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

📄 mainunit.pas

📁 冒险岛吸怪源码UCE的制作材料 用于冒险岛游戏的外挂
💻 PAS
📖 第 1 页 / 共 5 页
字号:

end;

procedure TMainForm.hotkey(var Message: TMessage); //stays because the old hotkeyhandler is still used in some places
var x: TDevMode;
    i: integer;
    c: integer;
begin
  if ((hotkeyform<>nil) and (hotkeyform.Visible)) or ((formhotkey<>nil) and (formhotkey.visible)) then exit;

  if Message.wparam=0 then
  begin
    //bring to front
    try
      unregisterhotkey(mainform.handle,0);

    if advancedoptions.Pausebutton.Down then
    begin
      beep;
      sleep(100);
      beep;
      sleep(100);
      beep;
      sleep(100);
      exit;
    end;

    beep;

    if formsettings.cbHideAllWindows.checked then
    begin
      ToggleWindow;

//      ToggleOtherWindows;

      if formsettings.cbCenterOnPopup.checked then
        if not allwindowsareback then
          setwindowpos(mainform.Handle,HWND_NOTOPMOST,(screen.Width div 2)-(mainform.Width div 2),(screen.Height div 2)-(mainform.height div 2),mainform.Width,mainform.Height,SWP_NOZORDER or SWP_NOACTIVATE);

      if not allwindowsareback then application.BringToFront else
      begin
        setforegroundwindow(lastforeground);
     //   setactivewindow(lastactive);
      end;

      adjustbringtofronttext;
      exit;
    end;


   // if length(windowlist)<>0 then
    application.BringToFront;

    if formsettings.cbCenterOnPopup.checked then
      setwindowpos(mainform.Handle,HWND_NOTOPMOST,(screen.Width div 2)-(mainform.Width div 2),(screen.Height div 2)-(mainform.height div 2),mainform.Width,mainform.Height,SWP_NOZORDER or SWP_NOACTIVATE);

    formstyle:=fsStayOnTop;

    finally
      registerhotkey(mainform.handle,0,message.lparamlo,message.LParamHi); //restore the hotkey
    end;
  end;


  if message.WParam=2 then //toggle speedhack
  begin
    try
      unregisterhotkey(mainform.handle,2);
      if cbSpeedhack.Enabled then
      begin
        beep;
        cbSpeedhack.checked:=not cbSpeedhack.Checked;
      end;
    finally
      registerhotkey(mainform.handle,2,message.lparamlo,message.LParamHi); //restore the hotkey
    end;

  end;

  if message.WParam>=10 then //it's a record with a hotkey
  begin
    for i:=0 to numberofrecords-1 do
    begin //find the record
      if message.WParam=hotkeys[i] then
      begin
        if memrec[i].VarType=255 then
        begin
          if memrec[i].Frozen then
            disableautoassemblecheat(i)
          else
            enableautoassemblecheat(i);
          updatescreen;
          exit;
        end;

        //set the value to what it was when the hotkey got set
        hotkeypressed:=i;
        memrec[i].Frozen:=true;
        FreezeThem;
        memrec[i].Frozen:=false;
        hotkeypressed:=-1;
        exit;
      end;
    end;
  end;
end;
//----------------------------------

procedure TMainform.EnableGui;
var i: integer;
    fname,expectedfilename: string;
begin
  if newscan.Caption=strNewScan then newscan.click;
  //-------------NEW SCAN


  foundlabel.Caption:='0';
  foundlist2.Clear;

  newscan.Caption:=strFirstScan;

  Groupbox1.Enabled:=true;
  for i:=0 to groupbox1.ControlCount-1 do
    groupbox1.Controls[i].Enabled:=true;

  scanvalue.Enabled:=true;
  newscan.Enabled:=true;
  nextscanbutton.Enabled:=false;
  vartype.Enabled:=true;
  scantype.Enabled:=true;
  scantext.enabled:=true;
  label4.enabled:=true;
  label8.Enabled:=true;
  HexadecimalCheckbox.Enabled:=true;
  cbCaseSensitive.Enabled:=true;

  scanvalue.visible:=true;
  scantext.Visible:=true;
  scanvalue.text:='';


  Updatescantype;
  Scantype.ItemIndex:=0;

  //-----------------------
  //Get the expectedFilename
  //-----------------------
  if (savedialog1.Filename='') or (opendialog1.Filename='') then
  begin
    Fname:=copy(processlabel.caption,pos('-',processlabel.caption)+1,length(processLabel.caption));

    if FName[length(FName)-3]='.' then  //it's a filename
      expectedFilename:=copy(FName,1,length(FName)-4)
    else //it's a normal title;
      expectedFilename:=FName;

    savedialog1.FileName:=expectedFilename;
    Opendialog1.FileName:=expectedFilename;
  end;

  cbspeedhack.enableD:=true;
  cbunrandomizer.Enabled:=true;
end;

procedure TMainform.toggleWindow;
resourcestring
  strWindowFailedToHide='A window failed to hide';
var c: integer;
begin
  togglewindows:=TTogglewindows.Create(false);
  c:=0;
  while togglewindows<>nil do
  begin
    if c=500 then
    begin
      togglewindows.free;
      raise exception.Create(strWindowFailedToHide);
    end;
    sleep(10);
    inc(c);
  end;
end;

procedure TMainForm.ReserveMem;
begin
  setlength(memrec,numberofrecords);
  setlength(frozenfvalue,numberofrecords);
  setlength(frozenStrings,numberofrecords);
  setlength(frozenbytes,NumberOfRecords);
  setlength(selected,numberofrecords);
  setlength(hotkeystrings,NumberOfRecords);
  setlength(Hotkeys,numberofrecords);
end;


procedure TMainform.setfoundlisthorizontal;
begin
//removed
end;

procedure TMainform.exceptionhandler(Sender: TObject; E: Exception);
begin

  if (E.Message='Error creating window device context') then exit;
  screen.Cursor:=crdefault;
  closefile(addressfile);
  closefile(memoryfile);
  closefile(newAddressfile);
  closefile(newmemoryfile);
  Application.ShowException(E);
end;

procedure TMainForm.freedebugger;
begin
  //the debugger says the process has ended, or the thread has stopped
  debuggerthread:=nil;
//  processhandle:=0;
 // processid:=0;
  advancedoptions.Pausebutton.Down:=false;
end;


procedure TMainform.SetReadWriteBreakpoint(address: dword; size: dword);
var mbi: _Memory_Basic_Information;
    i: integer;
    ct: _context;
    regsinuse: integer;
    olda,olds: dword;
    dr: dword;

procedure Set4bytebreak;
begin
  case regsinuse of
    0: begin
         ct.dr0:=address;
         ct.dr7:=ct.dr7 or reg0set or reg0rw or debugexact or reg0len4;
       end;

    1: begin
         ct.dr1:=address;
         ct.dr7:=ct.Dr7 or reg1set or reg1rw or debugexact or reg1len4;
       end;

    2: begin
         ct.Dr2:=address;
         ct.dr7:=ct.dr7 or reg2set or reg2rw or debugexact or reg2len4;
       end;

    3: begin
         ct.Dr3:=address;
         ct.dr7:=ct.dr7 or reg3set or reg3rw or debugexact or reg3len4;
       end;
  end;

  inc(address,4);
  dec(size,4);
  inc(regsinuse);
end;

procedure Set2bytebreak;
begin
  case regsinuse of
    0: begin
         ct.dr0:=address;
         ct.dr7:=ct.dr7 or reg0set or reg0rw or debugexact or reg0len2;
       end;

    1: begin
         ct.dr1:=address;
         ct.dr7:=ct.Dr7 or reg1set or reg1rw or debugexact or reg1len2;
       end;

    2: begin
         ct.Dr2:=address;
         ct.dr7:=ct.dr7 or reg2set or reg2rw or debugexact or reg2len2;
       end;

    3: begin
         ct.Dr3:=address;
         ct.dr7:=ct.dr7 or reg3set or reg3rw or debugexact or reg3len2;
       end;
  end;

  inc(address,2);
  dec(size,2);
  inc(regsinuse);
end;

procedure Set1bytebreak;
begin
  case regsinuse of
    0: begin
         ct.dr0:=address;
         ct.dr7:=ct.dr7 or reg0set or reg0rw or debugexact;
       end;

    1: begin
         ct.dr1:=address;
         ct.dr7:=ct.Dr7 or reg1set or reg1rw or debugexact;
       end;

    2: begin
         ct.Dr2:=address;
         ct.dr7:=ct.dr7 or reg2set or reg2rw or debugexact;
       end;

    3: begin
         ct.Dr3:=address;
         ct.dr7:=ct.dr7 or reg3set or reg3rw or debugexact;
       end;
  end;

  inc(address);
  dec(size);
  inc(regsinuse);
end;

resourcestring
  strAccessed='The following opcodes accessed the selected address';

var rd: dword;
    tmp: byte;
    ths: thandle;
    th: thandle;
    tE: threadentry32;
begin
  //check if you can read address to address+size
  if not (formsettings.rbDebugRegisters.checked or formsettings.cbKDebug.checked) then
  begin
    readprocessmemory(processhandle,pointer(address),@tmp,1,rd);
    if rd<>1 then raise exception.Create(strAddressHasToBeReadable);
  end;

  if foundcodedialog<>nil then raise exception.Create('The debugger is already trying to find out what reads,writes or accesses a certain address. First close the other window');
  if debuggerthread2<>nil then raise exception.create('Please stop any other debugger option before enabling this option');

  foundcodedialog:=TFoundcodedialog.create(self);
  foundcodedialog.Caption:=strAccessed;
  foundcodedialog.btnOK.caption:=strStop;

  if (formsettings.cbKdebug.checked) and (debuggerthread=nil) then
    if not DebugProcess(processid,address,size,3) then raise exception.Create(strFailedToInitialize);

  olda:=address;
  olds:=size;
  zeromemory(@ct,sizeof(ct));
  ct.ContextFlags:=CONTEXT_DEBUG_REGISTERS;

  //configure the debugregs
  if formsettings.rbDebugRegisters.checked or formsettings.cbKDebug.checked then
  begin
    foundcodedialog.useexceptions:=false;
    regsinuse:=0;
    ct.dr7:=0;
    while (regsinuse<4) and (size>0) do
    begin
      if size>=4 then
      begin
        if (address mod 4)>0 then
        begin
          if (address mod 2)>0 then
          begin
            set1bytebreak; //watch on a byte
            continue;
          end
          else
          begin
            set2bytebreak;
            continue;
          end;
        end
        else
        begin
          set4bytebreak;
          continue;
        end;
      end;

      if size>=2 then
      begin
        if (address mod 2)>0 then
        begin
          set1bytebreak; //watch on a byte
          continue;
        end
        else
        begin
          set2bytebreak;
          continue;
        end;
      end;


      if size=1 then
        set1bytebreak;
    end;

    //ct.dr7:=$D0303;
    if formsettings.cbKdebug.Checked and (debuggerthread=nil) then
    begin
      DebuggerThread2:=TDebugEvents.Create(true);
      debuggerthread2.debugregs:=ct;

      for i:=0 to length(debuggerthread2.threadlist)-1 do
      begin
        suspendthread(debuggerthread2.threadlist[i]);
        SetThreadContext(debuggerthread2.threadlist[i],debuggerthread2.debugregs);
        resumethread(debuggerthread2.threadlist[i]);
      end;

      debuggerthread2.Resume;
    end
    else
    begin
      debuggerthread.DRRegs:=ct;

      debuggerthread.Suspend;
      for i:=0 to length(debuggerthread.threadlist)-1 do
      begin
        suspendthread(debuggerthread.threadlist[i][1]);
        SetThreadContext(debuggerthread.threadlist[i][1],debuggerthread.DRRegs);
        resumethread(debuggerthread.threadlist[i][1]);
      end;

      debuggerthread.FindWriter2:=true;
      debuggerthread.Resume;
    end;
  end
  else
  begin
   //dont use debug regs
    foundcodedialog.useexceptions:=true;
    virtualqueryEx(processhandle,pointer(address),mbi,sizeof(mbi));

    debugger.DebuggerThread.findreader.pagebase:=dword(mbi.BaseAddress);
    debugger.DebuggerThread.findreader.pagesize:=dword(mbi.RegionSize);
    debugger.DebuggerThread.findreader.Address:=address;
    debugger.DebuggerThread.findreader.size:=size;
    DebuggerThread.findreaderset:=true;
    DebuggerThread.alsowrites:=true;

    VirtualProtectEx(processhandle,pointer(address),size,PAGE_NOACCESS,debugger.DebuggerThread.findreader.originalprotection);
  end;

  foundcodedialog.show;
end;


procedure TMainform.SetReadBreakpoint(address: dword; size: dword);
var mbi: _Memory_Basic_Information;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -