逆向工程实战手册 第 1 课

第一课:程序到底是什么

对应原书第 1 章《逆向工程是什么》


午后的钟表铺,蝉鸣震天。小林蹲在柜台后面,面前摆着一台老式收音机——不,是收音机里的一个"小方块",陈师傅说那叫"芯片"。

"师傅,你说程序是'跑在机器里的话',可我怎么看它都是一堆小点点啊。"

陈师傅放下手里的螺丝刀,从抽屉里摸出一只怀表,"啪"地打开后盖。

"你看这只表。"

小林凑过去。表里齿轮咬齿轮,密密麻麻,中间的轴心在阳光里闪闪发光。

"这只表里有几百个零件,"陈师傅说,"它们自己不知道自己是什么。是'设计它的人'让这些齿轮咬在一起,才让指针能走。程序也一样——一堆数字、一堆指令,本身什么都不是。但设计的人把它们排好顺序,机器就会'听话'。"

"所以……程序是'给机器写的说明书'?"

"差不多。但有个关键区别——"陈师傅竖起一根手指,"说明书谁都能看。可大多数程序的说明书是加密的,或者说,它不会告诉你它想干什么。它只告诉你:'别乱动,我是正经程序'。"

小林眨了眨眼:"那我们逆向工程,就是……把说明书偷出来?"

陈师傅笑了:"不。是'把齿轮一个个拆下来,重新画一张说明书'。这叫——'看穿它'。"


课程正文

逆向工程(英文 Reverse Engineering,简称 RE),说白了就一句话:

看一个成品,想明白它是怎么做出来的。

钟表店修表,是看齿轮怎么咬合;逆向工程师分析程序,是看代码怎么运转。

程序由什么组成(用钟表打比方)

钟表的零件 程序的零件 说明
齿轮 指令(汇编指令) 最小的动作单位
发条 控制流 谁先动、谁后动
指针和表盘 输出(字符串/界面) 你看到的东西
机芯里的暗格 数据和常量 藏着的秘密(密码、key)
调时间的旋钮 输入 你能操作的部分

一句话记住:程序就是'一串齿轮咬合',逆向就是把咬合关系画出来。

逆向工程师天天面对什么问题

问题 1: 这个程序认不认我给的密码?(→ 找它的"比较")
问题 2: 它把密码藏哪儿了?(→ 找它的"数据")
问题 3: 它怎么加密的?(→ 找它的"算法")
问题 4: 它凭什么判定我有没有资格?(→ 找它的"判断")

陈师傅的修理口诀是:程序只会做两件事——比较,和跳转。 它判断一切,都是"比一比,然后决定往哪走"。

第一个技能:让程序自己说话

打开电脑(这是本书唯一必须动手的环节),准备一个"练习程序"——比如你编译一个问"密码是多少"的小程序。

# 第一步:看看它是什么
file 程序

# 第二步:让它把肚子里的话"说"出来
strings 程序 | grep -iE "密码|key|flag|secret|password"

陈师傅说:"先听它说话,再拆它骨头。" 很多程序的秘密,就大大咧咧写在字符串里,等着你去看。

陈师傅的三条铁律

1. 先看,再猜,最后动手        (侦察优先)
2. 一条路不通,就换一条路       (静态不行上动态)
3. 拆坏了不丢人,不想清楚才丢人 (动手前先想)

本课口诀

程序只会比较和跳转。先让它说话,再拆它骨头。

动手做

  1. 写一个 C 程序,里面放一句"秘密提示语",编译后运行 strings 找出来。
  2. file 命令看一个你电脑上的 exe/程序,看它是什么"类型"。
  3. 想一想:如果一只钟表"防着人拆",它会在哪里动手脚?(答案在下一课揭晓)

想学更深的

见原书 第 1 章《逆向工程是什么》——那里有完整的工具清单和流程。