📄 memorybrowserformunit.pas
字号:
if disassemblerlines[i].address=debuggerthread2.breakpoints[j] then
begin
disimage.Canvas.Brush.Color:=clRed;
discanvas.Canvas.Brush.Color:=clRed;
disimage.Canvas.font.Color:=clBlack;
discanvas.Canvas.font.Color:=clBlack;
break; //get out of this for loop
end;
end;
if (debuggerthread<>nil) and (debuggerthread.userisdebugging) then
begin
for j:=0 to length(debuggerthread.userbreakpoints)-1 do
if disassemblerlines[i].address=debuggerthread.userbreakpoints[j] then
begin
disimage.Canvas.Brush.Color:=clRed;
discanvas.Canvas.Brush.Color:=clRed;
disimage.Canvas.font.Color:=clBlack;
discanvas.Canvas.font.Color:=clBlack;
break; //get out of this for loop
end;
for j:=0 to length(debuggerthread.int3userbreakpoints)-1 do
if disassemblerlines[i].address=debuggerthread.int3userbreakpoints[j].address then
begin
disimage.Canvas.Brush.Color:=clRed;
discanvas.Canvas.Brush.Color:=clRed;
disimage.Canvas.font.Color:=clBlack;
discanvas.Canvas.font.Color:=clBlack;
break; //get out of this for loop
end;
end;
{$endif}
rct.Left:=0;
rct.Right:=discanvas.Width;
rct.Top:=i*(textheight+2);
rct.Bottom:=rct.top+textheight+1;
discanvas.Canvas.FillRect(rct);
disimage.Canvas.FillRect(rct);
discanvas.Canvas.TextOut(8,i*(textHeight+2),disassemblerlines[i].disassembled);
disimage.Canvas.TextOut(8,i*(textHeight+2),disassemblerlines[i].disassembled);
discanvas.Canvas.font.color:=clWindowText;
disimage.Canvas.font.Color:=clWindowText;
discanvas.Canvas.Brush.color:=clBtnFace;
disimage.Canvas.Brush.color:=clBtnFace;
break;
end;
end;
//if it isn't found it propably has already been overwritten (and a big bug btw...)
dselected:=disassemblerlines[line].address;
discanvas.Canvas.Brush.Color:=Highlightcolor;
disimage.Canvas.Brush.Color:=Highlightcolor;
discanvas.Canvas.font.color:=clHighlightText;
disimage.Canvas.font.Color:=clHighlightText;
rct.Left:=0;
rct.Right:=discanvas.Width;
rct.Top:=line*(textheight+2);
rct.Bottom:=rct.top+textheight+1;
{$ifndef net}
if (debuggerthread2<>nil) and (disassemblerlines[i].address<>0) then
begin
for j:=0 to 3 do
if disassemblerlines[line].address=debuggerthread2.breakpoints[j] then
begin
disimage.Canvas.Brush.Color:=clRed;
discanvas.Canvas.Brush.Color:=clRed;
disimage.Canvas.font.Color:=clBlack;
discanvas.Canvas.font.Color:=clBlack;
break; //get out of this for loop
end;
end;
if (debuggerthread<>nil) and (debuggerthread.userisdebugging) then
begin
for j:=0 to length(debuggerthread.userbreakpoints)-1 do
if disassemblerlines[line].address=debuggerthread.userbreakpoints[j] then
begin
disimage.Canvas.Brush.Color:=clGreen;
discanvas.Canvas.Brush.Color:=clGreen;
disimage.Canvas.font.Color:=clWhite;
discanvas.Canvas.font.Color:=clWhite;
break; //get out of this for loop
end;
for j:=0 to length(debuggerthread.int3userbreakpoints)-1 do
if disassemblerlines[line].address=debuggerthread.int3userbreakpoints[j].address then
begin
disimage.Canvas.Brush.Color:=clGreen;
discanvas.Canvas.Brush.Color:=clGreen;
disimage.Canvas.font.Color:=clWhite;
discanvas.Canvas.font.Color:=clWhite;
break; //get out of this for loop
end;
end;
{$endif}
discanvas.Canvas.FillRect(rct);
disimage.Canvas.FillRect(rct);
discanvas.Canvas.TextOut(8,line*(textHeight+2),disassemblerlines[line].disassembled);
disimage.Canvas.TextOut(8,line*(textHeight+2),disassemblerlines[line].disassembled);
discanvas.Canvas.font.color:=clWindowText;
disimage.Canvas.font.Color:=clWindowText;
discanvas.Canvas.Brush.color:=clBtnFace;
disimage.Canvas.Brush.color:=clBtnFace;
end;
//now update the RWAddress
UpdateRWAddress(disassemblerlines[line].disassembled);
updatedisassemblerview;
end;
procedure TMemoryBrowser.ScrollBar1Change(Sender: TObject);
begin
//disassembleraddress:=dword(ScrollBar1.Position+2147483648);
updatedisassemblerview;
end;
procedure TMemoryBrowser.ScrollBar1Scroll(Sender: TObject;
ScrollCode: TScrollCode; var ScrollPos: Integer);
var x: integer;
found: boolean;
temp: string;
begin
case scrollcode of
scLineUp: disassembleraddress:=previousopcode(disassembleraddress);
scLineDown:
begin
found:=false;
for x:=0 to numberofaddresses-1 do
if disassembleraddress<>disassemblerlines[x].address then
begin
disassembleraddress:=disassemblerlines[x].address;
found:=true;
break;
end;
if not found then //disassemble
disassemble(disassembleraddress,temp);
end;
scPageDown:
begin
if disassemblerlines[numberofaddresses-1].address=disassembleraddress then
begin
for x:=0 to numberofaddresses-1 do
disassemble(disassembleraddress,temp);
end
else disassembleraddress:=disassemblerlines[numberofaddresses-1].address;
end;
scPageUp: for x:=0 to numberofaddresses-2 do
disassembleraddress:=previousopcode(disassembleraddress); //go 'numberofaddresses'-1 times up
end;
scrollpos:=50; //i dont want the slider to work 100%
updatedisassemblerview;
fcontrol1.SetFocus;
end;
procedure TMemoryBrowser.ScrollBar1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
fcontrol1.SetFocus;
end;
procedure TMemoryBrowser.ScrollBar1Enter(Sender: TObject);
begin
fcontrol1.SetFocus;
end;
procedure TMemoryBrowser.memorypopupPopup(Sender: TObject);
begin
goto1.Visible:=true;
change1.Visible:=(mbcanvas.Cursor=crHandpoint);
// if part=0 then ...
end;
procedure TMemoryBrowser.Replacewithnops1Click(Sender: TObject);
var codelength: integer;
written: dword;
bla:string;
i: integer;
nops: array of byte;
a: dword;
original: dword;
mbi : _MEMORY_BASIC_INFORMATION;
//set the protectionlabel
begin
//search dselected in the addresslist
a:=dselected;
disassemble(a,bla);
codelength:=a-dselected;
if advancedoptions.AddToCodeList(dselected,codelength,true) then
begin
setlength(nops,codelength);
for i:=0 to codelength-1 do
nops[i]:=$90; //$90=nop
zeromemory(@mbi,sizeof(mbi));
Virtualqueryex(processhandle,pointer(dselected),mbi,sizeof(mbi));
// get old security and set new security (not needed in win9x but nt doesnt even allow writeprocessmemory to do this
original:=0;
RewriteCode(processhandle,dselected,@nops[0],codelength);
refreshMB;
updatedisassemblerview;
end;
end;
procedure TMemoryBrowser.Panel4Enter(Sender: TObject);
begin
// fcontrol2.SetFocus;
end;
procedure TMemoryBrowser.Panel4MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
fcontrol2.SetFocus;
end;
procedure TMemoryBrowser.FControl2KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case key of
vk_up : begin
dec(memoryaddress,8*rows8);
refreshmb;
end;
vk_down : begin
inc(memoryaddress,8*rows8);
refreshmb;
end;
vk_left : begin
dec(memoryaddress);
refreshmb;
end;
vk_right : begin
inc(memoryaddress);
refreshmb;
end;
vk_prior : begin
dec(memoryaddress,8*rows8*((mbcanvas.Height-5) div (TextHeight)-1));
refreshMB;
end;
vk_next : begin
inc(memoryaddress,8*rows8*((mbcanvas.Height-5) div (TextHeight)-1));
refreshMB;
end;
{$ifndef net}
ord('F') : begin
if findwindow=nil then findwindow:=Tfindwindow.create(self);
findwindow.firstscan:=true;
findwindow.showmodal;
end;
{$endif}
ord('G') : begin
if ssCtrl in shift then goto1.click;
end;
{$ifndef net}
vk_f3 : begin
if findwindow<>nil then //easy way to find out if there was a scan before
begin
findwindow.editStart.Text:=inttohex(memoryaddress+1,8);
findwindow.firstscan:=false;
end;
findwindow.showmodal;
end;
{$endif}
end;
key:=0;
end;
procedure TMemoryBrowser.FControl2KeyPress(Sender: TObject; var Key: Char);
begin
key:=chr(0);
end;
procedure TMemoryBrowser.FControl2Enter(Sender: TObject);
begin
// panel4.bevelinner:=bvLowered;
// mbcanvas.Canvas.DrawFocusRect(rect(0,0,100,100));
end;
procedure TMemoryBrowser.FControl2Exit(Sender: TObject);
begin
panel4.BevelInner:=bvNone;
// RefreshMB;
end;
procedure TMemoryBrowser.FControl1Enter(Sender: TObject);
begin
Highlightcolor:=clHighlight;
updatedisassemblerview;
end;
procedure TMemoryBrowser.FControl1Exit(Sender: TObject);
begin
Highlightcolor:=clInactiveCaption;
updatedisassemblerview;
end;
procedure TMemoryBrowser.Panel2MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
fcontrol1.SetFocus;
end;
procedure TMemoryBrowser.Button4MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
fcontrol1.SetFocus;
end;
procedure TMemoryBrowser.Button6MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
fcontrol1.SetFocus;
end;
procedure TMemoryBrowser.Button7MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
fcontrol1.SetFocus;
end;
procedure TMemoryBrowser.Panel5MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
fcontrol1.SetFocus;
end;
//key control for the disassembler
procedure TMemoryBrowser.FControl1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var rct: trect;
ignore: string;
i: integer;
begin
case key of
vk_delete : Replacewithnops1.Click;
vk_up : begin
dselected:=previousopcode(dselected);
if dselected<disassembleraddress then disassembleraddress:=dselected;
end;
vk_down : begin
disassemble(dselected);
if dselected>(disassemblerlines[(Discanvas.Height) div (textheight+2)-1].address) then
disassemble(disassembleraddress);
end;
vk_left : dec(disassembleraddress);
vk_right : inc(disassembleraddress);
vk_prior : begin
if dselected>disassemblerlines[0].address then dselected:=disassemblerlines[0].address else
begin
for i:=0 to numberofaddresses-2 do
disassembleraddress:=previousopcode(disassembleraddress); //go 'numberofaddresses'-1 times up
dselected:=0;
updatedisassemblerview;
dselected:=disassemblerlines[0].address;
end;
end;
vk_next : begin
if dselected<disassemblerlines[numberofaddresses-1].address then dselected:=disassemblerlines[numberofaddresses-1].address else
begin
disassembleraddress:=disassemblerlines[numberofaddresses-1].address;
dselected:=0;
updatedisassemblerview;
dselected:=disassemblerlines[numberofaddresses-1].address;
end;
end;
vk_return : begin
//assembler input
assemble1.Click;
end;
ORD('A')..ORD('Z') , ORD('0')..ORD('9'):
begin
if key=ORD('G') then
begin
if ssCtrl in shift then
begin
gotoaddress1.Click;
updatedisassemblerview;
exit;
end;
end;
assemblepopup(lowercase(chr(key)));
end;
end;
updatedisassemblerview;
key:=0;
end;
procedure TMemoryBrowser.FControl1KeyPress(Sender: TObject; var Key: Char);
begin
key:=chr(0);
end;
procedure TMemoryBrowser.Panel5Resize(Sender: TObject);
begin
bytestoshow:=(discanvas.Width-360) div bytelength;
end;
procedure TMemoryBrowser.Gotoaddress1Click(Sender: TObject);
var newaddress: string;
symbol :PImagehlpSymbol;
oldoptions: dword;
begin
newaddress:=inputbox('Goto Address','Fill in the address you want to go to',IntTohex(disassembleraddress,8));
try
DisassemblerAddress:=symhandler.getaddressfromname(newaddress);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -