取PE文件OriginalFilename-解析VERSION资源
由于需要用到EXE文件的OriginalFilename这个值,原本微软提供了API可以取得PE文件的版本信息,通过VerQueryValue可以查询到这个值。
标准的取法是:
- 通过
2 {
3 if (NULL==pszPath)
4 {
5 return FALSE;
6 }
7
8 /// Get the length for version information
9
10 DWORD dwVersion = 0;
11 DWORD dwHandle = 0;
12 dwVersion = GetFileVersionInfoSize(pszPath, &dwHandle);
13 if (!dwVersion)
14 {
15 return FALSE;
16 }
17
18 /// Alloc the buffer for version information
19
20 std::auto_ptr<BYTE> pbBuffer(new BYTE[dwVersion]);
21 PVOID pBlock = pbBuffer.get();
22 ZeroMemory(pBlock, dwVersion);
23
24 if (!GetFileVersionInfo(pszPath, dwHandle, dwVersion, pBlock))
25 {
26 return FALSE;
27 }
28
29 /// Structure used to store enumerated languages and code pages.
30
31 struct LANGANDCODEPAGE
32 {
33 WORD wLanguage;
34 WORD wCodePage;
35 } *lpTranslate;
36
37 UINT cbTranslate = 0;
38
39 /// Read the list of languages and code pages.
40
41 VerQueryValue(pBlock,
42 TEXT("\\VarFileInfo\\Translation"),
43 (LPVOID*)&lpTranslate,
44 &cbTranslate);
45 if (NULL==lpTranslate)
46 {
47 return FALSE;
48 }
49
50 /// Read the Original filename for 1st language and code page.
51
52 TCHAR SubBlock[50] = {0};
53 StringCchPrintf(SubBlock, 50,
54 TEXT("\\StringFileInfo\\%04x%04x\\OriginalFilename"),
55 lpTranslate[0].wLanguage,
56 lpTranslate[0].wCodePage);
57
58 /// Retrieve file description for language and code page "i".
59
60 BOOL bResult = FALSE;
61 UINT dwBytes = 0;
62 LPTSTR pszFileName = NULL;
63 if (VerQueryValue(pBlock,
64 SubBlock,
65 (LPVOID*)&pszFileName,
66 &dwBytes))
67 {
68 rOriginalFilename = pszFileName;
69 bResult = TRUE;
70 }
71
72 return bResult;
73 }
通过上面代码就可以取得EXE文件的OriginalFilename值。但是有时候EXE文件资源信息中没有对应的Translation值或者Translation的值不匹配,但是有对应的OriginalFilename,这时候通过标准的方法就取不到了,怎么办呢?
如这是WinRAR的版本信息,对应的就不对。
Length Of Struc: 02ACh
Length Of Value: 0034h
Type Of Struc: 0000h
Info: VS_VERSION_INFO
Signature: FEEF04BDh
Struc Version: 1.0
File Version: 3.90.5.0
Product Version: 3.90.5.0
File Flags Mask: 0.0
File Flags:
File OS: WINDOWS32
File Type: APP
File SubType: UNKNOWN
File Date: 00:00:00 00/00/0000
Struc has Child(ren). Size: 592 bytes.
Child Type: StringFileInfo
Language/Code Page: 1033/1252
ProductName: WinRAR
CompanyName: Alexander Roshal
FileDescription: WinRAR archiver
FileVersion: 3.90.5
InternalName: WinRAR
LegalCopyright: Copyright ? Alexander Roshal 1993-2009
OriginalFilename: WinRAR.exe
Child Type: VarFileInfo
Translation: 0/0
这时通过之前的方法就不行了,只好自己解析了。下面代码参考了网上的VerInfoLib的代码,有兴趣的可以去下完整的代码http://packcab.googlecode.com/svn/trunk/VerInfoLib/
2 {
3 WORD wLength;
4 WORD wValueLength;
5 WORD wType;
6 WCHAR szKey[ANYSIZE_ARRAY];
7 WORD Padding[ANYSIZE_ARRAY];
8 };
9
10 struct VarString:
11 public VarBlock
12 {
13 WORD Value[ANYSIZE_ARRAY];
14 };
15
16 struct VarStringTable:
17 public VarBlock
18 {
19 VarString Children[ANYSIZE_ARRAY];
20 };
21
22 struct VarStringFileInfo:
23 public VarBlock
24 {
25 VarStringTable Children[ANYSIZE_ARRAY];
26 };
27
28 #define DWORDUP(x) (((DWORD)(LPBYTE)(x)+3)&~03)
29
30 BOOL GetOriginalFilename1(LPCTSTR pszPath, CString& rOriginalFilename)
31 {
32 if (NULL==pszPath)
33 {
34 return FALSE;
35 }
36
37 /// Get the length for version information
38
39 DWORD dwVersion = 0;
40 DWORD dwHandle = 0;
41 dwVersion = GetFileVersionInfoSize(pszPath, &dwHandle);
42 if (!dwVersion)
43 {
44 return FALSE;
45 }
46
47 /// Alloc the buffer for version information
48
49 std::auto_ptr<BYTE> pbBuffer(new BYTE[dwVersion]);
50 PVOID pBlock = pbBuffer.get();
51 ZeroMemory(pBlock, dwVersion);
52
53 if (!GetFileVersionInfo(pszPath, dwHandle, dwVersion, pBlock))
54 {
55 return FALSE;
56 }
57
58 /// Get StringFleInfo list in version information
59
60 LPVOID* pbStringFileInfo = NULL;
61 UINT cbStringFileInfo = 0;
62 VerQueryValue(pBlock,TEXT("\\StringFileInfo"),
63 (LPVOID*)&pbStringFileInfo,&cbStringFileInfo);
64
65 if (NULL==pbStringFileInfo)
66 {
67 return FALSE;
68 }
69
70 VarStringTable* pbStringTable = (VarStringTable*)DWORDUP(pbStringFileInfo);
71
72 BOOL bResult = FALSE;
73 VarString* pbString = (VarString*)DWORDUP(pbStringTable->szKey + lstrlenW(pbStringTable->szKey) + 1);
74 while ((DWORD_PTR)pbString < (DWORD_PTR)pbStringTable + pbStringTable->wLength)
75 {
76 if (lstrcmpiW(pbString->szKey, L"OriginalFilename")==0)
77 {
78 rOriginalFilename = (WCHAR*)DWORDUP(pbString->szKey + lstrlenW(pbString->szKey) + 1);
79 bResult = TRUE;
80 break;
81 }
82
83 pbString = (VarString*)DWORDUP((DWORD_PTR)pbString + pbString->wLength);
84 }
85
86 return bResult;
87 }
上面代码取出第一个StringTable值,并从中解析出OriginalFilename。具体参考MSDN中的Version Information。
转载于:https://www.cnblogs.com/Quincy/archive/2010/04/17/1713800.html
取PE文件OriginalFilename-解析VERSION资源相关推荐
- 从maven私服(nexus)拉取jar文件,解析项目pom依赖信息
一.前言 关于pom解析的方式,常见的我认为有两种: 一种是利用dom tree的结构特性,利用dom4j提供的xml解析工具将pom文件读取为dom tree结构,再层层解析出内容. 第二种方式更为 ...
- 【Python网络爬虫实战篇】使用selenium+requests爬取下载高清源视频:关于爬取m3u8文件链接解析为ts视频合并成mp4视频的分析实战
这两天博主在摸鱼时,偶然间接触到了流媒体的概念,一时间来了兴致.再加上之前博主有着七.八年的视频制作经验,深知视频素材获取的不易.因此,打算利用自己所学的python网络爬虫的知识,通过编写代码实现获 ...
- MATLAB---读取STL文件并解析
function VerMat=ReadSTLFile()%读取STL文件代码 filename='model1or.stl'; %指定要打开的文件名 fid=fopen(filename,'r'); ...
- 网络安全学习第6篇 - 爆破及PE文件解释
1.请采用暴力破解的方式去尝试破解crack.exe文件(在实验报告中说明破解原理即可,无需提交破解后的文件) 2.请依据参考文档中的内容编写一个小程序,使其可以实现如下功能: ①判断一个文件是否为P ...
- [网络安全自学篇] 五十七.PE文件逆向之什么是数字签名及Signtool签名工具详解(一)
本系列虽然叫"网络安全自学篇",但由于系统安全.软件安全与网络安全息息相关,作者同样会分享一些系统安全案例及基础工具用法,也是记录自己的成长史,希望大家喜欢,一起进步.前文讲解了i ...
- 代码实现pe文件图标替换
最近,好多人问我如何通过写个小程序,动态替换可执行文件的图标.这个问题看起来虽小,但却涉及到很多问题.网上也只能找到一些零零散散的资料,却没有详细的指导性文档.所以我决定把这个问题写下来,以方便大家查 ...
- [系统安全] 四十一.APT系列(6)Python解析PE文件并获取时间戳判断来源区域
您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...
- 编写PE文件解析器(三)
下面有几个表网上资料比较少,因为几乎用不到,我查文档写写吧,这篇写得比较久很抱歉. 7.IMAGE_DIRECTORY_ENTRY_EXCEPTION[异常处理表] CPU特定的并且基于表的异常处理. ...
- 快速查询PE文件知识点和PE文件解析(下)
延迟加载导入表 延迟加载导入表(Delay Load Import Table)是PE中引入的专门用来描述与动态链接库延迟加载相关的数据,因为这些数据所起的作用和结构与导入表数据基本一致,所以称为延迟 ...
- 图解VC++版PE文件解析器源码分析
该源码下载自 http://download.csdn.net/download/witch_soya/4979587 1 Understand 分析的图表 2 PE结构解析的主要代码简要分析 首先看 ...
最新文章
- AliExpress智能营销引擎大揭秘-AnalyticDB如何做到快准狠省
- c语言教程的辅导书,清华大学出版社-图书详情-《C语言程序设计案例教程学习辅导》...
- 华为机试HJ68:成绩排序
- mysql查询一个表有哪些索引_如何查看某张数据库表上都有哪些索引(转)
- oracle餐厅网络点餐系统_开餐厅,餐饮老板到底要怎么选餐饮管理系统?
- 五边形镶嵌计算机程序,如何看待美国数学家发现可无缝密铺平面的五边形?.doc...
- Python实现Mean Shift算法
- axio并发请求示例
- 【计算机网络】-- 第一章--概述(概念、组成、功能、分类、性能指标、体系结构)
- 移动通信:1G到5G发展过程简析 -- 什么是5G?
- 【单片机】汇编指令入门学习|单片机启动代码汇编
- algorithm的使用
- 梅科尔工作室-江凌宇-鸿蒙笔记4
- 计算机信息检索 服务方式,计算机信息检索.ppt
- 第五天:了解越疆dobot机械臂,使用python,编写通过ros服务控制机械臂运动程序
- 如何将图片格式转换成png
- G-Lexicographically Minimum Walk[CF-Gym-102391][2019-2020 XX Open Cup, Grand Prix of Korea]
- SCM、丰田生产方式和TOC
- 《NFL橄榄球》:新英格兰爱国者·橄榄1号位
- 怎样打开aspx文件