📄 memorybrowserformunit.pas.svn-base
字号:
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;
delta: integer;
i: integer;
begin
if scrollcode=sctrack then
begin
delta:=scrollpos-50;
//caption:=inttostr(delta);
if delta>0 then
begin
for i:=0 to delta do
ScrollBar1Scroll(Sender,scLineDown, scrollpos);
end
else
begin
for i:=delta to 0 do
ScrollBar1Scroll(Sender,scLineUp, scrollpos);
end;
end;
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);
var i: short;
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
i:=getkeystate(vk_control);
if i<=-127 then search1.OnClick(self);
end;
{$endif}
ord('G') : begin
if ssCtrl in shift then goto1.click;
end;
ord('C') : begin
if getkeystate(vk_control)<=-127 then
Cut1.OnClick(self);
end;
ord('V') : begin
if getkeystate(vk_control)<=-127 then
Pastefromclipboard1.OnClick(self);
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;
a,b: dword;
begin
//if shift is not pressed and it's a up,down,left or right, then disable multiline section
if (key in [vk_up,vk_down,vk_left,vk_right]) then
begin
if (not (ssShift in shift)) then
dselected2:=$ffffffff
else
if dselected2=$ffffffff then
dselected2:=dselected; //dslected 2 now contains the start
end;
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;
vk_space:
begin
if shift=[] then
follow1.Click
else
if shift = [ssShift] then
back1.click;
end;
VK_BACK:
begin
back1.click; //backspace and shift+space
end;
ORD('A')..ORD('Z') , ORD('0')..ORD('9'):
begin
if key=ORD('C') then
begin
if shift = [ssCtrl] then //ctrl C
begin
//open the copy window asking what exactly to copy
with tfrmSavedisassembly.create(self) do
begin
if dselected>dselected2 then
begin
a:=dselected2;
b:=dselected;
end
else
begin
a:=dselected;
b:=dselected2;
end;
if a=$ffffffff then a:=b;
if b=$ffffffff then b:=a;
disassemble(b); //b gets increased with size of selected instruction
edit1.Text:=inttohex(a,8);
edit2.Text:=inttohex(b,8);
copymode:=true;
showmodal;
free;
exit;
end;
end;
end;
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -