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...
假设如您所声称的那样,该地址是您进程中的有效地址,访问冲突将表明该地址的保护标志不允许写入。您的流程中的代码通常就是这种情况。
几种处理方法:
- 使用
VirtualProtect
更改该地址的保护。通常,您会希望在进行修改后将保护恢复到其原始值。
- 使用[
WriteProcessMemory
][3]进行内存写入。这会将保护更改为允许写入,进行修改并恢复原始保护。如果地址实际上是指不同的进程,那么你必须使用WriteProcessMemory
修改内存。
将 VirtualProtect
用于此类目的的例子比比皆是。例如,this post 显示如何修补一些代码,并使用 VirtualProtect
来安排可以写入内存。那个post写的实际数据和你的不一样,重点是演示如何使用VirtualProtect
.
在继续之前,请务必仔细阅读 documentation。
早上好。 我正在尝试了解 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...
假设如您所声称的那样,该地址是您进程中的有效地址,访问冲突将表明该地址的保护标志不允许写入。您的流程中的代码通常就是这种情况。
几种处理方法:
- 使用
VirtualProtect
更改该地址的保护。通常,您会希望在进行修改后将保护恢复到其原始值。 - 使用[
WriteProcessMemory
][3]进行内存写入。这会将保护更改为允许写入,进行修改并恢复原始保护。如果地址实际上是指不同的进程,那么你必须使用WriteProcessMemory
修改内存。
将 VirtualProtect
用于此类目的的例子比比皆是。例如,this post 显示如何修补一些代码,并使用 VirtualProtect
来安排可以写入内存。那个post写的实际数据和你的不一样,重点是演示如何使用VirtualProtect
.
在继续之前,请务必仔细阅读 documentation。