1

私はCodeProjectでさまざまなことを読んでいて、この記事を見つけました:http: //www.codeproject.com/Articles/29527/Reverse-Engineering-and-Function-Calling-by-Addres

そこで、インジェクターとDLLを作成し、サンプルの実行可能ファイルを取得しました。基本的にF11を押すと出力されます:http: //i.stack.imgur.com/YIygV.jpg

そのため、チュートリアル全体に従いましたが、DLLで使用されるアドレスは常に変更されています。具体的にはこれ:

pFunctionAddress pMySecretFunction = (pFunctionAddress)(0x004113C0);

彼のチュートリアルでは、関数のアドレスは0x004113C0です。私の場合、それは別のものであり、私は持っているものを取り、それを使用します。完全に機能しますが、実行可能ファイルを閉じて開くと、機能しなくなり、OllyDbgはアドレスがまったく新しいものであることを示します。

そこで少し調べて、OllyDbgでブレークポイントを追加し始めました。アドレスは常に次のようになることがわかりました。

main + 4C

「main」はこれらの実行可能ファイルのメインモジュールだと思います。関数へのこのアドレスを常に見つけるにはどうすればよいですか?それは常に変化し、私はこの時点で無知だからです。この記事では、実行可能ファイルを再度開いたときに何が起こるかについては説明していません。解決策を見つけるために5時間費やしました。

前もって感謝します!

編集:

みなさん、本当にありがとうございました。特にmfcのおかげで、ようやくわかりました!DLL_PROCESS_ATTACHを押すたびに、次のようにグローバルHMODULEを実行可能ファイルのアドレスに設定しました。

HMODULE g_hExeModule;
g_hExeModule = GetModuleHandle(L"TutExample.exe");

そして、いくつかのテストの後、関数アドレスは常に実行可能ファイル+ 0x11014のアドレスであるように思われるので、呼び出しでは次のようにします。

pFunctionAddress pMySecretFunction = (pFunctionAddress)((DWORD)g_hExeModule + 0x11014);
4

4 に答える 4

1

したがって、「メイン」のアドレスを取得する方法を見つけたら、4Cオフセットを追加でき、関数は常にそこにあると思います。

繰り返しますが、関数にはアドレスがあります。

void *(funcPtr)() = (void (*)())((char *)&main +  0x4C);

// If you were right, and you also substituted the appropriate
// function signature above, then this should work:

funcPtr();
于 2013-01-10T23:48:40.950 に答える
1

呼び出そうとしている関数はexeファイル内にあるため、参照オフセットはexeがロードされているメモリアドレスを基準にする必要があります。ターゲット関数へのオフセットは定数である必要があり、ソースコードの各コンパイル後にのみ変更されます。

exeの詳細を確認するには、次の2行をexeに追加します。

printf(_T("Exe loaded at: %08X"), GetModuleHandle(_T("TutExample.exe")));
printf(_T("Target function at: %08X"), mySecretFunction);
于 2013-01-11T03:10:34.800 に答える
0

新しいOSには、ASLR(アドレス空間配置のランダム化)と呼ばれる機能があります。犯罪者はあなたが使用しているトリックのいくつかを使用します。そのため、悪意のあるユーザーの生活をより困難にするために、プログラムを実行するたびにEXEとDLLに異なるアドレスが割り当てられます。

DLLをコンパイルした場合、DLLのASLRを無効にするオプションがあります。

于 2013-01-11T01:10:57.423 に答える
0

投稿を編集したりコメントを追加したりできないので、これを新しい回答として投稿する必要があります。

あなたの結果:

Exe loaded at: 00000000 (wrong, probably: 00BE0000 and offset is: 00001005)
Target function at: 00BE1005
Exe loaded at: 00000000 (wrong, probably: 01230000 and offset is: 00001005)
Target function at: 01231005
Exe loaded at: 00000000 (wrong, probably: 012A0000 and offset is: 00001005)
Target function at: 012A1005

コンパイルしたexeの名前を確認してください。「TutExample.exe」ですか?そうでない場合は、GetModuleHandleの呼び出しで正確な名前に変更してください。

「00000000」の値は、「TutExample.exe」という名前が現在のメモリスペースに見つからないため、GetModuleHandleが失敗したことを示します。

ターゲット関数のアドレスは問題ないようです。ロードされたexeのアドレスでこのアドレスを差し引くと、exeメモリレイアウト内のオフセットが取得されます。

挿入されたdll内でこれと同じ計算を実行して、OSがexeをロードする方法に関係なく、常にターゲット関数アドレスを正しく追跡できます。

于 2013-01-11T10:57:40.857 に答える