0x00 前言

前面两篇讲到了输出表的内容以及涉及如何在hexWorkShop中找到输出表及输入DLL,感觉有几个地方还是没有理解好,比如由数据目录表DataDirectory[16]找到输出表表后以为找到输入DLL就完了,其实这一流程的最终功能是通过输入DLL找到输入DLL调用的函数,这一步骤是通过输出表结构中的OriginalFristThunk或者OriginalFristThunk所指向的INT或者IAT结构来找到的。这里要说明的是,虽然一般情况通过OriginalFristThunk也行,但是有些情况下它的值被设置为0了,这样就无法利用了,最委托的的方式是通过FristThunk所指向的IAT表来找寻。下面来通过实例实践这一过程。

0x01 找寻输入DLL以及输入DLL调用的函数

材料及工具:名为PE.exe的可执行文件,工具hexWrokshop,LordPE

思路:找到PE文件头——》找到数据目录表第二项——》通过地址转换找到输出表数组——》逐个读出输出表数组的OriginalFristThunk,FristThunk值——》通过INT或者IAT逐个读出被调用函数的名字地址——》通过名字地址找到函数名。

1)将目标文件拖入hexWrokShop,快捷键ctrl+g跳往载入地址的3ch处,这里即PE文件头地址,如下图:

2)跳往40h处,该处即为文件头,如下图:

3)跳往PE文件头+80h处,该处存储了输入数据表的地址如下图:

4)将RVA=2040h转化位FileOffset地址,这里我们利用lordpe协助转化,转化后值为440h。

5)跳转至440h处,该处即为输出表IID数组的数据所在,每项为五对双字组成,结尾以五对双字0。我这个实例一共两组,如下图:

将以上根据字段数据统计如下表(PS:由于hex中是由低位到高位的故统计时应该注意高低位的换位):

OriginalFristThunk

TimeStamp

ForwardChain

Name

FristThunk

0000208C

00000000

00000000

00002174

00002010

0000207C

00000000

00000000

000021B4

00002000

利用表中的Name字段我们可以直接推出输入DLL的名字,第一项Name的RVA为2174h,转化为FileOffset值为:574h,跳往574h,我们可以看到第一个DLL为USER32.DLL,如下图:

第二项的Name值为RVA值为21B4h,转化位FileOffset值为5B4h,跳往574h,我们知道第二项DLL为KERNEL32.DLL,如下图:

6)知道了输入DLL不是我们目的终点,我们还要知道DLL所调用的所有函数名字地址,这里有两个字段可用,第一个是OriginalFristThunk,它所指向的是一个名为输入名称表(INT)的结构,这个结构是由多个IMAGE_THUNK_DATA结构所组成的数组。第二个是FristThunk,它所指向的是一个名称为输入地址表的(IAT)的结构,这个结构也是有多个IMAGE_THUNK_DATA结构所组成的数组。IMAGE_THUNK_DATA双字数组的每项指向另一个结构——IMAGE_IMPORT_BY_NAME。最终通过IMAGE_IMPORT_BY_NAME找到被DLL调用的函数。一般而言,这两个被指向的数组值是相等的。我们接下来分别用两个字段来查找。我们先用第一项的OriginalFristThunk来试试,将208C转化为FileOffset得48ch。掉跳往48ch,的如下图结果,共十一项,以双字0结尾。

我们用FristThunk来试试,将2010h转化为FileOffset得410h,跳往410h,可得下图:

它们的值都为:

102100001C210000F4200000E0200000502100006421000002210000CE200000BC2000002E21000042210000,将数据按八个字节拆分与翻转的下表:

第一项指向的IAMGE_THUNK_DATA数组

00002110

0000211C

000020F4

000020E0

00002150

00002164

00002102

000020CE

000020BC

0000212E

00002142

接下来进行地址转换,的下表:

510

51c

4f4

4e0

550

564

502

4ce

4bc

52e

542

7)由上表逐个查询出被调用函数名,如下图:

重复以上操作的下表:

RVA

FileOffset

Hint

函数名

00002110

510

019B

LoadIconA

0000211C

51c

01DD

PostQuitMessage

000020F4

4f4

0128

GetMessageA

000020E0

4e0

0094

DispatchMessageA

00002150

550

027D

TranslateMessage

00002164

564

028B

UpdateWindow

00002102

502

0197

LoadCursorA

000020CE

4ce

0083

DefWindowProcA

000020BC

4bc

0058

CreateWindowExA

0000212E

52e

01EF

RegisterClassExA

00002142

542

0265

ShowWindow

8)当然你可能会觉得这样找输入表实在太麻烦了,确实是,但是只有经过这样找你才能弄明白输出表到底是如何存放的转换的,从而对PE文件格式有更为透彻理解。接下来我们通过强大的lordPE来轻松查找到输入表和输入函数。如下图:

 0x02 总结

这两天看加密与解密收获很大,对于对逆向破解的朋友我强烈建议读一读此书,有相同兴趣的朋友欢迎评论留言交流。

PE文件格式详解(六)的更多相关文章

  1. PE文件格式详解,第一讲,DOS头文件格式

    PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...

  2. PE文件格式详解,第二讲,NT头文件格式,以及文件头格式

    PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...

  3. PE文件格式详解,第三讲,可选头文件格式,以及节表

    PE文件格式详解,第三讲,可选头文件格式,以及节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶可选头结构以及作 ...

  4. PE文件格式详解(七)

    PE文件格式详解(七)   Ox00 前言 前面好几篇在讲输入表,今天要讲的是输出表和地址的是地址重定位.有了前面的基础,其实对于怎么找输出表地址重定位的表已经非常熟悉了.   0x01 输出表结构 ...

  5. PE文件格式详解(下)

    作者:MSDN译者:李马 预定义段 一个Windows NT的应用程序典型地拥有9个预定义段,它们是.text..bss..rdata..data..rsrc..edata..idata..pdata ...

  6. PE文件格式详解(上)

    作者:MSDN 译者:李马 摘要 Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式.PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Spec ...

  7. PE 文件格式详解

    PE文件 是微软 Win32 环境下可执行文件的标准格式. 所谓的可执行文件并不仅仅是常见的 EXE 文件,DLL,SYS,VXD 等文件也都属于 PE 格式. |-------> DOS_MZ ...

  8. PE文件格式详解(一)

    PE文件格式介绍(一) 0x00 前言 PE文件是portable File Format(可移植文件)的简写,我们比较熟悉的DLL和exe文件都是PE文件.了解PE文件格式有助于加深对操作系统的理解 ...

  9. PE文件格式详解(八)

    0x00 前言 前面了解了PE文件的输入和输出,今天来看看另一个重要的结构——资源.资源结构是很典型的树形结构,层层查找,最终找到资源位置. 0x01 资源结构介绍 Windows程序的各种界面成为资 ...

随机推荐

  1. 终于我用JOL打破了你对java对象的所有想象

    目录 简介 JOL简介 使用JOL分析VM信息 使用JOL分析String 使用JOL分析数组 使用JOL分析自动装箱 使用JOL分析引用关系 总结 简介 使用面向对象的编程语言的好处就是,虽然没有女 ...

  2. Flutter upgrade更新版本引发的无法启动调试APP的错误 target:kernel_snapshot failed”

    前言 我的主机上的Flutter 本地的分支是在 beta,因为去年想尝鲜Flutter Web,所以一直没切回来stable分支. 早上打开VSCode,右下角弹出了Flutter upgrade的 ...

  3. shell编程(一):功能、执行、基础

    1.shell的功能 (1)自动化批量初始化系统:对N台系统初始化(装系统时对系统的时区.yum源.软件包的更新.安全的设置进行初始化) (2)自动化批量部署软件程序:(LAMP/LNMP/Tomca ...

  4. 宝塔部署时,出现“open_basedir restriction in effect”错误

    下面是错误代码: Warning: require(): open_basedir restriction in effect. Warning: require(XXXXXXXXXXX): fail ...

  5. Swift 界面跳转

    iOS开发中界面跳转有两种方式,上下跳转和左右跳转. 上下跳转_TO: let secondViewController = SecondViewController() self.presentVi ...

  6. HashMap源码和并发异常问题分析

    要点源码分析 HashMap允许键值对为null:HashTable则不允许,会报空指针异常: HashMap<String, String> map= new HashMap<&g ...

  7. D2大全

    年初看到cnblogs上有人说看这本旧书,自己也只是瞟了下,后来在看些OOP东西时,想想没事也看看老古董,于是网购了一本电子版可参考下,它们是怎么一步步来,还没来得及多看,贴图于此.

  8. 从0到70%:Chrome上位揭秘!

    最近的数据显示,Chrome在2020年4月的市场份额达到了70%左右,把微软的Edge和Firefox远远甩在身后,毫无疑问,Chrome赢得了第二次游览器之战,成为新一代王者. Chrome的第一 ...

  9. CentOS7.5搭建spark2.3.1集群

    一 下载安装包 1 官方下载 官方下载地址:http://spark.apache.org/downloads.html 2  安装前提 Java8         安装成功 zookeeper  安 ...

  10. 浅谈async 及 await

    async 及 await 涉及面试题:async 及 await 的特点,它们的优点和缺点分别是什么?await 原理是什么? 一个函数如果加上 async ,那么该函数就会返回一个 Promise ...