请教怎样得到指定程序在内存中的开始地址呀? 我想得到一个运行中程序的内存数据部分,使用ReadProcessMemory函数但不知道从那里开始读取呀,也不知道到那里结束,请高手指点. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看到网上有说使用VirtualQueryEx尝试得到程序的开始地址,但讲的不全,我按照做了运行出错。 VirtualQueryEx例子:procedure TForm1.Button3Click(Sender: TObject);varListItem: 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有关"运行中程序的内存数据部分",我的观点是"不确定",很多游戏修改器都是在内存中搜索得到数据的 Delphi可否获取数据库的raiserror的错误级别代码 调用webservice ★★终于搞定了VMWare,爽……★★ 不用OLE如何读写Excel文件? windows XP关机? 动态菜单的逻辑问题,高手来讨论 菜鸟问题。怎样把已有的位图、光标、图标文件加入到资源文件中? CalCulated field字段运行时显示错误,请指教 求救~~~如何自动关联~~ Delphi数据网格(DbGrid)色彩特效(欢迎大家再来添加一些) 读取文件遇到的问题 求个openfile 与 readfile函数在delphi下 简单使用实例
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
有关"运行中程序的内存数据部分",我的观点是"不确定",很多游戏修改器都是在内存中搜索得到数据的