📄 frmautoinjectunit.pas.svn-base
字号:
unit frmautoinjectunit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Menus,cefuncproc, StrUtils, types,
ComCtrls,
{$ifdef net}
netapis,
{$else}
newkernelhandler,
{$endif}
{$ifndef standalonetrainerwithassembler}
disassembler,
mainunit2,
psvAutoAssembler,
psvCPlusPlus,
underc,
{$endif}
assemblerunit, autoassembler, symbolhandler;
type
TfrmAutoInject = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Panel1: TPanel;
Button1: TButton;
Load1: TMenuItem;
Save1: TMenuItem;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
N1: TMenuItem;
Exit1: TMenuItem;
Assigntocurrentcheattable1: TMenuItem;
emplate1: TMenuItem;
Codeinjection1: TMenuItem;
CheatTablecompliantcodee1: TMenuItem;
APIHook1: TMenuItem;
SaveAs1: TMenuItem;
PopupMenu1: TPopupMenu;
Coderelocation1: TMenuItem;
TabControl1: TTabControl;
New1: TMenuItem;
assemblescreen: TRichEdit;
N2: TMenuItem;
Syntaxhighlighting1: TMenuItem;
closemenu: TPopupMenu;
Close1: TMenuItem;
Inject1: TMenuItem;
Injectincurrentprocess1: TMenuItem;
Injectintocurrentprocessandexecute1: TMenuItem;
Find1: TMenuItem;
Paste1: TMenuItem;
Copy1: TMenuItem;
Cut1: TMenuItem;
Undo1: TMenuItem;
N6: TMenuItem;
FindDialog1: TFindDialog;
undotimer: TTimer;
procedure Button1Click(Sender: TObject);
procedure Load1Click(Sender: TObject);
procedure Save1Click(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Codeinjection1Click(Sender: TObject);
procedure Panel1Resize(Sender: TObject);
procedure CheatTablecompliantcodee1Click(Sender: TObject);
procedure assemblescreenChange(Sender: TObject);
procedure Assigntocurrentcheattable1Click(Sender: TObject);
procedure APIHook1Click(Sender: TObject);
procedure SaveAs1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure assemblescreenKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Coderelocation1Click(Sender: TObject);
procedure New1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure TabControl1Change(Sender: TObject);
procedure Syntaxhighlighting1Click(Sender: TObject);
procedure TabControl1ContextPopup(Sender: TObject; MousePos: TPoint;
var Handled: Boolean);
procedure Close1Click(Sender: TObject);
procedure Injectincurrentprocess1Click(Sender: TObject);
procedure Injectintocurrentprocessandexecute1Click(Sender: TObject);
procedure Cut1Click(Sender: TObject);
procedure Copy1Click(Sender: TObject);
procedure Paste1Click(Sender: TObject);
procedure Find1Click(Sender: TObject);
procedure FindDialog1Find(Sender: TObject);
procedure undotimerTimer(Sender: TObject);
procedure Undo1Click(Sender: TObject);
private
{ Private declarations }
updating: boolean;
pagecontrol: tpagecontrol;
oldtabindex: integer;
scripts: array of record
script: string;
filename: string;
undoscripts: array [0..4] of record
oldscript: string;
startpos: integer;
end;
currentundo: integer;
end;
selectedtab: integer;
fcplusplus: boolean;
undolist: array [0..5] of string;
procedure setcplusplus(state: boolean);
procedure injectscript(createthread: boolean);
public
{ Public declarations }
editscript: boolean;
editscript2: boolean;
callbackroutine: procedure(script: string; changed: boolean) of object;
injectintomyself: boolean;
property cplusplus: boolean read fcplusplus write setcplusplus;
end;
procedure Getjumpandoverwrittenbytes(address,addressto: dword; jumppart,originalcodepart: tstrings);
implementation
{$R *.dfm}
{$ifndef standalonetrainerwithassembler}
uses memorybrowserformunit,APIhooktemplatesettingsfrm,{$ifdef net}unit2{$else}mainunit{$endif};
{$endif}
procedure TfrmAutoInject.setcplusplus(state: boolean);
begin
fcplusplus:=state;
if state then
begin
//change gui to c++ style
button1.Caption:='Execute script';
opendialog1.DefaultExt:='CEC';
opendialog1.Filter:='Cheat Engine Script (*.CEC)|*.CEC|All Files (*.*)|*.*';
savedialog1.DefaultExt:='CEC';
savedialog1.Filter:='Cheat Engine Script (*.CEC)|*.CEC|All Files (*.*)|*.*';
Assigntocurrentcheattable1.visible:=false;
emplate1.Visible:=false;
caption:='Script engine';
inject1.Visible:=true;
helpcontext:=19; //c-script help
end
else
begin
//change gui to autoassembler style
button1.caption:='Write code';
opendialog1.DefaultExt:='CEA';
opendialog1.Filter:='Cheat Engine Assembly (*.CEA)|*.CEA|All Files (*.*)|*.*';
savedialog1.DefaultExt:='CES';
savedialog1.Filter:='Cheat Engine Assembly (*.CEA)|*.CEA|All Files (*.*)|*.*';
Assigntocurrentcheattable1.Visible:=true;
emplate1.Visible:=true;
caption:='Auto assembler';
inject1.Visible:=false;
helpcontext:=18; //auto asm help
end;
end;
procedure TfrmAutoInject.Button1Click(Sender: TObject);
var enable,disable: integer;
a,b: integer;
aa: TCEAllocArray;
i: integer;
//variables for injectintomyself:
check: boolean;
oldProcessID: dword;
oldProcessHandle: thandle;
begin
{$ifndef standalonetrainerwithassembler}
if cplusplus then
begin
//scriptengine stuff
if not editscript and scriptengine.beginScript then
begin
try
// for i:=0 to assemblescreen.Lines.Count-1 do
if not scriptengine.execute_command(assemblescreen.text) then
raise exception.Create('Error interpreting script:'+scriptengine.getError);
finally
scriptengine.endScript;
end;
showmessage('script executed');
end;
end
else
{$endif}
begin
if editscript then
begin
{$ifndef standalonetrainerwithassembler}
//check if both scripts are valid before allowing the edit
setlength(aa,1);
getenableanddisablepos(assemblescreen.Lines,a,b);
if (a=-1) and (b=-1) then raise exception.create('The code needs an [ENABLE] and a [DISABLE] section if you want to use this script as a table entry');
if injectintomyself then
begin
//save the current process and target CE
oldProcessID:=processid;
oldProcessHandle:=processhandle;
processid:=Getcurrentprocessid;
processhandle:=getcurrentprocess;
end;
check:=autoassemble(assemblescreen.lines,false,true,true,false,aa) and
autoassemble(assemblescreen.lines,false,false,true,false,aa);
if injectintomyself then
begin
//restore back to original process
processid:=oldProcessID;
processhandle:=oldProcessHandle;
end;
if check then
begin
modalresult:=mrok; //not modal anymore, but can still be used to pass info
close;
end
else
begin
if messagedlg('Not all code is injectable. Are you sure you wan''t to edit it to this?',mtWarning,[mbyes,mbno],0)=mryes then
begin
modalresult:=mrok; //not modal anymore, but can still be used to pass info
close;
end;
end;
{$endif}
end else autoassemble(assemblescreen.lines,true);
end;
end;
procedure TfrmAutoInject.Load1Click(Sender: TObject);
begin
if opendialog1.Execute then
begin
assemblescreen.Clear;
assemblescreen.Lines.LoadFromFile(opendialog1.filename);
savedialog1.FileName:=opendialog1.filename;
end;
end;
procedure TfrmAutoInject.Save1Click(Sender: TObject);
var f: tfilestream;
s: string;
begin
if (savedialog1.filename='') and (not savedialog1.Execute) then exit; //filename was empty and the user clicked cancel
f:=tfilestream.Create(savedialog1.filename,fmcreate);
try
s:=assemblescreen.text;
f.Write(s[1],length(assemblescreen.text));
finally
f.Free;
end;
end;
procedure TfrmAutoInject.Exit1Click(Sender: TObject);
begin
close;
end;
procedure TfrmAutoInject.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
if not editscript then
begin
action:=cafree;
end
else
begin
if editscript2 then
begin
//call finish routine with script
if modalresult=mrok then
callbackroutine(assemblescreen.text,true)
else
callbackroutine(assemblescreen.text,false);
action:=cafree;
end;
end;
end;
procedure TfrmAutoInject.Codeinjection1Click(Sender: TObject);
function inttostr(i:int64):string;
begin
if i=0 then result:='' else result:=sysutils.IntToStr(i);
end;
var address: string;
addressdw: dword;
originalcode: array of string;
codesize: integer;
a,b: dword;
x: string;
i,j,k: integer;
prev_usesymbols: boolean;
injectnr: integer;
begin
{$ifndef standalonetrainerwithassembler}
a:=memorybrowser.dselected;
address:=inttohex(a,8);
if inputquery('On what address do you want the jump?','Code inject template',address) then
begin
try
a:=strtoint('$'+address);
except
a:=symhandler.getaddressfromname(address);
end;
b:=a;
injectnr:=0;
for i:=0 to assemblescreen.Lines.Count-1 do
begin
j:=pos('alloc(newmem',lowercase(assemblescreen.lines[i]));
if j<>0 then
begin
x:=copy(assemblescreen.Lines[i],j+12,length(assemblescreen.Lines[i]));
x:=copy(x,1,pos(',',x)-1);
try
k:=strtoint(x);
if injectnr<=k then
injectnr:=k+1;
except
inc(injectnr);
end;
end;
end;
//disassemble the old code
setlength(originalcode,0);
codesize:=0;
while codesize<5 do
begin
setlength(originalcode,length(originalcode)+1);
originalcode[length(originalcode)-1]:=disassemble(a,x);
i:=posex('-',originalcode[length(originalcode)-1]);
i:=posex('-',originalcode[length(originalcode)-1],i+1);
originalcode[length(originalcode)-1]:=copy(originalcode[length(originalcode)-1],i+2,length(originalcode[length(originalcode)-1]));
codesize:=a-b;
end;
with assemblescreen.lines do
begin
add('alloc(newmem'+inttostr(injectnr)+',2048) //2kb should be enough');
add('label(returnhere'+inttostr(injectnr)+')');
add('label(originalcode'+inttostr(injectnr)+')');
add('label(exit'+inttostr(injectnr)+')');
add('');
add(address+':');
add('jmp newmem'+inttostr(injectnr)+'');
while codesize>5 do
begin
add('nop');
dec(codesize);
end;
add('returnhere'+inttostr(injectnr)+':');
add('');
add('newmem'+inttostr(injectnr)+': //this is allocated memory, you have read,write,execute access');
add('//place your code here');
add('');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -