作个记录

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