资讯动态

Ghidra静态分析实战:上手流程、核心技巧与踩坑排查

发布时间:2026/10/16 4:58:52 来源:尧图企业网站定制
搞逆向的朋友应该都有过这样的经历拿到一个不知道什么来路的二进制文件想搞清楚它到底干了什么。以前我习惯先丢进某个命令行工具里看字符串、看导入表再根据经验猜逻辑效率低不说还容易漏东西。后来换了Ghidra做静态分析整个分析思路都顺了很多。Ghidra这套开源逆向工具集名气已经不需要多吹了反汇编、反编译、脚本化处理、团队协作全都有最关键的是它免费、可扩展而且反编译器的输出结果在很多时候比同类商业工具更干净。这篇文章我不打算写成面面俱到的官方文档就把我实际用Ghidra做静态分析的一套流程、踩过的坑、以及一些比较实用的操作细节分享出来希望对正在入门或者准备换工具的人有点用。1. 静态分析用Ghidra到底怎么上手1.1 为什么静态分析选Ghidra不选别的要把逆向分析这件事讲明白先分清静态分析和动态分析的差别。动态分析是把程序跑起来用调试器看寄存器、内存、调用栈动态库加载之后的行为看得很清楚但它的前提是程序能跑、环境能搭好。静态分析不运行程序而是直接基于二进制内容做解析适用范围更广——比如固件、恶意样本、还没解开壳的驱动程序拿到手不能随便跑或者跑起来就需要特定硬件环境这时候静态分析就是主力手段。Ghidra在静态分析这个领域算是个比较特殊的存在。它把反汇编、反编译、脚本引擎、调试器虽然调试功能相对弱一些但也在持续更新都集合在一个桌面应用里。最让我看好的一点是项目的开放性插件架构清晰底层用Java开发脚本支持Java、PythonJython和Ghidra自带的宏语言想扩展功能基本不受限制。看代码的时候还能拿反编译结果跟反汇编结果对照着看变量的传播路径、函数调用关系都可以可视化地追踪。用的时候我也对比过同类的商业逆向工具。从价格角度讲Ghidra完全免费对个人学习、企业部署都没有授权方面的负担这是硬优势。从功能角度讲商业工具在个别处理器架构的支持深度、调试体验上确实有积累但Ghidra的社区和插件生态也在快速追赶主流架构之外的冷门CPU也有很多第三方贡献的模块可用。做比赛、做样本分析、做协议逆向这些场景Ghidra都能胜任。1.2 安装和第一次启动需要注意的细节Ghidra的安装没有太多花活跨平台这一点做得比较到位Windows、Linux、macOS都能跑。需要提前准备好Java运行环境注意版本匹配老版本Ghidra可能要求Java 11新版本已经跟进到Java 17或者更高装错了版本会启动报错。我不止一次看到有人卡在启动闪退这一步最后发现就是Java版本不对。解压之后到目录里执行./ghidraRunWindows下直接双击ghidraRun.bat就行。启动速度看机器性能第一次初始化会比较慢因为要加载各种模块。用户目录下会自动生成.ghidra文件夹里面放的是个人偏好、缓存和插件配置。有洁癖的人也不用担心卸载不干净删掉这个文件夹就行。打开主界面后第一步一般是创建一个非共享项目Non-Shared Project。项目是Ghidra管理所有导入文件的地方语法跟常见IDE的工作区类似。如果只是临时分析一个文件用临时项目也可以但我不建议这么做——后面写脚本、保存标记、记录分析进度都需要项目作为载体建一个正式项目会省很多事。导入二进制文件的流程很简单直接把文件拖进Ghidra项目窗口或者通过File - Import File操作。导入的时候有个选项叫Language它决定了用什么处理器指令集来解析文件。正常情况下Analysis会自动识别文件头格式比如PE文件就会匹配到对应的架构和字节序。如果识别错了也可以手动修改。导入之后立刻会弹出Analysis Options对话框问你要不要自动分析。我建议打开自动分析这里有个容易踩的坑新的Ghidra版本默认分析选项可能没有把某些重要项勾上比如Decompiler Parameter ID和Stack分析在某些精简配置下没有开启导致后面的反编译结果信息不全。进入对话框把能开的分析项都勾上尤其是跟栈、引用、参数识别相关的选项宁可多花几分钟分析时间也不要之后手动补。确认开始分析后进度条会跑一会儿。文件越小越快如果是几兆的二进制可能几十秒就完事遇到几万甚至几十万函数的程序就先去倒杯水吧。分析完成后程序会在后台建立一套完整的模型每个函数被识别出来、调用关系被梳理清楚、字符串和引用被关联上、栈上的局部变量也有了初步的布局信息。2. Ghidra界面里的核心功能逐个拆开讲2.1 先从“程序树”和“符号表”开始找感觉分析完成之后界面分成了好几块初次接触容易看花眼。左边最上面是Symbol Tree符号树下面还有一个Program Trees程序树。Program Trees按节区来组织内容比如PE文件的.text、.data、.rdata都能在这里展开看到。通过它你可以跳转到任意一个节区的具体偏移地址浏览整个文件的字节布局。Symbol Tree则是按类别管理已知符号导入的函数比如CreateFileW、printf导出的函数还有分析过程中自动识别出来的函数名和标号。做恶意代码分析或者协议逆向时我经常先看导入表这一眼能看出程序大概干什么如果有socket、send、recv、connect八九不离十是网络通信相关功能如果加解密相关函数比较多可能涉及数据保护或通信加密逻辑。Ghidra的导入表展示比很多命令行工具直观的地方在于点击任何一个导入符号可以跳到引用它的代码位置这个引用关系是静态分析最重要的线索。右侧区域是Listing窗口也就是反汇编代码视图。这里显示的是最底层的汇编指令每条指令有地址、字节、助记符、操作数还带注释和引用箭头。往下一点是Decompiler窗口这是Ghidra的王牌功能一键把汇编转成类C伪代码。两个窗口联动你在反汇编里点一条指令反编译窗口会高亮对应的C语句反过来也一样。分析复杂逻辑时我一向是两边对照着看先看C伪代码整体理解意图再下钻到汇编细节确认关键操作的真实语义。左下方的Data Type Manager窗口容易被忽略但它非常有价值。它管理程序里已经定义好的数据类型包括结构体、联合体、枚举、函数指针。程序里如果引用了系统APIGhidra会自动带上已知的结构体定义比如_SYSTEM_INFO、_PEB这些。分析时你可以自己创建结构体跟反编译结果绑定绑定之后反编译出来的代码就会直观地显示结构体名.字段名这比干看一堆偏移量要舒服得多。2.2 反编译窗口的正确打开方式和查看技巧反编译窗口看起来就是个只读的代码编辑器但它绝不是只能干看着。在反编译结果上可以直接做很多操作这比直接改反汇编指令方便。比如修改函数名。函数在反编译窗口里显示的名字默认是FUN_00102340这种完全看不出作用。你通过分析逻辑推断出它可能是做某个初始化操作的就可以右键点函数名选Rename Function改成init_device之类有语义的名字。这个名字会同步到反汇编窗口、函数调用图、符号树整个项目都会统一更新。分析大型程序时养成随手改名的习惯到了后面看调用关系会轻松非常多。修改变量名也是同理。默认的local_8、param_1没有任何语义右键变量改成一个有意义的名字反编译代码的可读性提升是立竿见影的。我在分析某个网络协议处理函数时把一坨param_2改成了packet_len整个函数逻辑瞬间就通顺了。还有一个操作是“重定义变量类型”。比如你发现某个局部变量实际上是一个指向结构体的指针右键变量选Retype Variable把类型改成你定义好的结构体指针类型。反编译结果会立刻把拆开的字段引用显示成结构体成员访问伪代码的可读性直接提升一个量级。类型推导一直是静态分析里最花时间的环节Ghidra提供了这个手工矫正的入口等于把半自动化的工具变成了完全可控的分析利器。快捷键是提升效率的关键我最常用的几个CtrlShiftF搜索字符串快速定位你想要找的内容G跳转到指定地址或符号CtrlAltEnter在反编译窗口里跟进函数调用S在Listing里搜索字节模式L在Listing里重命名符号这些快捷键用熟了之后鼠标基本就不怎么动了。2.3 交叉引用从一条数据追到所有使用点静态分析最核心的信息就是交叉引用XREF。程序里一个变量、一个字符串、一个函数被谁引用了Ghidra在Listing窗口和反编译窗口里都会显示箭头和标签。比如你在某个函数里看到了一个可疑的字符串http://xxx点进字符串定义位置可以看到所有引用它的代码地址箭头指向哪里就说明谁在哪读取了它。反过来你怀疑某一个函数是关键函数也可以查看它的引用图看谁调用了它、它又调用了谁整个调用网络就展开了。References窗口还可以用图表的形式看到调用关系。选中一个函数按快捷键CtrlShiftR或者右键References - Show References to可以快速搜索所有指向它的地方。对于复杂程序直接看列表效率更高因为图多了容易乱。我一般先看列表筛出可疑引用再针对重点函数打开图来梳理逻辑。理解了交叉引用的价值之后前面提到的很多操作就有了基础。改函数名、修类型、分析调用链其实都是为了让数据流和调用流更容易被追踪。交叉引用是连接起所有这些信息的主干网络。3. 实操跟着我完整逆向一个二进制文件3.1 定位关键逻辑入口点纸上谈兵没有用直接拿一个实际场景走一遍。假设现在拿到一个加密的二进制程序目标是搞清楚它的核心算法和通信逻辑。第一步重新认识它导入Ghidra后先看入口点也就是entry函数。入口点一般不是一个真正的用户逻辑函数而是编译器生成的启动代码它会调用一堆初始化函数最后才跳转到main或者WinMain。在程序树里拿到.text节区的起始位置附近能找到entryGhidra会把入口函数标注成一个特殊符号。直接从入口往里钻很容易迷失更好用的做法是找main符号如果你分析的是没有符号的裸二进制那就改为通过字符串来找线索。在反编译窗口里对入口函数按F键跟进函数一层层往下扫找到入口函数真正调用的用户代码函数簇。一般你会发现它里面调了好几个函数其中一个名字可能是被自动分析识别出的FUN_...但它的代码结构看起来明显有命令行参数处理的逻辑或者有跟外部交互的逻辑那个基本就是主逻辑入口。给这个入口函数改个名比如叫real_main作为后续分析的锚点。从它开始向下梳理是整个过程的第一步。3.2 分析字符串和全局变量的线索指向拿到主入口函数之后下一步就是看它引用了哪些字符串。字符串经常是静态分析里最直接的“告密者”。如果一个程序里有password wrong、login success这种字符串那它的认证逻辑位置很快就能锁定。在Ghidra里按搜索按钮或者直接用CtrlShiftF打开字符串搜索面板输入你想找的关键词。找到对应字符串后点击它看反汇编窗口里的交叉引用可以看到所有引用位置。选定其中一个引用按回车跳到引用它的函数翻到那个函数的反编译窗口就能看到包含该字符串的上下文。串起来看的时候需要注意有些程序会在运行时动态构造字符串或者用固定缓冲区存放拼接内容这时候静态字符串可能只是一部分需要结合对引用函数的分析才能还原完整内容。我之前分析过一个通信加密程序表面上只看到一串固定的格式化串Session-%d顺着引用它的函数往下查才发现在另一个分支里它还读取了一个全局配置结构体真正的会话密钥是从那边来的。全局变量在Ghidra里也有比较清晰的展示。左侧Symbol Tree里找Global Variables点开之后能看到程序里定义的全局数据。点击某个全局变量可以跳到Listing定义位置查看它的交叉引用追踪所有读写它的代码。分析全局变量的访问模式可以很快勾勒出一个模块的状态机、配置类功能或者标志位逻辑。3.3 从反编译代码里提取核心算法逻辑算法逆向是静态分析的重头戏。Ghidra的反编译结果对于标准代码结构识别得比较准确for循环、while循环、if分支、switch语句基本都能还原出来这省掉了大量人工对着汇编数跳转的体力活。不过反编译不是万能的。编译器做过优化之后一些循环会被变换成很复杂的形式比如循环展开、尾递归优化、数据流重塑。遇到这种情况不要停留在伪代码层面硬猜切换到Listing窗口对照汇编看具体指令。我通常会把重点放在这些地方位运算指令and、or、xor、shl、shr加密算法里尤其常见AES的轮密钥加就是xorS盒替换在汇编层面表现为查表查表又对应一堆内存读取指令。看到大量位运算和查表操作可以先往对称加密算法的方向想乘法、除法指令经常是协议转换、解码逻辑的特征对特定地址的反复访问且每次偏移递增极大概率是数组遍历配合循环体就能还原出数组结构有些时候反编译结果里出现大段看起来很奇怪的位运算组合像是对某个中间值做了多次左移右移和异或。别急着去一行行翻译先看这个脏数据最终流向哪里是变成了一个计算结果、一个解密后的缓冲区还是只是参与了一个校验值生成。以数据流为导向去理解算法比逐指令翻译高效得多。我记得有一次需要还原一个自定义的Base64变种编码算法。反编译结果里到处都是索引偏移的计算一开始完全看不懂。后来我先把跟字符映射表相关的引用抓出来追上那张表的数据内容再把解码循环里的索引计算单独抽出来画个流程图才慢慢摸清字母表的变形规律。如果只盯着伪代码硬啃很容易被一堆变量名绕晕。4. 进阶操作结构体、基地址重定位和脚本化分析4.1 手动重建结构体把一维视野变成立体程序内部的对象在二进制层面无非就是连续的几个字节。只要知道偏移量对应的意义就可以把它们定义成结构体。Ghidra里有两个途径做这件事一个是手工定义另一个是根据代码自动推导。手工定义的方式是在Data Type Manager里右键New - Structure然后在结构体编辑界面里挨个添加字段。比如你发现有一个全局对象偏移0的位置是个整数ID偏移4的位置是个指向字符串的指针偏移8的位置又是个4字节的状态码那就可以定义一个结构体把三个字段名和类型都填进去。定义完成后回到反编译窗口右键那个全局对象变量重设类型为指向这个结构体的指针反编译结果里就变成obj-id、obj-name、obj-status这种形式了。更快捷的方法是使用结构体自动分析功能。在反编译窗口里选中一个变量右键可以直接弹出来一个菜单Auto Create Structure会根据对该变量的所有访问模式反向推导可能的字段布局。这个方法非常适合那种反复用偏移量访问某块数据的情况。不过自动分析生成的字段通常是匿名的你还需要根据上下文逐个重命名、改类型。自动推导能准确定位字段分割点手工重命名和类型矫正负责赋予语义两者配合相当高效。做完结构体定义后如果代码里对这个对象还有其他引用点Ghidra会自动把所有引用点的反编译结果同步更新。这种一次定义、多处生效的体验很省心项目里的信息也会越来越整洁。4.2 基地址重定位与DLL分析的关联逻辑分析DLL或者带加载偏移的动态库文件时有一个容易忽略的问题静态分析时的地址跟程序实际运行时的地址不一致。PE文件有一个默认的ImageBase大多数DLL的默认基址是0x10000000程序加载时可能被加载到完全不同的位置。如果不调整基地址分析交叉引用时就容易搞混明明觉得某个全局变量的地址有问题但又说不清为什么。Ghidra里做基地址重定位非常简单。打开Window - Memory Map里面列出了所有内存块及其起始地址。在内存映射视图里选中所有区块右键选择Set Base Address或者直接拖动修改起始地址Ghidra会全局更新所有地址、引用、符号信息整个项目的坐标系就对齐了。这里我一般直接在导入的时候就设置好基址免得后面手动改。File - Options - Program里有一个重新设置基址的功能可以在分析前把ImageBase调整成实际期望值。分析完DLL之后再动态加载对照看到的数据和交叉引用就会有锚定感不容易出现“明明在静态和动态下看到的函数都差不多但地址对不上”的困惑。很多加壳程序也会有类似的问题它们会先解密出一段原始代码放在某块内存里再去执行。静态分析时你看到的地址是虚拟地址动态调试时看到的可能不一样遇到这种情况先确认是不是基址或节区问题。排查完这两个因素剩下的基本就是壳的混淆逻辑了。4.3 用Python脚本做批量标注和补丁操作Ghidra脚本引擎是让人离不开它的重要原因。不需要重复手工操作的批量任务脚本两三分钟就能解决。最简单的例子是批量重命名函数。构造一段规则脚本对当前程序里所有FUN_*形式的函数名根据它的调用深度或指令特征自动命名。脚本用到的是Ghidra的Python API核心操作是这样一段代码from ghidra.program.model.symbol import SourceType fm currentProgram.getFunctionManager() funcs fm.getFunctions(True) count 0 for func in funcs: if func.getName().startswith(FUN_): # 把首字母大写加上模块标识 new_name sub_ func.getEntryPoint().toString() func.setName(new_name, SourceType.USER_DEFINED) count 1 print(renamed %d functions % count)在Ghidra的Window - Script Manager里打开脚本管理器把上面的代码存成.py文件放在脚本目录里点运行就能批量处理。脚本里还可以加更复杂的逻辑比如根据call的次数排序、检测特定指令序列、批量提取所有字符串并用引用的方式注释到代码里。打补丁也是脚本的常见用途。Ghidra本身有一个补丁工具Window - Byte Viewer可以编辑二进制字节但涉及到批量修改时脚本更方便。比如要把程序里所有call某个函数的指令都改成nop脚本可以遍历所有指令检查指令助记符和操作数如果匹配就直接用内存对象覆盖字节。用脚本做自动化时有个要点Ghidra的脚本API版本之间有差异旧脚本拿到新版本里可能因为类名、方法名变动而报错。我通常的做法是先看看$GHIDRA_HOME/docs/GhidraAPI_javadoc.zip里的接口定义或者直接参考Extensions下自带的示例脚本照着它们的写法改踩坑概率会小很多。5. 实际分析过程中常踩的坑和排查思路5.1 分析时间长到离谱怎么缩小范围有的程序导入后自动分析能跑很久很久几小时都结束不了。这种场景多见于加壳程序、虚拟机保护的程序、或者大量使用间接跳转的混淆代码。Ghidra面对大量无法解析的间接分支时会反复尝试跟随所有可能的路径复杂度飞涨。解决办法之一是调低分析选项导入文件时在Analysis Options里取消掉Decompiler Parameter ID、Aggressive Instruction Finder这类耗时项目只开最基础的Disassemble、Data Reference、Stack。这样分析完的初始代码可能不够精致但能保证先跑出一个骨架来。另一个办法是只分析指定节区。在导入的时候可以选择只分析.text节区忽略.data、.rsrc这些通常没有代码逻辑的区块。遇到恶意代码常见的加壳节区比如名为UPX0、UPX1的节区或者自定义名节的节区正常情况下不该直接去分析它们先跳过等脱壳后重导或者手动指定分析范围会更好。另外还要提一个很反直觉的点Ghidra在分析一些高度混淆的代码时会生成海量假函数导致你浏览Listing时看到一堆无用地址被标成函数。不要浪费时间逐个清理用脚本遍历函数列表把那些过短的、没有合法调用引用的、入口点不是标准函数开头的函数直接删掉减少干扰。5.2 反编译结果看着像是错的怎么验证反编译器输出的C伪代码不是百分之百正确的。有时候它会把一条指令理解错或者某个间接跳转解析失败导致后续一大片的代码都跟着乱。遇到这种情况我的建议是不要信伪代码回到反汇编视角重新读。具体做法是在反编译窗口里确保自己选中了可疑代码对应的汇编地址跳到Listing窗口看那几条指令的助记符和操作数手动推理一下执行效果。只要汇编没错就能确认到底是反编译翻译错了还是输入数据本身不合法。有些情况是Ghidra以为某个数是立即数实际却是内存地址这时右键数据框里调整为Pointer类型反编译输出就会马上变化。间接调用也是常见翻车点。函数指针调用在反编译窗口里可能显示成(*(code *))(...)这种奇怪的匿名调用。解析这类调用的方法是先找那变量在哪赋值从数据流推断指针指向哪个函数然后手动把这个地址标记成函数并把函数签名设置好。设置完成后反编译结果里的匿名调用就会变成对具体函数名的调用后续分析顺畅不少。我遇到过反编译结果里出现两个地址差一个字节的函数体看起来像是在同一个代码空间里错位了。后来确认是Ghidra的分析开关里漏掉了Enum和Data的分析选项导致某些对齐数据被误解读成指令。把分析选项补上重新分析一遍代码布局就正常了。这种问题在分析冷门格式时尤其常见解决思路就是先重跑分析再排查选项。5.3 遇到混淆代码或者壳静态分析还能做什么很多软件为了保护代码逻辑会加壳或者在其中插入激进的混淆指令。这种情况下静态分析的第一步不是直接反编译而是识别混淆特征。常见特征包括入口点处有大量无意义的push/pop堆栈平衡指令、大量jmp但目标地址一样的垃圾块、call之后紧跟不相关的计算指令、利用异常处理流程来跳转等。遇到明显的壳最佳策略是别硬抗先考虑动态配合。在受控环境里动态运行抓取脱壳后的内存镜像再把这个脱壳镜像导入Ghidra分析。这一点在文章前面提过静态分析负责深度理解动态分析负责解决“运行后才能看到”的那部分问题。如果是面对的是局部混淆比如加密代码块执行前先解密自身静态分析则需要在未解密的区块上跳过伪代码解读。可以先把这块区域标记成数据而不是代码然后搜索解密器代码通过分析解密器的逻辑来推断解密后的布局。有些插件可以模拟解密过程直接patch你的分析结果。Ghidra的Emulator扩展也可以派上用场它能对部分函数的执行过程做模拟。比如你可以设置好输入初始状态单步模拟一段代码观察寄存器和内存变化这样即使静态手算很费劲模拟器也能帮你跑完一小段逻辑。不过模拟器对缺失的系统调用处理有限这是它的局限但用来分析纯算法代码段是完全够用的。5.4 常见问题速查表把我在多个项目里遇到的高频问题整理成一个速查表方便对照排查现象可能原因解决思路启动崩溃或闪退Java版本不匹配检查Java版本更新到Ghidra要求的大版本自动分析卡死开启了过多分析项样本过大取消部分耗时分析项或只分析指定节区反编译结果不显示函数没有被识别出来手动在入口位置按F创建函数或检查代码起始是否被误判伪代码里全是偏移量结构体未定义或者类型不对创建结构体并绑定到变量类型交叉引用找不到数据被编码、字符串被拼接结合运行时的数据流分析或者使用脚本搜索引用模式地址跟动态调式对不上基地址重定位问题对齐内存映射里的基地址脚本执行报错API版本不一致参考当前版本的示例脚本别直接抄旧脚本这些坑都是我实际碰过的分享出来主要是想让大家少走弯路。每一个问题背后都有一个“为什么”在理解了原因再遇到就不会慌了。6. 静态分析的锦上添花让结果更可读的细节习惯6.1 善用书签和注释来维护分析进度分析一个大型样本少则几小时多则好几天。中间断掉再回来如果没有任何标记光靠记忆梳理进度是很痛苦的。Ghidra提供Bookmark功能可以在任意地址打上书签并附上说明文字。我会在关键算法入口、加解密分支点、可疑API调用附近都打上书签标签内容直接用自然语言描述比如“疑似AES密钥初始化”“这里检查证书有效期”“后续需要验证条件跳转”。注释同样重要。Listing窗口里按分号;可以添加注释注释内容会直接显示在反汇编代码行旁边。Ghidra支持前置注释、后置注释和EOL注释灵活使用可以让代码阅读体验追上带源码的工程。我最常用的是在看似晦涩的指令旁边写上“为什么这么写”比如某条指令的作用是清空标志位还是翻转某个字节写清楚之后后面回看会非常高效。6.2 基于项目的数据交换与团队协作Ghidra的协作功能在多人分析一个样本的时候很香。团队成员可以把分析进度同步到共享服务器每个人修改的标签、注释、结构体都能合并到同一个项目里这样就不会出现“我改的和你改的不一样”的尴尬。说一个实际经历有次分析一个复杂的驱动文件我和一个同事分工一人跟数据流一人跟控制流。通过Ghidra共享项目功能我们两个的标注实时同步分析完成后数据直接合并省掉了最后仲裁的功夫。如果你做安全分析经常跟团队配合建议把这个协作功能用起来。自己一个人分析也可以开一个本地服务器模式至少能保证数据可迁移不会因为换机器丢状态。6.3 导入导出分析报告分析做完之后把成果导出成报告是有价值的一步。Ghidra支持通过脚本导出标注过的注释和函数信息也可以把反编译结果直接复制出来放到笔记里归档。比较常用的做法是利用脚本把分析结果整理成JSON或者文本摘要这样数据可以自动进入你惯用的知识库。导出一个简单的函数列表和标注信息代码大致是这样写的out [] fm currentProgram.getFunctionManager() for func in fm.getFunctions(True): entry func.getEntryPoint() comment func.getComment() out.append({ name: func.getName(), addr: str(entry), comment: comment, body_size: func.getBody().getNumAddresses() }) print(out)改一改输出格式就能变成你笔记软件能导入的格式。分析过程本来就是讲故事的过程写下来既是整理也是备忘。7. 我对Ghidra做静态分析的真实使用感受用Ghidra做静态分析的时间越久越感觉到它最值钱的地方其实不是反编译器本身而是整个项目模型的完整性和可扩展性。反汇编、字符串、引用、结构体、脚本、协作这些能力被整合在同一个生态里分析时不需要反复切工具这边标注的结构体那边马上生效加了一行注释后面引用它的伪代码也跟着变清晰。这种反馈让分析过程很有“上手即用”的感觉。我给新接触的人一个建议不要在第一次打开软件时就想着要把所有功能都学一遍。先从最简单的流程做起——导入一个文件跑分析看反编译结果改几个函数名补一个结构体把交叉引用串起来。等你觉得这套流程不够用了再一点点扩展到脚本和插件那种进步曲线是最舒服的。最后再分享一个小技巧分析完一个程序之后别急着关项目。在Ghidra里用File - Export导出一次带注释的程序文件或者脚本快照把你的分析成果存下来。下次遇到类似结构的程序直接对比着看恢复上下文会快很多。好记性不如烂笔头分析笔记也是这么攒下来的。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑