DELPHI 远程注入DLL的例子
来源:互联网 发布:camtasia studio软件 编辑:程序博客网 时间:2024/05/22 05:21
远程注入DLL方法有很多种,也是很多木马病毒所使用的隐藏进程的方法,
因为通过程序加载的DLL在进程管理器是没有显示的.这里介绍一种用 CreateRemoteThread 远程建立线程的方式注入DLL.
首先,我们要提升自己的权限,因为远程注入必不可免的要访问到目标进程的内存空间,
如果没有足够的系统权限,将无法作任何事.下面是这个函数是用来提升我们想要的权限用的.
function EnableDebugPriv: Boolean;
var
hToken: THandle;
tp: TTokenPrivileges;
rl: Cardinal;
begin
Result := false;
//打开进程令牌环
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
hToken);
//获得进程本地唯一ID
if LookupPrivilegeValue(nil, 'SeDebugPrivilege', tp.Privileges[0].Luid) then
begin
tp.PrivilegeCount := 1;
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
//调整权限
Result := AdjustTokenPrivileges(hToken, false, tp, SizeOf(tp), nil, rl);
end;
end;
关于 OpenProcessToken() 和 AdjustTokenPrivileges() 两个 API 的简单介绍:
OpenProcessToken():获得进程访问令牌的句柄.
function OpenProcessToken(
ProcessHandle: THandle; //要修改访问权限的进程句柄
DesiredAccess: DWORD; //指定你要进行的操作类型
var TokenHandle: THandle//返回的访问令牌指针
): BOOL;
AdjustTokenPrivileges() :调整进程的权限.
function AdjustTokenPrivileges(
TokenHandle: THandle; // 访问令牌的句柄
DisableAllPrivileges: BOOL; // 决定是进行权限修改还是除能(Disable)所有权限
const NewState: TTokenPrivileges;
{ 指明要修改的权限,是一个指向TOKEN_PRIVILEGES结构的指针,该结构包含一个数组,
数据组的每个项指明了权限的类型和要进行的操作; }
BufferLength: DWORD;
//结构PreviousState的长度,如果PreviousState为空,该参数应为 0
var PreviousState: TTokenPrivileges;
// 指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息
var ReturnLength: DWORD //实际PreviousState结构返回的大小
) : BOOL;
远程注入DLL其实是通过 CreateRemoteThread 建立一个远程线程调用 LoadLibrary 函数来加载我们指定的DLL,可是如何能让远程线程知道我要加载DLL呢,要知道在Win32系统下,每个进程都拥有自己的4G虚拟地址空间,各个进程之间都是相互独立的。所我们需要在远程进程的内存空间里申请一块内存空间,写入我们的需要注入的 DLL 的路径. 需要用到的 API 函数有:
OpenProcess():打开目标进程,得到目标进程的操作权限,详细参看MSDN
function OpenProcess(
dwDesiredAccess: DWORD; // 希望获得的访问权限
bInheritHandle: BOOL; // 指明是否希望所获得的句柄可以继承
dwProcessId: DWORD // 要访问的进程ID
): THandle;
VirtualAllocEx():用于在目标进程内存空间中申请内存空间以写入DLL的文件名
function VirtualAllocEx(
hProcess: THandle; // 申请内存所在的进程句柄
lpAddress: Pointer; // 保留页面的内存地址;一般用nil自动分配
dwSize, // 欲分配的内存大小,字节单位;注意实际分 配的内存大小是页内存大小的整数倍
flAllocationType: DWORD;
flProtect: DWORD
): Pointer;
WriteProcessMemory():往申请到的空间中写入DLL的文件名
function WriteProcessMemory(
hProcess: THandle; //要写入内存数据的目标进程句柄
const lpBaseAddress: Pointer; //要写入的目标进程的内存指针, 需以 VirtualAllocEx() 来申请
lpBuffer: Pointer; //要写入的数据
nSize: DWORD; //写入数据的大小
var lpNumberOfBytesWritten: DWORD //实际写入的大小
): BOOL;
然后就可以调用 CreateRemoteThread 建立远程线程调用 LoadLibrary 函数来加载我们指定的DLL.
CreateRemoteThread() //在一个远程进程中建立线程
function CreateRemoteThread(
hProcess: THandle; //远程进程的句柄
lpThreadAttributes: Pointer; //线程安全描述字,指向SECURITY_ATTRIBUTES结构的指针
dwStackSize: DWORD; //线程栈大小,以字节表示
lpStartAddress: TFNThreadStartRoutine;
// 一个TFNThreadStartRoutine类型的指针,指向在远程进程中执行的函数地址
lpParameter: Pointer; //传入参数的指针
dwCreationFlags: DWORD; //创建线程的其它标志
var lpThreadId: DWORD //线程身份标志,如果为0, 则不返回
): THandle;
因为通过程序加载的DLL在进程管理器是没有显示的.这里介绍一种用 CreateRemoteThread 远程建立线程的方式注入DLL.
首先,我们要提升自己的权限,因为远程注入必不可免的要访问到目标进程的内存空间,
如果没有足够的系统权限,将无法作任何事.下面是这个函数是用来提升我们想要的权限用的.
function EnableDebugPriv: Boolean;
var
hToken: THandle;
tp: TTokenPrivileges;
rl: Cardinal;
begin
Result := false;
//打开进程令牌环
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
hToken);
//获得进程本地唯一ID
if LookupPrivilegeValue(nil, 'SeDebugPrivilege', tp.Privileges[0].Luid) then
begin
tp.PrivilegeCount := 1;
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
//调整权限
Result := AdjustTokenPrivileges(hToken, false, tp, SizeOf(tp), nil, rl);
end;
end;
关于 OpenProcessToken() 和 AdjustTokenPrivileges() 两个 API 的简单介绍:
OpenProcessToken():获得进程访问令牌的句柄.
function OpenProcessToken(
ProcessHandle: THandle; //要修改访问权限的进程句柄
DesiredAccess: DWORD; //指定你要进行的操作类型
var TokenHandle: THandle//返回的访问令牌指针
): BOOL;
AdjustTokenPrivileges() :调整进程的权限.
function AdjustTokenPrivileges(
TokenHandle: THandle; // 访问令牌的句柄
DisableAllPrivileges: BOOL; // 决定是进行权限修改还是除能(Disable)所有权限
const NewState: TTokenPrivileges;
{ 指明要修改的权限,是一个指向TOKEN_PRIVILEGES结构的指针,该结构包含一个数组,
数据组的每个项指明了权限的类型和要进行的操作; }
BufferLength: DWORD;
//结构PreviousState的长度,如果PreviousState为空,该参数应为 0
var PreviousState: TTokenPrivileges;
// 指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息
var ReturnLength: DWORD //实际PreviousState结构返回的大小
) : BOOL;
远程注入DLL其实是通过 CreateRemoteThread 建立一个远程线程调用 LoadLibrary 函数来加载我们指定的DLL,可是如何能让远程线程知道我要加载DLL呢,要知道在Win32系统下,每个进程都拥有自己的4G虚拟地址空间,各个进程之间都是相互独立的。所我们需要在远程进程的内存空间里申请一块内存空间,写入我们的需要注入的 DLL 的路径. 需要用到的 API 函数有:
OpenProcess():打开目标进程,得到目标进程的操作权限,详细参看MSDN
function OpenProcess(
dwDesiredAccess: DWORD; // 希望获得的访问权限
bInheritHandle: BOOL; // 指明是否希望所获得的句柄可以继承
dwProcessId: DWORD // 要访问的进程ID
): THandle;
VirtualAllocEx():用于在目标进程内存空间中申请内存空间以写入DLL的文件名
function VirtualAllocEx(
hProcess: THandle; // 申请内存所在的进程句柄
lpAddress: Pointer; // 保留页面的内存地址;一般用nil自动分配
dwSize, // 欲分配的内存大小,字节单位;注意实际分 配的内存大小是页内存大小的整数倍
flAllocationType: DWORD;
flProtect: DWORD
): Pointer;
WriteProcessMemory():往申请到的空间中写入DLL的文件名
function WriteProcessMemory(
hProcess: THandle; //要写入内存数据的目标进程句柄
const lpBaseAddress: Pointer; //要写入的目标进程的内存指针, 需以 VirtualAllocEx() 来申请
lpBuffer: Pointer; //要写入的数据
nSize: DWORD; //写入数据的大小
var lpNumberOfBytesWritten: DWORD //实际写入的大小
): BOOL;
然后就可以调用 CreateRemoteThread 建立远程线程调用 LoadLibrary 函数来加载我们指定的DLL.
CreateRemoteThread() //在一个远程进程中建立线程
function CreateRemoteThread(
hProcess: THandle; //远程进程的句柄
lpThreadAttributes: Pointer; //线程安全描述字,指向SECURITY_ATTRIBUTES结构的指针
dwStackSize: DWORD; //线程栈大小,以字节表示
lpStartAddress: TFNThreadStartRoutine;
// 一个TFNThreadStartRoutine类型的指针,指向在远程进程中执行的函数地址
lpParameter: Pointer; //传入参数的指针
dwCreationFlags: DWORD; //创建线程的其它标志
var lpThreadId: DWORD //线程身份标志,如果为0, 则不返回
): THandle;
- DELPHI 远程注入DLL的例子
- 远程注入DLL的例子
- delphi远程dll注入运行
- 远程线程注入dll的一个例子,netcat.dll
- DLL的远程注入
- delphi远程线程插入(DLL注入)
- 利用远程线程注入DLL Delphi版
- 远程注入代码,一些过时的ring3技术(ASM、VC++、Delphi) (非Dll注入)
- DLL的远程注入技术
- DLL的远程注入技术
- DLL的远程注入技术
- DLL的远程注入技术
- DLL的远程注入技术
- DLL的远程注入技术
- DLL的远程注入技术
- DLL的远程注入技术
- DLL的远程注入技术
- DLL的远程注入技术
- 明天就是植树节
- 在QTP中巧用WebTable对象的ChildItem方法进行测试
- 四年后求职滨海新区三个方向可供参考
- 求职跳槽 与老板论价还价的谈薪技巧
- 拼音与五笔
- DELPHI 远程注入DLL的例子
- linux下ftp命令的使用
- 巴菲特笑称荣登全球首富是因为“花得少”
- 华为坠亡员工博客称“心累”
- ODBC SDK + Oracle 开发扩展存储过程(一)
- 如何控制別台電腦中的某一個程式執行或結束
- asp中获取汉字拼音的第一个字母
- 你的灯还亮着吗?
- 关于 ZendFrameworkExample