<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 ...
随机推荐
- 获取安装后Apache、MySQL、Nginx、PHP编译时参数
# cat /usr/local/apache2/build/config.nice //获取Apache编译时的参数 #!/bin/sh # #Created by configure & ...
- 从零开始搭建GitHub个人博客--第一步
最近一段时间工作不是很忙,便开始着手整理博客并梳理自己的简历 可是,打开cnblog后第一眼我便开始了纠结~ 原起: 一直在cnblog写博客,看博客,突然发现这种在线纯文档记录的方式俨然跟不上时代的 ...
- 在windows搭建jenkins測试环境
jenkins 搭建好开发环境必备之中的一个,简单易用,搭建測试平台非常有帮助,不知道的都能够了解一下 官网下载地址 http://jenkins-ci.org/ 我是下载window版本号的 安装有 ...
- HTML5 Canvas 绘制佛教万字
代码如下: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Ty ...
- 转载:JAVA中获取项目文件路径
本文转载自:http://blog.163.com/michaelgaoit%40126/blog/static/11389538620103711613620/ web 上运行 1:this.get ...
- vue.js+koa2项目实战(三)登录注册模态框
登录注册模态框 注: [Vue warn]: Do not use built-in or reserved HTML elements as component id: diaLog 原因:diaL ...
- 编程算法 - 两个链表的第一个公共结点 代码(C)
两个链表的第一个公共结点 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入两个链表, 找出它们的第一个公共结点. 计算链表的长度, 然后移动 ...
- binary-tree-inorder-traversal——二叉树中序遍历
Given a binary tree, return the inordertraversal of its nodes' values. For example:Given binary tree ...
- setTimeout()基础/setInterval()基础
JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...
- 转:DDR中端接技术基本概念
DDR中端接技术基本概念 版权声明:转载请注明出处:http://blog.csdn.net/lg2lh https://blog.csdn.net/lg2lh/article/details/90 ...