大家好!各位安全领域的未来之星 🌱
上次我们完成了强大且免费的逆向工程工具 Ghidra 的安装。既然工具已经安装好了,是不是该尝试使用一下呢?
但是,如果一开始就尝试分析复杂的恶意软件,只会让人头疼,很快就会感到疲惫。🤯 所以今天,我们将分析最基础但也是最重要的一步——“Hello World”程序。
您可能会想:“哎,Hello World不就是只输出一下吗?” 是的,没错!但是,要理解“我们熟悉的源代码”如何变成“计算机能理解的机器码”,以及如何再将其“恢复(反编译)成我们能识别的形式”,没有比这更好的例子了。
如果再加上我们坚实的后盾——生成式AI呢?逆向工程将不再可怕!那么,我们开始吧?🚀

🛠️ 准备工作
- 已安装的Ghidra: (如果还没安装,请参考之前的文章!)
- 分析目标文件 (hello.exe): 一个用C语言输出“Hello World”的非常简单的程序。
- AI聊天机器人: ChatGPT、Claude、Gemini等,任何都可以。
💡 注意:创建分析目标文件 如果您有C编译器(GCC、Visual Studio等),可以尝试编译以下代码来创建hello.exe。如果没有,您也可以在网上找到任何“Hello World exe”文件。
>
`
#include
>
int main() { printf(“Hello, AI Reversing World!
“); return 0; }
`
STEP 1. 将文件导入Ghidra (Import) 📥
首先,运行Ghidra并打开一个项目。(例如:MyFirstReversing)
- 将准备好的hello.exe文件拖放到Ghidra项目窗口中。
- 当出现“Import”窗口时,无需进行特殊设置,直接点击[OK]。
- 您会看到hello.exe已添加到项目列表中。双击打开文件。
(激动)终于进入分析界面!
首次打开文件时,Ghidra会询问:“是否分析此文件?(Analyze?)” 当然要点击[Yes],然后保持默认选项,点击[Analyze]按钮。Ghidra将开始努力地“咀嚼、拆解、品尝、享受”这个文件。🍖
STEP 2. 面对“外星语” (Listing 视图 vs Decompiler 视图) 👽
分析完成后,屏幕上会显示大量信息。别慌!我们只需要关注两个地方。
1. 列表(Listing) 视图 (中间的大屏幕)
这里是“汇编语言(Assembly)”的世界。您会看到PUSH、MOV、CALL等机器码指令。计算机能理解这些,但我们……嗯……目前还很难。😅
2. 反编译器(Decompiler) 视图 (通常是右侧屏幕)
✨ 今天的主角就是它! ✨ Ghidra强大的反编译器功能将像“外星语”一样的汇编语言转换成我们熟悉的类似C语言的形式(伪代码,Pseudo-code)。
STEP 3. 查找 main 函数 🕵️
程序启动时最先执行的地方,就是main函数,我们需要找到它。
- 查看Ghidra左侧的“Symbol Tree”面板。
- 打开“Exports”或“Functions”文件夹。
- 如果运气好,您会直接看到名为main的函数。(如果看不到,通常需要查找entry或WinMain等,但由于是简单实践,我们假设main是可见的!)
- 双击main。
瞧!🎉 列表视图和反编译器视图会同时跳转到main函数的位置。
STEP 4. 还原我的代码! (检查反编译结果) 👀
仔细查看右侧的反编译器视图。它和我们之前编写的(或预期的)C源代码相似吗?
// Ghidra显示的逆向编译代码示例(可能与实际不同)
int __cdecl main(int _Argc,char **_Argv,char **_Env)
{
__main(); // 编译器添加的初始化函数
puts("Hello, AI Reversing World!"); // printf有时会被优化为puts
return 0;
}
嗯?有点不同。
- 我们用了printf,但有时会看到puts(这是编译器优化)。
- 还有像 __main(); 这样我没写的代码。
- 函数参数名也像 _Argc 一样看起来很复杂。
虽然与原始源代码并非100%相同,但我们能够理解其核心逻辑:“啊,这段代码是输出一个字符串然后结束。” 这正是逆向工程的核心!
STEP 5. 询问AI代码结构 (AI终于登场!🤖)
好了,代码太简单是不是觉得无聊?如果代码稍微复杂一点,就会充斥着像 undefined4 uVar1; 这样的奇怪变量名,让人难以理解。
这时,AI就大放异彩了。我们将Ghidra显示的反编译代码扔给AI,让它来解释。
1. 复制代码
拖动并复制(Ctrl+C)反编译器视图中的所有代码。
2. 输入AI提示词
前往您使用的AI聊天机器人,并提出以下问题。(赋予角色会得到更好的回答!)
🧑💻 我的提示词: “你现在是一名资深安全分析师。我将给你一段我用逆向工程工具(Ghidra)反编译的C代码,你能用初学者也能理解的方式,解释这段代码的整体结构和作用吗?
>
`
(将刚才复制的代码粘贴到这里)
`
3. 查看AI的回答
AI会怎么回答呢?它可能会这样回答:
🤖 AI的回答 (示例): 好的,您提供的代码是典型的C程序入口点——main函数的反编译结果。
>
代码结构及作用说明:
>
1. 函数定义 (main): 这是程序执行时由操作系统最先调用的主函数。它返回一个int类型,并接收命令行参数(_Argc, _Argv)。
2. 初始化例程 (__main()): 这似乎是编译器在实际用户代码运行之前插入的程序初始化相关函数。您无需过多关注。
3. 核心功能 (字符串输出):
– puts(“Hello, AI Reversing World!”);
– 这一部分最重要。它负责将“Hello…”字符串输出到屏幕(控制台)。即使原始源代码使用了printf,如果只是简单地输出字符串,编译器也常常会将其优化(更改)为更快的puts函数。
4. 终止 (return 0;): 函数返回0,通知操作系统程序已正常终止。
>
总结: 这个程序在执行时没有复杂的逻辑,只是输出“Hello, AI Reversing World!”这句问候语,然后立即终止,结构非常简单。
🎉 实践结束
怎么样?AI的解释是不是很精彩?🤩
我们将我们凭肉眼大致猜测的内容,通过AI用明确的术语(入口点、初始化例程、优化、返回值)进行了结构化的整理。
通过今天的实践,我们获得了两大收获:
- 我们初步窥探了机器码的世界: 我们了解到我们编写的优美源代码实际上会变得如此复杂。
- 我们获得了一个强大的助手——AI: 我们获得了信心,无论未来分析的代码多么复杂,变量名多么混乱(如iVar1, uVar2),我们都可以向AI提问,从而看到整体的“森林”。
下一次,我们将进行真正的“分析”实践。我将准备一个“补丁(Patch)”实践,通过操作代码来改变程序的行为!
在此之前,请务必复习今天所学的内容!再见!👋
发表回复