2024-06-02 05:45:56 发布
网友
我想知道是否可以使用Perl、Python或Ruby编写一个程序,以便它在另一个进程的内存(可能是堆中,同时查找数据和代码数据)中查找0x12345678,如果找到了,将其更改为0x00000000?它类似于Cheat Engine,它可以在Windows上做类似的事情。在
如果您已经将程序作为调试器附加到进程中,那么这样做是可能的,如果存在围绕适当api的包装器,或者通过ctypes(对于python)直接访问windows函数,在这些语言中应该是可能的。然而,用一种更低级的语言可能更容易实现,因为在高级语言中,您必须关心如何将高级数据类型转换为低级数据类型等等
首先调用进程上的OpenProcess进行调试,并请求相应的访问权限(您需要是计算机上的管理员/拥有相当高的权限才能获得访问权限)。然后您应该能够调用像ReadProcessMemory和WriteProcessMemory这样的函数来读写该进程的内存。在
[Edit]下面是一个函数概念的快速python证明,该函数可以成功地从另一个进程的地址空间读取内存:
import ctypes import ctypes.wintypes kernel32 = ctypes.wintypes.windll.kernel32 # Various access flag definitions: class Access: DELETE = 0x00010000 READ_CONTROL= 0x00020000 SYNCHRONIZE = 0x00100000 WRITE_DAC = 0x00040000 WRITE_OWNER = 0x00080000 PROCESS_VM_WRITE = 0x0020 PROCESS_VM_READ = 0x0010 PROCESS_VM_OPERATION = 0x0008 PROCESS_TERMINATE = 0x0001 PROCESS_SUSPEND_RESUME = 0x0800 PROCESS_SET_QUOTA = 0x0100 PROCESS_SET_INFORMATION = 0x0200 PROCESS_QUERY_LIMITED_INFORMATION = 0x1000 PROCESS_QUERY_INFORMATION = 0x0400 PROCESS_DUP_HANDLE = 0x0040 PROCESS_CREATE_THREAD = 0x0002 PROCESS_CREATE_PROCESS = 0x0080 def read_process_mem(pid, address, size): """Read memory of the specified process ID.""" buf = ctypes.create_string_buffer(size) gotBytes = ctypes.c_ulong(0) h = kernel32.OpenProcess(Access.PROCESS_VM_READ, False, pid) try: if kernel32.ReadProcessMemory(h, address, buf, size, ctypes.byref(gotBytes)): return buf else: # TODO: report appropriate error GetLastError raise Exception("Failed to access process memory.") finally: kernel32.CloseHandle(h)
请注意,您需要确定内存中的哪个位置来查找内容—大部分地址空间将被取消映射,尽管有一些标准偏移量可以用来查找程序代码、DLL等
好吧,有趣的部分是访问另一个进程的内存。作弊引擎是通过在虚拟机下运行整个操作系统来实现的,该虚拟机允许破坏内存保护。还有一种“在调试器下运行”模型,通常意味着使用提升的权限将目标应用程序作为修改应用程序的子进程启动。查看Win32 API中的许多有趣的东西。在
在Perl中,一旦您拥有了必要的访问权限,您可能希望使用Win32::Security::Raw与它交互。在
我最初认为这是不可能的,但是在看到Brian的评论后,我搜索了CPAN和lo,发现了Win32::Process::Memory:
C:\> ppm install Win32::Process::Info C:\> ppm install Win32::Process::Memory
该模块显然使用了^{}函数:下面是我的一个尝试:
输出:
C:\Temp> proc 0052A580 : 56 49 4D 20 2D 20 56 69 20 49 4D 70 72 6F 76 65 : VIM - Vi IMprove 0052A590 : 64 20 37 2E 32 20 28 32 30 30 38 20 41 75 67 20 : d 7.2 (2008 Aug 0052A5F0 : 56 49 4D 52 55 4E 54 49 4D 45 3A 20 22 00 : VIMRUNTIME: ". 0052A600 : 20 20 66 61 6C 6C 2D 62 61 63 6B 20 66 6F 72 20 : fall-back for 0052A610 : 24 56 : $V
如果您已经将程序作为调试器附加到进程中,那么这样做是可能的,如果存在围绕适当api的包装器,或者通过ctypes(对于python)直接访问windows函数,在这些语言中应该是可能的。然而,用一种更低级的语言可能更容易实现,因为在高级语言中,您必须关心如何将高级数据类型转换为低级数据类型等等
首先调用进程上的OpenProcess进行调试,并请求相应的访问权限(您需要是计算机上的管理员/拥有相当高的权限才能获得访问权限)。然后您应该能够调用像ReadProcessMemory和WriteProcessMemory这样的函数来读写该进程的内存。在
[Edit]下面是一个函数概念的快速python证明,该函数可以成功地从另一个进程的地址空间读取内存:
请注意,您需要确定内存中的哪个位置来查找内容—大部分地址空间将被取消映射,尽管有一些标准偏移量可以用来查找程序代码、DLL等
好吧,有趣的部分是访问另一个进程的内存。作弊引擎是通过在虚拟机下运行整个操作系统来实现的,该虚拟机允许破坏内存保护。还有一种“在调试器下运行”模型,通常意味着使用提升的权限将目标应用程序作为修改应用程序的子进程启动。查看Win32 API中的许多有趣的东西。在
在Perl中,一旦您拥有了必要的访问权限,您可能希望使用Win32::Security::Raw与它交互。在
我最初认为这是不可能的,但是在看到Brian的评论后,我搜索了CPAN和lo,发现了Win32::Process::Memory:
该模块显然使用了^{} 函数:下面是我的一个尝试:
^{pr2}$输出:
相关问题 更多 >
编程相关推荐