📄 mainunit.pas
字号:
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 + -