例如,我打开记事本,用CE查看到 &H002E0000 区块,长度6000,属性是 Execute+Read,只读的,不可写入,而我现在需要修改&H002E0010 处的一个字节,如何做?Private Declare Function VirtualProtectEx Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'得到窗体控件句柄的函数
Private Const PAGE_EXECUTE_READWRITE As Long = &H40
Private Const PROCESS_ALL_ACCESS = &H1F0FFF
Private Const PROCESS_VM_OPERATION = &H8
Private Const PROCESS_VM_READ = &H100
Private Const PROCESS_VM_WRITE = &H20
Private Const MEM_COMMIT = 4096
 Private Const PAGE_NOACCESS = 1
 Private Const PAGE_READONLY = 2
 Private Const PAGE_READWRITE = 4
 Private Const PAGE_WRITECOPY = 8
Private Declare Function VirtualAllocEx Lib "kernel32" (ByVal ProcessHandle As Long, ByVal lpAddress As Long, ByVal dwSize As _
Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long'Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long '打开这个进程
'Private Const PROCESS_ALL_ACCESS = &H1F0FFF '以全部权力打开进程
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long '关闭进程Private Sub command1_click()
Dim HWD, PID, hProcess, addr, bb, cc As Long
    HWD = FindWindow(vbNullString, "无标题 - 记事本")
    If HWD = 0 Then
        MsgBox "记事本没有启动", vbOKOnly, "出错啦"
        Unload Me
    End If
    GetWindowThreadProcessId HWD, PID
    hProcess = OpenProcess(PROCESS_ALL_ACCESS Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, PID)
'然后我想先查询&H002E0000 区块的信息,然后修改成可读写,然后写入,请大家帮忙写完。
'我想用MEMORY_BASIC_INFORMATION 查到信息,再VirtualQuery,把这个区块变成可读写,然后写入,最后又用VirtualQuery'把属性改成只读,我不知道怎么用VB表达出来。
end sub

解决方案 »

  1.   


    Private Declare Sub MoveMemory _
                    Lib "kernel32" _
                    Alias "RtlMoveMemory" (Destination As Any, _
                                           Source As Any, _
                                           ByVal Length As Long)
      

  2.   

    感谢楼上两位,等会试试
    昨天我直接用 WriteProcessMemory ,对第三方的程序执行内存,直接就写进去了,明明是执行+读取的权限。但是我直接修改第三方的程序在内存中的指令,比如说改成 mov [xxxx],ecx 当第三方程序执行到这一句时,提示内存不可写。
    而我用外挂程序直接WriteProcessMemory 就可以写xxxx 地址
    这是为什么?