私は実行ファイルの中に、からと呼ぶ関数を配置しました。 OllyDbgによると、そのアドレスは0x0090DE00
となります。私はそれを直接呼び出すようにしようとしました:ロードされたDLLから実行可能ファイルにある関数を呼び出す方法はありますか?
luaL__openlib *f = ((luaL__openlib*)(module_handle + 0x0090DE00));
もhereが示唆したように、それにモジュールハンドルの塩基を添加すると:
uint8_t * module_handle = (uint8_t *)GetModuleHandle(L"ForgedAlliance1.exe");
luaL__openlib *f = ((luaL__openlib*)(module_handle + 0x0090DE00));
私がアクセスを取得し、これは動作しないことが表示されます違反の例外 - ポインタが有効ではないようです。
So:どうすればこのアドレスを使ってこの関数を呼び出すことができますか?
私はちょうど0x00C0B530
でシンプルなRET
命令を挿入します。今のように見えるん私のコードは次のとおりです。
例外ForgedAlliance1.exeに
0x909090C3
で投げ::私は例外メッセージで別のアドレスを取得し、なぜ私はかなり理解していない何typedef void (*test)(); EXTERN_DLL_EXPORT void initialize(lua_State *L) { // Adding this should not be necessary. I get 0x00C0B530 from // OllyDbg where the offset 0x00401000 is included uint8_t * module_handle = (uint8_t *)GetModuleHandle(L"ForgedAlliance1.exe"); test *f = NULL; f = ((test*)(0x00C0B530)); (*f)(); // Crashing }
がある
0xC0000005
:アクセス違反実行場所0x909090C3
UPDATE:は、私はちょうどそれがコード自体
90 | NOP
90 | NOP
90 | NOP
C3 | RETN
である私はポインタで何かをめちゃくちゃにしていますようだ、0x909090C3
はここだけでポインタでないことに気づきました。なぜ "場所" 0x909090C3
を実行しようとしますか?それは場所ではありません。
ollyを調べるとき、関数が 'ForgedAlliance1.exe'が使用する別のモジュールの中に格納されておらず、正確には実行可能ファイル自体ではないことを確認しましたか? – Bauss
@Bauss Hm、私はこれに少し新しかったですが、私はどのように私はアドレスを得たかを伝えることができます:私は実行可能ファイルを開いたばかりです。私はそれを介してデバッグすると、私は開始アドレスが '0x00401000'であることがわかります。だから私は、この特定のウィンドウに表示されているすべてが実行可能ファイルであると仮定しています。実行ファイルのアセンブリコードにいくつかの変更を保存するたびに、実行可能ファイル 'ForgedAlliance1.exe'を上書きしています。だから、OllyDbgが私の記憶の他の領域を表示しない限り、アドレスは正確であり、実行可能ファイルの一部でなければなりません。 – displayname
あなたはこの記事を見ましたか? https://www.codeproject.com/articles/1045674/load-exe-as-dll-mission-possible – Alden