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”键可以修改内 ...
随机推荐
- node,cnpm安装和配置
作为一个前端人员,node已经是必备. 1.下载 下载地址:https://nodejs.org/zh-cn/download/ 选择相应的版本下载 2.解压缩 将文件解压到要安装的位置,并新建两个目 ...
- xampp打开显示缺少运行库的解决方法
如图:,安装好xampp的时候直接打开会弹出上面那个错误,显示的原因是因为缺少运行库,点击"确定"之后会弹出一个网页,上面有解决方法:http://www.phpstudy.net ...
- PHP开发程序员的学习路线
PHP开发程序员的学习路线 兄弟连PHP培训,简单为大家梳理了每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定学习成长目标. 第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟 ...
- Tomact高并发&Servlet线程处理
Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率.由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的安全性问题.然而 ...
- 【Python】 uuid生成唯一ID
uuid uuid是128位的全局唯一标识符(univeral unique identifier),通常用32位的一个字符串的形式来表现.有时也称guid(global unique identif ...
- (转)SQLite内置函数
一.聚合函数: SQLite中支持的聚合函数在很多其他的关系型数据库中也同样支持,因此我们这里将只是给出每个聚集函数的简要说明,而不在给出更多的示例了.这里还需要进一步说明的是,对于所有聚合函数而言, ...
- ListView属性及divider设置分割线
给ListView设置分割线,只需设置如下两个属性: android:divider="#000" //设置分割线显示颜色 android:dividerHeight=" ...
- PHP 相对完整的分页
效果链接http://love.bjxxw.com/oejiaoyou/pubu/zhaopian.php php 分页 <?php /* * * * 说明 吉海波 2015/9/17 * $p ...
- hibernate框架学习笔记1:搭建与测试
hibernate框架属于dao层,类似dbutils的作用,是一款ORM(对象关系映射)操作 使用hibernate框架好处是:操作数据库不需要写SQL语句,使用面向对象的方式完成 这里使用ecli ...
- JavaScript(第十三天)【内置对象】
学习要点: 1.Global对象 2.Math对象 ECMA-262对内置对象的定义是:"由ECMAScript实现提供的.不依赖宿主环境的对象,这些对象在ECMAScript程序执行之前就 ...