<ReversingEngineering>关于windows32位系统下的dll注入技术经验汇
上个学期把自己闷在图书馆一直在看关于逆向工程技术方面的书,从入门到初级,现在也敢说自己一条腿已经迈进了这片知识的大门里,因为该博客刚开通先将一些经验记录下来,也是留给自己一方面做个参照。 《逆向工程核心原理》((韩)李承远 )《Reversing:逆向工程揭密(电子工业出版社)》《黑客反汇编揭密》((俄)卡巴斯基 )
dll注入技术是一门逆向工程中非常基础非常初步的技术,也是打开大门的钥匙,逆向破解的前提条件。API勾取 ,Rootkit进程隐藏都需要dll注入为先决条件。基本方法如下(每一种方法都经过本人亲自多次试验,有不同意见欢迎评论):
(1)通过windows钩子函数来将dll注入进程之中
首先是钩子函数API的定义:
HOOK SetWindowsHookEx(
int idHook;
HOOKPROC lpfn;
HINSTANCE hMod;
DWORD dwThreadId;
)///////// 在头文件#include〈windows.h〉中的定义
SetWindowsHookEx proto :dword,dword,dword,dword
;;;;;; 在MASM32中的定义
(以全局键盘钩子为例)钩子过程是隶属于操作系统的,而非某个单独的进程或者线程,只要安装好了钩子,无论是哪个进程,就要将WM_CHAR或者WM_SYSCHAR消息就会强制将调用钩子函数的dll加载到相应的进程之中(所以钩子回调函数必须写进一个Dll之中)。这样一来钩子既可以通过dll在OS的消息循环队列之中拦截住键盘消息或者将消息“加工”后转达给下一个钩子回调函数或者应用程序(取决于是否调用了CallNextHookEx函数)。
通过在写有钩子回调函数的dll中加入一些你真正想要使用的function可以完成dll的注入。
///////////////////////////////////////////////////////////////////
(2)通过创建远程线程来将dll注入某一个进程
这种方法的核心思想在于:##不同的应用程序所装载的系统关键dll的虚拟地址一致##
////////////////////////////////////////////////////////////////////////////////////
“在Vista/7中应用了新的ASLR功能,使系统dll加载的地址每次都会改变,但在系统运行期间他都会被映射(Mapping)到每个进程相同的地址”
(《逆向工程核心原理》((韩)李承远)2014年5月第1版 P207)
/////////////////////////////////////////////////////////////////////////////////////
于是我们可以通过在自己的程序之中调用LoadLibraryA或者LoadLibraryW函数来获得函数入口,而这个函数的地址通过传递到创建在另一个进程之中的远程线程之中就可以用来加载自己想要加载的dll (所以前提是dll已经存在于被注入进程所在的主机之中)
具体步骤总结如下://///切换输入法太烦了,这段还是用英语写吧
1) OpenProcess(param...)////To get the handle of process as the parameter of CreateRomoteThread
2) VirtualAllocEx(param...) ///// To alloc a block of memory to store the path/name of DLL (WCHAR or CHAR depends)
WriteProcessMemory(param...) ////// Fill in the block alloced
3) GetModuleHandle("kernel32.dll") ///// Get the virtual address /handle of kernel32.dll which stores the entry of LoadLibraryA/W API
GetProcAddress(hKernelMod,”LoadLibray“) ///////////As stated above to get entry
4) CreateRemoteThread(param...) ////As call this API the DLL will be injected in remote thread's loadlibrary function
5) Memory Cleaning Freeing Deleting,Handles Shutting down
到此 通过创建远程线程来完成dll注入的工作就完成了。
/////////////////////////////////////////////////////////////////////////////
(3)通过静态修改PE格式文件的磁盘映像来完成dll的静态注入
熟悉整个PE格式文件的装载过程之后,我们可以通过使用一些非常简单的十六进制修改器来完成dll的安全注入过程
1)通过DOS头找到PE头,然后在PE头中的Import Directory Table中添加一个新的结构体(windows.h中的命名为IMAGE_IMPORT_DESCRIPTOR)来通过windows应用程序loader来装载dll。
这里有个问题是 原PE头中的IDT(Import Directory Table)的尾部是否有足够的空间来允许我们添加一个结构体(LOADER是通过一个全NULL的结构体来判断IDT是否结束),这里问题产生了分支,如果空间足够的话,我们直接暴力修改IDT是没有任何问题的,但是如果空间不足够我们来加入一个新的结构体单元,我们的选择就只有将整个IDT的位置转移到(一.另一个节区的空闲空间之中 二.静态创建一个新的节区来存放IDT)
方法一:我们在清空原来映像中的IDT之后,把需要添加的结构体添加好,再修改指向IDT的RVA就完成了DLL的注入。
方法二:创建新的节区我们需要扩大整个静态文件的映像大小,并且精确计算新节区的起始RVA再做修改后,重复方法一的过程就完成了dll静态注入。(这一部分内容很多,这里不再赘述。)
<ReversingEngineering>关于windows32位系统下的dll注入技术经验汇的更多相关文章
- 64位系统下注册32位dll文件
64位系统下注册32位dll文件 在64位系统里注册32位软件所需的一些dll会提示不兼容,大概因为32 位进程不能加载64位Dll,64位进程也不可以加载32的导致. 若要支持的32 位和64 位C ...
- 64位系统下注册32位dll、ax文件
64位系统下注册32位dll.ax文件. 换了64位系统遇到的新问题,目前常用的影音处理软件多数为32位. 注册这些32的滤镜会提示不兼容,大概因为32 位进程不能加载64位Dll,64位进程也不可以 ...
- PL/SQL Developer 在windows7 64位系统下连Oaracle11g64位系统的解决经验
PL/SQL Developer 在windows7 64位系统下连Oaracle11g64位系统的解决经验 一.问题现象及解决方法 现象: 1.PL/SQL 无法登录64位数据库 2.在PL/SQL ...
- 64位系统下System32文件系统重定向
前言 因为一次偶然的机会,需要访问系统目录“C:/Windows/System32“文件夹下的内容,使用的测试机器上预装了win7 64系统.在程序运行中竟然发生了该文件路径不存在的问题!!通过查看网 ...
- win7 64位系统下安装autoitlibrary库遇到问题解决
转载来自http://blog.sina.com.cn/s/blog_53f023270101skyq.html 今天需要在win7 64位系统下安装autoitlibrary库,起初安装好了robo ...
- C#在 64位系统下出现 “未能加载文件或程序集”错误
64位系统下,Build的时候,如果选择Any CPU,默认会按照64位进行编译,便无法加载某些旧的dll,这些dll可能是特定到X86 CPU的. 所以,把编译选项中改为 X86CPU,就可以运行了 ...
- windows32位系统 安装MongoDB
今天在win7 32位系统下安装 MongoDB 时,遇到了一堆坑,特此笔记. 一.下载MongoDB 打开官网下载地址:https://www.mongodb.com/download-center ...
- (转)Win7 64位系统下 Retional rose 2003 安装及破解
网上关于Retional rose 2003安装和破解的文章比较多,这里,我结合自己的亲身体验,和大家分享一下win7 旗舰版 64位系统下Retional rose 2003(下面简称rose200 ...
- Win7 64位系统下 Retional rose 2003 安装及破解
网上关于Retional rose 2003安装和破解的文章比较多,这里,我结合自己的亲身体验,和大家分享一下win7 旗舰版 64位系统下Retional rose 2003(下面简称rose200 ...
随机推荐
- Solidworks如何改变零件颜色
如图所示装配体有三个零件,现在我想把移动件的颜色变成红色 鼠标左键单击要改变颜色的零件(这里点击"移动件"),然后在弹出的菜单中选择颜色,最后点击"编辑颜色" ...
- Hadoop实战: Linux报 tmp 磁盘存储不足
Linux 权限真是一大堆呀.在Linux下进行试验,突然来了个tmp磁盘存储不足..... .. .. ..... ... . 然而.我却没有权限给tmp添加容量.......... .. . 仅仅 ...
- POJ 题目3264 Balanced Lineup(RMQ)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 39046 Accepted: 18291 ...
- Ruby之Rspec的报错解决
#enconding:utf-8 require 'selenium-webdriver' require 'rspec' describe "baidu main page" d ...
- sublime添加sass编译
首先安装Ruby环境sass是基于ruby的产物,因此在安装sass前需要先安装ruby,如果用命令方式编译Sass也是必须安装ruby的.命令行编译sass见!下载Ruby windows 安装包: ...
- [原创] 浅谈开源项目Android-Universal-Image-Loader(Part 3.1)
最近,总算有时间去做些平时喜欢而没空去做的事情.一直觉得项目中使用的Image Loader适用性不强,昨晚在github随便逛逛,发现一个开源项目Android-Universal-Image-Lo ...
- CentOS 6.5语言包裁剪
https://www.ibm.com/developerworks/cn/linux/l-cn-linuxglb/ 浅析 Linux 的国际化与本地化机制 Linux 是一个国际化的操作系统,它的工 ...
- Windows系统的Jenkins持续集成环境
Windows系统的Jenkins持续集成环境 如题:本文将介绍如何在Windows环境下运用Jenkins部署持续集成环境.之所以写本文,是因为在最近工作当中,学习使用Jenkins时,确实遇到了一 ...
- python 安装protobuf
安装准备:python和protoc(编译proto到各个语言) 下载protobuf源代码(各种语言实现):https://github.com/google/protobuf 1.到Python ...
- RRDTool详解(转)
原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处.作者信息和本声明.否则将追究法律责任.http://freeloda.blog.51cto.com/2033581/1307492 大纲 ...