dumpbin /exports XXXX.dll > hoge.txt
BOOL ReplaceDllProc( LPCTSTR lpSourceModuleName, // 置換対象の DLL 関数が格納されているモジュールの名前 LPVOID lpCurProc, // 置換対象の DLL 関数のアドレス LPVOID lpNewProc, // 新しい DLL 関数のアドレス HMODULE hNewProcModule // 新しい DLL 関数が格納されているモジュールのハンドル ) { ULONG ulSize = 0; PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ::ImageDirectoryEntryToData(hNewProcModule, TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize); if (!pImportDesc) { return FALSE; } for (; pImportDesc->Name; pImportDesc++) { LPCTSTR lpModName = (LPCTSTR) ((PBYTE) hNewProcModule + pImportDesc->Name); if (!_tcsicmp (lpModName, lpSourceModuleName)) { break; } } if (!pImportDesc->Name) { return FALSE; } PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA) ((PBYTE) hNewProcModule + pImportDesc->FirstThunk); for (; pThunk->u1.Function; pThunk++) { LPVOID* ppfn = (LPVOID*) &(pThunk->u1.Function); BOOL fFound = (*ppfn == lpCurProc); if (fFound) { ::WriteProcessMemory (::GetCurrentProcess(), ppfn, &lpNewProc, sizeof(lpNewProc), 0); return TRUE; } } return FALSE; }
DLL のソースコードに
#pragma comment(linker,"/section:SHARED,rws") #pragma data_seg("SHARED") HWND hwndOwner = 0; HHOOK hhk = 0; #pragma data_seg()
のように記述。
#pragma data_seg は、#pragma data_seg で括られた区間がデータセグメントであること、セクション名が "SHARED" であることを示し
#pragma comment ディレクティブは、リンカに対する指示で、"SHARED" と名前付けられたセクションが「読み書き可能、共有」の属性を持つことを指定
この2つの記述により、変数 hwndOwner と hhk は、この DLL をロードしたプロセス間で共有される。
なお、共有する変数は
HWND hwndOwner = 0;
のように必ず初期化すること。 これを忘れると、変数が共有されません。