ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

二进制逆向分析基础:x86-64 与 ARM 指令模式、调用约定及函数序言尾声全解(agents24 reverse-engineering 插件实践指南)

二进制逆向分析基础:x86-64 与 ARM 指令模式、调用约定及函数序言尾声全解(agents24 reverse-engineering 插件实践指南) 二进制逆向分析基础x86-64 与 ARM 指令模式、调用约定及函数序言尾声全解agents24 reverse-engineering 插件实践指南【免费下载链接】agentsMulti-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity项目地址: https://gitcode.com/GitHub_Trending/agents24/agents本篇技术指南以 agents24 仓库中reverse-engineering插件的binary-analysis-patterns技能为核心系统讲解反汇编中最基础也最关键的一环Disassembly Fundamentals反汇编基础。你将掌握 x86-64 与 ARM 两大架构下的函数序言/尾声识别、System V AMD64 与 Microsoft x64 调用约定、ARM64/ARM32 寄存器分配规则并进一步学会通过控制流、数据结构与常见代码模式快速重构程序逻辑具备在 Ghidra、IDA Pro、Binary Ninja 等工具中开展静态分析的实战能力。一、技能背景为什么反汇编基础如此重要binary-analysis-patterns是 agents24 仓库reverse-engineering插件见 docs/plugins.md 中 Security 分类提供的四大技能之一官方定位是Master binary analysis patterns including disassembly, decompilation, control flow analysis, and code pattern recognition——即面向已编译二进制的静态分析模式库包括反汇编、反编译、控制流分析和代码模式识别适用于分析未知可执行文件、恶意软件/混淆二进制、识别编译器引入的模式栈保护 canary、PIC trampoline等场景。值得注意的是本技能采用三层渐进式披露结构progressive disclosure详见 docs/agent-skills.mdMetadataYAML frontmatter技能名与激活条件始终加载InstructionsSKILL.md 主体核心指导与模式激活时加载Resourcesreferences/details.md按需加载的详细资源。根据 docs/harnesses.md 的记录Claude Code 对技能正文没有硬性上限而Codex 有 8 KB 的 skill body 硬上限超过该上限的技能在 Codex 加载时会被截断Skill body 8 KB → split into references/details.md。因此本技能原本位于 SKILL.md 中的约 2047 字节的「Disassembly Fundamentals」详细章节被迁移至references/details.md从而保证跨 harness 的可移植性——这正是本文档的由来。本文将完整继承该章节的全部内容并结合同技能的其余章节控制流、数据结构、常见代码模式、反编译模式、Ghidra/IDA 技巧与最佳实践做纵深扩充。二、函数序言与尾声Function Prologue/Epilogue函数序言是函数入口处为建立栈帧而执行的一小段指令尾声则是函数返回前恢复栈帧的指令。识别序言/尾声是定位函数边界、理解调用关系的第一步。标准序言Standard Prologue; Standard prologue push rbp ; Save base pointer mov rbp, rsp ; Set up stack frame sub rsp, 0x20 ; Allocate local variablespush rbp将调用者的基址指针压栈保存为当前函数建立独立的栈帧链mov rbp, rsp将栈指针赋给rbp此后所有局部变量和参数都可通过[rbp offset]或[rbp - offset]访问与栈指针的移动无关sub rsp, 0x20向下开辟 32 字节0x20局部变量空间。注意 x86-64 下 ABI 要求栈在call指令边界保持 16 字节对齐分配空间时需考虑对齐。叶函数Leaf Function; Leaf function (no calls) ; May skip frame pointer setup sub rsp, 0x18 ; Just allocate locals叶函数指不再调用其他函数的函数。由于无需在栈帧间穿梭编译器常省略帧指针frame pointer设置直接通过sub rsp分配局部空间。从源码结构看-O2及以上优化级别下非叶函数也可能因「omit frame pointer」优化而省略rbp此时局部变量将基于rsp寻址。标准尾声Standard Epilogue; Standard epilogue mov rsp, rbp ; Restore stack pointer pop rbp ; Restore base pointer ret尾声与序言严格对称先恢复栈指针再弹出基址指针最后ret弹出返回地址并跳转。leave 指令等价形式; Leave instruction (equivalent) leave ; mov rsp, rbp; pop rbp retleave是mov rsp, rbp; pop rbp的单指令等价形式常出现在使用帧指针的函数中。识别到leave; ret组合即可高度确信此处为函数出口。reverse-engineer 代理plugins/reverse-engineering/agents/reverse-engineer.md将这些序言/尾声识别能力列为「Static analysis: Control flow graphs, call graphs, data flow analysis, symbol recovery」的基础前提。三、调用约定Calling Conventions调用约定规定了参数传递位置、返回值位置、寄存器保存责任caller/callee-saved以及栈清理责任。在分析反汇编代码时识别调用约定可以直接推断出哪些寄存器装载的是参数、函数返回时哪个寄存器承载结果。System V AMD64Linux、macOS这是 Linux、macOS 及所有类 Unix 系统 x86-64 平台的标准 ABI; Arguments: RDI, RSI, RDX, RCX, R8, R9, then stack ; Return: RAX (and RDX for 128-bit) ; Caller-saved: RAX, RCX, RDX, RSI, RDI, R8-R11 ; Callee-saved: RBX, RBP, R12-R15 ; Example: func(a, b, c, d, e, f, g) mov rdi, [a] ; 1st arg mov rsi, [b] ; 2nd arg mov rdx, [c] ; 3rd arg mov rcx, [d] ; 4th arg mov r8, [e] ; 5th arg mov r9, [f] ; 6th arg push [g] ; 7th arg on stack call func前 6 个整数/指针参数依次放入RDI, RSI, RDX, RCX, R8, R9第 7 个及以后的参数压栈传递返回值放入RAX128 位返回值用RDX:RAX拼接浮点参数使用XMM0-XMM7返回值在XMM0调用者保存caller-savedRAX, RCX, RDX, RSI, RDI, R8-R11——调用者需在调用前保存这些寄存器的值被调用者保存callee-savedRBX, RBP, R12-R15——被调用函数若使用它们必须自行保存/恢复。实际分析技巧在函数入口处看到mov [rbp-8], rdi、mov [rbp-16], rsi这类把前几个寄存器存入栈局部的指令基本可断定该函数接受至少两个参数且参数类型为整数/指针详见后文「函数签名恢复」。Microsoft x64WindowsWindows x64 平台使用独立于 System V 的调用约定; Arguments: RCX, RDX, R8, R9, then stack ; Shadow space: 32 bytes reserved on stack ; Return: RAX ; Example: func(a, b, c, d, e) sub rsp, 0x28 ; Shadow space alignment mov rcx, [a] ; 1st arg mov rdx, [b] ; 2nd arg mov r8, [c] ; 3rd arg mov r9, [d] ; 4th arg mov [rsp0x20], [e] ; 5th arg on stack call func add rsp, 0x28前 4 个整数/指针参数依次放入RCX, RDX, R8, R9第 5 个起压栈Shadow space影子空间调用者必须在栈上预留 32 字节4 个参数各 8 字节供被调用者保存前 4 个参数即使参数少于 4 个也不例外本例sub rsp, 0x28即 32 字节 shadow space 8 字节返回地址对齐16 字节对齐要求因此mov [rsp0x20], [e]恰好落在 shadow space 之上的第 5 个参数槽位返回值同为RAX寄存器保存规则与 System V 不同Windows 下RDI, RSI, RBX, RBP, R12-R15为 callee-saved分析 Windows 二进制时切勿套用 System V 规则。调用约定速查对照平台 / ABI参数寄存器整数/指针第 N 个之后的参数返回值典型场景System V AMD64RDI, RSI, RDX, RCX, R8, R9第 7 个起压栈RAX128 位用 RDX:RAXLinux / macOSMicrosoft x64RCX, RDX, R8, R9第 5 个起压栈需 32 字节 shadow spaceRAXWindowsARM64 (AArch64)X0-X7第 9 个起压栈X0128 位用 X1:X0移动端 / 嵌入式ARM32 (AAPCS)R0-R3第 5 个起压栈R064 位用 R1:R0旧版移动端 / 嵌入式这一对照关系可直接对应到 reverse-engineer 代理 中记录的「Calling Conventions」经验表x86 cdecl、x86 stdcall、x64 Windows、x64 System V、ARM用于在不同架构间快速切换分析思维。四、ARM 汇编模式ARM 架构广泛存在于移动端、嵌入式与固件中本仓库另有arm-cortex-microcontrollers插件专注 ARM Cortex-M 固件开发。ARM 的调用约定与 x86-64 差异显著最核心的区别是返回地址存放在链接寄存器LR而非栈上。ARM64AArch64调用约定; Arguments: X0-X7 ; Return: X0 (and X1 for 128-bit) ; Frame pointer: X29 ; Link register: X30 ; Function prologue stp x29, x30, [sp, #-16]! ; Save FP and LR mov x29, sp ; Set frame pointer ; Function epilogue ldp x29, x30, [sp], #16 ; Restore FP and LR ret前 8 个参数放入X0-X7第 9 个起压栈返回值在X0128 位用X1:X0X29 为帧指针FPX30 为链接寄存器LR——BL/BLR调用会把返回地址写入 X30 而非压栈stp x29, x30, [sp, #-16]!store pair, pre-index将 FP 与 LR 成对压栈并同时减 16 字节!表示预写回pre-indexed——一条指令完成「保存两个寄存器 分配栈帧」两件事尾声ldp x29, x30, [sp], #16load pair, post-index对称恢复后ret——由于返回地址已在 X30ret无需从栈弹出。从编译器模式看stp/ldp成对访存是 AArch64 的标志性优化编译器会将两个相邻寄存器一次性存取既节省指令数又保证原子性。在固件分析中看到stp x29, x30开头即可确认函数边界。ARM32 调用约定; Arguments: R0-R3, then stack ; Return: R0 (and R1 for 64-bit) ; Link register: LR (R14) ; Function prologue push {fp, lr} add fp, sp, #4 ; Function epilogue pop {fp, pc} ; Return by popping PC前 4 个参数放入R0-R3第 5 个起压栈返回值在R064 位用R1:R0LR 为 R14作为链接寄存器保存返回地址帧指针为 R11fp序言push {fp, lr}将帧指针与链接寄存器一起压栈add fp, sp, #4让帧指针指向栈上保存的旧帧指针注意偏移 4 是因为压栈了两项尾声pop {fp, pc}是 ARM32 的经典技巧把保存的 LR 值直接弹入程序计数器 PC等价于「恢复帧指针 跳转返回」两步合一的写法。对比可发现一条通用规律x86-64 通过栈保存返回地址call/ret而 ARM 通过链接寄存器LR/X30保存返回地址——这是跨架构逆向时最需要调整的心智模型。五、控制流模式条件分支、循环与 Switch延伸自同技能 SKILL.mdbinary-analysis-patterns技能的其余章节与「反汇编基础」同属一个完整知识体系这里继承其核心内容以形成闭环。识别控制流结构是反汇编阅读的第二层能力。条件分支; if (a b) cmp eax, ebx jne skip_block ; ... if body ... skip_block: ; if (a b) - signed cmp eax, ebx jge skip_block ; Jump if greater or equal ; ... if body ... skip_block: ; if (a b) - unsigned cmp eax, ebx jae skip_block ; Jump if above or equal ; ... if body ... skip_block:编译器通常把if条件取反后跳转到跳过分支体branch-if-false。cmp设置标志位后有符号比较用jge/jl/jle/jggreat/less无符号比较用jae/jb/jbe/jaabove/below——这是最常见的分析失误点看到jae就应意识到源语言中的比较是无符号语义。循环模式; for (int i 0; i n; i) xor ecx, ecx ; i 0 loop_start: cmp ecx, [n] ; i n jge loop_end ; ... loop body ... inc ecx ; i jmp loop_start loop_end: ; while (condition) jmp loop_check loop_body: ; ... body ... loop_check: cmp eax, ebx jl loop_body ; do-while loop_body: ; ... body ... cmp eax, ebx jl loop_bodyfor循环初始化 → 条件检查在循环顶部 → 迭代步进在循环体底部条件不满足跳出while循环编译器常将条件检查下沉到循环底部loop rotation 优化循环体前先无条件jmp loop_check从而让每个迭代只执行一次条件比较do-while循环条件检查天然在循环体之后与源码语义一致是三种循环中最容易识别的形态。实际分析时while与do-while的区分要点是循环体第一条指令是否为无条件jmp到循环尾部的条件检查。Switch 语句模式; Jump table pattern mov eax, [switch_var] cmp eax, max_case ja default_case jmp [jump_table eax*8] ; Sequential comparison (small switch) cmp eax, 1 je case_1 cmp eax, 2 je case_2 cmp eax, 3 je case_3 jmp default_case跳转表jump tablecase 分支较多且密集时编译器生成一张指针表jmp [jump_table eax*8]按索引一次跳转8 字节为 x86-64 指针大小。先用cmp/ja做边界检查越界走 default再间接跳转顺序比较sequential comparisoncase 数量少或稀疏时编译器退化为逐个cmpje此时从反汇编恢复出的就是「if-else 链」形态。六、数据结构模式数组、结构体与链表数组访问; array[i] - 4-byte elements mov eax, [rbx rcx*4] ; rbxbase, rcxindex ; array[i] - 8-byte elements mov rax, [rbx rcx*8] ; Multi-dimensional array[i][j] ; arr[i][j] base (i * cols j) * element_size imul eax, [cols] add eax, [j] mov edx, [rbx rax*4]x86-64 的比例变址寻址base index*scale disp让数组访问一目了然scale4/8直接暴露元素大小从而推断数组类型。多维数组则先imul计算行偏移再做列偏移累加——看到乘法加法的寻址组合应联想到多维数组或结构体数组。结构体访问与内存对齐struct Example { int a; // offset 0 char b; // offset 4 // padding // offset 5-7 long c; // offset 8 short d; // offset 16 };; Accessing struct fields mov rdi, [struct_ptr] mov eax, [rdi] ; s-a (offset 0) movzx eax, byte [rdi4] ; s-b (offset 4) mov rax, [rdi8] ; s-c (offset 8) movzx eax, word [rdi16] ; s-d (offset 16)这个例子演示了结构体内存对齐的经典布局int a占 4 字节、char b占 1 字节后填充 3 字节 padding偏移 5-7long c从 8 字节对齐的偏移 8 开始8 字节short d在偏移 162 字节整个结构体按 8 字节对齐补齐到 18 的倍数 → sizeof 为 24。反汇编中字段访问的偏移量分布出现 4→8→16 的非连续跳跃正是恢复结构体定义的直接证据。链表遍历; while (node ! NULL) list_loop: test rdi, rdi ; node NULL? jz list_done ; ... process node ... mov rdi, [rdi8] ; node node-next (assuming next at offset 8) jmp list_loop list_done:test reg, reg; jz是判空的标准惯用法等价于cmp reg, 0。mov rdi, [rdi8]把当前节点偏移 8 处的指针加载回自身寄存器形成经典链表步进循环——next指针在结构体中的偏移此处为 8可据此确定。七、常见代码模式字符串、算术与位操作字符串操作; strlen pattern xor ecx, ecx strlen_loop: cmp byte [rdi rcx], 0 je strlen_done inc ecx jmp strlen_loop strlen_done: ; ecx contains length ; strcpy pattern strcpy_loop: mov al, [rsi] mov [rdi], al test al, al jz strcpy_done inc rsi inc rdi jmp strcpy_loop strcpy_done: ; memcpy using rep movsb mov rdi, dest mov rsi, src mov rcx, count rep movsbstrlen逐字节与 0 比较、计数器递增——见到cmp byte [...], 0 计数器模式可判为字符串长度计算strcpymov al, [rsi]; mov [rdi], al逐字节搬运用test al, al; jz判断是否遇到终止符memcpy编译器在长度已知或较小时用rep movsb前缀实现高效块拷贝。rep movsb也可用于识别编译器对memcpy/memmove内联优化的痕迹。算术模式编译器优化常数运算; Multiplication by constant ; x * 3 lea eax, [rax rax*2] ; x * 5 lea eax, [rax rax*4] ; x * 10 lea eax, [rax rax*4] ; x * 5 add eax, eax ; * 2 ; Division by power of 2 (signed) mov eax, [x] cdq ; Sign extend to EDX:EAX and edx, 7 ; For divide by 8 add eax, edx ; Adjust for negative sar eax, 3 ; Arithmetic shift right ; Modulo power of 2 and eax, 7 ; x % 8编译器用lea的移位加加组合替代乘法指令x*3 x x*2、x*5 x x*4是 -O2 下的高频优化。有符号除以 2 的幂不能简单右移负数需先做补偿调整cdq符号扩展 →and edx, 7取符号位补偿 →add→sar 3。识别这套「cdq and add sar」序列即可还原为x / 8有符号。取模 2 的幂则直接and掩码x % 8 → x 7。位操作; Test specific bit test eax, 0x80 ; Test bit 7 jnz bit_set ; Set bit or eax, 0x10 ; Set bit 4 ; Clear bit and eax, ~0x10 ; Clear bit 4 ; Toggle bit xor eax, 0x10 ; Toggle bit 4 ; Count leading zeros bsr eax, ecx ; Bit scan reverse xor eax, 31 ; Convert to leading zeros ; Population count (popcnt) popcnt eax, ecx ; Count set bits位操作模式直接对应 C 语言位运算test 条件跳转 位测试or/and/xor 掩码 置位/清位/翻转。bsr反向位扫描与popcnt置位计数是底层算法如哈希、熵计算、位图的典型信号——在恶意软件分析中popcnt频繁出现常意味着自定义哈希或熵检测逻辑。八、反编译模式变量、函数签名与类型恢复反编译的目标是把机器码还原成可读的高级语言结构。局部变量恢复; Local variable at rbp-8 mov qword [rbp-8], rax ; Store to local mov rax, [rbp-8] ; Load from local ; Stack-allocated array lea rax, [rbp-0x40] ; Array starts at rbp-0x40 mov [rax], edx ; array[0] value mov [rax4], ecx ; array[1] value使用帧指针时[rbp-8]、[rbp-0x10]等负偏移即为局部变量槽位lea rax, [rbp-0x40]计算出栈上数组基址后按偏移写入可恢复出栈分配的数组。函数签名恢复; Identify parameters by register usage func: ; rdi used as first param (System V) mov [rbp-8], rdi ; Save param to local ; rsi used as second param mov [rbp-16], rsi ; Identify return by RAX at end mov rax, [result] ret结合第三节的调用约定知识函数体开头把rdi、rsi存入局部变量说明它们被当作参数使用System V 下即第 1、2 个参数函数末尾把结果装入rax后ret则rax承载返回值。从源码结构看这正对应 SKILL.md 中「Function Signature Recovery」一节的核心方法Identify parameters by register usage。类型恢复按操作宽度推断; 1-byte operations suggest char/bool movzx eax, byte [rdi] ; Zero-extend byte movsx eax, byte [rdi] ; Sign-extend byte ; 2-byte operations suggest short movzx eax, word [rdi] movsx eax, word [rdi] ; 4-byte operations suggest int/float mov eax, [rdi] movss xmm0, [rdi] ; Float ; 8-byte operations suggest long/double/pointer mov rax, [rdi] movsd xmm0, [rdi] ; Double1 字节movzx/movsx byte→char/bool2 字节movzx/movsx word→short4 字节mov到eax、movss→int/float8 字节mov到rax、movsd→long/double/指针。movzx零扩展与movsx符号扩展的差异还能揭示变量是否为有符号类型。movss/movsdscalar single/double则是浮点运算的明确信号。九、Ghidra 与 IDA Pro 自动化脚本同技能延伸静态分析工具脚本化是提升效率的关键。以下脚本均出自 SKILL.md 的 Ghidra/IDA 章节。Ghidra 脚本修复函数签名与结构体// In Ghidra scripting // Fix function signature Function func getFunctionAt(toAddr(0x401000)); func.setReturnType(IntegerDataType.dataType, SourceType.USER_DEFINED); // Create structure type StructureDataType struct new StructureDataType(MyStruct, 0); struct.add(IntegerDataType.dataType, field_a, null); struct.add(PointerDataType.dataType, next, null); // Apply to memory createData(toAddr(0x601000), struct);Ghidra 的自动分析对未知函数常给出错误的返回类型默认undefined/void。用Function.setReturnType(...)配合SourceType.USER_DEFINED可强制修正StructureDataType用于定义结构体布局createData将定义应用到内存地址——这些操作在自动化分析批量二进制时非常有效。Ghidra 模式匹配脚本定位危险函数调用# Find all calls to dangerous functions for func in currentProgram.getFunctionManager().getFunctions(True): for ref in getReferencesTo(func.getEntryPoint()): if func.getName() in [strcpy, sprintf, gets]: print(fDangerous call at {ref.getFromAddress()})通过遍历函数管理器、对每个函数入口取引用getReferencesTo筛选出对strcpy、sprintf、gets等危险库函数的全部调用点。这是静态漏洞扫描如缓冲区溢出定位的典型实现可用于大规模安全审计。IDAPython查找指定函数的所有调用import idaapi import idautils import idc # Find all function calls def find_calls(func_name): for func_ea in idautils.Functions(): for head in idautils.Heads(func_ea, idc.find_func_end(func_ea)): if idc.print_insn_mnem(head) call: target idc.get_operand_value(head, 0) if idc.get_func_name(target) func_name: print(fCall to {func_name} at {hex(head)}) # Rename functions based on strings def auto_rename(): for s in idautils.Strings(): for xref in idautils.XrefsTo(s.ea): func idaapi.get_func(xref.frm) if func and sub_ in idc.get_func_name(func.start_ea): # Use string as hint for naming passidautils.Functions()遍历所有函数idautils.Heads()遍历函数内指令idc.print_insn_mnem检查助记符是否为call再解析操作数确认目标函数——构成「X 调用了谁」的完整查询。字符串交叉引用XrefsTo则可用于把sub_xxxx匿名函数改名为更有语义的名字。十、分析工作流与常见陷阱七步分析工作流SKILL.md 给出的推荐流程Initial triage初步分类文件类型、架构、导入/导出表String analysis字符串分析定位关键字符串、错误消息Function identification函数识别入口点、导出函数、交叉引用Control flow mapping控制流映射理解程序整体结构Data structure recovery数据结构恢复识别结构体、数组、全局变量Algorithm identification算法识别加密、哈希、压缩算法Documentation文档化注释、重命名符号、类型定义。这七步与 reverse-engineer 代理 的「Analysis Methodology」四阶段Reconnaissance → Static Analysis → Dynamic Analysis → Documentation互为印证静态分析阶段正是本文所讲的反汇编模式识别的主战场。常见陷阱Optimizer artifacts优化器产物优化后的代码可能与源码结构完全不对应切勿强求一一映射Inline functions内联函数函数可能被展开内联导致反汇编中不存在独立的函数边界Tail call optimization尾调用优化函数末尾以jmp而非callret调用另一函数——看到函数尾部直接jmp到别的函数应意识到这是尾调用而非无条件跳转Dead code死代码优化产生的不可达代码块如mov rax, 0; jmp next; nop应跳过避免误判为逻辑分支Position-independent code位置无关代码PIE/共享库使用 RIP 相对寻址lea rax, [ripoffset]识别地址时须结合重定位信息。十一、在 agents24 仓库中的定位与使用binary-analysis-patterns技能隶属于 reverse-engineering 插件该插件在 docs/plugins.md 中被归类为 Security 领域官方描述为「Binary analysis, malware triage, firmware security (authorized)」。围绕该技能仓库还提供reverse-engineer 代理精通 IDA Pro、Ghidra、radare2、x64dbg 与二进制格式PE/ELF/Mach-O/DEX负责执行可执行文件分析、库检查、协议提取与漏洞研究anti-reversing-techniques 技能逆向工程的反面——混淆、反调试、加壳等对抗技术与本文的静态分析模式互为镜像memory-forensics 技能进程内存取证与动态分析protocol-reverse-engineering 技能流量捕获、协议识别与自定义协议逆向。安全边界所有分析必须在授权范围内进行——安全研究、CTF 竞赛、授权渗透测试、恶意软件防御与教学目的。仓库中的代理与技能均明确声明只服务于上述合法场景详见 reverse-engineer 代理 的「Security Ethics」与 anti-reversing-techniques 技能 的「AUTHORIZED USE ONLY」声明。安装该技能有两种方式通过插件市场安装整个插件/plugin install reverse-engineering或按 docs/agent-skills.md 的说明单独安装技能gh skill install或npx skills add指定--skill binary-analysis-patterns。安装后当遇到未知可执行文件、混淆二进制或需要重构编译代码逻辑的任务时技能即会自动激活。十二、小结本文完整继承了binary-analysis-patterns技能references/details.md章节的反汇编基础内容并延伸覆盖了同技能的其余知识体系。掌握这些模式的实战收益是看到一段陌生架构的反汇编能在几十秒内定位函数边界、识别参数与返回值、判断数据结构形态——这是从「读汇编」到「懂程序」的关键一跃。建议读者将本文的汇编模式与 Ghidra/IDA 脚本结合使用在真实样本如 CTF 二进制、自有软件或授权分析的固件上反复练习逐步建立跨架构的逆向直觉。【免费下载链接】agentsMulti-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity项目地址: https://gitcode.com/GitHub_Trending/agents24/agents创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表