Go打包dll总结,stdcall打包dll妙招

本文参照了以下作者博文:
https://blog.youkuaiyun.com/RZTUSHU1/article/details/133126506

–add-stdcall-alias

由于go 不支持 std 压栈 stdcall

所以要变换一个方法,套一次 C语言
用gcc 打包 即可,先把go 代码中方法换成 共享库,再有C 调用共享库 linux 为.so ,windows 为 dll ,
gcc -m32 -c -o mydll.o mydll.c
gcc -m32 -c -o run.o run.c
-m32 参数为强制编程win32 api
gcc -shared -m32 -o mydll.dll mydll.o -Wl,–kill-at

Go代码 (example.go):
package main //export Addfunc Add(a int, b int) int { return a + b} func main() { // 这里的代码仅用于编译生成C可调用的库}
C代码 (main.c):
#include <stdio.h> // 声明Go函数,cgo会处理这些声明extern int Add(int, int); int main() { int result = Add(2, 3); printf(“Result: %d\n”, result); return 0;}
编译步骤:
1.编译Go代码生成共享库:
linux :
go build -buildmode=c-shared -o libexample.so example.go
windows:
go build -buildmode=c-shared -o libexample.dll example.go
2.编译C代码链接Go的共享库:
gcc -o main main.c -L. -lexample
gcc -c -m32 -o zhangxin.o zhangxin.c -L. -lexample

-----------第一步:打包go 中函数 变为 libexample.dll
-----先查看go env 环境
用CMD 非管理员 即可
64位golang 打包成32位 dll
set GOARCH=386
set CGO_ENABLED=1
go build -buildmode=c-shared -o libexample.dll main.go

  • go build -ldflags="-H windowsgui -w -s" -buildmode=c-shared -o libexample.dll getcpuid.go
  • go build -ldflags="-H windowsgui -w -s" -buildmode=c-shared -o libexample.dll main.go
  • go build -ldflags="-H windowsgui -w -s" -buildmode=c-shared -o main.dll getcpuid.go

-----------第一步:打包go 中函数 ---------
第二步 64红色部分,32位蓝色部分
转为 .o 文件
gcc -c -m32 -o zhangx.o zhangx.c -L. -lexample

gcc -c -m64 -o zhangx.o zhangx.c -L. -lexample
把 .o 文件 生成为dll 文件
gcc -shared -m32 -o zhangx.dll zhangx.o -Wl,–kill-at -L. -lexample

gcc -shared -m64 -o zhangx.dll zhangx.o -Wl,–kill-at -L. -lexample
第二步 红色部分
3.运行C程序:
./main
请确保你的Go环境已经正确安装,并且你的系统支持cgo。这个例子在Linux上测试通过,在其他系统上可能需要相应的调整。
提示:AI自动生成,仅供参考

java 调用动态库的方法
char* __stdcall test(char* strUrl,char* InData,char* OutData)
https://www.cnblogs.com/caoleiCoding/p/12949048.html
public class DllTest {
static {
String filePath = “D:\dll”; // 这里是你的动态库所在文件夹的绝对路径
// 这里引用动态库和他的依赖
System.load(filePath + “mfc100.dll”);
System.load(filePath + “mydll.dll”);
}
public static void main(String[] args) {
String strUrl = “http://127.0.0.1/test”;
String InData = “{“data”:{“operatorId”:“test001”,“operatorName”:“超级管理员”,“orgId”:“123”},“orgId”:“1232”}”;
byte[] OutData = new byte[1024];

String msg = CLibrary.INSTANCE.test(strUrl.getBytes(), InData.getBytes(), OutData);
System.out.println(msg);
try {
    System.out.println(new String(OutData, "GBK"));
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}

}
// 这里是最关键的地方
public interface CLibrary extends Library {
// FS_CheckCode是动态库名称,前面的d://test//是路径
CLibrary INSTANCE = (CLibrary) Native.loadLibrary(“mydll”, CLibrary.class);

// 我们要调用的动态库里面的方法。
String test(byte[] strUrl, byte[] InData, byte[] OutData);

}

}
if err != nil {
fmt.Printf(“⚠️ 调用异常: %v\n”, err)
return
}

<think>好的,用户现在想用AI分析EXE程序,确定它使用的高级语言。我需要回顾之前的对话历史,看看之前给过哪些建议。之前我介绍了AI在逆向工程中的多个应用方向,比如漏洞挖掘、二进制分析、反编译等等。现在用户具体针对语言识别这个点,可能需要更具体的思路。 首先,用户的需求是从EXE文件识别出编写它的高级语言,比如C++C#、Python等。这在逆向工程中确实是一个常见的问题,尤其是在分析恶意软件或闭源软件时。传统方法可能依赖特定编译器生成的符号、导入表或特定区段信息,比如用PyInstaller打包的Python程序会有特定标记。但用户希望用AI来做,可能需要更智能的方法。 接下来,我应该考虑AI如何应用到这里。可能的思路包括静态分析和动态分析。静态分析方面,可以提取二进制文件的特征,比如字节序列、反汇编后的指令分布、区段信息、导入函数等,然后用分类模型进行训练。动态分析的话,可能需要监控程序运行时的行为,比如内存分配模式、API调用序列,这些也可能带有语言相关的特征。 然后,我需要考虑特征提取的具体方法。例如,将二进制文件的字节转换为向量,可以使用CNN或RNN处理。反汇编后的指令序列可以用NLP模型,如BERT或Transformer,来捕捉语法结构。导入函数可能用TF-IDF或嵌入向量来表示,因为不同语言常用的库函数不同。 另外,数据收集是关键。用户需要构建一个包含不同语言编译的EXE的数据集,可能需要自己编译不同项目,或利用现有数据集,比如Kaggle上的恶意软件数据集。数据增强方面,可以改变编译器选项、优化级别、混淆手段,增加多样性。 模型选择方面,可能结合多个模型,比如用CNN处理字节序列,用NLP处理指令序列,再融合结果。或者使用图神经网络处理控制流图的结构特征。多模态学习可能有效,结合静态和动态特征。 实施步骤的话,用户需要先收集数据,提取特征,训练模型,验证效果,最后部署。现有工具方面,可以使用Angr或Ghidra提取反汇编代码,用scikit-learn或PyTorch构建模型。 挑战方面,编译器优化和混淆可能会影响特征,比如OLLVM混淆后的代码指令分布变化。跨平台问题,比如不同架构(x86 vs ARM)可能需要模型泛化。此外,打包工具(如PyInstaller)可能会在二进制中引入干扰,需要特别处理。 可能用户的实际场景是安全分析或软件复现,需要快速识别语言以进行后续分析。用户可能没有太多标注数据,所以建议利用迁移学习或预训练模型。另外,用户可能希望有一个端到端的工具,方便集成到现有工作流中,比如开发IDA插件或Ghidra脚本。 总结下来,需要分步骤指导用户,从数据准备到模型构建,再到实际应用,同时指出潜在挑战和解决方案。确保回答清晰,技术点明确,同时给出实用建议,帮助用户启动项目。</think>将AI技术应用于识别EXE程序使用的高级语言(如C++C#、Python、Go等)是一个典型的**二进制文件分类问题**。以下是具体思路和技术实现路径: --- ### **1. 核心思路** 通过分析二进制文件的静态特征(如字节序列、指令模式、区段结构)或动态行为(如API调用、内存分配),训练分类模型自动推断其原始编程语言。 --- ### **2. 关键特征提取** #### **(1) 静态分析特征** - **字节/指令序列** - 将二进制文件的字节流或反汇编后的指令序列视为“文本”,使用NLP模型(如CNN、LSTM、Transformer)提取模式特征。 - 例如:Python打包的EXE(如PyInstaller)包含特定字节模式(如`pyi`标识)。 - **区段与导入表** - 分析`.text`/`.data`区段大小、编译器特有区段(如`.tls`)、依赖的DLL(如C#程序依赖`mscoree.dll`)。 - **控制流图(CFG)与函数调用** - 不同语言编译后的控制流复杂度、函数调用约定(如`__stdcall` vs `__fastcall`)存在差异。 - **字符串与常量池** - 识别语言运行时特有的字符串(如Java的`JVM`、Go的`runtime.main`)。 #### **(2) 动态分析特征** - **API调用序列** - 监控程序启动时加载的API(如C#程序会调用`mscorlib`相关函数)。 - **内存分配模式** - 不同语言的内存管理机制(如Python的引用计数、Rust的所有权系统)可能留下痕迹。 --- ### **3. 实现步骤** #### **(1) 数据准备** - **构建数据集**:收集不同语言编译的EXE样本(需覆盖常见编译器,如GCC、MSVC、PyInstaller等),并标注其原始语言。 - **数据增强**:通过编译器优化选项、混淆工具(如UPX)生成变体样本,提升模型鲁棒性。 #### **(2) 模型选择** - **基于字节的分类** - 使用1D-CNN或Transformer直接处理二进制字节流(类似MalConv模型)。 - **基于反汇编的分类** - 对反汇编代码进行词嵌入(如Word2Vec),输入RNN或BERT模型。 - **混合模型** - 结合静态特征(字节、区段)与动态特征(API调用),通过多模态网络融合分类。 #### **(3) 工具链** - **特征提取工具** - 使用`radare2`/`Ghidra`提取反汇编代码,`LIEF`解析PE文件结构,`Wireshark`+`Frida`捕获动态行为。 - **模型框架** - 推荐PyTorch或TensorFlow,轻量级任务可尝试scikit-learn(如随机森林+特征工程)。 --- ### **4. 典型场景与案例** #### **(1) 识别打包的Python程序** - **特征**:存在PyInstaller的`pyiboot`区段,字节流中包含Python解释器字符串。 - **AI实现**:训练CNN模型直接对二进制文件头部进行分类。 #### **(2) 区分C++C#** - **特征**: - C++ EXE依赖`msvcp140.dll`,C#依赖`mscoree.dll`。 - C#程序通常包含强名称签名和CLR头。 - **AI实现**:通过导入表DLL列表构建TF-IDF特征,输入SVM分类器。 #### **(3) 检测Go语言程序** - **特征**:Go程序包含大量`runtime`相关函数(如`runtime.main`)、独特的初始化逻辑。 - **AI实现**:提取函数名的n-gram特征,使用LightGBM分类。 --- ### **5. 挑战与解决方案** - **混淆与打包工具干扰** - 方案:在训练数据中加入混淆后的样本(如UPX压缩、VMProtect加壳)。 - **跨编译器/版本差异** - 方案:使用多任务学习,同时学习编译器类型和语言类别。 - **小样本问题** - 方案:采用迁移学习,复用预训练的恶意软件分类模型(如Ember数据集)。 --- ### **6. 现有工具参考** - **Manalyze**(静态PE分析工具,可检测语言线索) - **Detect-It-Easy**(通过启发式规则识别语言/编译器,可结合AI增强) - **EMBER**(开源恶意软件分类数据集,含语言相关特征) --- ### **7. 简易实现示例** ```python # 使用scikit-learn基于导入表DLL分类 import lief from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import LinearSVC # 提取EXE导入的DLL列表 def extract_dlls(file_path): binary = lief.parse(file_path) return " ".join([dll.name.lower() for dll in binary.imports]) # 构建训练数据(假设已标注X_train_dlls和y_train) vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(X_train_dlls) clf = LinearSVC().fit(X, y_train) # 预测新样本 dlls = extract_dlls("unknown.exe") prediction = clf.predict(vectorizer.transform([dlls])) print(f"Predicted language: {prediction[0]}") ``` --- 通过上述方法,AI可快速识别未知EXE的编程语言,为后续逆向分析(如选择反编译器、漏洞模式匹配)提供关键上下文信息。实际应用中需结合传统逆向技巧(如字符串搜索、入口点分析)与AI模型互补验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

衡度人生

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值