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

📄 memorybrowserformunit.pas

📁 冒险岛吸怪源码UCE的制作材料 用于冒险岛游戏的外挂
💻 PAS
📖 第 1 页 / 共 5 页
字号:
            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 + -