pe
v1.5.0

PE是用于解析便携式可执行文件格式的GO软件包。该软件包的设计考虑了恶意软件分析,并且对PE畸形具有抵抗。
使用此GO软件包很容易。首先,使用go get安装库的最新版本。此命令将与图书馆及其依赖关系一起安装pedumper的可执行文件:
go get -u github.com/saferwall/pe
接下来,在您的应用程序中加入pe软件包:
import "github.com/saferwall/pe" package main
import (
peparser "github.com/saferwall/pe"
)
func main () {
filename := "C: \ Binaries \ notepad.exe"
pe , err := peparser . New ( filename , & peparser. Options {})
if err != nil {
log . Fatalf ( "Error while opening file: %s, reason: %v" , filename , err )
}
err = pe . Parse ()
if err != nil {
log . Fatalf ( "Error while parsing file: %s, reason: %v" , filename , err )
}
}首先通过称为New()方法实例化PE对象,该方法将文件路径带到要解析的文件和一些可选选项。
之后,对Parse()方法的调用将使您可以访问PE格式的所有不同部分,直接可以使用。这是结构的定义:
type File struct {
DOSHeader ImageDOSHeader `json:"dos_header,omitempty"`
RichHeader RichHeader `json:"rich_header,omitempty"`
NtHeader ImageNtHeader `json:"nt_header,omitempty"`
COFF COFF `json:"coff,omitempty"`
Sections [] Section `json:"sections,omitempty"`
Imports [] Import `json:"imports,omitempty"`
Export Export `json:"export,omitempty"`
Debugs [] DebugEntry `json:"debugs,omitempty"`
Relocations [] Relocation `json:"relocations,omitempty"`
Resources ResourceDirectory `json:"resources,omitempty"`
TLS TLSDirectory `json:"tls,omitempty"`
LoadConfig LoadConfig `json:"load_config,omitempty"`
Exceptions [] Exception `json:"exceptions,omitempty"`
Certificates CertificateSection `json:"certificates,omitempty"`
DelayImports [] DelayImport `json:"delay_imports,omitempty"`
BoundImports [] BoundImportDescriptorData `json:"bound_imports,omitempty"`
GlobalPtr uint32 `json:"global_ptr,omitempty"`
CLR CLRData `json:"clr,omitempty"`
IAT [] IATEntry `json:"iat,omitempty"`
Anomalies [] string `json:"anomalies,omitempty"`
Header [] byte
data mmap. MMap
FileInfo
size uint32
OverlayOffset int64
f * os. File
opts * Options
logger * log. Helper
}如前所述,结构的所有成员都可以直接(无getters)访问,此外,字段类型已被保留为规格,这意味着,如果您需要显示int类型的修复版本,则必须调用相应的助手函数。
fmt . Printf ( "Magic is: 0x%x n " , pe . DOSHeader . Magic )
fmt . Printf ( "Signature is: 0x%x n " , pe . NtHeader . Signature )
fmt . Printf ( "Machine is: 0x%x, Meaning: %s n " , pe . NtHeader . FileHeader . Machine , pe . NtHeader . FileHeader . Machine . String ())输出:
Magic is: 0x5a4d
Signature is: 0x4550
Machine is: 0x8664, Meaning: x64
例子:
richHeader , _ := json . Marshal ( pe . RichHeader )
fmt . Print ( prettyPrint ( richHeader ))输出:
{
"XorKey" : 2796214951 ,
"CompIDs" : [
{
"MinorCV" : 27412 ,
"ProdID" : 257 ,
"Count" : 4 ,
"Unmasked" : 16870164
},
{
"MinorCV" : 30729 ,
"ProdID" : 147 ,
"Count" : 193 ,
"Unmasked" : 9664521
},
{
"MinorCV" : 0 ,
"ProdID" : 1 ,
"Count" : 1325 ,
"Unmasked" : 65536
},
{
"MinorCV" : 27412 ,
"ProdID" : 260 ,
"Count" : 9 ,
"Unmasked" : 17066772
},
{
"MinorCV" : 27412 ,
"ProdID" : 259 ,
"Count" : 3 ,
"Unmasked" : 17001236
},
{
"MinorCV" : 27412 ,
"ProdID" : 256 ,
"Count" : 1 ,
"Unmasked" : 16804628
},
{
"MinorCV" : 27412 ,
"ProdID" : 269 ,
"Count" : 209 ,
"Unmasked" : 17656596
},
{
"MinorCV" : 27412 ,
"ProdID" : 255 ,
"Count" : 1 ,
"Unmasked" : 16739092
},
{
"MinorCV" : 27412 ,
"ProdID" : 258 ,
"Count" : 1 ,
"Unmasked" : 16935700
}
],
"DansOffset" : 128 ,
"Raw" : " 47vE9afaqqan2qqmp9qqprOxq6ej2qqmrqI5pmbaqqan2qumit+qprOxrqeu2qqms7Gpp6TaqqazsaqnptqqprOxp6d22qqms7FVpqbaqqazsainptqqplJpY2in2qqm "
}
for _ , sec := range pe . Sections {
fmt . Printf ( "Section Name : %s n " , sec . NameString ())
fmt . Printf ( "Section VirtualSize : %x n " , sec . Header . VirtualSize )
fmt . Printf ( "Section Flags : %x, Meaning: %v n n " ,
sec . Header . Characteristics , sec . PrettySectionFlags ())
}输出:
Section Name : .text
Section VirtualSize : 2ea58
Section Flags : 60500060, Meaning: [Align8Bytes Readable Align16Bytes Executable Contains Code Initialized Data Align1Bytes]
Section Name : .data
Section VirtualSize : 58
Section Flags : c0500040, Meaning: [Readable Initialized Data Writable Align1Bytes Align16Bytes Align8Bytes]
Section Name : .rdata
Section VirtualSize : 18d0
Section Flags : 40600040, Meaning: [Align2Bytes Align8Bytes Readable Initialized Data Align32Bytes]
...
为了验证解析器,我们使用corkami的Go-Fuzz和已知畸形和棘手的PE文件的语料库。

Fibratus是Windows内核探索和追踪的现代工具,专注于安全性。