How to make FastCodePatch work in Delphi XE2 Win64 platform?

前端 未结 2 2012
星月不相逢
星月不相逢 2021-02-08 05:10

Unit FastCodePatch.pas works in Win32 platform. Delphi XE2 supports Win64 platform, any ideas how to make FastCodePatch works in Win64 platform?

unit FastcodePa         


        
2条回答
  •  后悔当初
    2021-02-08 05:30

    For the FastcodeAddressPatch-function, this version works both in 32-bit and 64-bit when I try. The key is changing "pointer" to "integer" because the Intel relative jump-instruction ($E9) still use an 32-bit offset in 64-bit mode.

    type
      PJump = ^TJump;
      TJump = packed record
        OpCode: Byte;
        Distance: integer;
      end;
    
    procedure FastcodeAddressPatch(const ASource, ADestination: Pointer);
    const
      Size = SizeOf(TJump);
    var
      NewJump: PJump;
      OldProtect: Cardinal;
    begin
      if VirtualProtect(ASource, Size, PAGE_EXECUTE_READWRITE, OldProtect) then
      begin
        NewJump := PJump(ASource);
        NewJump.OpCode := $E9;
        NewJump.Distance := NativeInt(ADestination) - NativeInt(ASource) - Size;
    
        FlushInstructionCache(GetCurrentProcess, ASource, SizeOf(TJump));
        VirtualProtect(ASource, Size, OldProtect, @OldProtect);
      end;
    end;
    
    procedure Test;
    begin
      MessageBox(0,'Original','',0);
    end;
    
    procedure NewTest;
    begin
      MessageBox(0,'Patched','',0);
    end;
    
    procedure TForm5.FormCreate(Sender: TObject);
    begin
      FastcodeAddressPatch(@Test,@NewTest);
      Test;
    end;
    

    I'm not sure what the other function does but I'm guessing it should be like this:

    function FastcodeGetAddress(AStub: Pointer): Pointer;
    begin
      if PBYTE(AStub)^ = $E8 then
      begin
        Inc(NativeInt(AStub));
        Result := Pointer(NativeInt(AStub) + SizeOf(integer) + PInteger(AStub)^);
      end
      else
        Result := nil;
    end;
    

提交回复
热议问题