使用ctypes动态处理python内存的方法

2024-04-28 05:00:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近使用了一个名为作弊引擎的程序,它的作用是从当前运行的进程列表中指定要处理的进程(通常用于pc游戏),然后在选中一个进程后,您可以运行一个搜索现有值,并通过在内存中的顺序扫描来跟踪对这些值所做的更改,以帮助将结果列表缩减到您正尝试处理的相关内容的单个内存地址。在

一旦你找到了你想要的内存地址和它的值,你就可以编辑它并把它返回到我觉得很有趣的程序中。我想学习如何做这样的低级工作,I read this question这里有一个我认为能让我有一个好的开始的答案:

from ctypes import *
from ctypes.wintypes import *

OpenProcess = windll.kernel32.OpenProcess
ReadProcessMemory = windll.kernel32.ReadProcessMemory
CloseHandle = windll.kernel32.CloseHandle

PROCESS_ALL_ACCESS = 0x1F0FFF

pid = 4044   # I assume you have this from somewhere.
address = 0x1000000  # Likewise; for illustration I'll get the .exe header.

buffer = c_char_p("The data goes here")
bufferSize = len(buffer.value)
bytesRead = c_ulong(0)

processHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
if ReadProcessMemory(processHandle, address, buffer, bufferSize, byref(bytesRead)):
    print "Success:", buffer
else:
    print "Failed."

CloseHandle(processHandle)

这对我来说已经足够基本了,我可以很好地理解他们在做什么,但是在他们的代码中,他们使用的是硬编码的内存地址。一个特定的内存地址更接近我的终点,而不是起点。在

我想做的是能够将进程ID传递给我的脚本,让它读取与它相关联的所有内存(作弊引擎的内存扫描范围为0000000000000000-7fffffffffffff),并且我希望在与进程关联的任何程序中进行更改,然后运行与所做更改匹配的值的查询,直到我把它列为一个地址。然后我希望能够重写这个值,并将其传递回程序。在

从我所读到的内容来看,如果我想用python实现这一点,ctypes和kernel32似乎是个不错的选择,但是我一直致力于如何动态地检索与PID相关的内存地址,并且在我弄清楚之前不能从这个基本脚本中分支出来。怎么才能找到这些?在

我附上了一个在作弊引擎中的截图,以防我的解释不够清楚。enter image description here

--编辑-- 我还通读了ctypes文档,虽然他们有不同的例子来说明如何使用kernel32,但是他们没有解释如何使用它。我在页面上看到的一个提示是

“要找到正确的调用约定,必须查看要调用的函数的C头文件或文档。”

我找不到这个信息。当你寻找这些东西时,你通常会输入什么?在


Tags: 内存from引擎程序进程bufferctypes作弊