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

脱壳实践之手动构造输入表相关推荐

  1. 22. PE结构-PE详解之输入表(导入表)、屠龙刀W32Dasm(静态)、LordPE(动态)工具入门(查找dll、调用函数)

    我们知道PE 文件中的数据被载入内存后根据不同页面属性被划分成很多区块(节),并有区块表(节表)的数据来描述这些区块.这里我们需要注意的问题是:一个区块中的数据仅仅只是由于属性相同而放在一起,并不一定 ...

  2. 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc)

    系列汇总 写一个PE的壳_Part 1:加载PE文件到内存 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc) 写一个PE的壳_Part 3:Section里实 ...

  3. 手动脱壳—dump与重建输入表(转)

    文章中用到的demo下载地址: http://download.csdn.net/detail/ccnyou/4540254 附件中包含demo以及文章word原稿 用到工具: Ollydbg Lor ...

  4. 重建输入表 - 脱壳篇04

    重建输入表 - 脱壳篇04 让编程改变世界 Change the world by program 重建输入表 [caption id="attachment_2648" alig ...

  5. 依次输入表(30,15,28,20,24,10,68,35,50)中的元素,生成一棵平衡的二叉排序树。请画出构造过程,并在其中注明每一次平衡化的类型(LL型、RR型、LR型、RL型)

    题目 依次输入表(30,  15,  28,  20,  24,  10,  68,  35,  50)中的元素,生成一棵平衡的二叉排序树. 请画出构造过程,并在其中注明每一次平衡化的类型(LL型.R ...

  6. 33. 脱壳篇-重建输入表

    OD自动分析MessageBox,call 004011EA,他是怎么分析知道函数MessageBox 打开PE头文件,INT 我们要重点关注的字段一个是ImageBase基址,一个是Import T ...

  7. android手动创建数据表,Android开发—数据库应用—手动创建(SQLite)数据库--手动创建数据表(table)...

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称:数据库应用-手 ...

  8. sql 查询手动创建的表_学习SQL:使用SQL查询手动创建报告

    sql 查询手动创建的表 In the previous two articles, we've practiced SQL queries and went through a few more e ...

  9. 利用ESP定律的upx脱壳实践

    背景: 除了命令行upx -d脱壳,还有手动脱壳.ESP定律的本质是堆栈平衡,又称堆栈平衡定律,是应用频率最高的脱壳方法之一,脱壳的目的就是找到真正的OEP(源文件的EP代码) 方法: 从pushad ...

最新文章

  1. 无法连接iphone软件更新服务器_NX许可证错误:无法连接至许可证服务器系统。SPLM_LICENSE_SERVER错误[15]...
  2. 【Linux】关于Linux操作系统的配置步骤
  3. 深度学习模型的可视化技术总结
  4. java-word转pdf时的异常积累
  5. 美服fgo显示服务器异常,FGO日服美服错误代码合集_FGO日服美服错误代码汇总_牛游戏网...
  6. Ubuntu下安装Qt
  7. 编程中常见的数学概念及常用解法
  8. 张孝祥张老师一路走好!
  9. 苹果开发者账号注册第一步,Apple ID 的双重认证,为 Apple ID 设置双重认证
  10. 计算机页面里的坚果云删不了怎么回事,坚果云如何卸载?卸载坚果云的几种方法...
  11. cx oracle 连接编码,python用cx_Oracle连接oracle编码问题解决办法
  12. Oracle 查询库文件信息
  13. 什么是蜘蛛统计 有什么作用?
  14. 计算机系笔记本电脑配置,笔记本电脑硬件配置全解析, 看完让你轻松选择笔记本...
  15. STM32 HAL库学习系列第13篇---串口重定向配置--printf
  16. 服务器维护lol3.23,LOL3月23日测试服更新公告 3月23日更新内容介绍
  17. 关于“与google服务器通信时出现问题“
  18. 【英语六级】【仔细阅读】(3)
  19. 23 种设计模式的有趣见解
  20. 基于Android的儿童绘本阅读与收听APP的设计与实现【附项目源码+论文说明】

热门文章

  1. saltstack (1) 简介
  2. 使用 VisualVM 进行性能分析及调优
  3. 用户 'sa' 登录失败。该用户与可信 SQL Server 连接无关联。
  4. Gnu/Linux 链接XServer方法
  5. 英国《金融时报》:全力加码早期投资,红杉中国在下一盘怎样的棋?
  6. Kubernetes1.13.1部署Kuberneted-dashboard v1.10.1
  7. Algs4-1.4.7统计算术运算与比较次数
  8. 开发工具 | git、github使用场景总结
  9. 二叉查找树(binary search tree)详解
  10. Kettle调用Java类