add SelectionSize to disassembler view
script templates now take the selection into account for minimum originalcode size
This commit is contained in:
parent
3d9574ed9c
commit
df50882b23
@ -2537,6 +2537,7 @@ Disassemblerview class: (Inheritance: Panel->CustomControl->WinControl->Control-
|
|||||||
properties
|
properties
|
||||||
SelectedAddress: integer - The currently selected address in the disassemblerview
|
SelectedAddress: integer - The currently selected address in the disassemblerview
|
||||||
SelectedAddress2: integer - The secondary 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
|
TopAddress: Integer - The first address to show
|
||||||
ShowJumplines: boolean - Determines if the jumplines should be shown
|
ShowJumplines: boolean - Determines if the jumplines should be shown
|
||||||
HideFocusRect: boolean - If set to true the focus rectangle won't be shown
|
HideFocusRect: boolean - If set to true the focus rectangle won't be shown
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
<AutoIncrementBuild Value="True"/>
|
<AutoIncrementBuild Value="True"/>
|
||||||
<MajorVersionNr Value="7"/>
|
<MajorVersionNr Value="7"/>
|
||||||
<MinorVersionNr Value="5"/>
|
<MinorVersionNr Value="5"/>
|
||||||
<BuildNr Value="7684"/>
|
<BuildNr Value="7690"/>
|
||||||
<Language Value="041C"/>
|
<Language Value="041C"/>
|
||||||
<CharSet Value="04B0"/>
|
<CharSet Value="04B0"/>
|
||||||
<StringTable CompanyName="Cheat Engine" FileDescription="Cheat Engine" ProductVersion="7.5"/>
|
<StringTable CompanyName="Cheat Engine" FileDescription="Cheat Engine" ProductVersion="7.5"/>
|
||||||
|
@ -136,6 +136,10 @@ type TDisassemblerview=class(TPanel)
|
|||||||
procedure StatusInfoLabelCopy(sender: TObject);
|
procedure StatusInfoLabelCopy(sender: TObject);
|
||||||
|
|
||||||
procedure setCR3(pa: QWORD);
|
procedure setCR3(pa: QWORD);
|
||||||
|
|
||||||
|
function getSelectionSize: integer;
|
||||||
|
procedure setSelectionSize(s: integer);
|
||||||
|
|
||||||
protected
|
protected
|
||||||
backlist: TStack;
|
backlist: TStack;
|
||||||
goingback: boolean;
|
goingback: boolean;
|
||||||
@ -211,6 +215,7 @@ type TDisassemblerview=class(TPanel)
|
|||||||
property OnDisassemblerViewOverride: TDisassemblerViewOverrideCallback read fOnDisassemblerViewOverride write fOnDisassemblerViewOverride;
|
property OnDisassemblerViewOverride: TDisassemblerViewOverrideCallback read fOnDisassemblerViewOverride write fOnDisassemblerViewOverride;
|
||||||
property CR3: qword read fCR3 write setCR3;
|
property CR3: qword read fCR3 write setCR3;
|
||||||
property CurrentDisassembler: TDisassembler read fCurrentDisassembler;
|
property CurrentDisassembler: TDisassembler read fCurrentDisassembler;
|
||||||
|
property SelectionSize: integer read getSelectionSize write setSelectionSize;
|
||||||
|
|
||||||
property RelativeBase: ptruint read fRelativeBase write fRelativeBase;
|
property RelativeBase: ptruint read fRelativeBase write fRelativeBase;
|
||||||
property UseRelativeBase: boolean read fUseRelativeBase write fUseRelativeBase;
|
property UseRelativeBase: boolean read fUseRelativeBase write fUseRelativeBase;
|
||||||
@ -392,6 +397,44 @@ begin
|
|||||||
update;
|
update;
|
||||||
end;
|
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;
|
procedure TDisassemblerview.GoBack;
|
||||||
begin
|
begin
|
||||||
if hasBackList then
|
if hasBackList then
|
||||||
|
@ -391,9 +391,9 @@ type
|
|||||||
|
|
||||||
|
|
||||||
procedure generateAPIHookScript(script: tstrings; address: string; addresstogoto: string; addresstostoreneworiginalfunction: string=''; nameextension:string='0'; targetself: boolean=false);
|
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 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);
|
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);
|
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;
|
function registerAutoAssemblerTemplate(name: string; m: TAutoAssemblerTemplateCallback; shortcut: TShortCut=0): integer;
|
||||||
procedure unregisterAutoAssemblerTemplate(id: integer);
|
procedure unregisterAutoAssemblerTemplate(id: integer);
|
||||||
@ -1276,7 +1276,7 @@ begin
|
|||||||
d.free;
|
d.free;
|
||||||
end;
|
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;
|
function inttostr(i:int64):string;
|
||||||
begin
|
begin
|
||||||
if i=0 then result:='' else result:=sysutils.IntToStr(i);
|
if i=0 then result:='' else result:=sysutils.IntToStr(i);
|
||||||
@ -1301,7 +1301,6 @@ var
|
|||||||
jmpsize: integer;
|
jmpsize: integer;
|
||||||
|
|
||||||
rewrite: tstringlist;
|
rewrite: tstringlist;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
|
||||||
if not processhandler.is64Bit then
|
if not processhandler.is64Bit then
|
||||||
@ -1331,7 +1330,10 @@ begin
|
|||||||
enablecode:=tstringlist.Create;
|
enablecode:=tstringlist.Create;
|
||||||
disablecode:=tstringlist.Create;
|
disablecode:=tstringlist.Create;
|
||||||
|
|
||||||
while codesize<jmpsize do
|
if originalcodeMinSize<jmpsize then
|
||||||
|
originalcodeMinSize:=jmpsize;
|
||||||
|
|
||||||
|
while codesize<originalcodeMinSize do
|
||||||
begin
|
begin
|
||||||
GetOriginalInstruction(c, originalcode, farjmp);
|
GetOriginalInstruction(c, originalcode, farjmp);
|
||||||
codesize:=c-a;
|
codesize:=c-a;
|
||||||
@ -1442,11 +1444,18 @@ var
|
|||||||
a: ptruint;
|
a: ptruint;
|
||||||
mi: TModuleInfo;
|
mi: TModuleInfo;
|
||||||
address: string;
|
address: string;
|
||||||
|
originalCodeMinSize: integer;
|
||||||
begin
|
begin
|
||||||
if parent is TMemoryBrowser then
|
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
|
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
|
if symhandler.getmodulebyaddress(a,mi) then
|
||||||
address:='"'+mi.modulename+'"+'+inttohex(a-mi.baseaddress,1)
|
address:='"'+mi.modulename+'"+'+inttohex(a-mi.baseaddress,1)
|
||||||
@ -1458,7 +1467,9 @@ begin
|
|||||||
|
|
||||||
|
|
||||||
if inputquery(rsCodeInjectTemplate, rsOnWhatAddressDoYouWantTheJump, address) then
|
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;
|
end;
|
||||||
|
|
||||||
procedure TfrmAutoInject.Panel1Resize(Sender: TObject);
|
procedure TfrmAutoInject.Panel1Resize(Sender: TObject);
|
||||||
@ -3162,7 +3173,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
// \/ http://forum.cheatengine.org/viewtopic.php?t=566415 (jgoemat and some mods by db)
|
// \/ 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
|
var
|
||||||
originalcode: tstringlist;
|
originalcode: tstringlist;
|
||||||
originalbytes: array of byte;
|
originalbytes: array of byte;
|
||||||
@ -3227,7 +3238,10 @@ begin
|
|||||||
originalcode:=tstringlist.create;
|
originalcode:=tstringlist.create;
|
||||||
codesize:=0;
|
codesize:=0;
|
||||||
|
|
||||||
while codesize<jmpsize do
|
if originalcodeMinSize<jmpsize then
|
||||||
|
originalcodeMinSize:=jmpsize;
|
||||||
|
|
||||||
|
while codesize<originalcodeMinSize do
|
||||||
begin
|
begin
|
||||||
GetOriginalInstruction(c, originalcode, farjmp);
|
GetOriginalInstruction(c, originalcode, farjmp);
|
||||||
codesize:=c-a;
|
codesize:=c-a;
|
||||||
@ -3388,7 +3402,7 @@ var
|
|||||||
address: string;
|
address: string;
|
||||||
mi: TModuleInfo;
|
mi: TModuleInfo;
|
||||||
begin
|
begin
|
||||||
a:=memorybrowser.disassemblerview.SelectedAddress;
|
a:=min(memorybrowser.disassemblerview.SelectedAddress, memorybrowser.disassemblerview.SelectedAddress2);
|
||||||
|
|
||||||
if symhandler.getmodulebyaddress(a,mi) then
|
if symhandler.getmodulebyaddress(a,mi) then
|
||||||
address:='"'+mi.modulename+'"+'+inttohex(a-mi.baseaddress,1)
|
address:='"'+mi.modulename+'"+'+inttohex(a-mi.baseaddress,1)
|
||||||
@ -3399,7 +3413,7 @@ begin
|
|||||||
mi14ByteJMP.Checked:=true;
|
mi14ByteJMP.Checked:=true;
|
||||||
|
|
||||||
if inputquery(rsCodeInjectTemplate, rsOnWhatAddressDoYouWantTheJump, address) then
|
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;
|
end;
|
||||||
|
|
||||||
procedure TfrmAutoInject.miReplaceClick(Sender: TObject);
|
procedure TfrmAutoInject.miReplaceClick(Sender: TObject);
|
||||||
@ -3480,7 +3494,7 @@ begin
|
|||||||
|
|
||||||
end;
|
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
|
var
|
||||||
a,a2: ptrUint; // pointer to injection point
|
a,a2: ptrUint; // pointer to injection point
|
||||||
originalcode: tstringlist; // disassembled code we're replacing
|
originalcode: tstringlist; // disassembled code we're replacing
|
||||||
@ -3552,7 +3566,10 @@ begin
|
|||||||
originalcode:=tstringlist.create;
|
originalcode:=tstringlist.create;
|
||||||
codesize:=0;
|
codesize:=0;
|
||||||
|
|
||||||
while codesize<jmpsize do
|
if originalcodeMinSize<jmpsize then
|
||||||
|
originalcodeMinSize:=jmpsize;
|
||||||
|
|
||||||
|
while codesize<originalcodeMinSize do
|
||||||
begin
|
begin
|
||||||
GetOriginalInstruction(c, originalcode, farjmp);
|
GetOriginalInstruction(c, originalcode, farjmp);
|
||||||
codesize:=c-a;
|
codesize:=c-a;
|
||||||
@ -3722,7 +3739,7 @@ var
|
|||||||
mi: TModuleInfo;
|
mi: TModuleInfo;
|
||||||
symbolname: string;
|
symbolname: string;
|
||||||
begin
|
begin
|
||||||
a:=memorybrowser.disassemblerview.SelectedAddress;
|
a:=min(memorybrowser.disassemblerview.SelectedAddress, memorybrowser.disassemblerview.SelectedAddress2);
|
||||||
|
|
||||||
if symhandler.getmodulebyaddress(a,mi) then
|
if symhandler.getmodulebyaddress(a,mi) then
|
||||||
address:='"'+mi.modulename+'"+'+inttohex(a-mi.baseaddress,1)
|
address:='"'+mi.modulename+'"+'+inttohex(a-mi.baseaddress,1)
|
||||||
@ -3741,7 +3758,7 @@ begin
|
|||||||
symbolname:='INJECT'+nr;
|
symbolname:='INJECT'+nr;
|
||||||
|
|
||||||
if inputquery(rsCodeInjectTemplate, rsWhatIdentifierDoYouWantToUse, symbolName) then
|
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;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user