私の例は、「Gray Hat Python」(http://expect-us.net/files/Gray%20Hat%20Python%20=rwt911=.pdf)という本に基づいています。
小さなサンプルアプリケーションprintf_loopがあります:
from ctypes import *
import time
msvcrt = cdll.msvcrt
counter = 0
while True:
msvcrt.printf("Loop iteration %d!\n" % counter)
time.sleep(2)
counter += 1
現在、このアプリケーションで使用されているprintfのアドレスを取得しようとしています。しかし、ReadProcessMemory呼び出しは常にERROR_PARTIAL_COPYを返します。
def read_process_memory(self, address, length):
data = ""
read_buff = create_string_buffer(length)
count = c_ulong(0)
if not kernel32.ReadProcessMemory(self.h_process, address, read_buff, length, byref(count)):
print "[*] Error Code: 0x%08x" % kernel32.GetLastError()
print read_buff.raw
return False
else:
data += read_buff.raw
return data
次の関数全体でアドレスを取得しています。ここで、dll='msvcrt.dll'およびfunction='printf'です。
def func_resolve(self, dll, function):
handle = c_void_p()
kernel32.GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, dll, byref(handle))
address = kernel32.GetProcAddress(handle, function)
kernel32.CloseHandle(handle)
return address
なぜ私が記憶を読めないのか、何か提案はありますか?