作个记录
DIE
DIE (Detect it easy),从文件命名方式来看,意为使检测变容易。它的主要作用是用来查壳,比 PEID 强太多,自带的特征库非常丰富,是一款深受逆向工程师和安全研究人员喜爱的工具。
Go 如何使用 DIE
官方提供了专供开发者使用的库 https://github.com/horsicq/die_library,不过需要自己去编译,在编译时遇到了一个小坑 (后面作说明),作者现已修复。
编译
下载仓库
git clone --recursive https://github.com/horsicq/die_library.git
在编译之前,需要安装 Qt 库,当时编译拿的是 Ubuntu22.04,从官方 README 上说明需要执行
sudo apt-get install qt5-default
但 qt5-default 这个包已被 Ubuntu 官方移除,在低于 21.04 版本下可以安装 qt5-default 包,高于就安装不了了,取而代之的是 qtbase5-dev 包,除此之外,还需要 qtscript5-dev 包
所以若要成功编译此库,需要执行
sudo apt-get update
sudo apt install qtbase5-dev qtscript5-dev
cd die_library
# 因为目录下已有 build 文件夹所以直接进入
cd build
cmake ..
make
安装好以上依赖库后编译
编译后报错,提示无法匹配 qMin 这个函数,后面又换成 Ubuntu24.04,但一样还是报如上错误,因为我不懂 Qt,所以直接给作者提了 issue
同时也很快收到了回复,给出了修复方法,照着错误提示出错的代码文件修改源代码重新编译就能通过了,编译好的 so 库位于 src/dielib 下
Go 调用
仓库中给出了示例 Demo 调用,但只能在 windows 下编译通过,linux 下会报错,在 die.h 头文件中添加 #include <wchar.h>,因为 linux 下没有 windows.h 这个头文件
项目结构
main.go
package main
/*
#cgo CFLAGS: -I./inc
#cgo LDFLAGS: -L./lib -ldie
#include <stdlib.h>
#include "die.h"
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
fileName := C.CString("./test/Enigma Protector 6.70_protected.exe")
defer C.free(unsafe.Pointer(fileName))
database := C.CString("./db")
defer C.free(unsafe.Pointer(database))
flags := C.uint(C.DIE_DEEPSCAN | C.DIE_RECURSIVESCAN | C.DIE_RESULTASJSON)
result := C.DIE_ScanFileA(fileName, flags, database)
if result != nil {
scanResult := C.GoString(result)
fmt.Println(scanResult)
C.DIE_FreeMemoryA(result)
} else {
fmt.Println("Scan failed or no result.")
}
}
build & run
go build -o bin/die-go
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
bin/die-go