繁体   English   中英

在python中编写内存扫描程序

[英]Writing memory scanner in python

(编者)

很抱歉更改内容。

我改变了代码。

nameprocess = 'calc.exe'
def getpid():
    for proc in psutil.process_iter():

        if str(nameprocess) in str(proc.name):
            print nameprocess,'pid = ', proc.pid
            return proc.pid

PID = getpid()
PROCESS_QUERY_INFORMATION = 0x0400
PROCESS_VM_READ = 0x0010

process = windll.kernel32.OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,False,PID)
readprocess = windll.kernel32.ReadProcessMemory
rdbuf = ctypes.c_uint()
bytread = ctypes.c_ulong(0)
for i in range(11):
    num = int('0x%08X'%(0x00400000+i),16)

    try:
        if readprocess(process,hex(num),ctypes.byref(rdbuf),
            ctypes.sizeof(rdbuf),ctypes.byref(bytread)):
            print hex(num),rdbuf.value

    except:None

print '----------------done---------------'

结果输出是:

calc.exe pid =  4552
0x400000 4293587451
0x400001 4293587451
0x400002 4293587451
0x400003 4293587451
0x400004 4293587451
0x400005 4293587451
0x400006 4293587451
0x400007 4293587451
0x400008 4293587451
0x400009 4293587451
0x40000a 4293587451
----------------done---------------
[Finished in 0.2s]

但我希望它看起来像这样

00400000   AE               SCAS BYTE PTR ES:[EDI]
00400001   0001             ADD BYTE PTR DS:[ECX],AL
00400003   0000             ADD BYTE PTR DS:[EAX],AL
00400005   0000             ADD BYTE PTR DS:[EAX],AL
00400007   01EE             ADD ESI,EBP
00400009   FFEE             JMP FAR ESI                              ; Illegal use of register
0040000B   FF01             INC DWORD PTR DS:[ECX]

就像调试器一样。 我希望你们明白我要做的事情。 在阅读processmemory时,'rdbuf'获取了我想要的所有信息吗? 这个过程到底是什么?

您的代码中存在严重错误。 您将(const char *)"0xde2d6c"传递给ReadProcessMemory

    if readprocess(process,hex(num),ctypes.byref(rdbuf),
        ctypes.sizeof(rdbuf),ctypes.byref(bytread)):

hex使整数形成十六进制字符串; 因此,您最终会在"0xde2d6c"字符串碰巧存储在Python进程中的同一位置读取calc.exe进程中的字节,这要归功于CPython内存分配的工作方式,恰好是所有的时间有。

你应该传入地址,也就是ctypes.cvoid_p(num)

你的代码可以清晰地写成:

base = 0x00400000
for addr in range(base, base + 11):
    try:
       if readprocess(process, ctypes.cvoid_p(addr), ctypes.byref(rdbuf),
                      ctypes.sizeof(rdbuf),ctypes.byref(bytread)):

使用ReadProcessMemory ,您正在读取特定内存地址的某些值。 根据你所说的,你正在寻找的是反汇编二进制代码。 我会使用diStorm ,一个简单但功能强大的x86和x64反汇编程序库。 看看一个简单的例子:

>>>Decode(0x400000, 'b800000000'.decode('hex'), Decode32Bits)
[(4194304L, 5L, 'MOV EAX, 0x0', 'b800000000')]

请注意,打开该过程不是必需的,您只需要使用标准文件输入读取二进制文件内容。

希望能帮助到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM