⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frmautoinjectunit.pas.svn-base

📁 这是一段游戏修改工具的源代码.ring3功能由dephi开发,驱动是C开发.希望对大家有帮助
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
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 + -