講座08 分岐処理を書き替える

〜はじめに〜

前回で分岐命令について、判定分岐や無条件分岐といった基本を紹介しました。
というわけで今回は、これらを書き替える方法を解説します。

判定分岐→無条件分岐

まずは、判定分岐を無条件分岐(jmp)に書き替えてみましょう。
これの効果は「条件に関係無くジャンプするようになる」ですね。
…と言ってもそんな複雑なことはしません。
前回、判定分岐のバイナリデータが 7xyy で、無条件分岐が EByy であると紹介しましたが、
言いかえると 7x の部分を EB にすれば強制的に無条件分岐になるということがわかります。

たとえば、
:00401062 7542      jne 004010A6
こういう基本的な判定分岐命令があるとして、この 75EB にすると…
:00401062 EB42      jmp 004010A6
とまぁ、これだけで判定分岐が無条件分岐に変わりました。
これで上にどんな判定処理があろうとも、必ずアドレス 004010A6 に飛んでしまいます。

分岐命令→無効化

今度は、判定分岐・無条件分岐を無効化してジャンプしないようにする方法を紹介します。
(無条件分岐はむやみに書き替えないほうが良いと思いますが…)
ってわけで無効化です。
これについては、すでに講座6回目で紹介してますね。

つまり、分岐命令は nop 命令で無効化できるってわけです。

たとえば、
:00401060 7502      jne 00401064
:00401062 EB42      jmp 004010A6
とまぁ、こんな感じの判定分岐&無条件分岐を組み合わせた処理があるとします。
それで、上の判定分岐 jne 00401064 を潰して、必ず下の jmp 004010A6 を実行させたいとすると…
:00401060 90       nop
:00401061 90       nop
:00401062 EB42      jmp 004010A6
と、7502を9090にするだけです。

ところで、今更言わなくても分かってると思いますが、
テキストエディタで逆アセンブルリストを書き替えても、何も起こらないので注意です。
ちゃんと、プロセスエディタで上記のアドレスを書き替えるか、バイナリエディタでサーチしたオフセットを
書き替えてくださいな(友人に、勘違いしている人が居たので念のため…)
私の解説で逆アセンブルリストの記述を書き替えたように表記しているのは、
書き替える前と後の逆アセンブルリストの出力結果を表しているためです。

さいごに…

今回解説予定だったCDチェック解除は、次回になります。
まぁ、これは今回の講座第8回に積めこみすぎるのを防止するためっす。
(しかも、タイトルが「分岐処理を書き替える」ですし(汗))
ご了承くださいな。

>>NEXT STEP