由于需要用到EXE文件的OriginalFilename这个值,原本微软提供了API可以取得PE文件的版本信息,通过VerQueryValue可以查询到这个值。

标准的取法是:

  1. 通过
1 BOOL GetOriginalFilename(LPCTSTR pszPath, CString& rOriginalFilename)
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/

1 struct VarBlock
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资源相关推荐

  1. 从maven私服(nexus)拉取jar文件,解析项目pom依赖信息

    一.前言 关于pom解析的方式,常见的我认为有两种: 一种是利用dom tree的结构特性,利用dom4j提供的xml解析工具将pom文件读取为dom tree结构,再层层解析出内容. 第二种方式更为 ...

  2. 【Python网络爬虫实战篇】使用selenium+requests爬取下载高清源视频:关于爬取m3u8文件链接解析为ts视频合并成mp4视频的分析实战

    这两天博主在摸鱼时,偶然间接触到了流媒体的概念,一时间来了兴致.再加上之前博主有着七.八年的视频制作经验,深知视频素材获取的不易.因此,打算利用自己所学的python网络爬虫的知识,通过编写代码实现获 ...

  3. MATLAB---读取STL文件并解析

    function VerMat=ReadSTLFile()%读取STL文件代码 filename='model1or.stl'; %指定要打开的文件名 fid=fopen(filename,'r'); ...

  4. 网络安全学习第6篇 - 爆破及PE文件解释

    1.请采用暴力破解的方式去尝试破解crack.exe文件(在实验报告中说明破解原理即可,无需提交破解后的文件) 2.请依据参考文档中的内容编写一个小程序,使其可以实现如下功能: ①判断一个文件是否为P ...

  5. [网络安全自学篇] 五十七.PE文件逆向之什么是数字签名及Signtool签名工具详解(一)

    本系列虽然叫"网络安全自学篇",但由于系统安全.软件安全与网络安全息息相关,作者同样会分享一些系统安全案例及基础工具用法,也是记录自己的成长史,希望大家喜欢,一起进步.前文讲解了i ...

  6. 代码实现pe文件图标替换

    最近,好多人问我如何通过写个小程序,动态替换可执行文件的图标.这个问题看起来虽小,但却涉及到很多问题.网上也只能找到一些零零散散的资料,却没有详细的指导性文档.所以我决定把这个问题写下来,以方便大家查 ...

  7. [系统安全] 四十一.APT系列(6)Python解析PE文件并获取时间戳判断来源区域

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  8. 编写PE文件解析器(三)

    下面有几个表网上资料比较少,因为几乎用不到,我查文档写写吧,这篇写得比较久很抱歉. 7.IMAGE_DIRECTORY_ENTRY_EXCEPTION[异常处理表] CPU特定的并且基于表的异常处理. ...

  9. 快速查询PE文件知识点和PE文件解析(下)

    延迟加载导入表 延迟加载导入表(Delay Load Import Table)是PE中引入的专门用来描述与动态链接库延迟加载相关的数据,因为这些数据所起的作用和结构与导入表数据基本一致,所以称为延迟 ...

  10. 图解VC++版PE文件解析器源码分析

    该源码下载自 http://download.csdn.net/download/witch_soya/4979587 1 Understand 分析的图表 2 PE结构解析的主要代码简要分析 首先看 ...

最新文章

  1. AliExpress智能营销引擎大揭秘-AnalyticDB如何做到快准狠省
  2. c语言教程的辅导书,清华大学出版社-图书详情-《C语言程序设计案例教程学习辅导》...
  3. 华为机试HJ68:成绩排序
  4. mysql查询一个表有哪些索引_如何查看某张数据库表上都有哪些索引(转)
  5. oracle餐厅网络点餐系统_开餐厅,餐饮老板到底要怎么选餐饮管理系统?
  6. 五边形镶嵌计算机程序,如何看待美国数学家发现可无缝密铺平面的五边形?.doc...
  7. Python实现Mean Shift算法
  8. axio并发请求示例
  9. 【计算机网络】-- 第一章--概述(概念、组成、功能、分类、性能指标、体系结构)
  10. 移动通信:1G到5G发展过程简析 -- 什么是5G?
  11. 【单片机】汇编指令入门学习|单片机启动代码汇编
  12. algorithm的使用
  13. 梅科尔工作室-江凌宇-鸿蒙笔记4
  14. 计算机信息检索 服务方式,计算机信息检索.ppt
  15. 第五天:了解越疆dobot机械臂,使用python,编写通过ros服务控制机械臂运动程序
  16. 如何将图片格式转换成png
  17. G-Lexicographically Minimum Walk[CF-Gym-102391][2019-2020 XX Open Cup, Grand Prix of Korea]
  18. SCM、丰田生产方式和TOC
  19. 《NFL橄榄球》:新英格兰爱国者·橄榄1号位
  20. 怎样打开aspx文件

热门文章

  1. *第二周*数据结构实践项目二【多文件系统】
  2. python基础之字符串类型
  3. 使用UUID和int自增主键的区别
  4. 自动化测试 短信验证登录
  5. C#使用mybatis学习笔记
  6. [转载].net常用函数
  7. Postgresql----libpq
  8. 在ASP中常见的错误80004005信息和解决办法
  9. iOS -[JYBDScanCardManage configIDScan] in JYBDScanCardManage.o等静态库问题
  10. MVC系列博客之排球计分(六)Controller的实现(二)