How to write a Perl, Python, or Ruby program to change the memory of another process on Windows?

后端 未结 6 1876
终归单人心
终归单人心 2020-12-30 12:20

I wonder if Perl, Python, or Ruby can be used to write a program so that it will look for 0x12345678 in the memory of another process (probably the heap, for both data and c

6条回答
  •  难免孤独
    2020-12-30 13:05

    It is possible to implement the entire process in one of the languages listed but a compiled language would be better for memory scanning (speed considerations if nothing else). There is a dll (with source) called SigScan available that, while tailored for a specific game, could probably be modified to suite your needs with minimal effort.

    Building on Brian's correct answer here's a quick and dirty example of using a dll to get your address from within python. This is, of course, specific to the DLLs implementation. "Module name" would generally be the dll name as displayed in Cheat Engines "Enumerate DLLs and Symbols" dialog.

    With Brian's example as a guideline and MSDN you could easily extend this with your own WriteProcessMemory method.

    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)

提交回复
热议问题