PE文件之导入表

news2025/1/13 8:07:38

1. 导入表

在这里插入图片描述

2. 显示导入表信息的例子

; 作用: 将RVA地址转成FOA即文件偏移
; 参数: _pFileHdr 	指向读到内存中文件的基址指针
;       _dwRVA 		目标RVA地址
; 返回: 目标RVA转成文件偏移的值
RVA2FOA PROC USES esi edi edx, _pFileHdr:PTR BYTE, _dwRVA:DWORD
	
	mov esi, _pFileHdr 
	assume esi:ptr IMAGE_DOS_HEADER
	; 获取PE头
	mov edi, [esi].e_lfanew
	assume esi:nothing
	add edi, esi 
	assume edi:ptr IMAGE_NT_HEADERS32
	; 获取节数
	movzx ecx, [edi].FileHeader.NumberOfSections
	assume edi:nothing
	; 获取节表地址
	add edi, SIZEOF IMAGE_NT_HEADERS32
	assume edi:ptr IMAGE_SECTION_HEADER
L0:
	mov edx, _dwRVA
	cmp edx, [edi].VirtualAddress
	jb @F

	mov eax, [edi].VirtualAddress
	add eax, [edi].SizeOfRawData
	cmp edx, eax
	jae @F

	sub edx, [edi].VirtualAddress
	add edx, [edi].PointerToRawData
	mov eax, edx
	jmp Ending
@@:
	add edi, SIZEOF IMAGE_SECTION_HEADER
	loop L0
	xor eax, eax
Ending:
	ret

RVA2FOA ENDP

.data 
Crlf 				BYTE 0dh, 0ah, 0
szDllName 			BYTE "导出表: %s", 0dh, 0ah, 0
szSep				BYTE "---------------------------", 0dh, 0ah, 0
szINTRVA			BYTE "OriginalFirstThunk: 0x%08X", 0dh, 0ah, 0
szTimeStmp  		BYTE "TimeDateStamp: 0x%08X", 0dh, 0ah, 0
szForwarderChain	BYTE "ForwarderChain: 0x%08X", 0dh, 0ah, 0
szNameRVA			BYTE "Name: 0x%08X", 0dh, 0ah, 0
szFirstThunk		BYTE "FirstThunk: 0x%08X", 0dh, 0ah, 0dh, 0ah, 0
szFnInfo			BYTE "%hd %s", 0dh, 0ah, 0

szBuf				BYTE 64 DUP(0)

.code 
; 作用: 打印输出导入表信息
; 参数: _pFileHdr 	指向读到内存中文件的基址指针
; 返回: 无
_getImportTblInfo PROC _pFileHdr:PTR BYTE
	pushad 
	mov esi, _pFileHdr
	assume esi:PTR IMAGE_DOS_HEADER
	add esi, [esi].e_lfanew 
	assume esi:PTR IMAGE_NT_HEADERS32 
	mov esi, [esi].OptionalHeader.DataDirectory[8].VirtualAddress
	push esi
	mov eax, _pFileHdr
	push eax 
	call RVA2FOA

	mov esi, eax 
	add esi, _pFileHdr 
	assume esi:PTR IMAGE_IMPORT_DESCRIPTOR 

L0:
	; 确定导入表是否结束
	mov edx, [esi].Name1
	test edx, edx 
	jnz @F 
	jmp Ending 
@@:
	mov edx, [esi].OriginalFirstThunk
	test edx, edx 
	jnz @F 
	jmp Ending 
@@:
	mov edx, [esi].TimeDateStamp
	test edx, edx 
	jnz @F 
	jmp Ending 
@@:
	mov edx, [esi].ForwarderChain
	test edx, edx 
	jnz @F 
	jmp Ending 
@@:
	mov edx, [esi].FirstThunk
	test edx, edx 
	jnz @F 
	jmp Ending 
@@:
	; 进行IAT显示
	mov edx, [esi].Name1 
	push edx 
	push _pFileHdr 
	call RVA2FOA 
	add eax, _pFileHdr
	; 显示dll名称
	invoke wsprintf, OFFSET szBuf, OFFSET szDllName, eax 
	invoke crt_printf, OFFSET szBuf 
	invoke crt_printf, OFFSET szSep
	; 显示OriginalFirstThunk的RVA地址
	invoke wsprintf, OFFSET szBuf, OFFSET szINTRVA, [esi].OriginalFirstThunk 
	invoke crt_printf, OFFSET szBuf
	; 显示时间戳
	invoke wsprintf, OFFSET szBuf, OFFSET szTimeStmp, [esi].TimeDateStamp 
	invoke crt_printf, OFFSET szBuf
	; 显示ForwarderChain
	invoke wsprintf, OFFSET szBuf, OFFSET szForwarderChain, [esi].ForwarderChain 
	invoke crt_printf, OFFSET szBuf
	; 显示Name的RVA地址
	invoke wsprintf, OFFSET szBuf, OFFSET szNameRVA, [esi].Name1 
	invoke crt_printf, OFFSET szBuf
	; 显示FirstThunk的RVA地址
	invoke wsprintf, OFFSET szBuf, OFFSET szFirstThunk, [esi].FirstThunk 
	invoke crt_printf, OFFSET szBuf
	; 打印具体函数信息
	; 获取INT的RVA地址, 把VA转成FOA
	push [esi].OriginalFirstThunk
	push _pFileHdr 
	call RVA2FOA
	add eax, _pFileHdr
L1:
	assume eax:PTR IMAGE_THUNK_DATA 
	mov ebx, [eax].u1.Function
	test ebx, ebx 
	jz NextDesc
	push eax 
	mov eax, [eax].u1.Function
	test eax, 80000000h
	jnz BySeq
	push eax 
	push _pFileHdr
	call RVA2FOA
	add eax, _pFileHdr
	assume eax:PTR IMAGE_IMPORT_BY_NAME 
	movzx edx, WORD PTR [eax].Hint
	lea ebx, [eax].Name1 
	invoke wsprintf, OFFSET szBuf, OFFSET szFnInfo, edx, ebx
	invoke crt_printf, OFFSET szBuf
	pop eax 
	add eax, SIZEOF IMAGE_THUNK_DATA
	jmp @F 
BySeq:
	
@@:
	jmp L1 
NextDesc:
	push OFFSET Crlf
	call crt_printf
	push OFFSET Crlf
	call crt_printf
	add esi, SIZEOF IMAGE_IMPORT_DESCRIPTOR
	jmp L0
Ending:
	popad 
	ret 

_getImportTblInfo ENDP 

运行的部分截图:
在这里插入图片描述

3. 导入表图

在这里插入图片描述
(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1058108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

饲料微生物检验 采样.

声明 本文是学习GB-T 42959-2023 饲料微生物检验 采样. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了以微生物检验为目的的采样原则、采样人员、设备和材料、采样方案、采样步骤和采样 报告。 本文件适用于以微生物检验为目的…

Can‘t pickle <class ‘__main__.Test‘>: it‘s not the same object as __main__.Test

目录 原因1 类名重复了 案例1 变量名和类名重复 原因1 类名重复了 检查项目代码&#xff0c;是不是其他地方有同名类。 案例1 变量名和类名重复 转自&#xff1a;python3报错Cant pickle <class __main__.Test>: its not the same object as __main__.Test解决 - 知乎…

接口日志,统一记录(AOP+自定义注解)

需求 指定接口&#xff0c;记录请求的日志。 接口日志的核心内容包括&#xff1a;请求方法&#xff0c;接口路径&#xff0c;请求参数等。 方案 采用的方案是&#xff1a;AOP 自定义注解 说明&#xff1a; 在需要记录日志的接口上&#xff0c;加上自定义注解ApiLog&…

样品运输与贮存

声明 本文是学习GB-T 42959-2023 饲料微生物检验 采样. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了以微生物检验为目的的采样原则、采样人员、设备和材料、采样方案、采样步骤和采样 报告。 本文件适用于以微生物检验为目的…

如何限制文件只能通过USB打印机打印,限制打印次数和时限并且无法在打印前查看或编辑内容

在今天这个高度信息化的时代&#xff0c;文档打印已经成为日常工作中不可或缺的一部分。然而&#xff0c;这也带来了诸多安全风险&#xff0c;如文档被篡改、知识产权被侵犯以及信息泄露等。为了解决这些问题&#xff0c;只印应运而生。作为一款独特的软件工具&#xff0c;只印…

《视觉 SLAM 十四讲》V2 第 4 讲 李群与李代数 【什么样的相机位姿 最符合 当前观测数据】

P71 文章目录 4.1 李群与李代数基础4.1.3 李代数的定义4.1.4 李代数 so(3)4.1.5 李代数 se(3) 4.2 指数与对数映射4.2.1 SO(3)上的指数映射罗德里格斯公式推导 4.2.2 SE(3) 上的指数映射SO(3),SE(3),so(3),se(3)的对应关系 4.3 李代数求导与扰动模型4.3.2 SO(3)上的李代数求导…

S-Clustr(影子集群)僵尸网络@Мартин.

公告 项目地址:https://github.com/MartinxMax/S-Clustr/tree/V1.0.0 1.成功扩展3类嵌入式设备,组建庞大的"僵尸网络" |——C51[开发中] |——Arduino |——合宙AIR780e[开发中] 2.攻击者端与服务端之间通讯过程全程加密,防溯源分析 3.Generate一键自动生成Arduino…

将数组和减半的最少操作【贪心2】

题目&#xff1a;将数组和减半的最少操作 贪心思路&#xff1a;每次挑选最大的数来减半。 解法&#xff1a;贪心大根堆 class Solution { public:int halveArray(vector<int>& nums) {priority_queue<double> heap;double sum 0.0;for(int& x : nums){hea…

Linux性能优化--性能工具:系统内存

3.0.概述 本章概述了系统级的Linux内存性能工具。本章将讨论这些工具可以测量的内存统计信息&#xff0c;以及如何使用各种工具收集这些统计结果。阅读本章后&#xff0c;你将能够&#xff1a; 理解系统级性能的基本指标&#xff0c;包括内存的使用情况。明白哪些工具可以检索…

vtk 动画入门 1 代码

实现效果如图&#xff1a; #include <vtkAutoInit.h> //VTK_MODULE_INIT(vtkRenderingOpenGL2); //VTK_MODULE_INIT(vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle); //VTK_MODULE_INIT(vtkRenderingFreeType); #in…

lv8 嵌入式开发-网络编程开发 01什么是互联网

目录 1 计算机网络的定义与分类 1.1 按照网络的作用范围进行分类 1.2 按照网络的使用者进行分类 2 网络的网络 2.1 名词解释 2.2 边缘与核心 3 互联网基础结构发展的三个阶段 3.1 第一阶段&#xff1a;1969 – 1990 3.2 第二阶段&#xff1a;1985 – 1993 3.3 第三阶…

Python大数据之PySpark(四)SparkBaseCore

文章目录 SparkBase&Core环境搭建-Spark on YARN扩展阅读-Spark关键概念[了解]PySpark角色分析[了解]PySpark架构后记 SparkBase&Core 学习目标掌握SparkOnYarn搭建掌握RDD的基础创建及相关算子操作了解PySpark的架构及角色 环境搭建-Spark on YARN Yarn 资源调度框…

UE中制作棋盘格材质效果

在UE中通过这个小技巧制作棋盘格材质效果&#xff0c;可以快速预览UV拉伸情况&#xff0c;方便调试导入的模型。 1.操作步骤 1.1 首先新建材质&#xff0c;Shading Model&#xff08;着色模式&#xff09;设置为Unlit&#xff08;无光照&#xff09;&#xff1a; 1.2 我们…

管道-匿名管道

一、管道介绍 管道&#xff08;Pipe&#xff09;是一种在UNIX和类UNIX系统中用于进程间通信的机制。它允许一个进程的输出直接成为另一个进程的输入&#xff0c;从而实现数据的流动。管道是一种轻量级的通信方式&#xff0c;用于协调不同进程的工作。 1. 创建和使用管道&#…

Docker Alist 在线网盘部署

文章目录 拉取镜像创建并运行查看容器自动生成的密码在浏览器中进行访问 挂载本地磁盘 拉取镜像 docker pull xhofe/alist-aria2创建并运行 # -v /data/alist:/opt/alist/data 挂载本地目录 docker run -d --restartalways -v /data/alist:/opt/alist/data -p 5244:5244 -e P…

国庆作业6

TCP服务器 #include "head.h" #define PORT 2580 //端口号 #define IP "192.168.31.219" //本机IP int main(int argc, const char *argv[]) {sqlite3* dbNULL;if(sqlite3_open("./my.db",&db)!SQLITE_OK){fprintf(stde…

FFmpeg 命令:从入门到精通 | ffmpeg filter(过滤器 / 滤镜)

FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg filter&#xff08;过滤器 / 滤镜&#xff09; FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg filter&#xff08;过滤器 / 滤镜&#xff09;ffmpeg fliter 基本内置变量视频裁剪文字水印图片水印画中画视频多宫格处理 FFmpeg 命…

BIOS 如何确定引导扇区的位置

机械硬盘的信息都是存储在磁盘的表面&#xff0c;他们是由一圈一圈的磁道组成的。以前的磁盘的不同磁道的扇区数量是相同的&#xff0c;这就导致了很大的浪费&#xff0c;因为最外面的磁道的密度是最低的&#xff0c;信息是最安全的&#xff0c;所以最外面的磁道是0磁道。后来由…

NPDP产品经理知识(产品创新管理)

复习文化&#xff0c;团队与领导力 产品创新管理&#xff1a; 如何树立愿景&#xff1a; 如何实现产品战略 计划 实施产品开发&#xff1a; 商业化&#xff0c;营销计划&#xff0c;推广活动 管理产品生命周期&#xff1a; 新式走向市场的流程&#xff1a;

win10 关闭病毒防护

windows10彻底关闭Windows Defender的4种方法 - 知乎