⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memorybrowserformunit.pas.svn-base

📁 这是一段游戏修改工具的源代码.ring3功能由dephi开发,驱动是C开发.希望对大家有帮助
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
  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 + -