当前位置: 首页 > news >正文

PE文件之导入表

1. 导入表

在这里插入图片描述

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

; 作用: 将RVA地址转成FOA即文件偏移
; 参数: _pFileHdr 	指向读到内存中文件的基址指针
;       _dwRVA 		目标RVA地址
; 返回: 目标RVA转成文件偏移的值
RVA2FOA PROC USES esi edi edx, _pFileHdr:PTR BYTE, _dwRVA:DWORDmov esi, _pFileHdr assume esi:ptr IMAGE_DOS_HEADER; 获取PE头mov edi, [esi].e_lfanewassume esi:nothingadd edi, esi assume edi:ptr IMAGE_NT_HEADERS32; 获取节数movzx ecx, [edi].FileHeader.NumberOfSectionsassume edi:nothing; 获取节表地址add edi, SIZEOF IMAGE_NT_HEADERS32assume edi:ptr IMAGE_SECTION_HEADER
L0:mov edx, _dwRVAcmp edx, [edi].VirtualAddressjb @Fmov eax, [edi].VirtualAddressadd eax, [edi].SizeOfRawDatacmp edx, eaxjae @Fsub edx, [edi].VirtualAddressadd edx, [edi].PointerToRawDatamov eax, edxjmp Ending
@@:add edi, SIZEOF IMAGE_SECTION_HEADERloop L0xor eax, eax
Ending:retRVA2FOA 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, 0szBuf				BYTE 64 DUP(0).code 
; 作用: 打印输出导入表信息
; 参数: _pFileHdr 	指向读到内存中文件的基址指针
; 返回: 无
_getImportTblInfo PROC _pFileHdr:PTR BYTEpushad mov esi, _pFileHdrassume esi:PTR IMAGE_DOS_HEADERadd esi, [esi].e_lfanew assume esi:PTR IMAGE_NT_HEADERS32 mov esi, [esi].OptionalHeader.DataDirectory[8].VirtualAddresspush esimov eax, _pFileHdrpush eax call RVA2FOAmov esi, eax add esi, _pFileHdr assume esi:PTR IMAGE_IMPORT_DESCRIPTOR L0:; 确定导入表是否结束mov edx, [esi].Name1test edx, edx jnz @F jmp Ending 
@@:mov edx, [esi].OriginalFirstThunktest edx, edx jnz @F jmp Ending 
@@:mov edx, [esi].TimeDateStamptest edx, edx jnz @F jmp Ending 
@@:mov edx, [esi].ForwarderChaintest edx, edx jnz @F jmp Ending 
@@:mov edx, [esi].FirstThunktest 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; 显示ForwarderChaininvoke 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转成FOApush [esi].OriginalFirstThunkpush _pFileHdr call RVA2FOAadd eax, _pFileHdr
L1:assume eax:PTR IMAGE_THUNK_DATA mov ebx, [eax].u1.Functiontest ebx, ebx jz NextDescpush eax mov eax, [eax].u1.Functiontest eax, 80000000hjnz BySeqpush eax push _pFileHdrcall RVA2FOAadd eax, _pFileHdrassume eax:PTR IMAGE_IMPORT_BY_NAME movzx edx, WORD PTR [eax].Hintlea ebx, [eax].Name1 invoke wsprintf, OFFSET szBuf, OFFSET szFnInfo, edx, ebxinvoke crt_printf, OFFSET szBufpop eax add eax, SIZEOF IMAGE_THUNK_DATAjmp @F 
BySeq:@@:jmp L1 
NextDesc:push OFFSET Crlfcall crt_printfpush OFFSET Crlfcall crt_printfadd esi, SIZEOF IMAGE_IMPORT_DESCRIPTORjmp L0
Ending:popad ret _getImportTblInfo ENDP 

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

3. 导入表图

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

http://www.lryc.cn/news/181371.html

相关文章:

  • 二、码制及其转换
  • 在pycharm中出现下载软件包失败的解决方法
  • 10.0 探索API调试事件原理
  • 文心一言 VS 讯飞星火 VS chatgpt (104)-- 算法导论10.1 2题
  • 检测防火墙是否开启、判断程序是否加入防火墙白名单(附源码)
  • vtk 动画入门 1 代码
  • 【VR】【unity】如何在VR中实现远程投屏功能?
  • OpenGl材质
  • 背包问题
  • JavaSE | 初始Java(十一) | 抽象类和抽象接口
  • 产品经理如何科学的进行需求调研?
  • AI智能问答系统源码/AI绘画商业系统/支持GPT联网提问/支持Midjourney绘画
  • 玩具玩偶配送经营商城小程序的作用是什么?
  • latex表格内容换行
  • 2023 牛客国庆day4 【10.2训练补题】
  • android的USB开发时 mUsbManager.getDeviceList()获取都为空
  • SpringCloud Alibaba - Seata 部署 TC 服务,并集成微服务
  • Java基础面试,接口和抽象类的区别?
  • 《视觉 SLAM 十四讲》V2 第 4 讲 李群与李代数 【什么样的相机位姿 最符合 当前观测数据】
  • 【深蓝学院】手写VIO第4章--基于滑动窗口算法的 VIO 系统:可观性和 一致性--笔记
  • mfc 动态加载dll库,Mat转CImage,读ini配置文件,鼠标操作,在edit控件上画框,调试信息打印
  • 索尼 toio™应用创意开发征文|检测工业平台震动
  • 【已解决】 Expected linebreaks to be ‘LF‘ but found ‘CRLF‘.
  • Java8 Lambda.stream.sorted() 方法使用浅析分享
  • Neural Networks for Fingerprint Recognition
  • ChatGPT推出全新功能,引发人工智能合成声音担忧|百能云芯
  • Java 实现遍历一个文件夹,文件夹有100万数据,获取到修改时间在2天之内的数据
  • 持续集成部署-k8s-命令行工具:基础命令的使用
  • 使用python脚本的时间盲注完整步骤
  • C++项目:仿mudou库one thread one loop式并发服务器实现