update 2003.11.03 第2回
YS6 EXP Viewerの制作過程
第2回 プロセス検索
本項から難易度が半端に上昇します(ぉ。
基本的なC言語が使えてVisual C++6.0でプログラムが組めることを前提として解説しますので、ご了承ください。
(まあツール開発講座なので当然といえば当然なのですが…)
プロセスを開く
初めに、起動しているプログラム(YS6_WIN.EXE)のプロセスIDを取得する必要があります。
このために必要な関数が CreateToolhelp32Snapshot() です。
tlhelp32.h内で定義されていますのでメインのCPPソース内の初めに定義しておいてください。
#include <tlhelp32.h>
これでプログラム中に CreateToolhelp32Snapshot() を使うことが可能になります。
ここから先はほぼテンプレートになるんですが、
// 変数定義
HANDLE Gp; // プロセス検索用ハンドル
PROCESSENTRY32 pe32; // プロセス情報が格納される
unsigned long ID=0; // プロセスID
pe32. dwSize = sizeof( pe32 ); //初期化
// 現在のプロセス情報をGpに入れる
Gp=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
// YS6_WINのプロセスが見つかるまで全プロセスを検索
if(Process32First(Gp,&pe32)){
do{
strupr(pe32.szExeFile); // プロセス名を大文字に変換(念のため)
if(strstr(pe32.szExeFile,"YS6_WIN")!=0){ // プロセスにYS6_WINが含まれたら
ID = pe32.th32ProcessID; // そのプロセスIDを取得
break;
}
}while(Process32Next(Gp,&pe32));
}
CloseHandle(Gp);
if(ID==NULL) return; // もしIDがNULLだったらYS6のプロセス取得失敗。戻る。
これがプロセスIDを取得するための基本的な処理です。
ここではコードだけを入力していますが、実際にはOnTimerなどのコールバック関数内で
周期的に実行するようになると思います。
(オープンする必要があるのは1度だけなのに毎回実行するのはスマートではありませんが、
コードの簡略化ということで勘弁してください…)
プロセスを開く
プロセスIDが取得できたら、もう即プロセスが開ける状態です。
またまたテンプレートですがプロセスオープンの処理はこんな感じで…
HANDLE hnd; // プロセス情報格納用ハンドル定義
// hndにIDのプロセス(YS6_WIN)の情報を格納
hnd = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, false,ID);
〜〜ここにプロセスメモリを色々読んだり書いたりする処理が入る〜
CloseHandle(hnd); // 最後にハンドルをクローズする。
短いですけど、こんなもんです。
後は、この hnd の情報を利用してプロセスメモリを色々と細工すればOKですね。
というわけでその細工する方法は次回になります。
まあネタバレするなら
LPVOID lpAddress=(LPVOID)(DWORD){アドレス(16進数表記)};
ReadProcessMemory(hnd,lpAddress,格納する変数(ポインタ),読み込むサイズ,NULL);
これで任意のアドレスの値を参照できるんですけどね(ぉ
>>第3回に続く