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

📄 memorybrowserformunit.pas.svn-base

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