Можно реализовать весь процесс на одном из перечисленных языков, но скомпилированный язык будет лучше для сканирования памяти (соображения скорости, если ничего больше). Существует dll (с исходным кодом) под названием SigScan, которая, хотя и предназначена для конкретной игры, вероятно, может быть изменена для соответствия вашим потребностям с минимальными усилиями.
Опираясь на правильный ответ Брайана, вот быстрый и грязный пример использования dll для получения вашего адреса из Python.
Это, конечно, специфично для реализации DLL.
«Имя модуля», как правило, будет именем dll, отображаемым в диалоговом окне «Перечислить библиотеки DLL и символы».
С примером Брайана в качестве руководства и MSDN вы можете легко расширить его с помощью собственного метода WriteProcessMemory.
import win32defines
import win32process
import win32gui
from ctypes import *
SigScan = cdll.SigScan
kernel32 = windll.kernel32
addresses = {"Value1" : {"sigArg1" : "b0015ec390518b4c24088d4424005068",
"sigArg2" : 36,
"address" : None,
"size" : 32
},
"Value2" :{"sigArg1" : "3b05XXXXXXXX741285c0",
"sigArg2" : None,
"address" : None,
"size" : 32
}
}
def read_process_mem(pid, address, size):
"""Read memory of the specified process ID."""
buf = create_string_buffer(size)
gotBytes = c_ulong(0)
h = kernel32.OpenProcess(win32defines.PROCESS_VM_READ, False, pid)
try:
if kernel32.ReadProcessMemory(h, address, buf, size, byref(gotBytes)):
return buf
else:
# TODO: report appropriate error GetLastError
raise Exception("Failed to access process memory.")
finally:
kernel32.CloseHandle(h)
if __name__ == "__main__":
pid, id = None, None
## HWND
hwnd = win32gui.FindWindowEx(0, 0, 0, "Window Name here")
## pid
pid = win32process.GetWindowThreadProcessId(hwnd)[-1]
## Initialize the sigscan dll
SigScan.InitializeSigScan(pid, "Module Name")
## Find all the addresses registered
for key in addresses.keys():
addresses[key]["address"] = SigScan.SigScan(addresses[key]["sigArg1"],
addresses[key]["sigArg2"])
## Allow the scanner to clean up
SigScan.FinalizeSigScan()
for key in addresses.keys():
if addresses[key]["address"] != None:
print repr(read_process_mem(pid, addresses[key]["address"],
addresses[key]["size"]).raw)