Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Память процесса


Автор: chaos 9.12.2004, 15:25
Подскажите как определить адресс в памяти где живет процесс и допустим наити там определенное число как это делает ArtMoney

Автор: mntek 9.12.2004, 15:37
ReadProcessMemory()

Автор: _hunter 9.12.2004, 16:02
http://forum.vingrad.ru/index.php?showtopic=6224

Автор: Girder 9.12.2004, 17:08
1)Тебе надо определить идентификатор процесса жертвы
2)Необходимо пройтись по страницам процесса - т.е. составить список страниц.
К примеру вот так(для наглядности я их вывел в TreeView):
- создай новое приложение, брось на нее TreeView и кнопку
- Замени модуль на вот ентот:
Код
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls, StdCtrls;

type
 TFOnPagesMemory = procedure(Sender:TObject; MemInfo:_MEMORY_BASIC_INFORMATION; var StopSearch:Boolean) of object;

type
 TForm1 = class(TForm)
   Button1: TButton;
   TreeView1: TTreeView;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   function GetPagesMemoryProcess32(pID:Cardinal):integer;
   procedure PMP32(Sender: TObject; MemInfo: _MEMORY_BASIC_INFORMATION; var StopSearch: Boolean);
 end;

var
 Form1: TForm1;
 FOnPagesMemory:TFOnPagesMemory;

implementation

{$R *.dfm}

function TForm1.GetPagesMemoryProcess32(pID:Cardinal):integer;
var oProcess:Cardinal;
   MemAddr:Cardinal;
   MemInfo:_MEMORY_BASIC_INFORMATION;
   sNext:boolean;
begin
Result:=-1;
if pID=0 then exit;
oProcess:=OpenProcess(PROCESS_QUERY_INFORMATION,false,pID);
if oProcess<>0 then
 begin
  Result:=0;
  MemAddr:=0;
  sNext:=false;
  while (sNext=false)and(VirtualQueryEx(oProcess,Pointer(MemAddr),MemInfo,SizeOf(_MEMORY_BASIC_INFORMATION))<>0) do
   begin
    MemAddr:=MemAddr+MemInfo.RegionSize;
    if Assigned(FOnPagesMemory) then FOnPagesMemory(Self,MemInfo,sNext);
    inc(Result);
   end;
  CloseHandle(oProcess);
 end;
end;

procedure TForm1.PMP32(Sender: TObject; MemInfo: _MEMORY_BASIC_INFORMATION; var StopSearch: Boolean);
var t,tc:TTreeNode;
procedure Protect(p:Cardinal);
begin
if (p and PAGE_READONLY)=PAGE_READONLY then
 TreeView1.Items.AddChild(tc,'PAGE_READONLY');
if (p and PAGE_READWRITE)=PAGE_READWRITE then
 TreeView1.Items.AddChild(tc,'PAGE_READWRITE');
if (p and PAGE_WRITECOPY)=PAGE_WRITECOPY then
 TreeView1.Items.AddChild(tc,'PAGE_WRITECOPY');
if (p and PAGE_EXECUTE)=PAGE_EXECUTE then
 TreeView1.Items.AddChild(tc,'PAGE_EXECUTE');
if (p and PAGE_EXECUTE_READ)=PAGE_EXECUTE_READ then
 TreeView1.Items.AddChild(tc,'PAGE_EXECUTE_READ');
if (p and PAGE_EXECUTE_READWRITE)=PAGE_EXECUTE_READWRITE then
 TreeView1.Items.AddChild(tc,'PAGE_EXECUTE_READWRITE');
if (p and PAGE_EXECUTE_WRITECOPY)=PAGE_EXECUTE_WRITECOPY then
 TreeView1.Items.AddChild(tc,'PAGE_EXECUTE_WRITECOPY');
if (p and PAGE_GUARD)=PAGE_GUARD then
 TreeView1.Items.AddChild(tc,'PAGE_GUARD');
if (p and PAGE_NOACCESS)=PAGE_NOACCESS then
 TreeView1.Items.AddChild(tc,'PAGE_NOACCESS');
if (p and PAGE_NOCACHE)=PAGE_NOCACHE then
 TreeView1.Items.AddChild(tc,'PAGE_NOCACHE');
end;
begin
t:=TreeView1.Items.AddChild(nil,'State: ');
case MemInfo.State of
 MEM_COMMIT: t.Text:=t.Text+'MEM_COMMIT';
 MEM_FREE: t.Text:=t.Text+'MEM_FREE';
 MEM_RESERVE: t.Text:=t.Text+'MEM_RESERVE';
else
 t.Text:=t.Text+'???';
end;
t.Text:=t.Text+' BaseAddress: '+IntToHex(Cardinal(MemInfo.BaseAddress),8)+
        ' RegionSize: '+IntToHex(MemInfo.RegionSize,8)+' (Type: ';
case MemInfo.Type_9 of
 MEM_IMAGE: t.Text:=t.Text+'MEM_IMAGE)';
 MEM_MAPPED: t.Text:=t.Text+'MEM_MAPPED)';
 MEM_PRIVATE: t.Text:=t.Text+'MEM_PRIVATE)';
else
 t.Text:=t.Text+'???)';
end;
tc:=TreeView1.Items.AddChild(t,'AllocationProtect');
Protect(MemInfo.AllocationProtect);
tc:=TreeView1.Items.AddChild(t,'Protect');
Protect(MemInfo.Protect);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Items.Clear;
FOnPagesMemory:=PMP32;
GetPagesMemoryProcess32(GetCurrentProcessID); //Для постороннего процесса ты должен поставить его идентификатор!
end;

end.

- На OnClick кнопки повесь обработчик: Button1Click

3)Из второго пункта ты имееш информацию по страницам. Отбираеш страницы со статусом MemInfo.State=MEM_COMMIT. Также у тебя будет информация базовый адресс региона: MemInfo.BaseAddress и его размер MemInfo.RegionSize которые и используеш для ReadProcessMemory() и WriteProcessMemory()
4)Открываеш процесс с нужным тебе доступом (OpenProcess...) и используеш ReadProcessMemory() и WriteProcessMemory()

Полное решение мне писать лень... долго и тривиально... smile

Удачи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)