本文是我收集整理的DLL注入方法。 其中一些是我自己实现的。 源代码位于文章末尾的链接中。 其他没有实现的也有git链接或者其他源代码链接。
参考链接:
远程线程调用的第一种 DLL 注入是强制将特定的 DLL 文件映像插入特定的进程空间。 值得注意的是,这个插入是强制插入。 从技术角度来看,DLL注入使用()将特定的DLL文件加载到进程的内存空间中。 注入的对象可以是它本身,也可以是远程进程。 DLL注入技术的实现主要分为5部分:
1.打开进程并获取进程的句柄,
2、就是在内存空间中开辟一块内存空间。
3、将需要注入的DLL的路径写入刚刚打开的内存中。
4、用()得到的地址。
5.调用远程线程并使用()加载DLL。
第二种创建用户线程的方法是底层实现,所以使用的原理是一样的。 唯一的区别是,写入目标进程的是Dll的路径,写入的是一段。 由于直接调用创建线程,绕过了win7/vista在这方面的检测,因此可以注入到系统进程(如.exe)中。 当然,这种方法也有缺陷,因为它不与csrss通信,可能会调用线程体内的东西。 某些 API 函数可能会失败。 还需要注意的是,由于它没有被系统封装,所以线程体必须自己调用它来结束线程。
第三种APC注入通过函数创建线程来使用远程进程中的函数。 然而,线程创建需要系统开销,因此调用现有线程效率更高。
异步过程调用(APC)可以满足这个要求
APC 允许线程在运行其正常执行路径之前执行一些其他代码。 每个线程都有一个额外的 APC 队列,该队列在线程处于可警报等待状态时进行处理。
因此,只需要将APC进程添加到目标进程的线程的APC队列中即可。 当然,为了提高命中率,可以将APC进程添加到进程的所有线程中。 然后提示线程从睡眠中恢复就可以实现APC注入。
设置进程上下文的第四种方式
核心是通过函数
注入的实现,像很多方法如内存注入、通过进程进行核心注入等,都有这样的思想。 它们都是挂起线程,然后写入内存,重置,然后调用并恢复线程执行。
第五种反射注入
反射dll注入不需要dll文件落地,降低了被检测和查杀的风险。 首先编写需要注入进程内存的dllimm32.dll,然后给dll添加一个导出函数,利用这个导出函数自动加载dll。 注入器将DLL文件写入目标进程内存。 反射加载器实现的就是模拟dll加载器加载dll文件的操作。
反射注入过程如下:
1、将原始DLL文件读入内存缓冲区; 2、解析DLL头并获取; 3、为DLL分配新的内存空间,大小为4,将DLL头和PE段复制到步骤3分配的内存空间; 5、进行搬迁; 6.加载DLL导入的库; 7、解析导入地址表(IAT); 8、调用DLL;
第六种输入法注入
当切换输入法时,输入法管理器imm32.dll会加载IME模块,这就构成了输入法注入的充要条件。 而由于这个Ime文件本质上只是一个存放在C:\\目录下的特殊DLL文件,所以我们可以利用这个特性,利用Ime文件中的()函数来注入DLL文件。
第七种全局hook注入
使用消息机制,可以在发送到操作系统的事件之间建立一个钩子链来钩子不同的消息。 例如,使用以下代码,您可以挂钩键盘消息。 并调用钩子处理函数来处理消息,达到的效果和dll注入一样(执行dll内部的代码)
第八种DLL劫持
DLL劫持原理见链接
注入实现见文末链接
第九种注册表注入
系统中采用了REG注入的原理。 当REG下面的键值中有DLL文件路径时,DLL文件路径中的DLL文件会随着EXE文件的启动而被加载。 当遇到多个DLL文件时,需要用逗号或空格分隔多个DLL文件的路径。
\\\ NT\ \\,os会自动加载位于注册表中的有效DLL。 所以只需要在注册表中添加DLL的绝对路径\\\NT\\\并将值更改为1,这将使所有加载.dll的进程都加载目标路径中的DLL。 利用注册表,在HKLM\\\\\\下写入dll的路径,这个注册表项下的DLL就可以被加载到每个调用 、onW、enW 和 的进程中。值得注意的是,这个注册表项并不存在默认情况下在 win xp-win 10 中
第十种悬浮线程注入
–>–>申请内存–>编写代码–>–>获取EIP–>修改EIP–>–>。
第十一类暂停进程注入
注入方法之一是以挂起模式打开进程。 后一种方法类似于挂起线程注入。
第十二道工序替代技术(流程)
除了注入之外,我们还可以使用进程替换技术在正在运行的进程中编写可执行文件。 该技术允许恶意代码与被替换的进程具有相同的权限。 这项技术的关键在于:它需要处于暂停状态。 创建一个进程,也就是说这个进程会被加载到内存中,但是主线程通过。 直到外部程序恢复主线程后,程序才会工作。 主线程恢复后,程序即可运行。 以下代码是进程替换代码的伪代码。 程序通过调用进程创建标志并将其设置为()来完成。 新进程的主线程以挂起状态创建,直到调用该函数后才会运行。 接下来,恶意软件需要用恶意负载替换合法文件的内容。 这可以通过调用或取消映射目标进程的内存来完成(这一步的目的是在重写傀儡进程时,该进程仍然拥有这部分要注入的内存的所有权。为了避免冲突,在重写进程之前,需要取消映射进程的内存)。 这两个 API 基本上释放了某个节所指向的所有内存。 现在内存已取消映射,加载程序执行将为恶意软件分配新内存,并将每个恶意软件的部分写入目标进程空间。 恶意软件调用将指向已编写的新代码段。 最后,恶意软件通过调用恢复挂起的线程
(...,"目标进程.exe",);//创建一个处于挂起状态的进程
()//释放内存并取消映射内存
()//为恶意代码分配新的空间
()//写入数据(文件头)
对于(i=0;i
()//写入节数据
···
()//重启主线程
第十三种方法调试器注入
注入方式二,ESS在调试方式中打开进程,用它来将我们相应的函数写入到目标程序中,我们的编写使用的是CC断点。 当代码执行指令时,T 事件被触发。 在处理T的过程中返回到函数中原来的执行流程。
第十四种方法导入表注入
静态注入方法。 修改PE文件,添加新的,修改导入表,添加新的DLL,实现注入。
源码链接: 提取码:9spe
标题:远程线程调用DLL注入技术实现的基本原理及参考链接
链接:https://yqqlyw.com/news/xydt/5809.html
版权:文章转载自网络,如有侵权,请联系删除!