#author("2023-10-07T15:22:17+09:00","default:irrp","irrp") #author("2023-10-07T15:24:39+09:00","default:irrp","irrp") →WindowsAPI関連 #contents *一般 [#fb27ac99] -http://www.dll-files.com/ *Dependncy Walker [#mc4485b5] -[[覚書 : Dependency Walkerはもう古い! Windows 10ならDependenciesを使え! | FRONTL1NE (フロントライン)>https://frontl1ne.net/2018/12/dependency-walker-is-too-old-use-dependencies/]] 2018 --[[lucasg/Dependencies: A rewrite of the old legacy software "depends.exe" in C# for Windows devs to troubleshoot dll load dependencies issues.>https://github.com/lucasg/Dependencies]] --Dependencies is a rewrite of the legacy software Dependency Walker which was shipped along Windows SDKs, but whose development stopped around 2006. Dependencies can help Windows developers troubleshooting their dll load dependencies issues. -http://www.dependencywalker.com/ 2023 --[[help>http://www.dependencywalker.com/help/html/contents.htm]] *DLLの関数一覧を得る [#gf789935] -プログラムで取得するには(プログラムのヘッダ情報から取得) --http://d.hatena.ne.jp/kaorun55/20080429/p1 -[[コマンドで取得するには(dumpbinを使う)>http://d.hatena.ne.jp/kaorun55/20080429/p1]] dumpbin /exports XXXX.dll > hoge.txt --export以外も含め全部出す場合は、リンカのオプションに/MAPを付ける。 --そうすると出力先ディレクトリに*.mapファイルが生成される。 --C++の場合、コンパイラが付けた修飾名で関数が出力される。 --C++の関数でDEFファイルを作るときに手助けになるはず。 *DLLの関数差し替え [#ibc0b27d] -参考資料:http://www.users.gr.jp/blogs/hidori/archive/2005/07/25/14423.aspx 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の共有セグメント(C++) [#u6efc7c4] 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; のように必ず初期化すること。 これを忘れると、変数が共有されません。