逆向分析者必备的 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):
- RDI
- RSI
- RDX
- RCX
- R8
- 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 handlerSIMD 与加密常量
查找可以标识算法的数值常量:
- 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 反馈 — 无需本地设置。
此课程中的所有课时
- Ghidra:浏览与注释二进制程序
- 逆向分析者必备的 x86/x64 汇编
- 使用 GDB 与 pwndbg 进行动态分析
- 去混淆与反分析技巧