2017年1月15日日曜日

pydbgをMSYS2環境で使いたいけどできない

未解決です。


「リバースエンジニアリング Pythonによるバイナリ解析技法/Justin Seitz 著,安藤慶一 訳」を触っていたのですが、途中でpyDbgが必要になったのでメモです。

MSYS2の環境で、python2.7を利用しました。
初めはmingw64でコード書いていたのですが、CPUのレジスタ確認のコードあたりで、エラーが出てないのにすべての値が0x0になるという事態が起きていて、不安だなと思っていたところ、
https://github.com/OpenRCE/pydbg のpyDbgを導入したらpyDbg内のwindows_h.pyのでassert文によるエラーが出てしまいました。


AssertionError: 8

windows_h.pyを見るとsizeofによる構造体のサイズ確認だったようで、MSDNの方で確認すると32bit環境と64bit環境でサイズが違うからそのエラーなんだろうと思い、適当にassertを全部コメントアウトして動くか確かめたところ、windows_h.pyを抜けた先で、

import pydasm
ImportError: DLL load failed: %1 は有効な Win32 アプリケーションではありません。

となりました。

pydasmに関しては、本でもpython26.dllをpython27.dllに書き換えるなどの指示があったのでそのあたりをいじったのですが、駄目でした。
pydasm.pydが32bit用だからということで、64bit環境のものを探せばいいだろうと思ってもうまく動かず。


諦めてmingw32にpython2.7入れることにしてpyDbg(今度はhttps://github.com/reider-roque/pydbg-pydasm-paimeiから)を用意したところ、pydasmで「指定されたモジュールが見つかりません」に。
(確かこのときsetup.py installでpydasmのインストールでMINGW用のpydasm.pydがないとかいうエラーが出ますが新しくmingw-2.7とかフォルダを作って、内部にwin向けのpydasmを入れたら成功します、動きませんが)
dependency walkerとかを使って色々調べていたのですが、全然わからず諦めようかと思っていたところ、


Now, go to C:\Python27\Lib\site-packages\pydbg and delete the pydasm.pyd file (it’s compiled for an older python version and it causes the pydbg library not to load)

という内容を発見。試しにpydasm.pydをpydasm_tmp.pydなどにリネームしたところ、実行中のプロセスを列挙するテストコードが動きました。


dbgObj = pydbg()  # Create PyDbg object
print dbgObj.enumerate_processes()
これでとりあえず行けるだろうと思ってそのまま進めていたのですが、今度はpyDbgを利用してprintfが実行されるタイミングでメモリを書き換える(printf__random.py)という部分でまたこけました。
Traceback (most recent call last):

  File "printf_random.py", line 27, in <module>

    dbg.run()

  File "C:/mingw-w64/msys64/mingw32/lib/python2.7/site-packages/pydbg/pydbg.py", line 2900,in  run

    self.debug_event_loop()

  File "C:/mingw-w64/msys64/mingw32/lib/python2.7/site-packages/pydbg/pydbg.py", line 942,in  debug_event_loop

    self.debug_event_iteration()

  File "C:/mingw-w64/msys64/mingw32/lib/python2.7/site-packages/pydbg/pydbg.py", line 875,in  debug_event_iteration

    continue_status = self.event_handler_load_dll()

  File "C:/mingw-w64/msys64/mingw32/lib/python2.7/site-packages/pydbg/pydbg.py", line 1458,in event_handler_load_dll

    dll = system_dll(self.dbg.u.LoadDll.hFile,self.dbg.u.LoadDll.lpBaseOfDll)

  File "C:/mingw-w64/msys64/mingw32/lib/python2.7/site-packages/pydbg/system_dll.py", line 96, in __init__

    self.path = os.sep + filename.value.split(os.sep, 3)[3]

IndexError: list index out of range

[1]+  終了 3                  python printf_loop.py
 なんでpyDbgの中でインデックス超えるエラー出てくるんだと数時間戦ったのですが、printなどで出力してみると、system_dll.pyの自身のパスを格納する作業でパスの切り分けがうまいこと出来てないようでした。
#system_dll.py line96周辺
 self.path = os.sep + filename.value.split(os.sep, 3)[3]
ここに出てくるos.sepというのは、OS毎のパスの区切り文字のようで、Winであれば\ であるはずのものです。ここの区切り文字とfilenameのパスで使われている区切り文字が異なっていた為にうまいこと切り分けが出来ず、インデックスのエラーが起きたと思われます。MinGW環境なのが失敗だったのでしょうか。
とりあえず該当部分を
self.path = os.sep + filename.value.split("\\", 3)[3]                             
に変更。
 これでIndexErrorは消えたぞと思ったら、今度はメモリの読み書きを行う
#printf_random.py内
counter=dbg.read_process_memory(parameter_addr,4)
dbg.write_process_memory(parameter_addr,random_counter) 

が変な動きをしているようで読めないし書き込めないしでsegmentation falutを起こしてました。
未解決なので、気が向いたら調べてみようと思います。どうすればいいんだ…。 
というか大人しくMSYS2とか使わないで進めればこんなことにならなかったような…。

0 件のコメント:

コメントを投稿