壳基础(pe结构,导入表)

声明:因为pe文件已经学过,所有有很多重要东西没写上,只写了点之前不会的,仅供自己复习,有意者看。

PE文件结构:windows操作系统下的可执行文件的结构。

pe文件结构由为头部,和区块两部分组成。

pe文件的大致框架结构:

pe文件从磁盘加载到内存时会分配4GB虚拟地址,在磁盘上的结构与内存中的结构是一一对应的,程序运行时内存中拉伸了一点。

 虚拟地址:j加载到内存的地址

基址:imagebase

相对地址虚拟:偏移

虚拟地址=基质+相对虚拟地址

DOS头:是古老的16位的操作体统,微软为了兼容16位程序的运行,把DOS头放在了pe文件2框架的头部。

重要属性:MZ标志 pe文件跳转

标准pe头:

重要属性:numofsection:文件区的块数

timDataStamp:时间戳

sizeofoptionhead:可选pe头大小

可选pe头:

重要属性:addressofentorypoint:(RVA)相对虚拟地址

imagebase; 数据开始执行位置

sizeofhead:头尺寸大小 

区块表:

重要属性:vituraladdress (RVA)区段相对偏移地址

pointRawData:在文件中偏移地址

sizeofRvaData:在文件中的对其大小

  

链接库

把库文件打包成一个二进制文件

静态链接库(引用文件,利用):

在生成可执行文件之前,已经把所有的链接操作完成。

缺点:直接把二进制文件编译到exe文件中,不便于更改

动态链接库(提供给函数)

在程序执行的时候进行链接(生成的.dill文件,属于在单独在一个模块,如要进行某功能的修改,只需要修改.dill文件即可),对应的库文件称为动态链接库。

记载dill方法

1.显示·链接:使用时加载,用完释放。

2.隐式链接:一开始程序启动时加载,程序结束释放。

区别:静态链接库因为在程序运行之前就已经链接,,所以·可以独立运行。,而动态链接库生成的可执行文件在运行时才会链接所引用的外部地址,所以不能独立运行。

输入表(导入表):保存函数名和有关dill信息

每个dill都存放函数地址

IAT:相当于RVA相对虚拟地址

操作找函数所在地址

跳转到该地址,找到函数名

输入表位于数据目录表的第二个位置

我们可以找到他在文件中的位置,virturaladress是相对位置(RVA)通过工具即可找到输入表所在位置

输入表大体结构:

寻找dill(IAT)名字

寻找函数(IAT)名字

根据最后一个属性:FIrstTRunk

找到名称地址

继续转换该地址

即可找到函数名地址

大概流程:

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PE文件格式中的导入(import table)信息存储在可执行文件的数据目录中,具体来说是存储在`IMAGE_DIRECTORY_ENTRY_IMPORT`目录项中。该目录项的值可以在PE文件的NT头中找到,NT头是PE文件格式中的一个结构体,包含了PE文件的各种信息,包括数据目录的位置和大小等信息。 NT头的结构体定义如下: ``` typedef struct _IMAGE_NT_HEADERS { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; ``` 其中,`OptionalHeader`成员是一个结构体类型,它包含了PE文件的各种信息,包括数据目录的位置和大小等信息。`OptionalHeader`结构体定义如下: ``` typedef struct _IMAGE_OPTIONAL_HEADER { WORD Magic; BYTE MajorLinkerVersion; BYTE MinorLinkerVersion; DWORD SizeOfCode; DWORD SizeOfInitializedData; DWORD SizeOfUninitializedData; DWORD AddressOfEntryPoint; DWORD BaseOfCode; DWORD BaseOfData; DWORD ImageBase; DWORD SectionAlignment; DWORD FileAlignment; WORD MajorOperatingSystemVersion; WORD MinorOperatingSystemVersion; WORD MajorImageVersion; WORD MinorImageVersion; WORD MajorSubsystemVersion; WORD MinorSubsystemVersion; DWORD Win32VersionValue; DWORD SizeOfImage; DWORD SizeOfHeaders; DWORD CheckSum; WORD Subsystem; WORD DllCharacteristics; DWORD SizeOfStackReserve; DWORD SizeOfStackCommit; DWORD SizeOfHeapReserve; DWORD SizeOfHeapCommit; DWORD LoaderFlags; DWORD NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32; ``` 其中,`DataDirectory`是一个数组,它包含了PE文件的各个数据目录项的位置和大小等信息。导入信息就存储在`IMAGE_DIRECTORY_ENTRY_IMPORT`目录项中,它是`DataDirectory`数组的第5个元素,可以通过以下代码找到导入的位置和大小: ``` PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pDosHeader + pDosHeader->e_lfanew); PIMAGE_DATA_DIRECTORY pImportTable = &pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]; DWORD dwImportTableSize = pImportTable->Size; DWORD dwImportTableVA = pImportTable->VirtualAddress; ``` 其中,`pDosHeader`是指向PE文件DOS头的指针。`dwImportTableVA`是导入在内存中的虚拟地址,`dwImportTableSize`是导入的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值