バグを含む実行可能ファイル(C ++、i386、MacOS / X Tigerでコンパイルされています)があります。バグの修正は簡単です。コード内にfork()を呼び出す場所がありますが、そうすべきではありません。修正は簡単で、実行可能ファイルを最初から再コンパイルするのは現時点では難しいため(質問しないでください)、実行可能ファイル/バイナリファイルに直接パッチを適用したいと思います。
そのための最初のステップとして、実行可能ファイルで「otool -tV MyExecutableName」を実行しました。これは、逆アセンブリの出力で見つかりました。
./MyExecutableName:
(__TEXT,__text) section
[... many lines omitted ...]
0002ce0d subl $0x10,%esp
0002ce10 calll 0x0051adac
0002ce15 movzbl 0x14(%ebp),%esi
0002ce19 calll 0x00850ac9 ; symbol stub for: _fork
0002ce1e cmpl $0x00,%eax
0002ce21 jll 0x0002cf02
0002ce27 jle 0x0002ce34
[... many more lines omitted ...]
したがって、私がやりたいのは、行0002ce19のオペコードを置き換えることです。これにより、_forkを呼び出す代わりに、無条件に失敗のケースにジャンプします(つまり、fork()が-1を返したかのように動作するはずです)。
残念ながら、私は分解/バイナリパッチの完全な初心者なので、これを行う方法がわかりません。特に、私の質問は次のとおりです。
1)必要なものを取得するには、場所0002ce19から0002xe1dにどのバイトを書き込む必要がありますか?「jmp0x0002cf02」と同等のアセンブルされたものになると思いますが、これらのバイトが何であるかをどのように把握できますか?
2)「otool-tV」によって出力されたオフセットは、実行可能ファイルの__TEXTセグメントにオフセットされているように見えます。印刷されたオフセットとファイルの先頭の間のバイトデルタを把握して、ファイル内の正しいバイトを編集/パッチできるようにするにはどうすればよいですか?
あなたが与えることができるアドバイスをありがとう!