zoukankan      html  css  js  c++  java
  • PE结构学习笔记(七)

    Chinese:

    1、一个区块的数据仅仅只是由于属性相同而放在一起,并不一定是同一种用途的内容。比如输入表、输出表等就有可能和只读常量一起被放在同一个区块中,因为它们的属性都是可读不可写的。

    2、导入函数就是被程序调用但其执行代码又不在程序中得函数,这些函数的代码位于相关的dll文件中,在调用者程序中只保留相关的函数信息(如函数名、dll文件名等)即可。

    3、通过一系列图文解说来简单看看什么是导入表

    (1)先写一个简单的程序

    #include <windows.h>
    
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       PSTR szCmdLine,
                       int iCmdShow)
    {
        MessageBox(NULL, TEXT("Hello, I'm Maple~"), TEXT("Hello!"), MB_OKCANCEL | MB_OK);
    
        return 0;
    }

    (2)这里使用一个强大的反汇编工具W32Dasm,我们用W32Dasm打开反汇编这个程序:

    我们找到比较靠前的IMPORTED FUNCTIONS和IMPORT MODULE,里面记载了该程序调用的动态链接库和导入的函数名。

    (3)然后我们右键点击查找,输入MessageBox点击查找,查找到了MessageBox的指令:

    (4) 这里先不管指令,我们看到了Call 00401BC0这条指令,这个0x401BC0就是MessageBox去调用的虚拟地址,继续找到0x401BC0这个地址,发现了跳转到了0x00406158这个地址

    (5)我们用虚拟地址减去基地址00400000得到RVA为0x6158。我在上篇文章介绍过如何通过RVA查找物理地址,这里用一个PEInfo工具去查找该文件的区块信息。打开PEInfo解析该程序,并看到区块表信息,由RVA得出该地址落在.idata(VOffset为0x6000)区块中。一般输入表的地址都是落在.idata区块中。

    (6)由LoarPE可以看到物理地址为0x1A00(ROffset), 用物理地址+RVA-区块的虚拟地址,既是PE文件的地址。0x1A00+0x0158=0x1B58,我们用16进制编辑器打开exe文件找到这个地址

     (7) 这里其实就是输入表的地址,但是这里貌似什么都没有,其实这是一个指向函数名的指针,我们记录一下这个虚拟地址0x6330,然后去计算物理地址为0x1A00+0x0330=0x1D30,然后再去16进制编辑器里面找到这个地址

     

     (8) 呵呵 是否看到了我们要寻找的函数名呢?至于细节 请看之后的学习笔记了

  • 相关阅读:
    依次逐个亮灯并且每次只能亮一个灯的跑马灯程序
    逐个点亮LED灯,再逐个熄灭LED灯的跑马灯程序---基于74HC595移位锁存器,程序框架用switch语句
    把74HC595驱动程序翻译成类似单片机IO口直接驱动的方式
    两片联级74HC595驱动16个LED灯的基本驱动程序
    树莓派
    Linux I2C驱动
    转:使用 /proc 文件系统来访问 Linux 内核的内容
    转: 使用 /sys 文件系统访问 Linux 内核
    树梅派 -- 通过/sys读写ADC芯片 pcf8591
    树莓派 -- oled 续(2) python
  • 原文地址:https://www.cnblogs.com/maplewan/p/3234081.html
Copyright © 2011-2022 走看看