今天我加入了 ReSwitched Team 的 Discord 服务器,想及时地捞点 Nintendo Switch 破解的信息,因为我也很想给这个平台写点 Homebrew 什么的。
翻看他们历史记录的时候,我发现了一个很棒的列表,做完这些就能成为一个“全栈逆向工程师”。很感兴趣,于是翻译到这里来。感觉项目还是相当多,内容还是相当复杂的,当然信息量也是很大的。转载时请注明译者与来源,本文以 CC BY-NC-SA 4.0 协议开源。
下面是翻译:
好的,那么这是我推荐的成为一个“全栈逆向工程师”(我自己造的词,但是我很喜欢)的列表。这个列表不是为了把你变成一个厉害的桌面应用逆向工程师、主机逆向工程师,或是内核逆向工程师,而是让你把这些部分都了解一点,以便你可以在任何一个部分深入进去。
- 阅读:Eldad Eilam 写的《Reversing:逆向工程揭密》;
- (如果你已经精通汇编语言可以跳过这一项)
- 实践:写一些 C 语言的代码,编译再反汇编(译者注:反汇编很重要,不要直接编译成汇编,因为这样会丢失一些优化),然后手动反编译回 C 语言;
- 实践:让你的朋友写一些 C 语言的代码,编译再反汇编,然后给你来手动反编译回 C 语言;
- 实践:选一个游戏。把它的档案格式逆向出来,并写一个解包器;
- 实践:把一个游戏的三维模型格式逆向出来;
- 阅读:Aho 等人写的《Compilers》;
- 实践:给某个高级语言(可以自己造一个)写一个编译到另一个高级语言(推荐:JavaScript, Python, Ruby)的编译器;
- 实践:写一个汇编器;
- 实践:写一个从某个语言到汇编语言的编译器;
- 阅读:Cifuentes 写的《逆向编译技术》;
- 实践:给 CIL 和/或 Dalvik 字节码写一个反编译器;
- 实践:给 ARM(不一定必须是 ARM,但 ARM 比较统一、正常)写一个反编译器;
- 阅读:OSDev 的维基页面,直到你的视线模糊;
- 实践:随意写一个内核;
- (关于刚写的那个内核)
- 实践:把它再写一遍,让它不要那么糟糕;
- 实践:把你的内核移植到另一个平台上;
- 实践:选一个大众的平台写一个解释型模拟器;
- 实践:写一个重编译器;
- 实践:选一个稍微小众的平台;
- 阅读:你所能找到的关于这个平台的任何资料;
- 实践:开始写一个模拟器;
- 阅读:任何你不懂的这个平台的汇编代码;
- 回到上上步继续写你的模拟器。
你会发现大部分的项目与逆向工程并没有一点关系,这是因为逆向工程基本上与真正读代码一点关系也没有,而在于理解系统以及各个抽象层是如何叠在一起的。
翻译完之后,回视一笑,估计一生都做不完这些吧。默默地膜一下做逆向的 dalao 们。
下面是原文:
okay, so this is my recommended list to become a "full-stack reverse-engineer" (a term that i believe i just completely made up, but i'm rolling with it). this is not intended to make you a competent desktop app reverse-engineer, or a competent console reverse-engineer, or a competent kernel reverse-engineer. rather, it's intended to give you enough exposure to each of those parts, so that you can dive in and work on anything.
1) Read: Reversing by Eldad Eilam
2) Skip if you already know assembly
2a) Do: Write some C, compile it, disassemble, hand-decompile to C
2b) Do: Have a friend write and compile some C, then disassemble and hand-decompile it and have friend check your work
3) Do: Pick a game. Reverse-engineer its archive format and write an unpacker
4) Do: Reverse-engineer the 3d model format for a game
5) Read: The Dragon Book (Compilers by Aho et al)
6) Do: Write a compiler from some high-level language (feel free to make one up) to another (good candidates: JavaScript, Python, Ruby)
7) Do: Write an assembler
8) Do: Write a compiler from some language down to assembly
9) Read: Reverse Compilation Techniques by Cifuentes
10) Do: Write a decompiler for CIL and/or Dalvik bytecode
11) Do: Write a decompiler for ARM (doesn't have to be ARM, but it's consistent and relatively sane)
12) Read: The osdev wiki, until your eyes can't focus anymore
13) Do: Write a toy kernel
14a) Do: Write it again, with slightly less suck
14b) Do: Port your kernel to a different platform
15) Do: Pick a well-known platform and write an interpreting emulator
15a) Do: Add a recompiler
16) Do: Pick a slightly-unknown platform
16a) Read: Everything you can find about it
16b) Do: Begin writing an emulator
16c) Read: All the assembly you can find, for bits that aren't known
16d) Go back to 16b, continuing your work
you'll notice that the majority of the list isn't actually reverse-engineering at all. because reversing has almost nothing to do with actually reading code, but with understanding systems and how the layers of abstraction stack.