永发信息网

Delphi如何开启远程线程实现DLL的远程注入?

答案:1  悬赏:80  手机版
解决时间 2021-11-21 15:17
Delphi如何开启远程线程实现DLL的远程注入?
最佳答案
Delphi通过开启远程线程,注射DLL至目标进程:
unit Inject;
interface
uses Windows, SysUtils, Messages, Classes;
//再目标进程中申请空间,写入注射代码后 ,开启远程线程以执行
function InjectDll(pid: thandle; dllname: string; timeout: cardinal = 7000):
boolean;
//参数 pid 进程ID ,dllname 欲注射dll的名字
//调用样例 InjectDll(pid,'.\inject.dll');
//原理 使得目标进程通过API函数LoadLibraryA主动加载欲注射的DLL。
var
RemoteCode: array[0..18] of char = (#$60, #$9C, #$B8, #$88, #$77, #$66, #$55,
#$BA, #$44, #$33, #$22, #$11, #$52, #$FF, #$D0, #$9D, #$61, #$C3, #$00);
{
注射的代码
60 pushad
9C pushfd
B8 88776655 mov eax, 55667788
BA 44332211 mov edx, 11223344
52 push edx
FFD0 call eax
9D popfd
61 popad
C3 retn
}
implementation
function InjectDll(pid: thandle; dllname: string; timeout: cardinal = 7000):
boolean;
var
Rpid: thandle;
RemotePoint, RemoteFilename: pointer;
LoadLibptr: pointer;
rcode: longbool;
temp: cardinal;
threadid: cardinal;
begin
result := false;
Rpid := OpenProcess(PROCESS_ALL_ACCESS, false, pid); //打开目标进程
if Rpid = 0 then
exit; //打开失败则退出
RemoteFilename := VirtualAllocEx(Rpid, nil, length(dllname) + 1, MEM_COMMIT,
PAGE_READWRITE);
//在目标进程中申请空间 大小为欲注射dll名字长度+1 权限为可读写
if RemoteFilename = nil then
begin
CloseHandle(Rpid);
exit; //申请空间失败则退出
end;
rcode := WriteProcessMemory(Rpid, RemoteFileName, @dllname[1],
length(dllname), temp);
//将欲注射dll名字写入刚刚已经申请的空间中
if not rcode then
begin
CloseHandle(rpid);
exit; //写入失败则退出
end;
LoadLibptr := GetProcAddress(GetModuleHandle('Kernel32.dll'), 'LoadLibraryA');
//获取LoadLibraryA函数的地址指针
if LoadLibptr = nil then
begin
CloseHandle(rpid);
exit; //获取失败则退出
end;
RemotePoint := VirtualAllocEx(Rpid, nil, sizeof(RemoteCode) + 1, MEM_COMMIT,
PAGE_EXECUTE_READWRITE);
//在目标进程中申请空间 大小为注射代码的字节数+1 权限为可执行可读写
if RemotePoint = nil then
begin
CloseHandle(rpid);
exit; //申请失败则退出
end;
{
注射的代码
60 pushad
9C pushfd
B8 88776655 mov eax, 55667788
BA 44332211 mov edx, 11223344
52 push edx
FFD0 call eax
9D popfd
61 popad
C3 retn
}
CopyMemory(@RemoteCode[3], @LoadLibptr, 4);
//将LoadLibraryA的地址指针(4字节)写入 将如上88776655覆盖
CopyMemory(@RemoteCode[8], @RemoteFilename, 4);
//将dll名字的首地址指针(4字节)写入 将如上44332211覆盖
rcode := WriteProcessMemory(Rpid, RemotePoint, @RemoteCode[0],
sizeof(Remotecode), temp); //将注射代码写入申请的空间中
if rcode then
begin
result := CreateRemoteThread(rpid, nil, 0, RemotePoint, nil, 0, threadid) <>
0; //写入成功则开启一个远程线程执行
CloseHandle(rpid);
end;
end;
end.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
数学94.5语文99.45的平均分怎么算
24分之7除以72分之3除以5分之7怎样简便计算
一张图切成6张图的软件
6米长6米宽的门面怎么装修成超市
暖字隶书怎么写
阴虚津亏如何调理
正确反映三大类岩石互相转化的模式图是
智能冲奶机好不好用?有什么品牌推荐吗?
初彩·童林美术馆地址在什么地方,想过去
新特精品二手车地址在什么地方,想过去办事,
奸臣献计斩忠臣指的是什么人物
已知∂为第三象限角,且sin∂=-3&#
拿到护士资格证了没有从事护士行业可以注册到
vivox5S多少钱
煤矿切眼是什么
推荐资讯
1961年属牛女农历9月初九戊时出生在2016年运
大庆天梭零售店(新玛特)地址好找么,我有些
发酵)的做法,小餐包(一次发酵)怎么做
近几天手指变得粗糙大拇指肚按下有坑是什么回
老残游记是谁写的?
您好 请问天津出国体检中心 在哪里
上学的路上作文怎么写
集英社夏之一册2016广告歌叫什么
大专对英语有什么要求
甘都得都唔色白话是什么意思
国内汽车金融实况:贷款买车的人,都是怎么想
法语动词变位emmenèrent是emmener什么情况下
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?