add SelectionSize to disassembler view

script templates now take the selection into account for minimum originalcode size
This commit is contained in:
Dark Byte 2023-11-23 14:29:33 +01:00
parent 3d9574ed9c
commit df50882b23
4 changed files with 79 additions and 18 deletions

View File

@ -2537,6 +2537,7 @@ Disassemblerview class: (Inheritance: Panel->CustomControl->WinControl->Control-
properties
SelectedAddress: integer - The currently selected address in the disassemblerview
SelectedAddress2: integer - The secondary selected address in the disassemblerview
SelectionSize: integer - The size of the selected area
TopAddress: Integer - The first address to show
ShowJumplines: boolean - Determines if the jumplines should be shown
HideFocusRect: boolean - If set to true the focus rectangle won't be shown

View File

@ -27,7 +27,7 @@
<AutoIncrementBuild Value="True"/>
<MajorVersionNr Value="7"/>
<MinorVersionNr Value="5"/>
<BuildNr Value="7684"/>
<BuildNr Value="7690"/>
<Language Value="041C"/>
<CharSet Value="04B0"/>
<StringTable CompanyName="Cheat Engine" FileDescription="Cheat Engine" ProductVersion="7.5"/>

View File

@ -136,6 +136,10 @@ type TDisassemblerview=class(TPanel)
procedure StatusInfoLabelCopy(sender: TObject);
procedure setCR3(pa: QWORD);
function getSelectionSize: integer;
procedure setSelectionSize(s: integer);
protected
backlist: TStack;
goingback: boolean;
@ -211,6 +215,7 @@ type TDisassemblerview=class(TPanel)
property OnDisassemblerViewOverride: TDisassemblerViewOverrideCallback read fOnDisassemblerViewOverride write fOnDisassemblerViewOverride;
property CR3: qword read fCR3 write setCR3;
property CurrentDisassembler: TDisassembler read fCurrentDisassembler;
property SelectionSize: integer read getSelectionSize write setSelectionSize;
property RelativeBase: ptruint read fRelativeBase write fRelativeBase;
property UseRelativeBase: boolean read fUseRelativeBase write fUseRelativeBase;
@ -392,6 +397,44 @@ begin
update;
end;
function TDisassemblerview.getSelectionSize: integer;
var
lastaddr: ptruint;
d: TDisassembler;
begin
d:=TDisassembler.create;
lastaddr:=max(fSelectedAddress2, fSelectedAddress);
d.disassemble(lastaddr);
d.free;
result:=lastaddr-min(fSelectedAddress2, fSelectedAddress);
end;
procedure TDisassemblerview.setSelectionSize(s: integer);
var
first: ptruint;
last: ptruint;
current: ptruint;
stop: ptruint;
d: TDisassembler;
begin
first:=min(fSelectedAddress2, fSelectedAddress);
fselectedaddress:=first;
current:=first;
stop:=first+s;
d:=TDisassembler.create;
while current<stop do
begin
fselectedaddress2:=current;
d.disassemble(current);
end;
d.free;
update;
end;
procedure TDisassemblerview.GoBack;
begin
if hasBackList then

View File

@ -391,9 +391,9 @@ type
procedure generateAPIHookScript(script: tstrings; address: string; addresstogoto: string; addresstostoreneworiginalfunction: string=''; nameextension:string='0'; targetself: boolean=false);
procedure GenerateCodeInjectionScript(script: tstrings; addressstring: string; farjmp: boolean=false; jmp1:boolean=false);
procedure GenerateAOBInjectionScript(script: TStrings; address: string; symbolname: string; commentradius: integer=10; farjmp: boolean=false; jmp1: boolean=false);
procedure GenerateFullInjectionScript(Script: tstrings; address: string; commentradius: integer=10; farjmp: boolean=false; jmp1: boolean=false);
procedure GenerateCodeInjectionScript(script: tstrings; addressstring: string; farjmp: boolean=false; jmp1:boolean=false; originalcodeMinSize: integer=1);
procedure GenerateAOBInjectionScript(script: TStrings; address: string; symbolname: string; commentradius: integer=10; farjmp: boolean=false; jmp1: boolean=false; originalcodeMinSize: integer=1);
procedure GenerateFullInjectionScript(Script: tstrings; address: string; commentradius: integer=10; farjmp: boolean=false; jmp1: boolean=false; originalcodeMinSize: integer=1);
function registerAutoAssemblerTemplate(name: string; m: TAutoAssemblerTemplateCallback; shortcut: TShortCut=0): integer;
procedure unregisterAutoAssemblerTemplate(id: integer);
@ -1276,7 +1276,7 @@ begin
d.free;
end;
procedure GenerateCodeInjectionScript(script: tstrings; addressstring: string; farjmp: boolean=false; jmp1: boolean=false);
procedure GenerateCodeInjectionScript(script: tstrings; addressstring: string; farjmp: boolean=false; jmp1: boolean=false; originalcodeMinSize: integer=1);
function inttostr(i:int64):string;
begin
if i=0 then result:='' else result:=sysutils.IntToStr(i);
@ -1301,7 +1301,6 @@ var
jmpsize: integer;
rewrite: tstringlist;
begin
if not processhandler.is64Bit then
@ -1331,7 +1330,10 @@ begin
enablecode:=tstringlist.Create;
disablecode:=tstringlist.Create;
while codesize<jmpsize do
if originalcodeMinSize<jmpsize then
originalcodeMinSize:=jmpsize;
while codesize<originalcodeMinSize do
begin
GetOriginalInstruction(c, originalcode, farjmp);
codesize:=c-a;
@ -1442,11 +1444,18 @@ var
a: ptruint;
mi: TModuleInfo;
address: string;
originalCodeMinSize: integer;
begin
if parent is TMemoryBrowser then
a:=TMemoryBrowser(parent).disassemblerview.SelectedAddress
begin
a:=min(TMemoryBrowser(parent).disassemblerview.SelectedAddress, TMemoryBrowser(parent).disassemblerview.SelectedAddress2);
originalCodeMinSize:=TMemoryBrowser(parent).disassemblerview.selectionsize;
end
else
a:=memorybrowser.disassemblerview.SelectedAddress;
begin
a:=min(memorybrowser.disassemblerview.SelectedAddress, memorybrowser.disassemblerview.SelectedAddress2);
originalCodeMinSize:=memorybrowser.disassemblerview.selectionsize;
end;
if symhandler.getmodulebyaddress(a,mi) then
address:='"'+mi.modulename+'"+'+inttohex(a-mi.baseaddress,1)
@ -1458,7 +1467,9 @@ begin
if inputquery(rsCodeInjectTemplate, rsOnWhatAddressDoYouWantTheJump, address) then
GenerateCodeInjectionScript(assemblescreen.lines, address, (ssCtrl in GetKeyShiftState) or mi14ByteJMP.checked, mi1ByteExceptionJMP.checked);
begin
GenerateCodeInjectionScript(assemblescreen.lines, address, (ssCtrl in GetKeyShiftState) or mi14ByteJMP.checked, mi1ByteExceptionJMP.checked, originalCodeMinSize);
end;
end;
procedure TfrmAutoInject.Panel1Resize(Sender: TObject);
@ -3162,7 +3173,7 @@ begin
end;
// \/ http://forum.cheatengine.org/viewtopic.php?t=566415 (jgoemat and some mods by db)
procedure GenerateFullInjectionScript(Script: tstrings; address: string; commentRadius: integer=10; farjmp: boolean=false; jmp1:boolean=false);
procedure GenerateFullInjectionScript(Script: tstrings; address: string; commentRadius: integer=10; farjmp: boolean=false; jmp1:boolean=false; originalcodeMinSize: integer=1);
var
originalcode: tstringlist;
originalbytes: array of byte;
@ -3227,7 +3238,10 @@ begin
originalcode:=tstringlist.create;
codesize:=0;
while codesize<jmpsize do
if originalcodeMinSize<jmpsize then
originalcodeMinSize:=jmpsize;
while codesize<originalcodeMinSize do
begin
GetOriginalInstruction(c, originalcode, farjmp);
codesize:=c-a;
@ -3388,7 +3402,7 @@ var
address: string;
mi: TModuleInfo;
begin
a:=memorybrowser.disassemblerview.SelectedAddress;
a:=min(memorybrowser.disassemblerview.SelectedAddress, memorybrowser.disassemblerview.SelectedAddress2);
if symhandler.getmodulebyaddress(a,mi) then
address:='"'+mi.modulename+'"+'+inttohex(a-mi.baseaddress,1)
@ -3399,7 +3413,7 @@ begin
mi14ByteJMP.Checked:=true;
if inputquery(rsCodeInjectTemplate, rsOnWhatAddressDoYouWantTheJump, address) then
generateFullInjectionScript(assemblescreen.Lines, address, 10, (ssCtrl in GetKeyShiftState) or mi14ByteJMP.checked, mi1ByteExceptionJMP.checked);
generateFullInjectionScript(assemblescreen.Lines, address, 10, (ssCtrl in GetKeyShiftState) or mi14ByteJMP.checked, mi1ByteExceptionJMP.checked, memorybrowser.disassemblerview.SelectionSize);
end;
procedure TfrmAutoInject.miReplaceClick(Sender: TObject);
@ -3480,7 +3494,7 @@ begin
end;
procedure GenerateAOBInjectionScript(script: TStrings; address: string; symbolname: string; commentradius: integer=10; farjmp: boolean=false; jmp1:boolean=false);
procedure GenerateAOBInjectionScript(script: TStrings; address: string; symbolname: string; commentradius: integer=10; farjmp: boolean=false; jmp1:boolean=false; originalcodeMinSize: integer=1);
var
a,a2: ptrUint; // pointer to injection point
originalcode: tstringlist; // disassembled code we're replacing
@ -3552,7 +3566,10 @@ begin
originalcode:=tstringlist.create;
codesize:=0;
while codesize<jmpsize do
if originalcodeMinSize<jmpsize then
originalcodeMinSize:=jmpsize;
while codesize<originalcodeMinSize do
begin
GetOriginalInstruction(c, originalcode, farjmp);
codesize:=c-a;
@ -3722,7 +3739,7 @@ var
mi: TModuleInfo;
symbolname: string;
begin
a:=memorybrowser.disassemblerview.SelectedAddress;
a:=min(memorybrowser.disassemblerview.SelectedAddress, memorybrowser.disassemblerview.SelectedAddress2);
if symhandler.getmodulebyaddress(a,mi) then
address:='"'+mi.modulename+'"+'+inttohex(a-mi.baseaddress,1)
@ -3741,7 +3758,7 @@ begin
symbolname:='INJECT'+nr;
if inputquery(rsCodeInjectTemplate, rsWhatIdentifierDoYouWantToUse, symbolName) then
GenerateAOBInjectionScript(assemblescreen.Lines, address, symbolname, 10, (ssCtrl in GetKeyShiftState) or mi14ByteJMP.checked, mi1ByteExceptionJMP.checked);
GenerateAOBInjectionScript(assemblescreen.Lines, address, symbolname, 10, (ssCtrl in GetKeyShiftState) or mi14ByteJMP.checked, mi1ByteExceptionJMP.checked, memorybrowser.disassemblerview.SelectionSize);
end;
end;