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

    至此所有问题已解决。

  • 相关阅读:
    ATI Radeon HD 5450 with full QE/CI Support ( 转载 )
    从零开始学iPhone开发(5)——使用MapKit
    从零开始学iPhone开发(4)——使用WebView
    从零开始学iPhone开发(3)——视图及控制器的使用
    从零开始学iPhone开发(2)——控件的使用
    从零开始学iPhone开发(1)——工具的使用
    实战做项目如何选择开源许可协议(一)-了解协议
    git使用3
    git团队开发操作
    git分支管理
  • 原文地址:https://www.cnblogs.com/echoDetected/p/13832273.html
Copyright © 2011-2022 走看看