Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
actions-user committed Oct 28, 2023
2 parents a165e1d + 647e16b commit 7fb693a
Show file tree
Hide file tree
Showing 15 changed files with 885 additions and 665 deletions.
9 changes: 7 additions & 2 deletions Cheat Engine/CEFuncProc.pas
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,8 @@ implementation
frmProcessWatcherUnit, KernelDebugger, formsettingsunit, MemoryBrowserFormUnit,
savedscanhandler, networkInterface, networkInterfaceApi, vartypestrings,
processlist, Parsers, Globals, xinput, luahandler, LuaClass, LuaObject,
UnexpectedExceptionsHelper, LazFileUtils, autoassembler, Clipbrd, mainunit2, cpuidUnit, OpenSave;
UnexpectedExceptionsHelper, LazFileUtils, autoassembler, Clipbrd, mainunit2,
cpuidUnit, OpenSave, GDBServerDebuggerInterface, DebuggerInterfaceAPIWrapper;


resourcestring
Expand Down Expand Up @@ -2798,7 +2799,11 @@ function rewritedata(processhandle: thandle; address:ptrUint; buffer: pointer; v
v:=VirtualProtectEx(processhandle, pointer(address),size,PAGE_READWRITE,original);
if v then
begin
result:=writeprocessmemory(processhandle,pointer(address),buffer,size,s);
if (CurrentDebuggerInterface is TGDBServerDebuggerInterface) and GDBWriteProcessMemoryCodeOnly then
TGDBServerDebuggerInterface(CurrentDebuggerInterface).writeBytes(address, buffer,size)
else
result:=writeprocessmemory(processhandle,pointer(address),buffer,size,s);

result:=result or VirtualProtectEx(processhandle, pointer(address),size,original,a);
end;
ntresumeProcess(processhandle);
Expand Down
10 changes: 10 additions & 0 deletions Cheat Engine/LuaHandler.pas
Original file line number Diff line number Diff line change
Expand Up @@ -16046,6 +16046,14 @@ function lua_syncSymbolsNow(L: Plua_State): integer; cdecl;
result:=0;
end;

function lua_setThreadSafetyCheck(L: Plua_State): integer; cdecl;
begin
if lua_gettop(L)>=1 then
threadsafetycheck:=lua_toboolean(L,1);

result:=0;
end;

procedure InitLimitedLuastate(L: Plua_State);
begin
//don't put functioncallback events in here, as limited luastates can be destroyed
Expand Down Expand Up @@ -16206,6 +16214,8 @@ procedure InitLimitedLuastate(L: Plua_State);

lua_register(L, 'syncSymbolsNow',lua_syncSymbolsNow);

lua_register(L, 'setThreadSafetyCheck', lua_setThreadSafetyCheck);


initializeLuaNetworkInterface(L);

Expand Down
15 changes: 14 additions & 1 deletion Cheat Engine/LuaObject.pas
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ function lua_setProperty(L: PLua_state): integer; cdecl;

implementation

uses LuaClass, LuaHandler, pluginexports, LuaCaller, symbolhandler;
uses LuaClass, LuaHandler, pluginexports, LuaCaller, symbolhandler, LCLClasses, globals;

resourcestring
rsThisIsAnInvalidClassOrMethodProperty = 'This is an invalid class or method property';
Expand Down Expand Up @@ -248,6 +248,19 @@ function lua_setProperty(L: PLua_state): integer; cdecl;
c:=pointer(StrToInt64(p));
end;


if threadsafetycheck and (c is TLCLComponent) then
begin
if GetCurrentThreadId<>MainThreadID then
begin
p:='';
v:='';
lua_pushstring(L, 'Error: GUI Control access outside of main thread ('+tcomponent(c).Name+':'+c.ClassName+')');
lua_error(L);
end;
end;


p:=Lua_ToString(L, 2);
v:=Lua_ToString(L, 3);

Expand Down
9 changes: 9 additions & 0 deletions Cheat Engine/MainUnit.pas
Original file line number Diff line number Diff line change
Expand Up @@ -3252,6 +3252,15 @@ procedure TMainForm.openProcessEpilogue(oldprocessname: string; oldprocess: dwor
SaveCurrentState(PScanState(scantablist.TabData[i]),true);


{$ifdef darwin}
if formsettings.cbAttachDebuggerToRosettaOnProcessOpen.checked and isProcessTranslated(processid) then
begin
if (formsettings.cbaskToAttachToRosetta.Checked=false) or (MessageDlg('The selected process is running under Rosetta. To be able to edit programcode the debugger needs to be attached. Attach the debugger now?', mtConfirmation, [mbyes,mbno],0)=mryes) then
startdebuggerifneeded(false);
end;
{$endif}


outputdebugstring('openProcessEpilogue exit');

// miDotNET.visible:=symhandler.hasDotNetAccess; //too slow to use. You're free to uncomment it but don't bitch about having to wait 2 and a half hour
Expand Down
30 changes: 28 additions & 2 deletions Cheat Engine/MainUnit2.pas
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ interface
{$endif}
dialogs,forms,classes,LCLIntf, LCLProc, sysutils,registry,ComCtrls, menus,
formsettingsunit, cefuncproc,AdvancedOptionsUnit, MemoryBrowserFormUnit,
memscan,plugin, hotkeyhandler,frmProcessWatcherUnit, newkernelhandler,
memscan,plugin, hotkeyhandler,frmProcessWatcherUnit, NewKernelHandler,
debuggertypedefinitions, commonTypeDefs, betterControls;

const
Expand Down Expand Up @@ -942,6 +942,7 @@ procedure LoadSettingsFromRegistry(skipPlugins: boolean=false; skipkernelapply:

if reg.ValueExists('Use Kernel Debugger') then
cbKdebug.checked:=reg.ReadBool('Use Kernel Debugger');
{$endif}

if reg.ValueExists('Use GDBServer Debugger') then
cbUseGDBServer.checked:=reg.ReadBool('Use GDBServer Debugger');
Expand All @@ -955,6 +956,11 @@ procedure LoadSettingsFromRegistry(skipPlugins: boolean=false; skipkernelapply:
if reg.ValueExists('GDBPort') then
edtGDBPort.text:=reg.ReadString('GDBPort');

if reg.ValueExists('GDBWriteCode') then
cbGDBWriteCode.checked:=reg.ReadBool('GDBWriteCode');


{$ifdef windows}

if reg.ValueExists('Use DBVM Debugger') then
cbUseDBVMDebugger.checked:=reg.ReadBool('Use DBVM Debugger');
Expand Down Expand Up @@ -984,12 +990,32 @@ procedure LoadSettingsFromRegistry(skipPlugins: boolean=false; skipkernelapply:
waitafterguiupdate:=reg.ReadBool('Wait After Gui Update');
cbWaitAfterGuiUpdate.checked:=waitafterguiupdate;


{$ifdef darwin}
cbUseMacDebugger.checked:=true;
if reg.ValueExists('UseMacDebugger') then
cbUseMacDebugger.checked:=reg.readBool('UseMacDebugger');;

if reg.ValueExists('AttachDebuggerToRosettaOnProcessOpen') then
cbAttachDebuggerToRosettaOnProcessOpen.checked:=reg.ReadBool('AttachDebuggerToRosettaOnProcessOpen');

if reg.ValueExists('AskToAttachToRosetta') then
cbAskToAttachToRosetta.checked:=reg.ReadBool('AskToAttachToRosetta');

if reg.ValueExists('RosettaDebugserverLaunchCommand') then
edtRosettaDebugserverLaunchCommand.text:=reg.ReadString('RosettaDebugserverLaunchCommand');

if reg.ValueExists('RosettaDebugserverPort') then
edtRosettaDebugserverPort.text:=reg.ReadString('RosettaDebugserverPort');




if reg.ValueExists('Use TaskLevel debugger') then
useTaskLevelDebug:=reg.ReadBool('Use TaskLevel debugger');


if not (cbUseMacDebugger.checked or cbUseGDBServer.checked) then
cbUseMacDebugger.checked:=true;
{$endif}


Expand Down
6 changes: 5 additions & 1 deletion Cheat Engine/MemoryBrowserFormUnit.pas
Original file line number Diff line number Diff line change
Expand Up @@ -3770,7 +3770,11 @@ procedure TMemoryBrowser.AssemblePopup(x:string);
ntsuspendProcess(processhandle);
vpe:=(SkipVirtualProtectEx=false) and VirtualProtectEx(processhandle, pointer(Address),bytelength,PAGE_READWRITE,p)
end;
WriteProcessMemoryWithCloakSupport(processhandle,pointer(Address),@bytes[0],bytelength,a);

if (CurrentDebuggerInterface is TGDBServerDebuggerInterface) and GDBWriteProcessMemoryCodeOnly then
TGDBServerDebuggerInterface(CurrentDebuggerInterface).writeBytes(address, @bytes[0],bytelength)
else
WriteProcessMemoryWithCloakSupport(processhandle,pointer(Address),@bytes[0],bytelength,a);

if vpe then
begin
Expand Down
4 changes: 2 additions & 2 deletions Cheat Engine/ProcessHandlerUnit.pas
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ implementation
{$ifdef jni}
uses networkinterface, networkInterfaceApi;
{$else}
uses LuaHandler, mainunit, networkinterface, networkInterfaceApi, ProcessList, lua, FileUtil;
uses LuaHandler, mainunit, networkInterface, networkInterfaceApi, ProcessList, lua, FileUtil;
{$endif}

procedure TProcessHandler.overridePointerSize(newsize: integer);
Expand Down Expand Up @@ -152,7 +152,7 @@ procedure TProcessHandler.setProcessHandle(processhandle: THandle);
{$ifdef darwin}
if MacIsArm64 then //rosetta2 or I finally ported it to full armv8
begin
if processhandle=getcurrentprocess then
if isProcessTranslated(processid) then
fSystemArchitecture:=archX86
else
fSystemArchitecture:=archArm;
Expand Down
1 change: 1 addition & 0 deletions Cheat Engine/bin/autorun/threadsafegui.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
setThreadSafetyCheck(true)
2 changes: 1 addition & 1 deletion Cheat Engine/contexthandler.pas
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
interface

uses
{$ifdef darwin}macport,{$endif}{$ifdef windows}windows, {$endif}Classes, SysUtils,StringHashList, newkernelhandler,math;
{$ifdef darwin}macport,{$endif}{$ifdef windows}windows, {$endif}Classes, SysUtils,StringHashList, NewKernelHandler,math;

type

Expand Down
12 changes: 10 additions & 2 deletions Cheat Engine/debughelper.pas
Original file line number Diff line number Diff line change
Expand Up @@ -3425,8 +3425,16 @@ procedure TDebuggerthread.defaultConstructorcode;
{$ifdef darwin}
else
begin
outputdebugstring('Setting the CurrentDebuggerInterface to the MacException Debug interface');
CurrentDebuggerInterface:=TMacExceptionDebugInterface.create;
if isProcessTranslated(processid) then
begin
port:=strtoint(formsettings.edtRosettaDebugserverPort.Text);
CurrentDebuggerInterface:=TGDBServerDebuggerInterface.createAndConnect(formsettings.edtRosettaDebugserverLaunchCommand.Text, 'localhost', port);
end
else
begin
outputdebugstring('Setting the CurrentDebuggerInterface to the MacException Debug interface');
CurrentDebuggerInterface:=TMacExceptionDebugInterface.create;
end;
end;
{$endif}
end;
Expand Down
Loading

0 comments on commit 7fb693a

Please sign in to comment.