zoukankan      html  css  js  c++  java
  • 利用 PEview 分析 PE 文件结构

    对照 Import_descriptor 结构体,给出遍历 INT 得到源文件中调用函数的 函数名、库名、函数索引

    源程序:wsample01a.exe

    首先了解import_descriptor结构体在哪里

    首先是最外面一层,可选PE头

    接着进入可选PE头

    DWORD AOE;
    ...
    DWORD ImageBase;
    ...
    ...
    ...
    //结尾
    IMAGE_DATA_DIRECTORY DataDirectory;

    里面有很多成员变量,在结尾的地方,有一个结构体数组,名叫DataDirectory,里面包含了16个数组,每个数组又又两个成员变量

    XX在内存中的起始地址;
    XX的长度;

    16个数组中第1,2个分别是导出表和导入表,第13个是导入地址表(缩写IAT)

    而导入表中又包含了许多结构体,就是我们要找的Image_Import_Descriptor结构体。

    因此定位到导入表在内存中的相对偏移地址RVA:

    换算RVA -> Raw,由公式Raw - PointToRawData = Rva - VA(PointerToRawData为节在硬盘中起始的地址,VA为节在内存的起始地址,这两个变量都在节表(IMAGE_SECTION_HEADER中)可以找到)

    1.我们先确定导入表在哪个节里面

    首先看第一个节的RVA,lucky!节的偏移地址和大小符合导入表偏,说明导入表在这个节里面

    再确认一下下一个节,没有问题

    2.运算的PointToRawData值

    则Raw=22A4-2000+E00=10A4(所有地址的值都是偏移地址,可以放一起计算)

    用Hxd把十六进制原文件看一下

    这里就是第一个Image_Import_Descriptor表中的结构体,共5个成员变量

    3.然后有的人可能纠结怎么开头三个元素是空的(大端存储,成员变量1个4字节),有没有算错?在我排查了一个多小时后,我确认自己没有算错

    参照IDT,发现也是对的

    Name的RVA是23B8,换算Raw为23B8-2000+E00=11B8

    我们找到了函数库名

    FistThunk变量的Raw值(即IAT表的首地址)=2000-2000+E00=E00,也没错

    那么值为0的OriginalThunk成员变量怎么转换为Raw呢?岂不是为负值?

    这次我在一个不起眼的ppt里面看到了答案:

    若OriginalFirstThunk值为0,就使用FirstThunk代替,那么找到对应地址的值

    换算Raw=23AC-2000+E00=11AC

    数组里面两个变量:编号+函数名字

    编号为0,函数名为lstrcmpW

    至此所有问题已解决。

  • 相关阅读:
    创建类以及引用一个类
    修改hosts文件
    微信第三方登录接口开发
    Android定位
    Leetcode 102. Binary Tree Level Order Traversal
    Leetcode 725. Split Linked List in Parts
    Leetcode 445. Add Two Numbers II
    Leetcode 328. Odd Even Linked List
    Leetcode 237. Delete Node in a Linked List
    Leetcode 234. Palindrome Linked List
  • 原文地址:https://www.cnblogs.com/echoDetected/p/13832273.html
Copyright © 2011-2022 走看看