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回に続く