📄 memorybrowserformunit.pas.svn-base
字号:
setlength(memorytext,0);
setlength(memorytext,8*rowsof8+1);
end;
//fill local array
setlength(buffer,(((mbcanvas.Height-5) div (TextHeight))+1)*(8*rowsof8)+257);
range1start:=memoryaddress;
range1length:=2048-(range1start mod 2048);
if range1length>((((mbcanvas.Height-5) div (TextHeight))+1)*(8*rowsof8)) then range1length:=((((mbcanvas.Height-5) div (TextHeight))+1)*(8*rowsof8));
// range1length:=(range1start+(((mbcanvas.Height-5) div (TextHeight))+1)*(8*rowsof8));// mod 2048;
range2start:=range1start+range1length;
range2length:=((((mbcanvas.Height-5) div (TextHeight))+1)*(8*rowsof8))-range1length;
//get the modules (if they have any)
module1ok:=symhandler.getmodulebyaddress(range1start,range1module);
module2ok:=symhandler.getmodulebyaddress(range2start,range2module);
zeromemory(@buffer[0],length(buffer));
range1ok:=readprocessmemory(processhandle,pointer(range1start),@buffer[0],range1length,bytesread);
if range2length>0 then range2ok:=readprocessmemory(processhandle,pointer(range2start),@buffer[range1length],range2length,bytesread) else range2ok:=false;
for i:=0 to ((mbcanvas.Height-5) div (TextHeight))+1 do
begin
//addresses
mbcanvas.Canvas.font.Color:=clwindowtext;
mbimage.Canvas.font.Color:=clwindowtext;
currentaddress:=IntToHex(dword(memoryaddress+i*8*rowsof8),8);
mbcanvas.Canvas.TextOut(10,5+i*TextHeight+2,currentaddress);
mbimage.Canvas.TextOut(10,5+i*TextHeight+2,currentaddress);
if addressestext[i]<>currentaddress then
begin
addressestext[i]:=currentaddress;
end;
//bytes
teststr:='';
p:=pointer(memoryaddress+i*8*rowsof8);
a:=memoryaddress+i*8*rowsof8;
for j:=0 to (8*rowsof8)-1 do
begin
if a<int64(int64(range1start)+int64(range1length)) then
begin
if range1ok then
begin
//readable
if (selecting or selectionmade) and (selstart<>selstop) and ((((memoryaddress+i*8*rowsof8)+j)>=selstart) and (((memoryaddress+i*8*rowsof8)+j)<=selstop)) then
begin
mbcanvas.Canvas.font.Color:=clred;
mbimage.Canvas.font.Color:=clred;
end
else
begin
if (module1ok) then
begin
mbcanvas.Canvas.font.Color:=clgreen;
mbimage.Canvas.font.Color:=clgreen;
end
else
begin
mbcanvas.Canvas.font.Color:=clwindowtext;
mbimage.Canvas.font.Color:=clwindowtext;
end;
end;
bts:=IntToHex(buffer[j+(i*8*rowsof8)],2);
mbcanvas.Canvas.TextOut(start+20*j,5+i*textHeight+2,bts);
mbimage.Canvas.TextOut(start+20*j,5+i*textHeight+2,bts);
if buffer[j+(i*8*rowsof8)]<$20 then
begin
mbcanvas.Canvas.TextOut(start+20+20*((8*rowsof8)-1)+j*chrlength,5+i*textHeight+2,' ');
mbimage.Canvas.TextOut(start+20+20*((8*rowsof8)-1)+j*chrlength,5+i*textHeight+2,' ');
end else
begin
mbcanvas.Canvas.TextOut(start+20+20*((8*rowsof8)-1)+j*chrlength,5+i*textHeight+2,chr(buffer[j+(i*8*rowsof8)]));
mbimage.Canvas.TextOut(start+20+20*((8*rowsof8)-1)+j*chrlength,5+i*textHeight+2,chr(buffer[j+(i*8*rowsof8)]));
end;
end
else
begin
//unreadable
if (selecting or selectionmade) and (selstart<>selstop) and ((((memoryaddress+i*8*rowsof8)+j)>=selstart) and (((memoryaddress+i*8*rowsof8)+j)<=selstop)) then
begin
mbcanvas.Canvas.font.Color:=clred;
mbimage.Canvas.font.Color:=clred;
end
else
begin
mbcanvas.Canvas.font.Color:=clwindowtext;
mbimage.Canvas.font.Color:=clwindowtext;
end;
mbcanvas.Canvas.TextOut(start+20*j,5+i*textHeight+2,'??');
mbimage.Canvas.TextOut(start+20*j,5+i*textHeight+2,'??');
mbcanvas.Canvas.TextOut(start+20+20*((8*rowsof8)-1)+j*chrlength,5+i*textHeight+2,'?');
mbimage.Canvas.TextOut(start+20+20*((8*rowsof8)-1)+j*chrlength,5+i*textHeight+2,'?');
// teststr:=teststr+'?';
end;
end
else
begin
//range 2
if range2ok then
begin
if (selecting or selectionmade) and (selstart<>selstop) and ((((memoryaddress+i*8*rowsof8)+j)>=selstart) and (((memoryaddress+i*8*rowsof8)+j)<=selstop)) then
begin
mbcanvas.Canvas.font.Color:=clred;
mbimage.Canvas.font.Color:=clred;
end
else
begin
if (module2ok) then
begin
mbcanvas.Canvas.font.Color:=clgreen;
mbimage.Canvas.font.Color:=clgreen;
end
else
begin
mbcanvas.Canvas.font.Color:=clwindowtext;
mbimage.Canvas.font.Color:=clwindowtext;
end;
end;
//readable
bts:=IntToHex(buffer[j+i*8*rowsof8],2);
mbcanvas.Canvas.TextOut(start+20*j,5+i*textHeight+2,bts);
mbimage.Canvas.TextOut(start+20*j,5+i*textHeight+2,bts);
if buffer[j+(i*8*rowsof8)]<$20 then
begin
mbcanvas.Canvas.TextOut(start+20+20*((8*rowsof8)-1)+j*chrlength,5+i*textHeight+2,' ');
mbimage.Canvas.TextOut(start+20+20*((8*rowsof8)-1)+j*chrlength,5+i*textHeight+2,' ');
end else
begin
mbcanvas.Canvas.TextOut(start+20+20*((8*rowsof8)-1)+j*chrlength,5+i*textHeight+2,chr(buffer[j+(i*8*rowsof8)]));
mbimage.Canvas.TextOut(start+20+20*((8*rowsof8)-1)+j*chrlength,5+i*textHeight+2,chr(buffer[j+(i*8*rowsof8)]));
end;
end
else
begin
//unreadable
if (selecting or selectionmade) and (selstart<>selstop) and ((((memoryaddress+i*8*rowsof8)+j)>=selstart) and (((memoryaddress+i*8*rowsof8)+j)<=selstop)) then
begin
mbcanvas.Canvas.font.Color:=clred;
mbimage.Canvas.font.Color:=clred;
end
else
begin
mbcanvas.Canvas.font.Color:=clwindowtext;
mbimage.Canvas.font.Color:=clwindowtext;
end;
mbcanvas.Canvas.TextOut(start+20*j,5+i*textHeight+2,'??');
mbimage.Canvas.TextOut(start+20*j,5+i*textHeight+2,'??');
mbcanvas.Canvas.TextOut(start+20+20*((8*rowsof8)-1)+j*chrlength,5+i*textHeight+2,'?');
mbimage.Canvas.TextOut(start+20+20*((8*rowsof8)-1)+j*chrlength,5+i*textHeight+2,'?');
end;
end;
inc(a);
end;
end;
{$ifdef net}
//no virtualquery, so no protectlabel
protectlabel.Caption:='';
{$else}
//set the protectionlabel
zeromemory(@mbi,sizeof(mbi));
Virtualqueryex(processhandle,pointer(memoryaddress),mbi,sizeof(mbi));
teststr:='AllocationProtect=';
if (mbi.AllocationProtect and PAGE_NOACCESS)>0 then teststr:=teststr+'No Access ';
if (mbi.AllocationProtect and PAGE_READONLY)>0 then teststr:=teststr+'Read Only ';
if (mbi.AllocationProtect and PAGE_READWRITE)>0 then teststr:=teststr+'Read/Write ';
if (mbi.AllocationProtect and PAGE_WRITECOPY)>0 then teststr:=teststr+'Write Copy ';
if (mbi.AllocationProtect and PAGE_EXECUTE)>0 then teststr:=teststr+'Execute ';
if (mbi.AllocationProtect and PAGE_EXECUTE_READ)>0 then teststr:=teststr+'Execute/Read only ';
if (mbi.AllocationProtect and PAGE_EXECUTE_READWRITE)>0 then teststr:=teststr+'Execute/Read/Write ';
if (mbi.AllocationProtect and PAGE_EXECUTE_WRITECOPY)>0 then teststr:=teststr+'Execute/Write Copy ';
if (mbi.AllocationProtect and PAGE_GUARD)>0 then teststr:=teststr+'Guarded ';
if (mbi.AllocationProtect and PAGE_NOCACHE)>0 then teststr:=teststr+'Not Cached';
if (formsettings<>nil) and formsettings.cbKernelOpenProcess.checked and assigned(GetPhysicalAddress) and GetPhysicalAddress(processhandle,pointer(memoryaddress),a) then
s:=teststr+' AllocationBase='+IntToHex(dword(mbi.AllocationBase),8)+' RegionSize='+IntTohex(mbi.RegionSize,1)+' Physical Address='+IntToHex(a,8)
else
s:=teststr+' AllocationBase='+IntToHex(dword(mbi.AllocationBase),8)+' RegionSize='+IntTohex(mbi.RegionSize,1);
if module1ok then
s:=s+' Module='+range1module.modulename;
protectlabel.caption:=s;
protectlabel.repaint;
{$endif}
end;
procedure TMemoryBrowser.MBCanvasMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var a: integer;
i,j: integer;
acr: dword;
bt:byte;
temp:string;
begin
if button=mbright then exit;
selecting:=false;
if selected2<>selected then selectionmade:=true;
fcontrol2.SetFocus;
hexedit.Visible:=false;
textedit.Visible:=false;
//find out if the user clicked on a byte, and if so which one
a:=20+mbimage.Canvas.TextWidth('00400000');
part:=0; //address
if x>a then
begin //didnt click on the address
part:=2; //textfield ad the left side
if x<(a+20*8*rows8) then //byteclick
begin
part:=1; //a byte
srow:=((y-7) div textheight);
scolumn:=(x-a) div 20;
i:=(srow*8*rows8)+scolumn;
//caption:=Inttohex(memoryaddress+i,8);
selected2:=memoryaddress+i;
if selected<>selected2 then exit;
//if ssLeft in shift then
with HexEdit do
begin
if visible then
begin
if length(hexedit.text)=2 then
begin
bt:=strtoint('$'+hexedit.text);
writeprocessmemory(processhandle,pointer(selected2),@bt,1,acr);
end;
end;
top:=(srow+1)*(textheight)+3;
left:=1+a+20*(scolumn);
acr:=0;
readprocessmemory(processhandle,pointer(selected2),@bt,1,acr);
if acr=1 then
begin
text:=IntToHex(bt,2);
visible:=true;
SelectAll;
SetFocus;
end else visible:=false;
end;
end
else
begin
//not on a byte click
for i:=1 to 8*rows8 do
temp:=temp+'D';
srow:=((y-7) div textheight);
i:=(x-(1+a+20*8*rows8));
scolumn:=i div mbcanvas.Canvas.TextWidth('D');
if scolumn<8*rows8 then
begin
i:=scolumn*mbcanvas.Canvas.TextWidth('D');
selected2:=scolumn+memoryaddress+(8*rows8)*srow;
if selected<>selected2 then exit;
//if ssLeft in shift then
with textedit do
begin
if visible then
begin
if length(textedit.Text)>0 then
begin
bt:=byte(textedit.Text[1]);
if (editing2) and (bt>32) then
writeprocessmemory(processhandle,pointer(selected2),@bt,1,acr);
end;
end;
textedit.top:=(srow+1)*(textheight)+3;
textedit.Left:=1+a+20*8*rows8+i; // (1+(20+mbimage.Canvas.TextWidth('00400000'))+20*8*rows8+(scolumn*mbcanvas.Canvas.TextWidth('D')) )
acr:=0;
readprocessmemory(processhandle,pointer(selected2),@bt,1,acr);
if acr=1 then
begin
if bt>32 then text:=chr(bt) else text:='';
visible:=true;
editing2:=false;
SelectAll;
SetFocus;
end else visible:=false;
end;
end;
end;
end;
end;
procedure TMemoryBrowser.MBCanvasMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var a,part,srow,scolumns,i: integer;
temp: string;
begin
a:=20+mbimage.Canvas.TextWidth('00400000');
if x>a then
begin
if x<(a+20*8*rows8) then //bytepoint
begin
mbcanvas.Cursor:=crHandpoint;
if selecting then
begin
part:=0; //address
if x>a then
begin //didnt klick on the address
part:=2; //textfield at the left side
if x<(a+20*8*rows8) then //byteclick
begin
part:=1; //a byte
srow:=((y-7) div textheight);
scolumn:=(x-a) div 20;
i:=(srow*8*rows8)+scolumn;
if selected2<>memoryaddress+i then
begin
selected2:=memoryaddress+i;
//and repaint the selected region
refreshmb;
end;
end;
end;
end;
end else
begin
mbcanvas.Cursor:=crDefault;
if selecting then
begin
//textclick?
for i:=1 to 8*rows8 do
temp:=temp+'D';
srow:=((y-7) div textheight);
i:=(x-(1+a+20*8*rows8));
scolumn:=i div mbcanvas.Canvas.TextWidth('D');
if scolumn<8*rows8 then
begin
i:=scolumn*mbcanvas.Canvas.TextWidth('D');
i:=scolumn+memoryaddress+(8*rows8)*srow;
if selected2<>i then
begin
selected2:=i;
refreshmb;
end;
end;
end;
end;
end else mbcanvas.Cursor:=crdefault;
end;
procedure TMemoryBrowser.MBCanvasDblClick(Sender: TObject);
begin
if mbcanvas.Cursor=crHandpoint then
begin
if part=1 then
begin
//edit
with Tvaluechangeform.Create(application) do
begin
address:=selected;
ShowModal;
refreshmb;
end;
end;
end;
end;
procedure TMemoryBrowser.Panel2Resize(Sender: TObject);
begin
updatedisassemblerview;
end;
procedure TMemoryBrowser.updatedisassemblerview;
{
This routine will paint the disassembler view canvas
}
var lines,i,j,k: integer;
rct: trect;
address: dword;
maddress: dword;
disassembled: string;
addressstring, bytesstring, opcodestring, specialstring:string;
descript: string;
newdselected2: integer;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -