C/C++ PeView 结构解析器

简介: PeView 结构解析器,是一款使用C/C++开发实现的命令行交互式 WindowsPE 程序结构解析器,目前可解析32位可执行程序的绝大部分通用参数,并内置各种结构查询转换阅览工具,目前已基本可在工作中使用。

PeView 结构解析器,是一款使用C/C++开发实现的命令行交互式 WindowsPE 程序结构解析器,目前可解析32位可执行程序的绝大部分通用参数,并内置各种结构查询转换阅览工具,目前已基本可在工作中使用。

GitHUB地址: https://github.com/lyshark/PeView


打开PE文件: 使用Open一次性打开文件,只有打开后才可以对其进行其他操作,打开文件需要使用Open命令跟路径。

[Pe View] # Open --path d://Win32Project.exe
[+] 已读入文件

查询PE头数据: PE头查询命令有两个,使用Dos可查询DOS头部,使用Nt命令则可查询NT头部,目前只列出了常用字段。

[Pe View] # Dos
----------------------------------------------------------------------
                 十六进制        十进制
----------------------------------------------------------------------
DOS标志:         00005A4D        00023117
IP入口:          00000000        00000000
CS入口:          00000000        00000000
PE指针:          000000E8        00000232
----------------------------------------------------------------------
[Pe View] #
[Pe View] # Nt
----------------------------------------------------------------------
                 十六进制        十进制
----------------------------------------------------------------------
NT标志:         0x00004550       00017744
运行平台:       0x0000014C       00000332
入口点:        0x0001121C       00070172
镜像基址:      0x00400000       04194304
镜像大小:      0x0001F000       00126976
代码基址:      0x00001000       00004096
内存对齐:      0x00001000       00004096
文件对齐:      0x00000200       00000512
子系统:        0x00000002       00000002
区段数目:      0x00000007       00000007
时间日期标志:  0x62D76132       1658282290
首部大小:      0x00000400       00001024
特征值:        0x00000102       00000258
校验和:        0x00000000       00000000
可选头部大小:  0x000000E0       00000224
RVA 数及大小:  0x00000010       00000016
----------------------------------------------------------------------

查询数据目录表: 查询数据目录表可执行DataDirectory命令获取,其中包括了RVA,FOA,Size等基本信息。

[Pe View] # DataDirectory
-------------------------------------------------------------------------------------------------------
编号     目录RVA         目录FOA         Size长度(十进制)        Size长度(十六进制)      功能描述
-------------------------------------------------------------------------------------------------------
001      0x00000000      0xFFFFFFFF      00000000                0x00000000             Export symbols
002      0x0001A1E0      0x00006DE0      00000080                0x00000050             Import symbols
003      0x0001B000      0x00007800      00009612                0x0000258C             Resources
004      0x00000000      0xFFFFFFFF      00000000                0x00000000             Exception
005      0x00000000      0xFFFFFFFF      00000000                0x00000000             Security
006      0x0001E000      0x00009E00      00000972                0x000003CC             Base relocation
007      0x00016820      0x00005020      00000056                0x00000038             Debug
008      0x00000000      0xFFFFFFFF      00000000                0x00000000             Copyright string
009      0x00000000      0xFFFFFFFF      00000000                0x00000000             Globalptr
010      0x00000000      0xFFFFFFFF      00000000                0x00000000             TLS
011      0x00017560      0x00005D60      00000064                0x00000040             Loadconfiguration
012      0x00000000      0xFFFFFFFF      00000000                0x00000000             Bound Import
013      0x0001A000      0x00006C00      00000480                0x000001E0             IAT
014      0x00000000      0xFFFFFFFF      00000000                0x00000000             Delay Import
015      0x00000000      0xFFFFFFFF      00000000                0x00000000             COM descriptor
016      0x00000000      0xFFFFFFFF      00000000                0x00000000             NoUse
-------------------------------------------------------------------------------------------------------

查询节表: 查询程序中的节表可使用Section命令查询。

[Pe View] # Section
----------------------------------------------------------------------------------------------------
编号     节区名称       虚拟偏移        虚拟大小        实际偏移        实际大小        节区属性
----------------------------------------------------------------------------------------------------
1        .textbss        0x00001000      0x00010000      0x00000000      0x00000000      0xE00000A0
2        .text           0x00011000      0x00004366      0x00000400      0x00004400      0x60000020
3        .rdata          0x00016000      0x00002069      0x00004800      0x00002200      0x40000040
4        .data           0x00019000      0x00000769      0x00006A00      0x00000200      0xC0000040
5        .idata          0x0001A000      0x00000AB9      0x00006C00      0x00000C00      0x40000040
6        .rsrc           0x0001B000      0x0000258C      0x00007800      0x00002600      0x40000040
7        .reloc          0x0001E000      0x00000599      0x00009E00      0x00000600      0x42000040
----------------------------------------------------------------------------------------------------

查询所有导入表: 导入表的查询有多个命令,其中ImportAll用于查询所有导入过的模块以及该模块的导入函数。

[Pe View] # ImportAll
---------------------------------------------------------------------------------------------------
Hint值           API序号         文件RVA         VA地址          函数名称        模块: [ USER32.dll ]
---------------------------------------------------------------------------------------------------
[  547]          000107838       0000713E        0041A53E        LoadIconW
[  545]          000107824       00007130        0041A530        LoadCursorW
[  233]          000107812       00007124        0041A524        EndPaint
[   14]          000107798       00007116        0041A516        BeginPaint
[  855]          000107782       00007106        0041A506        UpdateWindow
[  829]          000107758       000070EE        0041A4EE        TranslateAcceleratorW
-----------------------------------------------------------------------------------------------------
Hint值           API序号         文件RVA         VA地址          函数名称        模块: [ KERNEL32.dll ]
-----------------------------------------------------------------------------------------------------
[  615]          000108820       00007514        0041A914        GetModuleHandleW
[  611]          000108798       000074FE        0041A8FE        GetModuleFileNameW
[  414]          000108784       000074F0        0041A8F0        FreeLibrary
[ 1443]          000108768       000074E0        0041A8E0        VirtualQuery
[  674]          000108750       000074CE        0041A8CE        GetProcessHeap
[  819]          000108738       000074C2        0041A8C2        HeapFree

查询所有导入库: 查询该程序中导入了那些动态链接库,可使用ImportDll命令来获取到。

[Pe View] # ImportDll
----------------------------------------------------------------------
序号     文件偏移FOA     相对偏移RVA     DLL名称
----------------------------------------------------------------------
1        0x0000714A      0x00000000      USER32.dll
2        0x000072AE      0x00000000      MSVCR120D.dll
3        0x00007528      0x00000000      KERNEL32.dll
----------------------------------------------------------------------

查询特定DLL导入表: 查询该程序中指定的动态链接库内导入过的导入函数,可使用ImportByName命令来获取到。

[Pe View] # ImportByName -dll KERNEL32.dll
---------------------------------------------------------------------------------
序号     文件偏移FOA     相对偏移RVA     导入函数        [ 当前模块: KERNEL32.dll ]
---------------------------------------------------------------------------------
615      0x00007514      0x0001A914      GetModuleHandleW
611      0x000074FE      0x0001A8FE      GetModuleFileNameW
414      0x000074F0      0x0001A8F0      FreeLibrary
1443     0x000074E0      0x0001A8E0      VirtualQuery
674      0x000074CE      0x0001A8CE      GetProcessHeap
819      0x000074C2      0x0001A8C2      HeapFree
815      0x000074B6      0x0001A8B6      HeapAlloc
254      0x000074A6      0x0001A8A6      DecodePointer
---------------------------------------------------------------------------------

查询特定函数所在位置: 用于验证指定的程序中是否引入了指定函数,可使用ImportByFunction命令来获取到。

[Pe View] # ImportByFunction --function HeapAlloc
-------------------------------------------------------------------
序号             FOA地址         VA地址          所在DLL
-------------------------------------------------------------------
[  815]          000074B6        0041A8B6        KERNEL32.dll
-------------------------------------------------------------------
[Pe View] #
[Pe View] # ImportByFunction --function wcscpy_s
-------------------------------------------------------------------
序号             FOA地址         VA地址          所在DLL
-------------------------------------------------------------------
[ 1990]          00007368        0041A768        MSVCR120D.dll
-------------------------------------------------------------------

查询导出表: 用于查询程序中的导出表,可使用Export命令查询,此处我们需要切换到DLL上然后再查询。

[Pe View] # Open --path d://SecurityPE.dll
[+] 已读入文件
[Pe View] #
[Pe View] # Export
-----------------------------------------------------------------------
序号     导出RVA地址     导出VA地址      导出FOA地址     导出函数
-----------------------------------------------------------------------
    1      00003760      0x10003760      0x00002B60      CreateObject
-----------------------------------------------------------------------

查询重定位项: 用于查询该程序中所有的重定位项,可使用FixReloc命令查询。

[Pe View] # FixReloc
--------------------------------------------------------------------
起始RVA          类型    重定位RVA       重定位地址      修正RVA
--------------------------------------------------------------------
00011000         3       0001151C        0041A178       0001A178
00011000         3       00011592        00419138       00019138
00011000         3       000115B6        00419140       00019140
00011000         3       000115BB        00419208       00019208
00011000         3       000115C3        0041A188       0001A188
00011000         3       000115E7        0041A180       0001A180
00011000         3       000115FA        0041A16C       0001A16C
00011000         3       0001166F        00419000       00019000
00011000         3       00011689        00411195       00011195
--------------------------------------------------------------------

查询重定位表分页: 用于显示重定位分页情况,可使用FixRelocPage命令查询。

[Pe View] # FixRelocPage
----------------------------------------------------------------------
映像基址: 00400000 虚拟偏移: 0001E000 重定位表基址: 001C9E00
----------------------------------------------------------------------
起始RVA: 00011000        块长度: 0200    重定位个数: 0096
起始RVA: 00012000        块长度: 0292    重定位个数: 0142
起始RVA: 00013000        块长度: 0296    重定位个数: 0144
起始RVA: 00014000        块长度: 0108    重定位个数: 0050
起始RVA: 00016000        块长度: 0028    重定位个数: 0010
起始RVA: 00017000        块长度: 0048    重定位个数: 0020
----------------------------------------------------------------------

查询重定位页内分页: 用于查询重定位RVA页内的页,此功能需要得到RVA时再使用。

[Pe View] # FixRelocRVA --rva 00017000
----------------------------------------------------------------------
起始RVA          类型    重定位RVA       重定位地址      修正RVA
----------------------------------------------------------------------
00017000         3       00017014        00419350       00019350
00017000         3       00017018        004193A0       000193A0
00017000         3       00017020        00417038       00017038
00017000         3       00017024        00417058       00017058
00017000         3       00017028        0041708C       0001708C
00017000         3       0001702C        004170A8       000170A8
00017000         3       00017030        004170DC       000170DC
00017000         3       0001759C        00419000       00019000
----------------------------------------------------------------------

查询资源表: 用于查询程序内的资源,使用Resource命令获取,目前只能获取到一级资源。

[Pe View] # Resource
------------------------------------------------------------
资源类型ID       类型
------------------------------------------------------------
00000003         图标
00000004         菜单
00000005         对话框
00000006         字符串列表
00000009         快捷键
0000000E         图标组
00000018         24
------------------------------------------------------------

检查函数内存地址: 用于验证特定模块中的内存地址,使用GetProcAddr命令验证。

[Pe View] # GetProcAddr --dll user32.dll --function MessageBoxA
0x76B12D90
[Pe View] # 
[Pe View] # GetProcAddr --dll user32.dll --function MessageBoxW
0x76B132B0
[Pe View] # 
[Pe View] # GetProcAddr --dll user32.dll --function MessageBox
0x0

检查保护模式: 用于检查当前打开进程所开启的保护模式。

[Pe View] # CheckSelf
--------------------------------------------------
基址随机化:   是
DEP保护兼容:  是
强制完整性:   否
SEH异常保护:  否
证书签名:     否
--------------------------------------------------

十六进制输出: 用于得到程序的十六进制机器码,通常传入的是文件路劲,文件偏移,以及读取大小。

[Pe View] # GetHexAscii --path d://Win32Project.exe --offset 498 --len 100
-------------------------------------------------------------------------------
Offset   | 0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 | ASCII
-------------------------------------------------------------------------------
00000498 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
00000514 | 00 00 A0 00 00 E0 2E 74 65 78 74 00 00 00 66 43 |     ?text   fC
00000530 | 00 00 00 10 01 00 00 44 00 00 00 04 00 00 00 00 |      D   
00000546 | 00 00 00 00 00 00 00 00 00 00 20 00 00 60 2E 72 |              `.r
00000562 | 64 61 74 61 00 00 69 20 00 00 00 60 01 00 00 22 | data  i    `  "
00000578 | 00 00 00 48 00 00 00 00 00 00 00 00 00 00 00 00 |    H
00000594 | 00 00 40

目标指纹识别: 检测目标程序硬盘特征指纹,从而判断是那个编译器生成的程序,目前特征库不全仅用于测试。

[Pe View] # Fingerprint --path d://Win32Project.exe
---------------------------------------------------------------------------------------------------------
原始数据: 55 8B EC 81 EC C4 00 00 00 53 56 57 8D BD 3C FF FF FF B9 31 00 00 00 B8 CC CC CC CC F3 AB 8B 45
磁盘映像: 55 8B EC 81 EC C4 00 00 00 53 56 57 8D BD 3C FF FF FF B9 31 00 00 00 B8 CC CC CC CC F3 AB 8B 45
检测结果: Microsoft Visual C/C++ x86 (2013)
---------------------------------------------------------------------------------------------------------

十六进制计算器: 此处是一个小功能,用于计算两个十六进制数的加减法。

[Pe View] # Add --x 1c --y 2d
1c + 2d =>
         HEX= 00000049
         DEC= 73
         OCT= 111
         BIN= 1001001
[Pe View] #
[Pe View] # Sub --x 1c --y 2d
1c - 2d =>
         HEX= FFFFFFEF
         DEC= -17
         OCT= 37777777757
         BIN= 11111111111111111111111111101111

文件地址转虚拟地址: 将当前打开程序机器码所在地址转换成载入内存中的虚拟地址。

[Pe View] # FoaToVa --foa 420
--------------------------------------------------------------------------------
基址: 0x00400000 文件偏移开始: 0x00000400 文件偏移结束: 0x00004800
--------------------------------------------------------------------------------
FOA地址: 0x00000420
         ---> RVA地址: 0x00011020
                 ---> VA地址: 0x00411020
--------------------------------------------------------------------------------

虚拟地址转文件地址: 将当前打开程序的内存虚拟地址转换为所在文件地址。

[Pe View] # VaToFoa --va 0x00411020
--------------------------------------------------------------------------------
基址: 0x00400000 所在节区:  .text 节开始地址: 0x00411000 节结束地址: 0x00415366
--------------------------------------------------------------------------------
VA地址: 0x00411020
         ---> RVA地址: 0x00011020
                 ---> FOA地址: 0x00000420
--------------------------------------------------------------------------------

相对地址转文件地址: 将当前打开程序的RVA相对内存地址,转换成一个文件偏移地址。

[Pe View] # RvaToFoa --rva 1024
--------------------------------------------------------------------------------
基址: 0x00400000 所在节区: .textbss 节开始地址: 0x00001000 节结束地址: 0x00011000
--------------------------------------------------------------------------------
RVA地址: 0x00001024
         ---> VA地址: 0x00401024
                 ---> FOA地址: 0x00000024
--------------------------------------------------------------------------------
相关文章
|
15天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
15天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
15天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
8天前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
2月前
|
自然语言处理 编译器 Linux
|
2月前
|
设计模式 安全 数据库连接
【C++11】包装器:深入解析与实现技巧
本文深入探讨了C++中包装器的定义、实现方式及其应用。包装器通过封装底层细节,提供更简洁、易用的接口,常用于资源管理、接口封装和类型安全。文章详细介绍了使用RAII、智能指针、模板等技术实现包装器的方法,并通过多个案例分析展示了其在实际开发中的应用。最后,讨论了性能优化策略,帮助开发者编写高效、可靠的C++代码。
42 2
|
22天前
|
安全 编译器 C++
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
28 0
|
22天前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
57 0
|
2月前
|
机器学习/深度学习 自然语言处理 数据管理
GraphRAG核心组件解析:图结构与检索增强生成
【10月更文挑战第28天】在当今数据科学领域,自然语言处理(NLP)和图数据管理技术的发展日新月异。GraphRAG(Graph Retrieval-Augmented Generation)作为一种结合了图结构和检索增强生成的创新方法,已经在多个应用场景中展现出巨大的潜力。作为一名数据科学家,我对GraphRAG的核心组件进行了深入研究,并在此分享我的理解和实践经验。
88 0
|
2月前
光纤电缆(FOC)的结构深度解析
【10月更文挑战第21天】
80 0

推荐镜像

更多