符号恢复的练习路径
命名要立刻回填到调用图里,否则第二天就忘了当初为什么叫这个名字
练逆向最怕「看了很多,一个都没做完」。
先说结论
练习要有终点,否则只是浏览。
- 目标:能说清结构
- 下一步:定位功能
- 再下一步:改行为
- 最后:写脚本
- 验证:错误信息与日志格式串经常直接暴露函数用途,是最便宜的信息来源,前提是没被裁掉
把目标拆小
每个练习都要有明确终点:
函数序言与控制流图形状,比字符串更可靠地指示编译器类型与优化级别,字符串反而容易被混淆。
- 第一个:能说清一个程序的结构
- 第二个:能定位一个具体功能的位置
- 第三个:能改一处行为并验证
- 第四个:能写脚本自动化前三个
怎么验证
错误信息与日志格式串经常直接暴露函数用途,是最便宜的信息来源,前提是没被裁掉。
没有验证的练习,等于看视频。
几个具体练法
下面这些是相对确定的细节:
- C++ 的 RTTI 与虚表结构能还原类层次关系,前提是编译时没有关掉 RTTI

卡住时怎么办
看到一个像 md5 的常量就把函数命名成 md5_update。
卡住超过两天就换一个更小的目标,别硬耗。
一句实话
符号恢复的目标是「读得下去」,不是「还原成源码」。
能复现的进度才是进度。
还有几处容易忽略的
这些细节不影响入门,但影响你判断的准确度。
- 识别出库函数能消掉六成以上的符号,剩下的才是需要人读的业务逻辑,值得逐行看
- 错误的命名比没有命名更糟,它会让后来的人顺着错误假设一直读下去,不确定就标成 func_sub_xxx
- 看到一个像 md5 的常量就把函数命名成 md5_update
- 只在大函数上花时间,忽略了小工具函数
- 改完名字不写备注,交接时全部推倒重来
逆向是手艺,只能靠做完来学。
评论 (3)
日志留存时间那条被我们领导采纳了。
防御那节写得克制,没有教人打站,这点好评。
审计检查点可以直接做成 checklist。
发表评论