文章目录[隐藏]
这里的APC是R3应用层(用户层),APC注入的原理是利用当线程被唤醒时APC中的注册函数会被执行的机制,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的,
APC注入可以让一个线程在它正常的执行路径运行之前执行一些其他的代码,每一个线程都有一个附加的APC队列,他们在线程处于可警告的时候才被处理(WaitForSingObjectEx,SleepEx)
R3用户模式:
线程可利用QueueUserAPC排入一个让远程线程调用的函数,QueueUser函数的参数 pfnAPC,hThread,dwDate用法如下:一旦获取了线程ID,就可以利用其打开句柄,通过参数LoadLibaryA以及对应参数dwData(dll名称),LoadLibaryA就会被远程线程调用, 从而加载对应的我们需要注入的DLL。
步骤
1、打开需要注入的进程
2、获取DLL文件路径的长度
3、申请内存地址
4、将DLL路径写入内存
5、获取loadlibraryA在kernel32.dll中的地址
6、获取系统线程快照句柄,4在快照中包含所有的线程
7、初始化线程结构大小
8、验证检索与线程相关的第一个线程的信息
9、判断父进程ID等于 参数的进程ID
10、打开线程
11、不等于说明打开线程成功,开始核心注入
(1)指向一个我们提供的APC函数指针
(2)线程句柄
(3)指定一个被传到APC参数指向的函数的值
12、关闭进程句柄
13、关闭线程局部
易语言APC应用层注入源码:
.版本 2 .子程序 APC注入_R3, 逻辑型, , APC应用层注入 .参数 进程ID, 整数型 .参数 DLL文件, 文本型 .局部变量 dll文件大小, 整数型 .局部变量 内存地址, 整数型 .局部变量 LoadLibraryA地址, 整数型 .局部变量 快照句柄, 整数型 .局部变量 线程信息, THREADENTRY32 ' 1、打开需要注入的进程 进程句柄 = OpenProcess (2035711, 假, 进程ID) .如果真 (进程句柄 = 0) 信息框 (“打开进程失败!”, 0, , ) 返回 (假) .如果真结束 ' 2、获取DLL文件路径的长度 dll文件大小 = 取文本长度 (DLL文件) + 1 ' 3、申请内存地址 内存地址 = VirtualAllocEx (进程句柄, 0, dll文件大小, 4096, 64) .如果真 (内存地址 = 0) 信息框 (“申请内存地址失败!”, 0, , ) 返回 (假) .如果真结束 ' 4、将DLL路径写入内存 WriteProcessMemory (进程句柄, 内存地址, 到字节集 (DLL文件), dll文件大小, 0) ' 5、获取loadlibraryA在kernel32.dll中的地址 LoadLibraryA地址 = GetProcAddress (GetModuleHandleA (“kernel32”), “LoadLibraryA”) .如果真 (LoadLibraryA地址 = 0) 信息框 (“获取loadlibraryA失败!”, 0, , ) 返回 (假) .如果真结束 ' 6、获取系统线程快照句柄,4在快照中包含所有的线程 快照句柄 = CreateToolhelp32Snapshot (4, 0) .如果真 (快照句柄 = 0) 信息框 (“获取系统线程快照句柄失败!”, 0, , ) 返回 (假) .如果真结束 CloseHandle (快照句柄) CloseHandle (进程句柄) 返回 (真)
我们将会在下一课完成注入DLL的编写
教程获取下载:
提取码:加QQ群:521068947 群文件下载
511遇见全部视频教程百度网盘下载
511遇见易语言DLL制作调用及hook注入
资源教程交流①群:
521068947
511遇见QQ: 272586593