Python3でリバースエンジニアリング その4
今回は3.2章。
32bitならraw_input()やprint文を変更するだけで大丈夫です。64bitの場合、スレッドIDは取得できるのですが、レジスタの値が取得できないので変更する必要があります。
それっぽい値は出力できるけど間違っていると思います。参考までに。
my_debugger.py
-
...
-
def get_thread_context(self, thread_id=None, h_thread=None):
-
...
-
if kernel32.GetThreadContext(h_thread, byref(context)):
-
kernel32.CloseHandle(h_thread)
-
kernel32.RtlCaptureContext(byref(context))
-
return context
64bitではRtlCaptureContext関数を使うと簡単にレジスタの値が取得できるらしい。
my_debugger_defines.py
-
...
-
DWORD = c_ulong
-
DWORD64 = c_ulonglong
-
...
-
class CONTEXT(Structure):
-
_fields_ = [
-
-
("ContextFlags", DWORD),
-
("Dr0", DWORD),
-
("Dr1", DWORD),
-
("Dr2", DWORD),
-
("Dr3", DWORD),
-
("Dr6", DWORD),
-
("Dr7", DWORD),
-
("FloatSave", FLOATING_SAVE_AREA),
-
("SegGs", DWORD),
-
("SegFs", DWORD),
-
("SegEs", DWORD),
-
("SegDs", DWORD),
-
("Rdi", DWORD64),
-
("Rsi", DWORD64),
-
("Rbx", DWORD64),
-
("Rcx", DWORD64),
-
("Rax", DWORD64),
-
("Rbp", DWORD64),
-
("Rip", DWORD64),
-
("SegCs", DWORD),
-
("EFlags", DWORD),
-
("SegSs", DWORD),
-
("ExtendedRegisters", BYTE * 512),
-
]
winnt.hを参考にしながらレジスタの型を変更
my_test.py
-
...
-
print("[*] Dumping registers for thread ID: 0x{0:08x}".format(thread))
-
print("[**] RIP: 0x{0:016x}".format(thread_context.Rip))
-
print("[**] RBP: 0x{0:016x}".format(thread_context.Rbp))
-
print("[**] RAX: 0x{0:016x}".format(thread_context.Rax))
-
print("[**] RBX: 0x{0:016x}".format(thread_context.Rbx))
-
print("[**] RCX: 0x{0:016x}".format(thread_context.Rcx))
-
print("[*] END DUMP")
レジスタの名前を変更。
検索してもよくわからなかったのでそのまま次へ進みます。
Python3でリバースエンジニアリング その3
今回は3.1章の後半。raw_input()をinput()へ変更する必要があります。print文の変更は省略します。
my_debugger.py
-
...
-
def get_debug_event(self):
-
...
-
if kernel32.WaitForDebugEvent(byref(debug_event), INFINITE):
-
input("Press a key to continue...")
my_test.py
-
pid = input("Enter the PID of the process to attach to: ")
Python3でリバースエンジニアリング その2
前回リバースエンジニアリング ―Pythonによるバイナリ解析技法の続きで、今回は3.1章の前半。
my_debugger.py
-
...
-
def load(self, path_to_exe):
-
...
-
None,
-
None,
-
None,
-
None,
-
creation_flags,
-
None,
-
None,
-
byref(startupinfo),
-
byref(process_information)):
-
...
-
print("[*] PID: {0}".format(process_information.dwProcessId))
-
else:
-
print("[*] Error: 0x{0:08x}".format(kernel32.GetLastError()))
リバースエンジニアリング ―Pythonによるバイナリ解析技法
『みんなのPython』をひと通り読み終えたので、一緒に借りてきた『リバースエンジニアリング ―Pythonによるバイナリ解析技法』を読んでいきます。
非常に面白い本なのですが、少し古くPython2.5を前提に書かれているので、Python3に対応させつつ読んでいくつもりです。基本的にはprint文をprint関数へ、辞書型メソッドの変更をしていくだけです。
chapter1-printf.py
-
...
-
msvcrt = cdll.msvcrt
-
message_string = "Hello world!\n"
python3からbytes型とstr型の自動変換が行われなくなったのでencodeが必要。
ちなみに4行目は
-
msvcrt.wprintf("Testing: {0}".format(message_string))
や
でも動作します。
cx_Freezeでpython3.2を実行形式(.exe)にする
pythonスクリプトをexeにするには、cx_Freeze / py2exe / PyInstallerと方法がいろいろあります。今回はcx_Freezeを使う方法を試してみたいと思います。
環境はWindows 7 Home Premium(64bit)。Python、PySideのインストールは前回の記事を参考にして下さい。
インストールするもの
・cx_Freeze-4.2.3.win-amd64-py3.2.msi
・実行形式(.exe)に変換
test.py
-
import sys
-
from PySide.QtCore import *
-
from PySide.QtGui import *
-
-
def main():
-
app = QApplication(sys.argv)
-
# Create a Label and show it
-
label.show()
-
# Enter Qt application main loop
-
app.exec_()
-
-
if __name__ == '__main__':
-
main()
setup.py
-
from cx_Freeze import setup, Executable
-
-
setup(
-
name = "test",
-
version = "0.1",
-
description = "test",
-
executables = [Executable("test.py")])
上記スクリプトを同じ場所に保存して、コマンドプロンプトで次のコマンドを実行します。
-
setup.py build
問題点
・パスに日本語を含む場所で実行すると「Fatal Python error: cannot get zipimporter instance」とエラーになる。
・64bitで作成したファイルは32bitで実行できない?
・簡単なプログラムでも結構な容量になる。
Python+PySideでGUIプログラミング
PyQtではじめるGUIプログラミングが面白そうだったのでメモ。
OSはWindows 7 Home Premium(64bit)。インストールするPythonのバージョンは、現時点で最新の3.2.3にしました。
インストールするもの
・python-3.2.3.amd64.msi(Python本体)
・PySide-1.1.0qt474.win-amd64-py3.2.exe(GUIライブラリ)
・PyScripter-v2.5.3-x64-Setup.exe(統合開発環境)
ドキュメント
・python2.7.2ja(参考)
インストール
デフォルトの位置にインストールすれば、設定などは特にしなくて大丈夫だと思います。
ウィンドを表示
PyScripterを起動して以下を保存して実行。Hello Worldと書かれたウィンドが表示されると思います。
-
import sys
-
from PySide.QtCore import *
-
from PySide.QtGui import *
-
-
def main():
-
app = QApplication(sys.argv)
-
# Create a Label and show it
-
label.show()
-
# Enter Qt application main loop
-
app.exec_()
-
-
if __name__ == '__main__':
-
main()
割と楽にGUIアプリが作れそうです。