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()
Полное решение мне писать лень... долго и тривиально...
Удачи. |