Delphi - 尝试使用 DLL 注入覆盖指令时发生访问冲突

Delphi - Access violation when try to overwrite an instruction with DLL Injection

早上好。 我正在尝试了解 DLL 注入,所以我写了一个小软件,它只获取一个字符串,与 StrCmp() 进行比较,如果输入等于 "Winner",该软件会给出一个 Good boy 消息,学习 DLL 注入。 所以我写了一个 DLL,在注入时加载一个表单,海豚正在使用 DLL 注入,修改比较指令(JNZ(74) 到 JMP(EB)),并制作软件,接受任何字符串。我的 DLL 代码是:

library Project2;
uses
  SysUtils,
  Windows,
  Classes,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}
var
Hproccess:THandle;
Hid:Cardinal;
b:Boolean=false;

       Procedure Chamar;
       begin
        Form1:=TForm1.Create(nil);
       Form1.ShowModal;
       end;
begin
Hproccess:=OpenProcess(PROCESS_ALL_ACCESS,false,GetCurrentProcessID);
CreateRemoteThread(Hproccess,nil,0,@Chamar,@Chamar,0,Hid);
end.

你怎么看出来的,DLL只是新建了一个Thread来加载Form(Form1)。问题是,当我写入内存地址以覆盖 JNZ 指令时,Windows 不让我这样做,并且 returns 地址 005B55A9 的访问冲突消息。我的表单代码也很简单。

    unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button2: TButton;
    procedure Button2Click(Sender: TObject);

  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
var
Memory:Dword;
begin
Memory:=[=12=]5B55A9;
PDWORD(Memory)^:=225; {EB=225}
Free();
end;
end.

我做错了什么?如何在没有访问冲突错误的情况下将 JNZ(74) 的指令覆盖到 JMP(EB)?对不起我的错误,我昨天开始阅读它,那是我的第一个例子。我已经有了注射器(极限注射器)。我的疑问只是关于 DLL 编码。你能帮帮我吗?

忘了说了,我用的是Windows10...

假设如您所声称的那样,该地址是您进程中的有效地址,访问冲突将表明该地址的保护标志不允许写入。您的流程中的代码通常就是这种情况。

几种处理方法:

  1. 使用VirtualProtect更改该地址的保护。通常,您会希望在进行修改后将保护恢复到其原始值。
  2. 使用[WriteProcessMemory][3]进行内存写入。这会将保护更改为允许写入,进行修改并恢复原始保护。如果地址实际上是指不同的进程,那么你必须使用WriteProcessMemory修改内存。

VirtualProtect 用于此类目的的例子比比皆是。例如,this post 显示如何修补一些代码,并使用 VirtualProtect 来安排可以写入内存。那个post写的实际数据和你的不一样,重点是演示如何使用VirtualProtect.

在继续之前,请务必仔细阅读 documentation