脱壳实践之手动构造输入表
0x00 前言
对于脱壳后的程序往往不能直接运行,这是因为它们很多都没有重建输入表。当然用的od脱壳可能可以。重建输入表一般都是用专业软件比如ImportREC。但是对于逆向研究者来说会自己重讲输入表是必须的技能。这就需要读者对前面几篇所讲的PE文件格式非常熟悉。
0x01 寻找OEP脱壳脱壳
前面已经提到对于区段信息全都已经改的面目全非的加壳程序,用两次内存断点法是无法找到OEP地址的,比如今天我们用的这个程序,下图为它的区段信息:
上图可知我们根本无法知晓哪个区段存放数据,哪个区段存放代码。这种情况下用两次断点法难免会失效。因此我们应该采用堆栈平衡法来寻找OEP地址。这里步骤就省去了,毕竟今天的主题是构造输入表,有兴趣了解堆栈平衡法的可以去我的博客按标题查看。下图为找的OEP地址:
既然找到了OEP地址,就直接使用OD来脱壳了。点击插件的ollydump,把重建输入表去掉,毕竟这个是我们接下来的工作。如下图:
0x02 手动重建输入表
思路:找到被调用的api函数——》将DLL函数和api函数写入脱壳后的文件的空白区域——》空白区域重写IMAGE_THUNK_DATA数组——》空白区域重写IID数组——》将IID数组地址写入数据目录表第二项。
重建之前我们先来看看脱壳后的程序的输入表,如下图:
明显看出这个输入表已经紊乱了。接下来我们一步步重建它。
1)我们先用没有加壳的原程序来看看他调用了哪些函数(一定要用没有加壳的,加了壳的调用的函数会很不同)。见下图:
上图可知共调用了四个个函数KERNEL32.DLL调用了ExitProcess和CreateFileA而USER32.DLL调用了MessageBoxA。
2)将输入DLL以及被调用的函数写入脱壳后程序的空白区域
此表是DLL已经函数写入的地址(这里的地址都是高低位互换的便易在hexworkshop中读写)
DLL名及DLL地址 |
函数名及函数地址 |
||||
KERNEL32.DLL |
0016 0000 |
ExitProcess |
1a16 0000 |
CreateFileA |
2816 0000 |
USER32.DLL |
0d16 0000 |
MessageBoxA |
3616 0000 |
(PS:DLL之间应该有一个字符空隙,DLL与API函数,API函数与API函数之间应该有三个字符间隙,因为前面API函数前面个两个字节是预留给IMAGE_IMPORT_BY_NAME的Hint字段多余的一个作为间隙)
3)在空白区域构造IMAGE_THUNK_DATA数组。
构造IMAGE_THUNK_DATA数组起始位置16b0
第一个IID数组的IMAGE_THUNK_DATA数组 |
1a16 0000-2=1816(16b0) |
28160000-2=2616 (16b4) |
第二个IID数组的IAMGE_THUNK_DATA数组 |
3616 0000-2=3416(16BC) |
构造完成之后如下图:
IID数组之间预留四个字节的间隙
4)构造IID数组
另找一块空白区域,我们这里选用1760处。
构造IID数组位置:1760
DLL名称 |
OriginalFristThunk |
TimaStamp |
ForwordChian |
Name |
FristThunk |
KERNEL32.DLL |
B016 0000 |
0000 0000 |
0000 0000 |
0016 0000 |
B016 0000 |
USER32.DLL |
Bc16 0000 |
0000 0000 |
0000 0000 |
0d16 0000 |
Bc16 0000 |
结束标志 |
0000 0000 |
0000 0000 |
0000 0000 |
0000 0000 |
0000 0000 |
构造后如下图:
5)将数据目录表的第二项改成IID的地址1760,后面四个字节写入IID数组大小28,如下图:
至此手动构造完毕,保存文件。
0x03 检验构造的输入表是否起作用。
我们用LordPE打开保存后的文件,点击目录信息,再点击输入表即可查看信息,如下图:
很明显,我们手动构造的输入表已经起作用了。
0x04 总结
虽然手动构造输入表成功了,但是我发现脱壳后的程序并不能正常运行,这两天一直在思考其中的缘由,如果有幸哪位大佬看到这篇文章请留言指导一二。
转载于:https://www.cnblogs.com/2f28/p/9870848.html
脱壳实践之手动构造输入表相关推荐
- 22. PE结构-PE详解之输入表(导入表)、屠龙刀W32Dasm(静态)、LordPE(动态)工具入门(查找dll、调用函数)
我们知道PE 文件中的数据被载入内存后根据不同页面属性被划分成很多区块(节),并有区块表(节表)的数据来描述这些区块.这里我们需要注意的问题是:一个区块中的数据仅仅只是由于属性相同而放在一起,并不一定 ...
- 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc)
系列汇总 写一个PE的壳_Part 1:加载PE文件到内存 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc) 写一个PE的壳_Part 3:Section里实 ...
- 手动脱壳—dump与重建输入表(转)
文章中用到的demo下载地址: http://download.csdn.net/detail/ccnyou/4540254 附件中包含demo以及文章word原稿 用到工具: Ollydbg Lor ...
- 重建输入表 - 脱壳篇04
重建输入表 - 脱壳篇04 让编程改变世界 Change the world by program 重建输入表 [caption id="attachment_2648" alig ...
- 依次输入表(30,15,28,20,24,10,68,35,50)中的元素,生成一棵平衡的二叉排序树。请画出构造过程,并在其中注明每一次平衡化的类型(LL型、RR型、LR型、RL型)
题目 依次输入表(30, 15, 28, 20, 24, 10, 68, 35, 50)中的元素,生成一棵平衡的二叉排序树. 请画出构造过程,并在其中注明每一次平衡化的类型(LL型.R ...
- 33. 脱壳篇-重建输入表
OD自动分析MessageBox,call 004011EA,他是怎么分析知道函数MessageBox 打开PE头文件,INT 我们要重点关注的字段一个是ImageBase基址,一个是Import T ...
- android手动创建数据表,Android开发—数据库应用—手动创建(SQLite)数据库--手动创建数据表(table)...
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称:数据库应用-手 ...
- sql 查询手动创建的表_学习SQL:使用SQL查询手动创建报告
sql 查询手动创建的表 In the previous two articles, we've practiced SQL queries and went through a few more e ...
- 利用ESP定律的upx脱壳实践
背景: 除了命令行upx -d脱壳,还有手动脱壳.ESP定律的本质是堆栈平衡,又称堆栈平衡定律,是应用频率最高的脱壳方法之一,脱壳的目的就是找到真正的OEP(源文件的EP代码) 方法: 从pushad ...
最新文章
- 无法连接iphone软件更新服务器_NX许可证错误:无法连接至许可证服务器系统。SPLM_LICENSE_SERVER错误[15]...
- 【Linux】关于Linux操作系统的配置步骤
- 深度学习模型的可视化技术总结
- java-word转pdf时的异常积累
- 美服fgo显示服务器异常,FGO日服美服错误代码合集_FGO日服美服错误代码汇总_牛游戏网...
- Ubuntu下安装Qt
- 编程中常见的数学概念及常用解法
- 张孝祥张老师一路走好!
- 苹果开发者账号注册第一步,Apple ID 的双重认证,为 Apple ID 设置双重认证
- 计算机页面里的坚果云删不了怎么回事,坚果云如何卸载?卸载坚果云的几种方法...
- cx oracle 连接编码,python用cx_Oracle连接oracle编码问题解决办法
- Oracle 查询库文件信息
- 什么是蜘蛛统计 有什么作用?
- 计算机系笔记本电脑配置,笔记本电脑硬件配置全解析, 看完让你轻松选择笔记本...
- STM32 HAL库学习系列第13篇---串口重定向配置--printf
- 服务器维护lol3.23,LOL3月23日测试服更新公告 3月23日更新内容介绍
- 关于“与google服务器通信时出现问题“
- 【英语六级】【仔细阅读】(3)
- 23 种设计模式的有趣见解
- 基于Android的儿童绘本阅读与收听APP的设计与实现【附项目源码+论文说明】
热门文章
- saltstack (1) 简介
- 使用 VisualVM 进行性能分析及调优
- 用户 'sa' 登录失败。该用户与可信 SQL Server 连接无关联。
- Gnu/Linux 链接XServer方法
- 英国《金融时报》:全力加码早期投资,红杉中国在下一盘怎样的棋?
- Kubernetes1.13.1部署Kuberneted-dashboard v1.10.1
- Algs4-1.4.7统计算术运算与比较次数
- 开发工具 | git、github使用场景总结
- 二叉查找树(binary search tree)详解
- Kettle调用Java类