如何编写一个Perl、Python或Ruby程序来改变Windows上另一个进程的内存?

2024-06-02 05:45:56 发布

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

我想知道是否可以使用Perl、Python或Ruby编写一个程序,以便它在另一个进程的内存(可能是堆中,同时查找数据和代码数据)中查找0x12345678,如果找到了,将其更改为0x00000000?它类似于Cheat Engine,它可以在Windows上做类似的事情。在


Tags: 数据内存代码程序进程windows事情engine
3条回答

如果您已经将程序作为调试器附加到进程中,那么这样做是可能的,如果存在围绕适当api的包装器,或者通过ctypes(对于python)直接访问windows函数,在这些语言中应该是可能的。然而,用一种更低级的语言可能更容易实现,因为在高级语言中,您必须关心如何将高级数据类型转换为低级数据类型等等

首先调用进程上的OpenProcess进行调试,并请求相应的访问权限(您需要是计算机上的管理员/拥有相当高的权限才能获得访问权限)。然后您应该能够调用像ReadProcessMemoryWriteProcessMemory这样的函数来读写该进程的内存。在

[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

该模块显然使用了^{}函数:下面是我的一个尝试:

^{pr2}$

输出:

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

相关问题 更多 >