Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save yvbbrjdr/9379ebf3bb83351755fae0f176fa595b to your computer and use it in GitHub Desktop.
Save yvbbrjdr/9379ebf3bb83351755fae0f176fa595b to your computer and use it in GitHub Desktop.

今天我加入了 ReSwitched TeamDiscord 服务器,想及时地捞点 Nintendo Switch 破解的信息,因为我也很想给这个平台写点 Homebrew 什么的。

翻看他们历史记录的时候,我发现了一个很棒的列表,做完这些就能成为一个“全栈逆向工程师”。很感兴趣,于是翻译到这里来。感觉项目还是相当多,内容还是相当复杂的,当然信息量也是很大的。转载时请注明译者来源,本文以 CC BY-NC-SA 4.0 协议开源。

下面是翻译:


好的,那么这是我推荐的成为一个“全栈逆向工程师”(我自己造的词,但是我很喜欢)的列表。这个列表不是为了把你变成一个厉害的桌面应用逆向工程师、主机逆向工程师,或是内核逆向工程师,而是让你把这些部分都了解一点,以便你可以在任何一个部分深入进去。

  1. 阅读:Eldad Eilam 写的《Reversing:逆向工程揭密》;
  2. (如果你已经精通汇编语言可以跳过这一项)
    • 实践:写一些 C 语言的代码,编译再反汇编(译者注:反汇编很重要,不要直接编译成汇编,因为这样会丢失一些优化),然后手动反编译回 C 语言;
    • 实践:让你的朋友写一些 C 语言的代码,编译再反汇编,然后给你来手动反编译回 C 语言;
  3. 实践:选一个游戏。把它的档案格式逆向出来,并写一个解包器;
  4. 实践:把一个游戏的三维模型格式逆向出来;
  5. 阅读:Aho 等人写的《Compilers》;
  6. 实践:给某个高级语言(可以自己造一个)写一个编译到另一个高级语言(推荐:JavaScript, Python, Ruby)的编译器;
  7. 实践:写一个汇编器;
  8. 实践:写一个从某个语言到汇编语言的编译器;
  9. 阅读:Cifuentes 写的《逆向编译技术》;
  10. 实践:给 CIL 和/或 Dalvik 字节码写一个反编译器;
  11. 实践:给 ARM(不一定必须是 ARM,但 ARM 比较统一、正常)写一个反编译器;
  12. 阅读:OSDev 的维基页面,直到你的视线模糊;
  13. 实践:随意写一个内核;
  14. (关于刚写的那个内核)
    • 实践:把它再写一遍,让它不要那么糟糕;
    • 实践:把你的内核移植到另一个平台上;
  15. 实践:选一个大众的平台写一个解释型模拟器;
    • 实践:写一个重编译器;
  16. 实践:选一个稍微小众的平台;
    • 阅读:你所能找到的关于这个平台的任何资料;
    • 实践:开始写一个模拟器;
    • 阅读:任何你不懂的这个平台的汇编代码;
    • 回到上上步继续写你的模拟器。

你会发现大部分的项目与逆向工程并没有一点关系,这是因为逆向工程基本上与真正读代码一点关系也没有,而在于理解系统以及各个抽象层是如何叠在一起的。


翻译完之后,回视一笑,估计一生都做不完这些吧。默默地膜一下做逆向的 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment