<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 ...
随机推荐
- Drools的HelloWord例子
添加drools框架运行的依赖 <!--Drools 规则相关 --> <dependency> <groupId>org.drools</groupId&g ...
- Gson的应用测试
关于将对象列表直接转为json数组 代码如下: import java.util.ArrayList; import java.util.List; import com.google.gson.Gs ...
- C#网络编程:Socket编程
套接字简介:套接字最早是Unix的,window是借鉴过来的.TCP/IP协议族提供三种套接字:流式.数据报式.原始套接字.其中原始套接字允许对底层协议直接访问,一般用于检验新协议或者新设备问题,很少 ...
- Predicate与filter
转: http://blog.csdn.net/michaellufhl/article/details/6329823 怎么根据某些条件来过滤Collection的元素?我们可以在循环里面判断元素是 ...
- Linux 的计划任务(运维基础|可用于提权)
Linux操作系统定时任务系统 Cron 入门 先写笔记: crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 crontab -l //列出某个用户 ...
- HDOJ--2112--
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 通过a标签(不丢失referrer)打开另一个窗口
第一页 //这个是显示窗口的方法 function frmshow(arr){ var old; var val =$.trim($("#phone").val()); if (v ...
- js学习总结--DOM2兼容处理重复问题
在解决this问题之后,只需要在每次往自定义属性和事件池当中添加事件的时候进行以下判断就好了,具体代码如下: /* bind:处理DOM2级事件绑定的兼容性问题(绑定方法) @parameter: c ...
- spring4.0.0的配置和使用
1.创建一个javaproject或者webproject,我创建的时webproject,编译器用的时myeclipse2013 2.在lib文件夹以下倒入spring须要的一些核心包例如以下 还需 ...
- 浅谈java反序列化工具ysoserial
前言 关于java反序列化漏洞的原理分析,基本都是在分析使用Apache Commons Collections这个库,造成的反序列化问题.然而,在下载老外的ysoserial工具并仔细看看后,我发现 ...