菜鸟脱壳之脱壳的基础知识(二) ——DUMP的原理
菜鸟脱壳之脱壳的基础知识(二)
——DUMP的原理
当外壳的执行完毕后,会跳到原来的程序的入口点,即Entry Point,也可以称作OEP!当一般加密强度不是很大的壳,会在壳的末尾有一个大的跨段,跳向OEP,类似一个壳与程序入口点的“分界线!当我们到达了程序的OEP,我们就需要进行DUMP程序了,那么什么时候去DUMP一个程序呢?这里我引用了fly的一句话!
“手动脱壳理想的最佳dump时机是指壳已经把程序代码包括资源等数据全部解密、输入表等数据还原但还未填充系统函数地址、DLL则还未重定位,此时dump出来的文件只需修正OEP、ImportTableRVA等信息即可正常运行完成脱壳。”
并不是所有的程序都要到达OEP才能进行脱壳的,只要把压缩的全部的代码数据释放到内存中,初始化一些必需的项目,我们就可以选择合适的DUMP点了!
那么何为DUMP呢?DUMP用中文翻译过来,就是转存,也就是抓取内存镜像,就是把内存指定地址的映像文件读取出来,然后用文件等形式保存下来!
我们比较常用的DUMP软件有LordPE、PETools等工具。这些工具基本都是利用Module32Next来获取将要呗Dump进程的信息,我们打开MSDN来查看下这个函数的原型:
BOOL WINAPI Module32Next( HANDLE hSnapshot, LPMODULEENTRY32 lpme );
我们再来看看他的参数:
Parameters
hSnapshot
Handle to the snapshot returned from a previous call to the CreateToolhelp32Snapshot function. //由前面的CreateToolhelp32Snapshot 函数返回的快照
lpme
Pointer to a MODULEENTRY32 structure. //是指向MODULEENTRY32 的指针
我们再在MSDN上面看看MODULEENTRY32的结构是什么样子的:
typedef struct tagMODULEENTRY32 {
DWORD dwSize; // 这个结构的大小
DWORD th32ModuleID;
DWORD th32ProcessID; // 进程的标识符
DWORD GlblcntUsage;
DWORD ProccntUsage;
BYTE * modBaseAddr; // 进程的映像基址
DWORD modBaseSize; // 进程的影响大小
HMODULE hModule; // 进程的句柄
char szModule[MAX_MODULE_NAME32 + 1];
char szExePath[MAX_PATH]; } MODULEENTRY32;
typedef MODULEENTRY32 * PMODULEENTRY32; typedef MODULEENTRY32 * LPMODULEENTRY32;
LordPE就是利用这个结构中的modBaseSize和modBaseAddr 得到进程的映像大小和基址,然后调用ReadProcessMemory来读取进程内所保存的数据,LordPE不用进程的文件头,直接读取原始的文件的文件头来用,读取内存数据后,再把进程中的数据保存到硬盘文件里。
OllyDbg的一个插件OllyDump,也支持DUMP功能,使用起来也比较简单方便,但是不方便DUMP取DLL文件的镜像!
完整版文档:
http://www.2cto.com/uploadfile/2012/1202/20121202072507103.zip
菜鸟脱壳之脱壳的基础知识(二) ——DUMP的原理的更多相关文章
- Dapper基础知识二
在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. 2,如何使用Dapper? 首先Dapper是支持多种数据库的 ...
- java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
- python基础知识(二)
python基础知识(二) 字符串格式化 格式: % 类型 ---- > ' %类型 ' %(数据) %s 字符串 print(' %s is boy'%('tom')) ----> ...
- Java基础知识二次学习--第三章 面向对象
第三章 面向对象 时间:2017年4月24日17:51:37~2017年4月25日13:52:34 章节:03章_01节 03章_02节 视频长度:30:11 + 21:44 内容:面向对象设计思 ...
- Java基础知识二次学习-- 第一章 java基础
基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一 ...
- 快速掌握JavaScript面试基础知识(二)
译者按: 总结了大量JavaScript基本知识点,很有用! 原文: The Definitive JavaScript Handbook for your next developer interv ...
- Java基础知识二次学习--第六章 常用类
第六章 常用类 时间:2017年4月26日16:14:49~2017年4月26日16:56:02 章节:06章_01节~06章_06节 视频长度:20:57+1:15+8:44+1:26+11:2 ...
- java接口自动化基础知识(二)
二.HttpClient+testNG实现对接口的测试及校验 在上面第一篇中已经实现了基础配置和测试用例数据准备,本篇文章将以登录举例进行测试执行. 这是之前login接口的代码 @Test(grou ...
- ThinkPHP框架基础知识二
一.空操作和空控制器处理 空操作:没有指定的操作方法:空控制器:没有指定控制器,例如: http://网址/index.php/Home/Main/login 正常 http://网址/index. ...
随机推荐
- Jedis连接 HelloWorld实现
建一个Maven项目, pom里加下jedis依赖, <dependency> <groupId>redis.clients</groupId> <artif ...
- LwIP协议栈规范翻译——摘要目录
摘要 LwIP是一种TCP/IP协议栈的实现.LwIP协议栈专注于减少内存的使用和代码的大小,使LwIP适用于嵌入式系统中在有限的资源下能够使用小型的客户机.为了减少处理和内存的需求,LwIP使用裁剪 ...
- linux 通过pid 寻找程序路径的最简单命令(pwdx)
在linux实际操作命令中,查看pid的方式有很多种,通过pid找程序路径的方式也有好几个,但是可能大家都忽略的一个很简单也是很实用的命令:pwdx. 比如要查找某个java编写的程序运行情况可通过j ...
- 【Tools】-NO.93.Tools.5.pyCharm-【pyCharm 安装与破解配置】-
1.0.0 Summary Tittle:[Tools]-NO.93.Tools.5.pyCharm-[pyCharm 安装与破解配置]- Style:Tools Series:Tools Since ...
- JAVA:IDEA使用Hibernate(2)
1.打开IDEA新建项目 勾选Hibernate.勾选下方生成相关配置和类 下方选择Download,如果使用本地已经下载的包则选择 Use Library ,路径选到包里面的require里导入即可 ...
- alias用法
echo 'alias msfconsole="pushd $HOME/git/metasploit-framework && ./msfconsole && ...
- centos共享目录
使用VirtualBOX自带的共享文件夹功能 运行环境: - 宿主机:windows 10 - 虚拟机:CentOS 7(我当初是按照Ubuntu环境下的教程弄的,所以其他Linux版本也可以参考 ...
- 分治法——归并排序(mergesort)
首先上代码. #include <iostream> using namespace std; int arr[11]; /*两个序列合并成一个序列.一共三个序列,所以用 3 根指针来处理 ...
- [转][访谈] Olivier Grisel谈scikit-learn和机器学习技术的未来
原文:http://www.csdn.net/article/2015-10-11/2825882 几周前,我们的Florian Douetteau (FD)对Olivier Grisel(OG)进行 ...
- docker基本管理
一.docker基本命令 1.docker 获取镜像 将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像 docker pull ubuntu:12.04 Pullin ...