# 使用LLM反编译二进制程序

- URL: https://www.yidoo.xyz/llm4decompile
- 作者: 核动力蜗牛
- 发布时间: 2025-03-16
- 更新时间: 2025-03-16
- 分类: LLM技术内幕
- 标签: agent, llm

_本文介绍的内容仅供学习和娱乐使用，不建议使用在生产环节_

# 前言

偶然间，我读到了一篇名为《LLM4Decompile: Decompiling Binary Code with Large Language Models》的论文，介绍了如何使用大型语言模型（LLM）对二进制程序进行反编译。受此启发，我进行了一个简单的实验，复现了整个反编译过程。

# 使用 LLM 反编译 Hello World 程序

实验选取了 C++语言编写的 Hello World。大体流程如下：
![8d2525def5b2684a71df5e69cee2ed27.png](https://www.yidoo.xyz/images/8d2525def5b2684a71df5e69cee2ed27.png)

**1.创建 helloworld.cpp 文件**

```cpp
#include <iostream>
using namespace std;

int main() {
    cout << "Hello, World!" << endl;
    return 0;
}
```

**2.编译程序并运行**

```bash
g++ helloworld.cpp -o helloworld
./helloworld
Hello, World!
```

**3.反编译得到汇编代码**
这里选用的是 objdump 工具

```bash
objdump -d -M intel helloworld > helloworld.asm
```

**4.将得到汇编代码贴入 ChatGPT 中，并给出提示词**

```text
把下面的汇编还原成C++代码：

Disassembly of section .init:

0000000000001000 <_init>:
    1000:	f3 0f 1e fa          	endbr64
    1004:	48 83 ec 08          	sub    rsp,0x8
    1008:	48 8b 05 d9 2f 00 00 	mov    rax,QWORD PTR [rip+0x2fd9]        # 3fe8 <__gmon_start__>
    100f:	48 85 c0             	test   rax,rax
    1012:	74 02                	je     1016 <_init+0x16>
    1014:	ff d0                	call   rax
    1016:	48 83 c4 08          	add    rsp,0x8
    101a:	c3                   	ret
(省略...)
```

下面是 ChatGPT 的返回：
![3fb2d1c61d6a4645e13ae2e558faef36.png](https://www.yidoo.xyz/images/3fb2d1c61d6a4645e13ae2e558faef36.png)

# 总结

尽管这个文本反编译程序相对简单，实验过程也不够严谨，但它确实简单地证明了 LLM 反编译代码的可行性。这启发了我们一些其他的思路，例如格式化混淆后的 JavaScript 文件、处理反编译后的 JAR 文件等等。
