📄 memorybrowserformunit.pas.svn-base
字号:
frmBreakpointlistunit,
savedisassemblyfrm,
{$endif}
advancedoptionsunit,
frmautoinjectunit,
formsettingsunit,
frmSaveMemoryRegionUnit,
frmLoadMemoryunit,
inputboxtopunit,
formAddToCodeList,
frmFillMemoryUnit,
frmCodecaveScannerUnit,
FoundCodeUnit,
frmFunctionListUnit,
{$ifndef net}symbolconfigunit,frmTracerUnit,Structuresfrm,dissectcodeunit,pointerscannerfrm,driverlist,ServiceDescriptorTables,{$endif}
frmDisassemblyscanunit, frmGDTunit, frmIDTunit, peINFOunit;
{$R *.DFM}
procedure TEdit2.wmMouseWheel (var Msg : TWMMouseWheel);
begin
with (parent as TMemorybrowser) do
begin
if msg.WheelDelta>0 then
memoryaddress:=memoryaddress-(8*rows8*4)
else
memoryaddress:=memoryaddress+(8*rows8*4);
refreshMB;
end;
end;
procedure TEdit3.wmMouseWheel (var Msg : TWMMouseWheel);
begin
with (parent as TMemorybrowser) do
begin
if msg.WheelDelta>0 then
disassembleraddress:=previousopcode(disassembleraddress) //up
else
disassemble(disassembleraddress); //down
updatedisassemblerview;
end;
end;
//property functions:
function TMemoryBrowser.getShowValues: boolean;
begin
result:=FShowValues;
end;
procedure TMemoryBrowser.setShowValues(newstate: boolean);
begin
Showvaluesofstaticaddresses1.checked:=newstate;
FShowValues:=newstate;
if not newstate then
begin
lastspecialwidth:=disassemblerheader.Sections[3].Width;
disassemblerheader.Sections[3].MinWidth:=0;
disassemblerheader.Sections[3].Width:=0;
disassemblerheader.Sections[3].MaxWidth:=0;
end
else
begin
disassemblerheader.Sections[3].MaxWidth:=10000;
if lastspecialwidth>0 then
disassemblerheader.Sections[3].Width:=lastspecialwidth;
disassemblerheader.Sections[3].MinWidth:=5;
end;
updatedisassemblerview;
disassemblerheaderSectionResize(disassemblerheader, disassemblerheader.Sections[3]);
end;
//^^^^
procedure TMemoryBrowser.WMGetMinMaxInfo(var Message: TMessage);
var MMInfo: ^MINMAXINFO;
begin
if panel1.visible then
begin
MMInfo:=ptr(message.LParam);
MMInfo.ptMinTrackSize:=point(340,panel1.Height+100);
end
else
begin
MMInfo:=ptr(message.LParam);
MMInfo.ptMinTrackSize:=point(340,100);
end;
end;
procedure TMemoryBrowser.UpdateBPlist;
begin
{$ifndef net}
if frmBreakpointlist<>nil then
frmBreakpointlist.updatebplist;
{$endif}
end;
procedure TMemoryBrowser.UpdateRegisterview;
begin
//removed till 3.3
end;
procedure TMemoryBrowser.UpdateRWAddress(disasm: string);
var seperator: integer;
fb: integer;
nb: integer;
address: string;
offset:dword;
begin
//find out if it is a read or write
//label1.Caption:='';
seperator:=pos(',',disasm);
if seperator>0 then
begin
fb:=pos('[',disasm);
nb:=pos(']',disasm);
if nb>fb then
begin
//if fb<seperator then label1.Font.Color:=clRed //write
// else label1.font.color:=clGreen; //read
address:=copy(disasm,fb+1,nb-fb-1);
try
offset:=getaddress(address);
except
end;
//label1.Caption:=IntToHex(offset,8);
end;
end;
end;
procedure TMemoryBrowser.Button4Click(Sender: TObject);
begin
{$ifndef net}
debuggerthread.howtocontinue:=1;
debuggerthread.stepping:=false;
memorybrowser.Caption:='Advanced - Debug:Stepping';
{$endif}
end;
procedure TMemoryBrowser.Button2Click(Sender: TObject);
begin
{$ifndef net}
debuggerthread.howtocontinue:=0;
debuggerthread.stepping:=false;
memorybrowser.Caption:='Advanced - Debug:Running';
{$endif}
end;
procedure TMemoryBrowser.Splitter1Moved(Sender: TObject);
begin
// updatememoryview;
updatedisassemblerview;
panel6.Repaint;
end;
procedure TMemoryBrowser.FormShow(Sender: TObject);
begin
updatedisassemblerview;
mbimage.Width:=0; //clear the image
mbimage.Width:=clientwidth;
RefreshMB;
{$ifdef net}
registerview.Visible:=false;
stacktrace1.Visible:=false;
breakpointlist1.Visible:=false;
threadlist1.Visible:=false;
debugstrings1.Visible:=false;
n5.Visible:=false;
memoryregions1.Visible:=false;
heaps1.Visible:=false;
n6.Visible:=false;
enumeratedllsandsymbols1.Visible:=false;
n10.visible:=false;
showsymbols1.Visible:=false;
showmoduleaddresses1.Visible:=false;
symbolhandler1.Visible:=false;
debug1.Visible:=false;
view1.Visible:=false;
scanforcodecaves1.Visible:=false;
reservememory1.Visible:=false;
fillmemory1.Visible:=false;
createthread1.Visible:=false;
n8.visible:=false;
injectdll1.visible:=false;
search1.Visible:=false;
Changestateofregisteratthislocation1.Visible:=false;
ogglebreakpoint1.Visible:=false;
n9.Visible:=false;
dissectcode1.Visible:=false;
dissectdata2.visible:=false;
disectwindow1.visible:=false;
n12.visible:=false;
dissectdata1.Visible:=false;
findstaticpointers1.Visible:=false;
n11.Visible:=true;
injectdll1.Visible:=false;
autoinject1.Visible:=true;
{$endif}
end;
procedure TMemoryBrowser.FormCreate(Sender: TObject);
begin
{
not enough time to add header supports
}
{ disassemblerheader.Visible:=false;
discanvas.Top:=discanvas.top-disassemblerheader.Height;
discanvas.Height:=discanvas.Height+disassemblerheader.Height;
//ronresize isn't repainting correctly }
{^^^^}
disassembler:=true;
dselected2:=$ffffffff;
fcontrol1:=tedit3.create(self);
fcontrol1.width:=0;
fcontrol1.Height:=0;
fcontrol1.parent:=self;
fcontrol1.OnEnter:=FControl1Enter;
fcontrol1.onexit:=FControl1Exit;
fcontrol1.onKeydown:=FControl1keydown;
fcontrol1.onkeypress:=FControl1keypress;
fcontrol1.PopupMenu:=mainform.emptypopup;
fcontrol1.sendtoback;
fcontrol2:=tedit2.create(self);
fcontrol2.Width:=0;
fcontrol2.Height:=0;
fcontrol2.parent:=self;
fcontrol2.OnEnter:=FControl2Enter;
fcontrol2.onexit:=FControl2Exit;
fcontrol2.onKeydown:=FControl2keydown;
fcontrol2.onkeypress:=FControl2keypress;
fcontrol2.PopupMenu:=mainform.emptypopup;
fcontrol2.SendToBack;
bytestoshow:=3;
disassembleraddress:=$00400000; //debug
MBImage:=TBitmap.Create;
MBImage.Canvas.Brush.Color:=clBtnFace;
MBImage.Width:=mbcanvas.Width*3;
MBImage.Height:=MBCanvas.Height*3;
MBImage.Canvas.Font.Name:='Courier';
textheight:=MBImage.Canvas.TextHeight('||||');
bytelength:=MBImage.Canvas.TextWidth(' ');
chrlength:=MBImage.Canvas.TextWidth(' ');
DisImage:=TBitmap.create;
DisImage.Canvas.Brush.Color:=clBtnFace;
DisImage.Width:=1024; //there's no way that the text ever goes over this
DisImage.Height:=MBCanvas.Height+textheight+10;
DisImage.Canvas.Font.Name:='Courier';
memoryaddress:=$00400000;
memorylabelcount:=0;
Highlightcolor:=clHighlight;
disassemblerHistory:=TStringList.create;
memorybrowserHistory:=TStringList.create;
assemblerHistory:=TStringList.create;
backlist:=TStack.create;
showvalues:=true;
end;
procedure TMemoryBrowser.Goto1Click(Sender: TObject);
var newaddress: string;
canceled: boolean;
begin
panel4.setfocus;
newaddress:=inputboxtop('Goto Address','Fill in the address you want to go to',IntTohex(memoryaddress,8),true,canceled,memorybrowserHistory);
memoryaddress:=getaddress(newaddress);
fcontrol2.SetFocus;
RefreshMB;
end;
procedure TMemoryBrowser.FormResize(Sender: TObject);
begin
mbimage.Width:=0;
mbimage.height:=0;
mbimage.Width:=mbcanvas.Width;
mbimage.Height:=mbcanvas.Height;
refreshmb;
updatedisassemblerview;
end;
procedure TMemoryBrowser.MemoryLabelClick(Sender: TObject);
var address: dword;
begin
address:=memoryaddress+(sender as TLabel).Tag;
showmessage(inttohex(address,8));
end;
procedure TMemoryBrowser.MBCanvasPaint(Sender: TObject);
var cr: Trect;
begin
cr:=mbcanvas.Canvas.ClipRect;
mbcanvas.Canvas.CopyRect(cr,mbimage.Canvas,cr);
end;
procedure TMemoryBrowser.Timer2Timer(Sender: TObject);
begin
if Visible then
begin
refreshMB;
updatedisassemblerview;
//refresh the modulelist
lastmodulelistupdate:=(lastmodulelistupdate+1) mod 10;
if lastmodulelistupdate=0 then
symhandler.loadmodulelist;
end;
end;
procedure TMemoryBrowser.RefreshMB;
var i: integer;
j,k: integer;
currentaddress: string[8];
bts: string[2];
start: integer;
stop: integer;
needed: integer;
available: integer;
rowsof8: integer;
teststr: string;
p: pchar;
a: int64;
range1ok: boolean;
range1start: dword;
range1length: dword;
range2ok: boolean;
range2start: dword;
range2length: dword;
buffer: array of byte;
bt: byte;
bytesread: dword;
rct: Trect;
mbi : _MEMORY_BASIC_INFORMATION;
range1module: tmoduleinfo;
range2module: tmoduleinfo;
module1ok,module2ok: boolean;
s: string;
selstart,selstop: integer;
begin
//find the address in the module list
if selected<=selected2 then
begin
selstart:=selected;
selstop:=selected2;
end
else
begin
selstart:=selected2;
selstop:=selected;
end;
k:=0;
MBCanvas.Canvas.Font:=MBImage.Canvas.Font;
if length(addressestext)<((mbcanvas.Height-5) div (TextHeight))+2 then //resync
begin
setlength(addressestext,0);
setlength(addressestext,((mbcanvas.Height-5) div (TextHeight))+2);
setlength(memorystring,0);
setlength(memorystring,((mbcanvas.Height-5) div (TextHeight))+2);
end;
start:=20+mbimage.Canvas.TextWidth('00400000');
rowsof8:=0;
needed:=0;
available:=mbcanvas.Width-(start+20*rowsof8)-mbimage.Canvas.TextWidth('??');
while available>(needed) do
begin
inc(rowsof8);
teststr:='';
for i:=1 to rowsof8 do teststr:=teststr+'????????';
needed:=10+mbcanvas.Canvas.TextWidth(teststr);
available:=mbcanvas.Width-(start+20*((8*rowsof8)-1))-mbcanvas.Canvas.TextWidth('??');
end;
dec(rowsof8);
rows8:=rowsof8;
if length(memorytext)<8*rowsof8 then
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -