3环注入方法记录

注入方法:
1.远程线程注入
   a.在目标进程中创建一个远程线程;
   b.在目标进程中分配一块内存,用于存储注入dll的路径;
   c.获取Loadlibrary函数地址(目标进程和当前进程函数地址一样);
   d.调用CreateRemoteThread创建远程线程。
2.远程线程注入进阶
   整体过程和1一致,只是使用了更底层的接口(NtCreateThreadEx或RtlCreateUserThread)创建远程线程
3.注入shellcode
   a.挂起目标线程(SuspendThread);
   b.获取目标线程上下文ctx(GetThreadContext);
   c.构造用于注入的硬编码(硬编码最后要跳回原来的执行流程;涉及地址的部分先随便填);
   d.在目标进程中分配内存,用于存放要导入dll的路径(地址1)和硬编码;
   e.获取Loadlibrary函数地址(地址2);
   f.将地址1和地址2以及ctx.eip修正到硬编码中;
   g.将硬编码写入到目标进程中;
   h.将ctx.eip指向硬编码首地址;
   i.恢复线程执行(ResumeThread)。
4.3环APC注入
   a.在目标进程中分配内存,用于存放要注入dll的路径;
   b.获取Loadlibrary函数地址;
   c.给目标进程中所有线程挂一个用户APC(函数地址是Loadlibrary地址,参数是要注入dll的路径;给所有线程挂APC是为了确保 
      APC函数能及时执行);
5.导入表注入
   1.将要注入dll的程序写入到内存中,并新增一个节
    2.拷贝原来的导入表到新节中
    3.在新节拷贝的导入表后新增一个导入表_IMAGE_IMPORT_DESCRIPTOR
    4.增加8字节的INT表和8字节的IAT表
    5.存储要注入的dll的名称
    6.增加一个_IMAGE_IMPORT_BY_NAME结构,并将函数名称存进结构体第一个变量后的内存中
    7.将_IMAGE_IMPORT_BY_NAME结构的地址的RVA赋值给INT表和IAT表第一项
    8.将dll名称所在位置的首地址的RVA赋值给新增导入表的Name
    9.修改IMAGE_DATA_DIRECTORY结构的VirtualAddress和Size
    10.存盘
6.全局消息钩子注入
    利用windows消息机制,安装全局消息钩子。当进程接收到钩子消息时,操作系统会将安装钩子的dll加载到该进程中。
7.特洛伊注入
   由自己写一个与原有进程调用的DLL具有相同接口函数的DLL,再用我们的DLL替换原有的DLL。在替换的过程中,由我们自己编写感兴趣的函数替换原有函数,而对其它不感兴趣的函数,则以函数转发的形式调用原有DLL中的函数。这里面有个前提,就是你在编写DLL时你必须知道原有DLL中的函数都有哪些,以免导至其它进程调用DLL时找不到相应的API函数,特别是在替换系统DLL文件时更要小心。
8.注册表注入
   在系统中每一个进程加载User32.dll时,会受到DLL_PROCESS_ATTACH通知,当User32.dll对其进行处理时,会取得注册表键值HKEY_LOCAL_MACHINE\Software\Microsoft\windowsNT\CurrentVresion\Windows\AppInit_Dlls,并调用LoadLibrary来载入这个字符串中指定的每个DLL。被调用的DLL会在系统调用它们的DllMain函数,并将参数fdwReason的值设为DLL_PROCESS_ATTACH时,对自己进行初始化。所以我们在这个键值中添加我们的Dll路径,即可实现注入。全局的注入,可控性不强。
    注意:
    1.AppInit_DLLs是一个REG_SZ类型,在这里写入一个DLL的文件名或是一组DLL的文件名。如果写入的是一组DLL文件名,那么中间要用逗号或者是空格分隔。由于在这里使用空格分隔文件名,因此一定要避免在DLL文件名中包含空格。第一个DLL的文件名可以包含路径,但其他DLL包含的路径则将被忽略。因此应该将多个DLL放到Windows系统目录为妙,这样就不必指定路径了。
    2.由于被注入的DLL是在进程生命期的早期被载入(User32.dll),因此在dll实现中所调用的函数应该被慎重考虑,当然,调用Kernel32.dll是可以的,但其他dll函数可能会导致问题,甚至会蓝屏。

9.输入法注入
   输入法程序程序到底是什么?它没有自己的进程,并且在系统还没有登录时就已被加载(在欢迎界面你也可以调出输入法),它可以在游戏中打开,也可以在控制台程序中打开,还可以在瑞星保护下的QQ中打开,在杀软中也可以打开,这不就是我们要找的特性吗。那么,输入法到底是什么呢?根据Windows的规定,输入法其实就是一个DLL,不过它是一个特殊的DLL,它必须具有标准输入法程序所规定的那些接口,输入法是由输入法管理器(imm32.dll)控制的,输入法管理器又是由user32.dll控制的。输入法在系统目录是以IME为扩展名的文件,当在应用程序中激活某个输入法时,输入法管理器就会在那个应用程序的进程中加载对应的IME文件,注意,加载IME文件跟加载普通的DLL并没有本质区别,所以,可以认为,输入法其实就是注入到应用程序中的一个DLL文件,并且,这种“注入”是不会被杀软和游戏NP拦截的(至少目前是)。现在,我们已经有了一个注入DLL的另类方法,那就是利用输入法。具体流程是这样,首先制作一个标准输入法文件,但是这个输入法并不完成文字输入工作,它的唯一任务就是用来注入DLL,所以称为“服务输入法”,然后,制作一个控制程序,来控制服务输入法,当然最后还需要一个用于注入的目标DLL,这样一共就有3个文件。开始工作后,控制程序首先将服务输入法安装到系统中,然后传递几个参数给服务输入法,参数中包括了需要注入的DLL文件的名称和路径,然后,控制程序将服务输入法设置为系统的默认输入法,这样新的程序一打开,服务输入法就会注入那个程序。当然,在服务输入法安装之前打开的程序不会被注入,这时需要向系统中的所有窗口POST一条WM_INPUTLANGCHANGEREQUEST消息,该消息可以在指定窗口中后台激活服务输入法,这样,系统中所有拥有窗口的进程就都被我们的服务输入法注入了。服务输入法注入程序之后,就会根据控制程序传递过来的参数加载目标DLL,这样目标DLL也就随着服务输入法一同注入到目标程序中了。注意服务输入法是控制程序用WM_INPUTLANGCHANGEREQUEST消息在所有窗口中自动激活的,如果某个窗口自动激活失败,你就需要在那个窗口中手工切换到服务输入法,这样才能注入进去了。至于注入以后,你就可以在窗口中切换到别的输入法,这并不会影响已经注入进去的DLL。
利用输入法来注入DLL基本上就是这样了,测试发现该方法能过目前所有杀软,也能注入冰刃。当然缺点还是有的,就是目标程序如果不接受输入法那就没办法了,但是现在一般的游戏都不会禁止玩家在里面打字吧,而且杀软也不能禁止用户输入汉字吧,哈哈,所以通用性应该还是蛮好的。
参考文章:
1.https://github.com/Gality369/Process-Injection
2.https://bbs.kanxue.com/thread-262420.htm
3.https://www.cnblogs.com/okwary/articles/1358829.html
4.https://www.cnblogs.com/HsinTsao/p/6541883.html

5.[非原创帖][分享]关于最近流行的输入法注入(申请邀请码)-付费问答-看雪-安全社区|安全招聘|kanxue.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值