第一课:程序到底是什么
对应原书第 1 章《逆向工程是什么》
午后的钟表铺,蝉鸣震天。小林蹲在柜台后面,面前摆着一台老式收音机——不,是收音机里的一个"小方块",陈师傅说那叫"芯片"。
"师傅,你说程序是'跑在机器里的话',可我怎么看它都是一堆小点点啊。"
陈师傅放下手里的螺丝刀,从抽屉里摸出一只怀表,"啪"地打开后盖。
"你看这只表。"
小林凑过去。表里齿轮咬齿轮,密密麻麻,中间的轴心在阳光里闪闪发光。
"这只表里有几百个零件,"陈师傅说,"它们自己不知道自己是什么。是'设计它的人'让这些齿轮咬在一起,才让指针能走。程序也一样——一堆数字、一堆指令,本身什么都不是。但设计的人把它们排好顺序,机器就会'听话'。"
"所以……程序是'给机器写的说明书'?"
"差不多。但有个关键区别——"陈师傅竖起一根手指,"说明书谁都能看。可大多数程序的说明书是加密的,或者说,它不会告诉你它想干什么。它只告诉你:'别乱动,我是正经程序'。"
小林眨了眨眼:"那我们逆向工程,就是……把说明书偷出来?"
陈师傅笑了:"不。是'把齿轮一个个拆下来,重新画一张说明书'。这叫——'看穿它'。"
课程正文
逆向工程(英文 Reverse Engineering,简称 RE),说白了就一句话:
看一个成品,想明白它是怎么做出来的。
钟表店修表,是看齿轮怎么咬合;逆向工程师分析程序,是看代码怎么运转。
程序由什么组成(用钟表打比方)
| 钟表的零件 | 程序的零件 | 说明 |
|---|---|---|
| 齿轮 | 指令(汇编指令) | 最小的动作单位 |
| 发条 | 控制流 | 谁先动、谁后动 |
| 指针和表盘 | 输出(字符串/界面) | 你看到的东西 |
| 机芯里的暗格 | 数据和常量 | 藏着的秘密(密码、key) |
| 调时间的旋钮 | 输入 | 你能操作的部分 |
一句话记住:程序就是'一串齿轮咬合',逆向就是把咬合关系画出来。
逆向工程师天天面对什么问题
问题 1: 这个程序认不认我给的密码?(→ 找它的"比较")
问题 2: 它把密码藏哪儿了?(→ 找它的"数据")
问题 3: 它怎么加密的?(→ 找它的"算法")
问题 4: 它凭什么判定我有没有资格?(→ 找它的"判断")
陈师傅的修理口诀是:程序只会做两件事——比较,和跳转。 它判断一切,都是"比一比,然后决定往哪走"。
第一个技能:让程序自己说话
打开电脑(这是本书唯一必须动手的环节),准备一个"练习程序"——比如你编译一个问"密码是多少"的小程序。
# 第一步:看看它是什么
file 程序
# 第二步:让它把肚子里的话"说"出来
strings 程序 | grep -iE "密码|key|flag|secret|password"
陈师傅说:"先听它说话,再拆它骨头。" 很多程序的秘密,就大大咧咧写在字符串里,等着你去看。
陈师傅的三条铁律
1. 先看,再猜,最后动手 (侦察优先)
2. 一条路不通,就换一条路 (静态不行上动态)
3. 拆坏了不丢人,不想清楚才丢人 (动手前先想)
本课口诀
程序只会比较和跳转。先让它说话,再拆它骨头。
动手做
- 写一个 C 程序,里面放一句"秘密提示语",编译后运行
strings找出来。 - 用
file命令看一个你电脑上的 exe/程序,看它是什么"类型"。 - 想一想:如果一只钟表"防着人拆",它会在哪里动手脚?(答案在下一课揭晓)
想学更深的
见原书 第 1 章《逆向工程是什么》——那里有完整的工具清单和流程。