滴水三期 资源表解析

news/2025/3/10 0:12:14/文章来源:https://www.cnblogs.com/B1219/p/18761700

void Resource()
{

int fileSize = 0;DWORD ResourceTableAddress = 0;
LPVOID pFileBuffer = NULL;
//将文件读取到缓冲区PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HEADER pPEHeader = NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;PIMAGE_RESOURCE_DIRECTORY ResourceTable, ResourceTable_Buf, ResourceTable2, ResourceTable3 = NULL;//资源表fileSize = ReadPEFile(FilePath, &pFileBuffer);if (fileSize == 0)
{printf("ReadPEFile失败!!\n");
}//DOS头
pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
//NT头
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pFileBuffer + pDosHeader->e_lfanew);
//标准PE头
pPEHeader = (PIMAGE_FILE_HEADER)((DWORD)pNTHeader + 4);
//可选PE头
pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + IMAGE_SIZEOF_FILE_HEADER);
//首个节表
pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader + pPEHeader->SizeOfOptionalHeader);ResourceTableAddress = RvaToFileOffset(pFileBuffer, pOptionHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress);ResourceTable = (PIMAGE_RESOURCE_DIRECTORY)((PBYTE)pFileBuffer + ResourceTableAddress);ResourceTable_Buf = ResourceTable;//备份DWORD ResourceNumber = ResourceTable->NumberOfIdEntries + ResourceTable->NumberOfNamedEntries;for (int i = 0; i < ResourceNumber; i++)
{PIMAGE_RESOURCE_DIRECTORY_ENTRY Data = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((PBYTE)ResourceTable + 0x10+ i * 0x08);if (!Data->NameIsString){printf("Data->Id: %d\n", Data->Id);}else{PIMAGE_RESOURCE_DIR_STRING_U pstcString = (PIMAGE_RESOURCE_DIR_STRING_U)((DWORD)ResourceTable_Buf + Data->NameOffset);WCHAR szStr[MAX_PATH] = { 0 };memcpy_s(szStr, MAX_PATH, pstcString->NameString, pstcString->Length * sizeof(WCHAR));printf("资源字符串: %ls\n", szStr);}//第二层ResourceTable2= (PIMAGE_RESOURCE_DIRECTORY)((PBYTE)ResourceTable_Buf + Data->OffsetToDirectory);DWORD Number2 = ResourceTable2->NumberOfIdEntries + ResourceTable2->NumberOfNamedEntries;printf("Number2->%d\n", Number2);for (int t = 0; t < Number2; t++){PIMAGE_RESOURCE_DIRECTORY_ENTRY Data2 = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((PBYTE)ResourceTable2 + 0x10 + t * 0x08);if (!Data2->NameIsString){printf("Data2->Id: %d\n", Data2->Id);}else{PIMAGE_RESOURCE_DIR_STRING_U pstcString = (PIMAGE_RESOURCE_DIR_STRING_U)((DWORD)ResourceTable_Buf + Data2->NameOffset);WCHAR szStr[MAX_PATH] = { 0 };memcpy_s(szStr, MAX_PATH, pstcString->NameString, pstcString->Length * sizeof(WCHAR));printf("资源字符串: %ls\n", szStr);}//第三层ResourceTable3 = (PIMAGE_RESOURCE_DIRECTORY)((PBYTE)ResourceTable_Buf + Data2->OffsetToDirectory);DWORD Number3 = ResourceTable3->NumberOfIdEntries + ResourceTable3->NumberOfNamedEntries;printf("Number3->%d\n", Number3);for (int C = 0; C < Number3; C++){PIMAGE_RESOURCE_DIRECTORY_ENTRY Data3 = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((PBYTE)ResourceTable3 + 0x10 + C * 0x08);PIMAGE_DATA_DIRECTORY DATA_DIRE = (PIMAGE_DATA_DIRECTORY)((PBYTE)ResourceTable_Buf + Data3->OffsetToDirectory);printf("->->->数据RVA:%x\t数据大小:%x\n", DATA_DIRE->VirtualAddress, DATA_DIRE->Size);}}}

}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【问题】HashMap的computeIfAbsent方法丢失数据问题分析

问题背景 前段时间碰到客户问题发现是 ConcurrentHashMap的computeIfAbsent导致死循环(ConcurrentHashMap死循环问题分析)就很好奇HashMap的computeIfAbsent会不会也有问题,一试之下发现确实存在问题,相同的代码在HashMap中会丢失插入的数据。 发生原因 【循环添加】时,如…

CFA学习

定量分析 利率 利率的定义:被认为是 ① 平衡借贷双方的平衡点(equilibrium interest rates)② 贴现率(货币的时间价值)③ 机会成本 利率的组成:通货膨胀➕各种风险 计算【现值/终值】用时间轴确实一目了然! # 经济学 # 财务报表分析 # 公司理财 # 投资组合管理 # 权益投…

INFINI Labs 产品更新 | Easysearch 增加异步搜索等新特性

INFINI Labs 产品更新发布!此次更新,Easysearch 增加了新的功能和数据类型,包括 wildcard 数据类型、Point in time 搜索 API、异步搜索 API、数值和日期字段的 doc-values 搜索支持,Console 新增了日志查询功能。 INFINI Easysearch v1.11.0 INFINI Easysearch 是一个分布…

语法trick

for (int i = 1; i <= n; ++i) {cout << dist[i] << " \n"[i == n];}

百万架构师第四十七课:并发编程的原理(二)|JavaGuide

原文链接 JavaGuide《并发编程的艺术》 并发编程的实现原理 目标上节课内容回顾 synchronized 原理分析 wait 和 notify Lock 同步锁回顾原子性 可见性 有序性JMM ​ JMM 是 JAVA 里边定义的内存模型。定义了多线程和我们内存交互的规范。屏蔽了硬件和操作系统访问内存的差异。…

[极客大挑战 2019]Havefun 1

进网站显示一只猫,于是看源代码 发现下面有注释<!--$cat=$_GET[cat];echo $cat;if($cat==dog){echo Syc{cat_cat_cat_cat};}-->所以在后面加上/index.php?cat=dog即可(小猫可爱捏)

提取excel中的图片

需求: 提取excel中嵌入单元格的图片 实现思路: 用pandas读取文件,对于嵌入图片的单元格则会显示其函数 问题:wps与office嵌入方法有所不同,wps使用函数嵌套,而office则是设置随单元格大小变动,对于后者,会被视为是悬浮的图片,使用pandas无法提取任何一张图片 源文件如…

2019年-PTA模拟赛-L2-1 链表去重(一维数组模拟链表)

一维数组模拟链表一维数组模拟链表 被删除的结点仍然在e数组中,因此记录一下被删除的结点的地址就可以找到其值AcCode: #include<bits/stdc++.h> using namespace std; int e[100010], ne[100010], vis[100010]; vector<int> delNode; int main(){int N, rootAdre…

C语言实验一作业

实验任务1:#include <stdio.h> int main() {printf(" O \n");printf("<H>\n");printf("I I\n");printf(" O \n");printf("<H>\n");printf("I I\n");return 0; }#include <stdio.h> in…

二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)

二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)@目录二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)2.1 开发环境2.2 创建maven工程2.3 创建User实体2.4 创建MyBatis的核心配置文件2.5 创建mapper接口2.6 创建MyBatis的映射文件2.7配置日志打印2.8 通过junit测…

MongoDB 的开源替代方案FerretD发了 2.0 版

FerretDB 宣布推出 2.0 版本,由 DocumentDB 驱动,作为 MongoDB 的开源替代方案。它带来性能提升、功能兼容性、向量搜索能力和复制支持。FerretDB 基于 Apache 2.0 许可发布,与 MongoDB 的驱动程序和工具兼容,可作为 MongoDB 5.0 及以上版本的直接替代品。FerretDB 2.x 利用…