0Pricing
Cyber Security Academy · 课时

逆向分析者必备的 x86/x64 汇编

阅读 MOV、CMP、JNE、CALL 和 RET,并跟踪数据在寄存器与栈中的流动。

逆向分析者必备的 x86/x64 汇编 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。

逆向分析为什么需要汇编?

Ghidra 的反编译器很有帮助,但并不完美 — 它会遗漏某些结构、错误推断类型,也无法反编译经过混淆的代码。直接阅读汇编可以获得最真实的结果。逆向分析人员需要能够阅读汇编,而不是编写汇编。

寄存器

x86-64 的关键寄存器:

  • RAX — 累加器,保存返回值
  • RBX、RCX、RDX — 通用寄存器
  • RSI、RDI — 源/目标索引,函数的第一个/第二个参数
  • RSP — 栈指针
  • RBP — 基址指针(栈帧)
  • RIP — 指令指针

函数调用约定(x64 Linux)

参数通过寄存器传递(System V AMD64 ABI):

  1. RDI
  2. RSI
  3. RDX
  4. RCX
  5. R8
  6. R9

返回值存放在 RAX 中。其他参数压入栈中。

基本指令

需要识别的核心指令:

mov rax, rbx    ; copy rbx to rax
push rax        ; push rax onto stack
pop rbx         ; pop top of stack into rbx
add rax, 8      ; rax = rax + 8
sub rsp, 0x20   ; allocate 32 bytes on stack
call 0x401234   ; call function at address
ret             ; return to caller
lea rax, [rbp-0x10] ; load address of local var

条件跳转

比较与分支:

cmp rax, 0      ; set flags based on rax - 0
test rax, rax   ; test rax & rax (check if zero)
jz  0x401234    ; jump if zero
jnz 0x401234    ; jump if not zero
jl  0x401234    ; jump if less (signed)
jge 0x401234    ; jump if >= (signed)
je  0x401234    ; jump if equal

阅读简单函数

识别常见模式:

; if (x == 0) return 1;
mov eax, [rbp-4]    ; load x
test eax, eax       ; x == 0?
jnz .notZero        ; if not zero, skip
mov eax, 1          ; return value = 1
ret
.notZero:
...

识别字符串操作

常见的字符串/内存操作:

; memcpy(dest, src, n):
; rdi=dest, rsi=src, rdx=n
rep movsb           ; copy RCX bytes from RSI to RDI

; strlen-like loop:
.loop:
  cmp byte [rsi], 0 ; check for null terminator
  je  .done
  inc rsi
  jmp .loop

栈帧建立与拆除

每个函数都以以下操作开始和结束:

; Prologue:
push rbp            ; save caller frame
mov  rbp, rsp       ; set up new frame
sub  rsp, 0x30      ; allocate local vars

; Epilogue:
leave               ; mov rsp, rbp; pop rbp
ret

识别循环

反汇编中的循环:

  • 向后跳转(跳转到较低地址)表示循环
  • 寄存器中的计数器通过 dec/sub 递减
  • loop 指令递减 RCX,并在其不为零时跳转

阅读 switch 语句

Switch 语句通常会编译为跳转表:

; Jump table pattern:
cmp eax, 5          ; check if case > max
ja  .default        ; jump to default
lea rcx, [jump_table]
mov rax, [rcx + rax*8]  ; index into table
jmp rax              ; jump to case handler

SIMD 与加密常量

查找可以标识算法的数值常量:

  • AES S 盒:前几个字节为 63 7C 77 7B...
  • SHA-256 初始哈希值:0x6a09e667, 0xbb67ae85...
  • MD5:0xd76aa478

识别这些常量后,就能立即确定相应的加密函数。

快速检查:x64 汇编

在 x86-64 System V ABI 中,函数调用的第一个参数存放在哪个寄存器中?

课程回顾

x86-64 逆向分析需要了解关键寄存器(RAX、RDI、RSI、RSP、RIP)、函数调用约定(参数位于 RDI/RSI/RDX……)以及常见模式(序言、循环、比较和跳转表)。您不需要编写汇编,只需阅读汇编即可。代码中的加密常量无需运行二进制文件就能帮助识别算法。

常见问题解答

「逆向分析者必备的 x86/x64 汇编」课时是免费的吗?

是的 — 「逆向分析者必备的 x86/x64 汇编」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。

「逆向分析者必备的 x86/x64 汇编」这节课中我会学到什么?

阅读 MOV、CMP、JNE、CALL 和 RET,并跟踪数据在寄存器与栈中的流动。 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Cyber Security Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「逆向分析者必备的 x86/x64 汇编」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Cyber Security Academy 课中编写并运行代码吗?

能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Ghidra:浏览与注释二进制程序
  2. 逆向分析者必备的 x86/x64 汇编
  3. 使用 GDB 与 pwndbg 进行动态分析
  4. 去混淆与反分析技巧
← 返回 Cyber Security Academy