3 个版本

0.1.2 2024 年 4 月 12 日
0.1.1 2023 年 12 月 29 日
0.1.0 2023 年 8 月 8 日

#926解析器实现

自定义授权GPL-3.0 授权

150KB
3K SLoC

Crates.io Docs.rs

RPECLI

RPECLI 是 Rust 编写的快速跨平台工具,旨在成为 pecli 的替代品。虽然 pecli 是一款优秀的工具,但它使用 pefile,加载 PE 可执行文件时速度较慢,特别是在处理大量可执行文件时。

该项目目前依赖于为恶意软件解析而创建的 exe 库。

它还通过一个库导出解析数据,供你在自己的项目中使用。一些命令还可以将结果输出为 JSON 字符串,供你解析。

使用方法

Rust cli tool to parse PE files


This tool is still under development.
Some of the commands have a `--json` argument that outputs the result as a JSON string.
Try "rpecli COMMAND --help" to show help for a specific command.
Certain commands support multiple PE files as arguments and will compare them if you give multiple PE files.

Usage: rpecli [OPTIONS] <COMMAND>

Commands:
  info           Print all available information
  import-export  Print both import and exports
  import         Print imports
  export         Print exports
  rich           Rich headers
  rsrc           Print or dump resources
  sig            Print authenticode signature
  disass         Disassemble section
  strings        Print strings
  test           Test command for development
  help           Print this message or the help of the given subcommand(s)

Options:
  -n, --no-hash  Do not compute any hashes when reading PE file. (Enabling this option should greatly improve performance)
  -h, --help     Print help
  -V, --version  Print version
rpecli export --json sample
{
  "characteristics": 0,
  "major_version": 0,
  "minor_version": 0,
  "name": "Qt5Widgets.dll",
  "base": 1,
  "number_of_functions": 8990,
  "number_of_names": 8990,
  "address_of_functions": 3557432,
  "address_of_names": 3593392,
  "address_of_names_ordinals": 3629352,
  "timestamp": 4294967295,
  "entries": [
    {
      "name": "??0QAbstractButton@@IAE@AAVQAbstractButtonPrivate@@PAVQWidget@@@Z",
      "ordinal": 1,
      "rva": 775280,
      "forwarded_name": null
    },
    {
      "name": "??0QAbstractButton@@QAE@PAVQWidget@@@Z",
      "ordinal": 2,
      "rva": 775344,
      "forwarded_name": null
    },
    {
      "name": "??0QAbstractGraphicsShapeItem@@IAE@AAVQAbstractGraphicsShapeItemPrivate@@PAVQGraphicsItem@@@Z",
      "ordinal": 3,
      "rva": 2341920,
      "forwarded_name": null
    },
  ...
  ]
}
.\rpecli kernel32.dll

Metadata:
================================================================================
MD5       : e44c6872f7e2dade42e472b2c062c7b0
SHA1      : cc2fcdf6b747943c196d49f7ed55d308d7ef4d9b
SHA256    : 03bf2226a8cf553fd2a0f22a9f27c3f0f0ec3e99aa061f7219821caa4142c175

Size:           772.1 KiB (790616 bytes)
Type:           X64 DLL
Compile Time:   2066-08-28 19:59:40 (Timestamp: 3050251180 (0xb5cf23ac))
Subsystem:      WindowsCUI
Entrypoint:     0x15640 => .text

Code at entrypoint:
================================================================================
48895C2408           mov [rsp+8],rbx
57                   push rdi
4883EC20             sub rsp,20h
8BFA                 mov edi,edx
488BD9               mov rbx,rcx
BA01000000           mov edx,1
3BFA                 cmp edi,edx
7505                 jne short 000000000000001Dh
E817D80000           call 000000000000D834h
8BD7                 mov edx,edi

Signature:
================================================================================
Signature 0:
  Signature digest: 852fb691ec19bd403547973f1a963fc17fee2376c25a2590427de1705bc8cfec

  Signer:
    Issuer:        C=US,STATEORPROVINCENAME=Washington,L=Redmond,O=Microsoft Corporation,CN=Microsoft Windows Production PCA 2011
    Serial number: 33:00:00:04:0C:12:00:67:8B:16:B2:65:DB:00:00:00:00:04:0C
  Certificate 0:
    Issuer:        C=US,STATEORPROVINCENAME=Washington,L=Redmond,O=Microsoft Corporation,CN=Microsoft Windows Production PCA 2011
    Subject:       C=US,STATEORPROVINCENAME=Washington,L=Redmond,O=Microsoft Corporation,CN=Microsoft Windows
    Serial number: 33:00:00:04:0C:12:00:67:8B:16:B2:65:DB:00:00:00:00:04:0C
  Certificate 1:
    Issuer:        C=US,STATEORPROVINCENAME=Washington,L=Redmond,O=Microsoft Corporation,CN=Microsoft Root Certificate Authority 2010
    Subject:       C=US,STATEORPROVINCENAME=Washington,L=Redmond,O=Microsoft Corporation,CN=Microsoft Windows Production PCA 2011
    Serial number: 61:07:76:56:00:00:00:00:00:08



Rich headers:
================================================================================

  Product Name       Build   Product ID   Count   Guessed Visual Studio version
  Implib1400         29395   257          4       Visual Studio 2015 14.00
  Implib900          30729   147          201     Visual Studio 2008 09.00
  Import0            0       1            1332    Visual Studio
  Utc1900_C          29395   260          10      Visual Studio 2015 14.00
  Export1400         29395   256          1       Visual Studio 2015 14.00
  Masm1400           29395   259          5       Visual Studio 2015 14.00
  Utc1900_POGO_O_C   29395   269          207     UNKN
  Cvtres1400         29395   255          1       Visual Studio 2015 14.00
  Linker1400         29395   258          1       Visual Studio 2015 14.00



Sections:
================================================================================

    Name    VirtAddr   VirtSize   RawAddr   RawSize   Entropy                  md5                                         Characteristics
  .text       0x1000    0x7de27    0x1000   0x7e000      6.39    e64217696a3b17b4d623e585246a0d66   60000020 (CNT_CODE | MEM_EXECUTE | MEM_READ)
  .rdata     0x7f000    0x337b4   0x7f000   0x34000      5.62    78058c4b075118a4e2f44f428859761a   40000040 (CNT_INITIALIZED_DATA | MEM_READ)
  .data      0xb3000     0x12e4   0xb3000    0x1000      1.17    55b8682f534b352b31d73ad57bbcef5d   C0000040 (CNT_INITIALIZED_DATA | MEM_READ | MEM_WRITE)
  .pdata     0xb5000     0x5544   0xb4000    0x6000      5.43    91c69814336303f6adff1de3999a993f   40000040 (CNT_INITIALIZED_DATA | MEM_READ)
  .didat     0xbb000       0xa8   0xba000    0x1000      0.23    302f288de68cff124618438bb2d632cf   C0000040 (CNT_INITIALIZED_DATA | MEM_READ | MEM_WRITE)
  .rsrc      0xbc000      0x520   0xbb000    0x1000      1.32    d58796bd5bf9664ed21be9166aab39fd   40000040 (CNT_INITIALIZED_DATA | MEM_READ)
  .reloc     0xbd000      0x348   0xbc000    0x1000      1.74    82affef2f6f4f8f22ad4f220b1b7a7c6   42000040 (CNT_INITIALIZED_DATA | MEM_DISCARDABLE | MEM_READ)


Imports:
================================================================================

api-ms-win-core-rtlsupport-l1-1-0.dll
        RtlCompareMemory
        RtlDeleteFunctionTable
[SNIP]

api-ms-win-core-appcompat-l1-1-1.dll
        BaseReadAppCompatDataForProcess
        BaseFreeAppCompatDataForProcess

imphash: 5529a33510d7fd9c2cfa748e0d102653

Exports:
================================================================================

"KERNEL32.dll" => 1657 exported function(s)
          1 AcquireSRWLockExclusive (Forwarded export)
[SNIP]
         1657 uaw_wcsrchr

exphash: 4ca79cdc84d990b7803d389563eba24a
Export timestamp: 2066-08-28 19:59:40 (Timestamp: 3050251180 (0xb5cf23ac))

Debug info:
================================================================================
Entry 1:
  Type      : Codeview
  Timestamp : 2066-08-28 19:59:40 (Timestamp: 3050251180 (0xb5cf23ac))

  CodeView (v70)
    Signature      : {12950B30-DA44-7427-C06E-E816EFA3EBC6}
    Age            : 1
    PDB filename   : "kernel32.pdb"

Entry 2:
  Type      : Pogo
  Timestamp : 2066-08-28 19:59:40 (Timestamp: 3050251180 (0xb5cf23ac))

  PGO:
    0x001000 ".text$lp00kernel32.dll!20_pri7" (size : 0xb10)
    0x001b10 ".text$lp01kernel32.dll!20_pri7" (size : 0x1f040)
[SNIP]
    0x0bc000 ".rsrc$01" (size : 0xb0)
    0x0bc0b0 ".rsrc$02" (size : 0x470)

Entry 3:
  Type      : Repro
  Timestamp : 2066-08-28 19:59:40 (Timestamp: 3050251180 (0xb5cf23ac))

  Entry of type Repro is not supported for display

Entry 4:
  Type      : ExDllCharacteristics
  Timestamp : 2066-08-28 19:59:40 (Timestamp: 3050251180 (0xb5cf23ac))

  Entry of type ExDllCharacteristics is not supported for display


Resources:
================================================================================

    Name     Offset   RSRC ID    Lang ID                   MD5

    MUI        80      ID(1)     ID(1033)    fbaf48ec981a5eecdb57b929fdd426e8

  Version      90      ID(1)     ID(1033)    3a1682660ad485730c4987c23ab5fdd7



TLS callbacks:
================================================================================
No TLS callback directory

构建

cargo build --release

安装

cargo install rpecli

或本地

cargo install --path .

待办事项

  • 重构某些部分

内部结构

在创建此工具时,速度和模块化是关键考虑因素。它旨在提供接口,使用户能够根据需要修改 PE 解析后端。默认后端是专门用于解析 PE 恶意软件的 exe 库。

请注意,允许后端定制的特性尚不可用。

感谢

此项目使用了以下项目的代码

依赖项

~26–36MB
~598K SLoC