3

私はグーグルで検索しましたが、正しい質問をしているのかどうかわかりません。また、リンクが役立つかもしれません。

メッセージ ボックスを表示する C++ プログラムを作成し、それを Ollydbg で開き、MessageBoxW を呼び出す部分に移動しました。

WindowsがImportsテーブルを更新してMessageBoxWの正しいアドレスを持つように、アプリを実行するたびにMessageBoxWの呼び出しアドレスが変更されます。だから私の質問は、インポートテーブルへの MessageBoxW の仮想アドレスを見つける方法と、これを ollydbg で使用する方法です。

基本的に、アセンブリにコード ケーブを作成して MessageBoxW を再度呼び出そうとしています。16 進エディタで実行可能ファイルを検索して、呼び出しの位置を見つけ、仮想アドレスを見つけたと思います。しかし、その仮想アドレスを olly で呼び出して実行可能ファイルに保存すると、次にそれを開いたときに、呼び出しが一連のDB xyz(仮想アドレスのように見えたが、なぜcall削除されたのですか?

私はこれに慣れていないため、用語がオフになっている場合は申し訳ありません。何と呼ぶべきかよくわかりません。

4

2 に答える 2

2

(元の投稿のコメントに返信)

いいえ、「call」オペコードで指定されたアドレスは、call 命令に関連しています。ただし、インポートされた関数の場合は、間接呼び出し (関数のアドレスをメモリ ロケーションから読み取る) である可能性が最も高くなります。

インポートセグメントにアクセスせずに関数のアドレスを取得する「公式」/信頼できる方法は実際にはありません。特定の実行可能ファイルにパッチを適用する場合は、Windows がそのインポート セグメントに配置する値を確認してください。別のプロセスからコードを挿入する場合、システム DLL 内の関数のアドレスは、DLL の読み込みアドレスに対して相対的に同じままであるという事実を信頼できます。プログラムのインポート セグメントをメモリ内で手動で検索して解析することもできます。

于 2010-05-24T02:33:40.043 に答える
0

1- 実行可能モジュール内のメッセージ ボックスのアドレスを見つけます。あなたのexeファイルがa1.exeだとします

実行可能モジュール > a1.exe を選択 > ctrl+を押しNて、メッセージ ボックスのアドレスを見つけます。アドレスが00402008だとします

2-ff25 08204000マシンコードを使用してメッセージボックスを呼び出しますが、パラメーターをプッシュする前に、EIPアドレスを返すためにプッシュします。

于 2015-08-05T18:07:30.063 に答える