我想得到一个运行中程序的内存数据部分,使用ReadProcessMemory函数但不知道从那里开始读取呀,也不知道到那里结束,请高手指点.

解决方案 »

  1.   

    看到网上有说使用VirtualQueryEx尝试得到程序的开始地址,但讲的不全,我按照做了运行出错。
      

  2.   

    VirtualQueryEx例子:procedure TForm1.Button3Click(Sender: TObject);
    var
    ListItem:  TListItem ;ProcessId:    DWORD ;
    hWnd,hProcess:   THANDLE ;
     pvAddress :Pointer;
     MBI:    MEMORY_BASIC_INFORMATION;
    begin
      hWnd := FindWindow(nil, '计算器');
        if hWnd=NULL then
        begin
          ShowMessage('没找到程序');
          exit;
        end;
        pvAddress:=0;
            ListView1.Clear();
            fillchar(MBI, 0, sizeof(MBI));
            GetWindowThreadProcessId(hWnd, ProcessId);
            hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessId);        while( VirtualQueryEx(hProcess, pvAddress, MBI, sizeof(MBI))<>NULL ) do
            begin
            ListItem := ListView1.Items.Add();
            ListItem.Caption := IntToStr(ProcessId);
            ListItem.SubItems.Add('0x' + IntToHex(integer(MBI.BaseAddress), 2));
            ListItem.SubItems.Add('0x' + IntToHex(integer(MBI.AllocationBase), 2));
            ListItem.SubItems.Add('0x' + IntToHex(integer(MBI.AllocationProtect), 2));
            ListItem.SubItems.Add('0x' + IntToHex(integer(MBI.RegionSize), 2));
            ListItem.SubItems.Add('0x' + IntToHex(integer(MBI.State), 2));
            ListItem.SubItems.Add('0x' + IntToHex(integer(MBI.Protect), 2));
            ListItem.SubItems.Add('0x' + IntToHex(integer(MBI.Type_9 ), 2));        pvAddress := pointer(dword(pvAddress)+MBI.RegionSize);
            if  dword(pvAddress)>dword($80000000) then
              break;
            end;
        CloseHandle(hProcess);
    end;
    有关MEMORY_BASIC_INFORMATION各个参数说明,请查MSDN
    有关"运行中程序的内存数据部分",我的观点是"不确定",很多游戏修改器都是在内存中搜索得到数据的