めいくりぷとのブログ

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

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

DetourCopyInstructionで命令コピーして、
0xC3の場合はret、0xC2 0xXX 0x00 の場合は ret 00XX、それぞれ、ret, ret 00XXの次の命令もコピーして、0xCC or 0x90の場合は関数終了と判断する。
これで、near/far jmpが含まれない関数のサイズ取得までは出来た。
f:id:mcrypt:20180311221126p:plain


で、この法則だと、こういうパターンの関数はサイズ取得に失敗する。
f:id:mcrypt:20180311221408p:plain

このままだとクラッシュの原因にもなるので、どうにかしたい所・・・。
そこで、ある条件を付け加えることにした。

0xC2, 0xC3の命令までの命令にnear jmp系の有無のチェックを入れ、そのjmp先のアドレスがretの次の命令(0xCC, 0x90では無い場合)のアドレスを含んでいるかどうか。
含んでいなければ、0xCC, 0x90の条件を無視してそのまま関数終了と判断すれば良いのでは?・・・と。

続きは次回記事で。