めいくりぷとのブログ

技術的なことをまったりと。

対象プロセスの関数列挙の実装 #1

完成するかも分からない動的デバッガーを作っていこうかと。
フレームワークはQt, 言語はC++

イメージとしては、IDA Pro 一部機能 + CheatEngine + α って感じかな。
ドライバによりメモリプロテクションが施されているプロセスに対しては、DKOMやらExploitを使えばどうにでもなる。
デバッグを行う際に、対象プロセスにDLLを注入する必要があるが、CreateRemoteThread, LoadLibraryでの注入は最近のプロテクタには弾かれてしまうので、
マニュアルマッピングやら、スレッドハイジャック等のオプションも追々...


まずはIDA Proの関数列挙を作っていこうかと・・・。
IDA Proがどのように列挙してるのかは明確ではないが、色々と調べた結果、


まず初めに各セクションのアドレス、サイズを取得する。
次に、対象のプロセスのエクスポート関数, エントリーポイント、.textセクションの開始アドレスから、opcodeを読み取っていき、関数の始まりから終わりまでのメモリサイズ分も計算する。
関数自体の列挙は、それらの関数のcall先のアドレスが.textセクション内ならリストに追加するようにする。
その際に、関数A call 関数B とした場合、関数Bの呼び出し元の関数Aも保存することで、IDA Proのような該当関数の呼び出し元を調べる機能が実装出来そうだ。


セクションの取得+α
f:id:mcrypt:20180310232407p:plain

次に必要なのが、opcodeを読み取って行かなければならないのだが、
普段見る・使っているopcodeだけであればどうにかなりそうだが、見慣れないopcodeも多々あり、x64についてはサッパリ・・・。
イチからエミュレートするとなるとかなり大変なので、取り敢えずDetoursを使って補うことにした。
まだまだ先が長いが、少しずつパーツを整えてから作っていこうと思う。