Windows用户模式下注入方式总结
注入技术在病毒木马、游戏、打补丁等编程中应用很广泛,学习该技术不仅能帮助理解Windows工作原理,还能对病毒木马技术手段有更加深刻的理解,下面我们了解下各种注入方式吧。
一.DLL注入
在注入技术中,DLL注入是最常见最有效的技术。作者通常把代码编写成一个动态链接库,然后把这个动态链接库加载到正常进程中去,因为任何一个进程在加载动态链接库时都要执行DLL文件里入口函数DllMain中的代码,这样代码才得以执行。
1.修改注册表
修改 HKEY_LOCAL_MACHINE/Software/Microsoft/WindowsNT/CurrentVersion/Windows/AppInit_DLLs 的键值,改为待注入DLL的路径,这样一来,程序运行后只要加载了user32.dll,都会加载我们写入的DLL。
2.全局消息钩子注入
Windows应用程序是基于消息驱动的,任何线程只要注册窗口类都会有一个消息队列用于接收用户输入的消息和系统消息。为了拦截消息,Windows提出了钩子的概念。钩子(Hook)是Windows消息处理机制中的一个监视点,钩子提供一个回调函数。当在某个程序中安装钩子后,它将监视该程序的消息,在指定消息还没到达窗口之前钩子程序先捕获这个消息。这样就有机会对此消息进行过滤,或者对Windows消息实现监控。 消息钩子分为局部钩子和全局钩子。局部钩子是指仅拦截某一个进程的消息,全局钩子将拦截系统中所有进程的消息。
该技术需要我们写一个简单的加载该DLL的程序,使其调用DLL的钩子函数,该函数会下一个全局消息钩子,强迫所有发生该消息的进程加载该DLL,这样就实现了DLL注入。
3.手工修改导入表
该方法需要我们熟悉PE结构,找到导入表位置在其后面添加一个新节,写入待注入的DLL,并将该DLL的导出函数的一些信息写到正确的位置,若导出函数过多将花费很多时间在手工修改上,并且可能出现空间不足写入的情况。
4.远程线程注入DLL
通过利用2000/XP等系统所有进程加载Kernel32.dll的模块基址一致的特点,先使用OpenProcess函数打开远程进程的句柄,再用VirtualAllocEx和WriteProcessMemory将待注入DLL路径写入目标进程,找到LoadLibraryW的地址,最后用CreateRemoteThread使目标进程调用LoadLibraryW加载DLL,参数为写入的DLL路径。
5.APC注入
APC注入的原理是利用当线程被唤醒时APC中的注册函数会被执行的机制,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的。利用QueueUserAPC()可以向APC队列投入Loadlibrary函数指针完成注入,其实这种方法配合CreateProcess使用注入最为简单,先挂起打开线程,再QueueUserAPC(),再恢复线程,完成注入。
6.DLL劫持
自己实现应用程序的某个DLL,完成其导出函数,并将其放于应用程序目录下,当程序打开并加载DLL时会优先加载该目录下的DLL,原来的DLL若在该目录下降其移走即可。
7.输入法注入
利用输入法在工作时需要向进程中加载Ime文件(其实就是个Dll),我们构造自己的Ime文件,在Ime文件注入对方进程的时候加载我们自己的DLL完成注入
二.代码注入
对于病毒来讲,虽然远程注入DLL相对隐蔽,但是因为在被注入进程中多了个DLL模块,所以也没有做到完全隐蔽,而且也很容易将病毒清除。所以对于那些更高级的病毒则使用了更加隐蔽,更加难以清除的方法:远程代码注入。这是指,在远程进程中开辟足够大的内存空间,然后将要执行的代码直接写过去,最后使用远程线程的方法运行注入代码。这样做可以使其他进程执行病毒代码,而又不会在对方进程中产生新的模块,从而使病毒能够更隐蔽地运行。
1.手工修改执行起始地址
使用二进制编辑工具打开目标程序,找到合适的地方写入二进制代码,将程序执行起始地址(AddressOfEntryPoint)改为注入代码处,在执行完后跳到源地址。
2.挂起线程注入
OpenThread-->SuspendThread-->申请内存-->写入代码-->GetThreadContext-->获取EIP-->修改EIP-->SetThreadContext-->ResumeThread。
3.挂起进程注入
CreateProcess注入方法之一,CREATE_SUSPENDED以挂起的方式打开进程,后面方法与挂起线程注入相似。
4.调试器注入
CreateProcess注入方法之二,DEBUG_ONLY_THIS_PROCESS以调试的方法打开进程,利用CREATE_PROCESS_DEBUG_EVENT,向目标程序中写入我们的ShellCode完成相应功能,并且我们的ShellCode中写入以CC断点,代码执行指令时触发EXCEPTION_DEBUG_EVENT事件,在EXCEPTION_DEBUG_EVENT的处理函数中回到原来的执行流程。
参考书籍:《计算机病毒揭秘与对抗》
参考网址:https://bbs.pediy.com/thread-217722.htm
Windows用户模式下注入方式总结的更多相关文章
- windows核心编程---第七章 用户模式下的线程同步
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...
- 【windows核心编程】 第八章 用户模式下的线程同步
Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ① 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ② 一个线程需要通知其他线程 ...
- 《windows核心编程系列》七谈谈用户模式下的线程同步
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...
- Windows核心编程:第8章 用户模式下的线程同步
Github https://github.com/gongluck/Windows-Core-Program.git //第8章 用户模式下的线程同步.cpp: 定义应用程序的入口点. // #in ...
- 线程同步——用户模式下线程同步——Interlocked实现线程同步
线程同步分为用户模式下的线程同步和内核对象的线程同步. 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局 //1.利用原子访问: Interlocked系列函数,关于Interlocke ...
- CentOS单用户模式下修改ROOT密码和grub加密
Linux 系统处于正常状态时,服务器主机开机(或重新启动)后,能够由系统引导器程序自动引导 Linux 系统启动到多用户模式,并提供正常的网络服务.如果系统管理员需要进行系统维护或系统出现启动异常时 ...
- 在单用户模式下修改CentOS的root密码
我们在使用CentOS的过程中可能会发生忘记root用户密码的情况,本文就从应用的角度简单介绍一下如何在单用户模式下修改root用户的密码. 开启CentOS,进入系统启动菜单 将光标停留在系统开机时 ...
- 设置GRUB密码以防止单用户模式下root密码被恶意更改
在使用LInux系统的时候可能会发生忘记root密码的情况,通常管理员会进入单用户模式下进行重置root密码.那么问题来了,既然管理员可以进入单用户模式,如果恶意用户可以接触的到计算机的话毫无疑问也是 ...
- CentOS6.8单用户模式下修改密码
CentOS6.8单用户模式下修改密码 1. 选择进入菜单menu界面,在开启系统出现如下界面时,按Esc键(只需按一下) 2. 然后进入到如下界面 3. 上图中红色矩形类的内容,按“a”键可以修改内 ...
随机推荐
- token的时限多长才合适?
在使用JWT时,一个让人纠结的问题就是"Token的时限多长才合适?".对此,Stormpath的这篇文章给出了一个可供参考的建议: 面对极度敏感的信息,如钱或银行数据,那就根本不 ...
- Nancy启用跨站攻击防护(CSRF)
什么是CSRF(跨站攻击) 可能很多人已经对CSRF有所了解,就简单的介绍下: CSRF全程是 Cross-Site Request Forgery .大概意思就是在登录用户不知情的情况下,由一个网站 ...
- TestNG的简单使用
TestNG的简单使用 TestNG(Test Next Generation)是一个测试框架,其灵感来自JUnit和NUnit,但同时引入了一些新的功能,使其功能更强大,使用更方便. TestNG是 ...
- 13.C++-静态成员变量、静态成员函数
首先回顾下成员变量 能通过对象名能够访问public成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 再来讲讲类的静态成员变量 介绍 静态成员变量属于整个类所有 静态成员变量的生命期 ...
- luogu3244 bzoj4011 HNOI2015 落忆枫音
这道题目题面真长,废话一堆. 另外:这大概是我第一道独立做出来的HNOI2011年以后的题目了吧.像我水平这么差的都能做出来,dalao您不妨试一下自己想想? 题目大意:给一个DAG,其中1号点没有入 ...
- 修改WordPress后台登录地址,提高安全性
大家都知道,WordPress默认的后台登陆地址是http://[你的域名]/wp-admin,今天就来讲讲怎么修改WordPress后台登录地址,首先要知道为什么要修改WordPress后台登录地址 ...
- SparkHiveContext和直接Spark读取hdfs上文件然后再分析效果区别
最近用spark在集群上验证一个算法的问题,数据量大概是一天P级的,使用hiveContext查询之后再调用算法进行读取效果很慢,大概需要二十多个小时,一个查询将近半个小时,代码大概如下: try: ...
- load vs. initialize
这篇文章来对比一下NSObject类的两个方法,+load与+initialize. + (void)load; Invoked whenever a class or category is add ...
- Linux目录结构和基础知识
目录结构: /bin:存放系统常用的命令程序 /boot:系统启动或引导所需要的一些文件 /dev:可用的设备文件 /etc:系统配置相关的东西 /home:所有用户的主目录 /lib,lib64:存 ...
- Python实现制度转换(货币,温度,长度)
人民币和美元是世界上通用的两种货币之一,写一个程序进行货币间币值转换,其中: 人民币和美元间汇率固定为:1美元 = 6.78人民币. 程序可以接受人民币或美元输入,转换为美元或人民币输出.人民币采用R ...