2

最終的に IAT を見つけられるようにする Python コード (ctypes を使用) を作成しようとしています。私は PE 構造に精通していますが、データ構造を介してそれに到達するためにコードを記述する必要はありませんでした。私はいくつかの調査を行っており、C++ で記述されたコードを見つけました。これにより、ベース イメージへのハンドルを取得できるため、データ構造を介して逆参照を開始できます。私はこの投稿PE Format - IAT Questionsを参照として使用しています。だから私はこの投稿を使用して IMAGE_DOS_HEADER へのハンドルを取得しようとしていますGetModuleHandleでIMAGE_DOS_HEADERへのポインターを取得しますか? 私はPython Cタイプを使用してこれを書いているので、以下は私が使用しているコードです。

class IMAGE_DOS_HEADER(ctypes.Structure):
    _fields_ = [
            ("e_magic",    WORD),
            ("e_cblp",     WORD),
            ("e_cp",       WORD),
            ("e_crlc",     WORD),
            ("e_cparhdr",  WORD),
            ("e_minalloc", WORD),
            ("e_maxalloc", WORD),
            ("e_ss",       WORD),
            ("e_sp",       WORD),
            ("e_csum",     WORD),
            ("e_ip",       WORD),
            ("e_cs",       WORD),
            ("e_lfarlc",   WORD),
            ("e_ovno",     WORD),
            ("e_res",      WORD * 4),
            ("e_oemid",    WORD),
            ("e_oeminfo",  WORD),
            ("e_res2",     WORD * 10),
            ("e_lfanew",   WORD),
            ]

kernel32.GetModuleHandleW.restype = wintypes.HMODULE
kernel32.GetModuleHandleW.argtypes = [wintypes.LPCWSTR]

image_dos_header = IMAGE_DOS_HEADER()

hModule = kernel32.GetModuleHandleW(0)

if hModule == 0:
   hModule_Error = ctypes.WinError(ctypes.get_last_error())
   print("[-] error getting the hModule " + hModule)
   system.exit(1)

#Trying to cast the handle to image_dos_header struct
image_dos_header = ctypes.byref(hModule)                 #Error is here

このコードを試すと、「byref() 引数は 'int' ではなく、ctypes インスタンスでなければなりません」というエラーが表示されます。私はいくつかの調査を行っており、いくつかのことを試しましたが、答えが見つからないようです。私は、C 型を使用して宣言した他の構造体を操作するときに、以前に「byref」を使用しました。

もう 1 つの質問は、GetModuleHandleW 呼び出しから返された有効なハンドルと思われるものを取得できることです。それがアドレスだと思いますが、そうであれば、新しい「image_dos_header」構造体を作成せずに、その IMAGE_DOS_HEADER 構造体を介して作業を開始し、返されたハンドルをそれにキャストできますか? そして、それを通り抜けて IAT に行くのですか? IAT にたどり着くために使用しようとしている私の方法論について、どんな助けでも感謝またはフィードバックをいただければ幸いです。ありがとう!

4

1 に答える 1