<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Aaron Ji's blog (Posts about reverse)</title><link>https://blog.jiya.net/</link><description></description><atom:link href="https://blog.jiya.net/categories/reverse.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2025 &lt;a href="mailto:me@jiya.net"&gt;Aaron Ji&lt;/a&gt; </copyright><lastBuildDate>Wed, 19 Feb 2025 06:17:18 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>逆向笔记</title><link>https://blog.jiya.net/posts/2022/08/reverse-note.html</link><dc:creator>Aaron Ji</dc:creator><description>&lt;div id="outline-container-org2b1e104" class="outline-3"&gt;
&lt;h3 id="org2b1e104"&gt;&lt;span class="section-number-3"&gt;0.1.&lt;/span&gt; IDA 说明&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-0-1"&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgad22131" class="outline-4"&gt;
&lt;h4 id="orgad22131"&gt;&lt;span class="section-number-4"&gt;0.1.1.&lt;/span&gt; 字符串窗口（Strings window）&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-0-1-1"&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;.data 表示数据在数据段：可以进行读写；&lt;/li&gt;
&lt;li&gt;.rodata 表示在只读数据段：只读，不能进行修改；&lt;/li&gt;
&lt;li&gt;.note&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
&lt;code&gt;#&lt;/code&gt; 开头的一些数据为立即数，表示数值本身，如 &lt;code&gt;#0&lt;/code&gt; 。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orga95e257" class="outline-4"&gt;
&lt;h4 id="orga95e257"&gt;&lt;span class="section-number-4"&gt;0.1.2.&lt;/span&gt; IDA 调试界面&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-0-1-2"&gt;
&lt;ol class="org-ol"&gt;
&lt;li&gt;&lt;p&gt;
把汇编窗口
&lt;/p&gt;

&lt;p&gt;
C 将当前地址处的数据解析成代码
P
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
十六进制窗口
&lt;/p&gt;

&lt;p&gt;
编辑内存数据和代码
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
寄存器窗口
&lt;/p&gt;

&lt;p&gt;
修改寄存器的值
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
模块窗口
&lt;/p&gt;

&lt;p&gt;
模块路径和地址
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;线程窗口&lt;/li&gt;
&lt;li&gt;栈窗口&lt;/li&gt;
&lt;li&gt;输出信息窗口&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;
IDA 调试常用功能：
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;&lt;p&gt;
断点和运行
&lt;/p&gt;

&lt;p&gt;
设置断点 F2
设置断点不可用 Disable breakpoint
编辑断点 Edit breakpoint
删除断点 Delete breakpoint
继续运行 F9
查看当前所有断点 Ctrl+Alt+B
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
单步调试
&lt;/p&gt;

&lt;p&gt;
单步进入 F7
单步步过 F8
运行到函数的返回地址 Ctrl + F7
运行到光标处 F4
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;IDC 脚本&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org1d000f6" class="outline-4"&gt;
&lt;h4 id="org1d000f6"&gt;&lt;span class="section-number-4"&gt;0.1.3.&lt;/span&gt; ARM 汇编指集&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-0-1-3"&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;B 无条件跳转&lt;/li&gt;

&lt;li&gt;BL 带链接无条件跳转指令，即调用子函数或子程序，相当于 &lt;code&gt;x86&lt;/code&gt; 的 &lt;code&gt;call&lt;/code&gt; 指令；&lt;/li&gt;

&lt;li&gt;MOV 数据传送指令（&amp;lt;–），方向为从右向左，把右边的立即数或者寄存器里面的值放入左边的寄存器里面；&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
堆栈操作
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;STMFD （寄存器和存储器之间的访问） 和 LDMFD  操作多个寄存器，这两个命令针对的是都是堆栈操作；
&lt;ul class="org-ul"&gt;
&lt;li&gt;STMFD 入栈，方向 &amp;lt;–&lt;/li&gt;

&lt;li&gt;LDMFD 出栈，方向 –&amp;gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
BEQ
&lt;/p&gt;

&lt;p&gt;
BNE
&lt;/p&gt;

&lt;p&gt;
分析和修改汇编指令：
&lt;/p&gt;

&lt;p&gt;
赋值（MOV）、跳转、算术运算、移位运算、堆栈操作、内存读写指令、函数调用约定
&lt;/p&gt;

&lt;p&gt;
Thumb 16 、Thumb2 32、ARM32 、ARM64
&lt;/p&gt;

&lt;p&gt;
用户模式（usr）：
&lt;/p&gt;

&lt;p&gt;
不分组寄存器：R0-R7
分组寄存器：R8-R14
&lt;/p&gt;

&lt;p&gt;
传递参数与返回值：R0-R3 ，如果参数大于四个多余的参数则使用堆栈进行存储（顺序相反，从后向前，即最后的参数是R0）
&lt;/p&gt;

&lt;p&gt;
保存栈顶地址：R13/SP
&lt;/p&gt;

&lt;p&gt;
保存函数的返回地址：R14/LR
&lt;/p&gt;

&lt;p&gt;
程序计数器：R15 （PC）控制程序执行流程
&lt;/p&gt;

&lt;p&gt;
状态寄存器：CPSR （指定当前指令是ARM 指令还是Thumb 指令）
&lt;/p&gt;

&lt;p&gt;
ARM 处理器：
&lt;/p&gt;

&lt;p&gt;
ARM 状态（执行32位对齐指令的 ARM 指令）
&lt;/p&gt;

&lt;p&gt;
Thumb 状态（执行16位对齐的 Thumb 指令）
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgc25491a" class="outline-4"&gt;
&lt;h4 id="orgc25491a"&gt;&lt;span class="section-number-4"&gt;0.1.4.&lt;/span&gt; 工具&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-0-1-4"&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;p&gt;
objdump
&lt;/p&gt;

&lt;p&gt;
objdump -S exec &amp;gt; exec.txt
objdump -s exec &amp;gt; exec.txt
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
readelf
&lt;/p&gt;

&lt;p&gt;
ELF 文件结构
&lt;/p&gt;

&lt;p&gt;
Linux ELF 文件；Windows PE 文件；
安卓操作系统内核采用 Linux 内核框架实现，即 Android ELF 文件。
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
ELF 文件整体结构：
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
ELF Header -&amp;gt; ELF 文件头的位置是固定的
Segment Header Table -&amp;gt; ELF 程序头描述的是段的相关信息
.init
.text
.rodata
.data
.symtab 符号表
.line
.strtab 字符串表
section Header Table -&amp;gt; ELF 节头表描述的是节区的信息
动态用段，静态用节
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
readelf 的使用： -a -h -l -s -e -s
&lt;/p&gt;

&lt;p&gt;
程序在运行的时候只会加载 &lt;code&gt;PT_LOAD&lt;/code&gt; 段，其他段不会加载到内存，这会导致一些 so 文件在动态调试的时候抠出来的内存里的东西放到 IDA 里面只能看得到 &lt;code&gt;PT_LOAD&lt;/code&gt; 段的信息，其他段看不到，这种情况下就要进行 so 文件的修复（补全其他段的信息）。
&lt;/p&gt;

&lt;p&gt;
iOS APP 证书双向验证机制
&lt;/p&gt;

&lt;p&gt;
参考： &lt;a href="https://blog.csdn.net/feibabeibei_beibei/article/details/64126064"&gt;https://blog.csdn.net/feibabeibei_beibei/article/details/64126064&lt;/a&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org862f5c9" class="outline-3"&gt;
&lt;h3 id="org862f5c9"&gt;&lt;span class="section-number-3"&gt;0.2.&lt;/span&gt; iOS&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-0-2"&gt;
&lt;/div&gt;
&lt;div id="outline-container-org6486152" class="outline-4"&gt;
&lt;h4 id="org6486152"&gt;&lt;span class="section-number-4"&gt;0.2.1.&lt;/span&gt; 汇编基础（部分摘自《iOS 应用逆向与安全之道》，罗巍著）&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-0-2-1"&gt;
&lt;/div&gt;
&lt;div id="outline-container-org76f15cd" class="outline-5"&gt;
&lt;h5 id="org76f15cd"&gt;&lt;span class="section-number-5"&gt;0.2.1.1.&lt;/span&gt; 寄存器&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-0-2-1-1"&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgce8e50b" class="outline-6"&gt;
&lt;h6 id="orgce8e50b"&gt;&lt;span class="section-number-6"&gt;0.2.1.1.1.&lt;/span&gt; 通用寄存器&lt;/h6&gt;
&lt;div class="outline-text-6" id="text-0-2-1-1-1"&gt;
&lt;p&gt;
ARM64 有 31 个通用寄存器，每个寄存器可以存取一个 64 位的数据。当使用 X0 ~ X30 时，它就是一个 64 位的数；当使用 W0 ~ W30 时，实际访问的是这些寄存器的低 32 位，写入时会将高 32 位清零。在指令编码中，0b11111 （31）用来表示 ZR （0 寄存器），仅表示参数 0 ，并不表示 ZR 是一个物理寄存器，如下图所示。
&lt;/p&gt;

&lt;p&gt;
zero register(XZR/WZR) 效果和软件层面的"/dev/zero"类似，作为源寄存器产生0，作为目标寄存器丢弃传入的数据。效果和软件层面的"/dev/zero"类似，作为源寄存器产生0，作为目标寄存器丢弃传入的数据。另外，wzr是32位的零寄存器,用于给int清零；xzr是64位的零寄存器,用于给long清零。
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mov  r0, #0
str  r0, [...]
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
有了zero register，一条指令就可以解决问题：
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;str  wzr, [...]
&lt;/pre&gt;&lt;/div&gt;


&lt;div id="orgf76e3c2" class="figure"&gt;
&lt;p&gt;&lt;img src="https://blog.jiya.net/images/2022/08/general_purpose_register.png" alt="nil"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span class="figure-number"&gt;Figure 1: &lt;/span&gt;通用寄存器&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
除了 X0 ~ X30 寄存器外，还有一个 SP 寄存器也非常重要。下面介绍 iOS 逆向工程中关注频率最高的一些寄存器。
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;X0 ~ X7：用来传递函数的参数，如果有更多的参数则使用栈来传递；X0 也用来存放函数的返回值；&lt;/li&gt;
&lt;li&gt;SP （Stack Pointer）：栈指针寄存器。指向栈的顶部，可以通过 WSP 寄存器访问栈指针的最低有效 32 位；&lt;/li&gt;
&lt;li&gt;FP （Frame Pointer）：即 X29 ，栈指针寄存器。指向栈的顶部；&lt;/li&gt;
&lt;li&gt;LR （Link Register）：即 X30 ，链接寄存器。存储着函数调用完成时的返回地址，用来做函数调用栈跟踪，程序在崩溃时能够用栈打印出来就是借助 LR 寄存器来实现的；&lt;/li&gt;
&lt;li&gt;PC （Program Counter）：保存的是将要执行的下一条指令的内存地址。通常在调试状态下看到的 PC 值都是当前断点处的地址，所以很多人认为 PC 值就是当前正在执行的指令内存地址，其实这是错误的。(MOV 指令不能修改 PC 寄存器的值，需要使用 BL 指令)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org8630bf9" class="outline-6"&gt;
&lt;h6 id="org8630bf9"&gt;&lt;span class="section-number-6"&gt;0.2.1.1.2.&lt;/span&gt; 浮点寄存器&lt;/h6&gt;
&lt;div class="outline-text-6" id="text-0-2-1-1-2"&gt;
&lt;p&gt;
因为浮点数的存储及运算的特殊性，所以 CPU 中专门提供了 FPU 以及相应的浮点数寄存器来进行处理。ARM64 有 32 个浮点寄存器（V0 ~ V31），每个寄存器大小是 128 位。开发者可以通过 Bn （Byte）、Hn （Half Word）、Sn （Single Word）、Dn （Double Word）、Qn （Quad Word）来访问不同的位数，如下图所示：
&lt;/p&gt;


&lt;div id="org271aba8" class="figure"&gt;
&lt;p&gt;&lt;img src="https://blog.jiya.net/images/2022/08/floating_point_register.png" alt="nil"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span class="figure-number"&gt;Figure 2: &lt;/span&gt;浮点寄存器&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org6bb7b62" class="outline-6"&gt;
&lt;h6 id="org6bb7b62"&gt;&lt;span class="section-number-6"&gt;0.2.1.1.3.&lt;/span&gt; 状态寄存器&lt;/h6&gt;
&lt;div class="outline-text-6" id="text-0-2-1-1-3"&gt;
&lt;p&gt;
状态寄存器用来保存指令运行结果的一些信息，比如相加的结果是否溢出、是否为0及是否为负数等。CPU 的某些指令会根据运行的结果来设置状态寄存器的标志位，而某些指令则是根据这些状态寄存器中的值来进行处理。ARM64 体系的 CPU 提供了一个 32 位的 CPSR （Current Program Status Registerp）寄存器来作为状态寄存器，低 8 位（包括 M[0:4] 、T 、F 和 I）称为控制位，程序无法修改，第 28 ~ 31 位的 V 、C 、Z 和 N 均为条件码标志位，它们的内容可被算术或逻辑运算的结果改变，如下图所示。状态寄存器的内容由 CPU 内部进行置位，在程序中不能将某个数赋值给它。
&lt;/p&gt;


&lt;div id="orgefa93d1" class="figure"&gt;
&lt;p&gt;&lt;img src="https://blog.jiya.net/images/2022/08/status_register.png" alt="nil"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span class="figure-number"&gt;Figure 3: &lt;/span&gt;状态寄存器&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
下面介绍 4 个条件代码标志位及其含义：
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;N （ Negative）：当两个有符号整数进行运算时，N = 1 表示结果为负数，N = 0 表示运行结果为正数或零；&lt;/li&gt;
&lt;li&gt;Z （Zero）：Z = 1 表示运算结果为零；Z = 0 表示运算结果为非零；&lt;/li&gt;
&lt;li&gt;C （Carry）：当加法运算结果产生进位时（无符号数溢出），C = 1 ，否则 C = 0；当减法运行结果产生错位（无符号数溢出）时，C = 0，否则 C = 1；&lt;/li&gt;
&lt;li&gt;V （Overflow）：在加/减法运算中，当操作数和运算结果为二进制补码表示的带符号数时，V = 1 表示符号位溢出。&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgaae13a5" class="outline-6"&gt;
&lt;h6 id="orgaae13a5"&gt;&lt;span class="section-number-6"&gt;0.2.1.1.4.&lt;/span&gt; 指令集&lt;/h6&gt;
&lt;div class="outline-text-6" id="text-0-2-1-1-4"&gt;
&lt;p&gt;
指令的基本格式如下：
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
&amp;lt;opcode&amp;gt; {&amp;lt;cond&amp;gt;}{S} &amp;lt;Rd&amp;gt;, &amp;lt;Rn&amp;gt; {, &amp;lt;shift_op2&amp;gt;}
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
其中，尖括号是必需的，花括号是可选的，各关键字的含义见下表：
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;
&lt;caption class="t-above"&gt;&lt;span class="table-number"&gt;Table 1:&lt;/span&gt; ARM 指令关键字及其含义&lt;/caption&gt;

&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;标识符&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;opcode&lt;/td&gt;
&lt;td class="org-left"&gt;操作码域，也就是指令编码助词符，说明指令需要执行的操作类型&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;cond&lt;/td&gt;
&lt;td class="org-left"&gt;条件码域，指令允许执行的条件编码&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;S&lt;/td&gt;
&lt;td class="org-left"&gt;条件码设置域，这是一个可选项，当在指令中设置该域时，指令执行的结果将会影响程序状态寄存器 CPSR 中相应的状态标志&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;Rd/Xt&lt;/td&gt;
&lt;td class="org-left"&gt;目标寄存器，ARM64 指令可以选择 X0 ~ X30 或 W0 ~ W30&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;Rn/Xn&lt;/td&gt;
&lt;td class="org-left"&gt;第一个操作数的寄存器，和 Rd 一样，不同指令有不同要求&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;shift_op2&lt;/td&gt;
&lt;td class="org-left"&gt;第二个操作数，可以是立即数或寄存器移位方式&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
常见的 ARM64 指令：
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;常用算术指令&lt;/li&gt;
&lt;/ul&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;
&lt;caption class="t-above"&gt;&lt;span class="table-number"&gt;Table 2:&lt;/span&gt; 常用算术指令&lt;/caption&gt;

&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;指令&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;示例&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;ADD&lt;/td&gt;
&lt;td class="org-left"&gt;ADD X0,X1,X2&lt;/td&gt;
&lt;td class="org-left"&gt;X0 = X1 + X2&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;SUB&lt;/td&gt;
&lt;td class="org-left"&gt;SUB X0,X1,X2&lt;/td&gt;
&lt;td class="org-left"&gt;X0 = X1 - X2&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;MUL&lt;/td&gt;
&lt;td class="org-left"&gt;MUL X0,X0,X8&lt;/td&gt;
&lt;td class="org-left"&gt;X = X0 x X8&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;SDIV&lt;/td&gt;
&lt;td class="org-left"&gt;SDIV X0,X0,X1&lt;/td&gt;
&lt;td class="org-left"&gt;X0 = X0 / X1 （有符号除法运算）&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;UDIV&lt;/td&gt;
&lt;td class="org-left"&gt;UDIV X0,X0,X1&lt;/td&gt;
&lt;td class="org-left"&gt;X0 = X0 / X1 （无符号除法运算&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;CMP&lt;/td&gt;
&lt;td class="org-left"&gt;CMP X28,X0&lt;/td&gt;
&lt;td class="org-left"&gt;X28 与 X0 相减，不存储结果，只更新 CPSR 中的条件标志位&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;CMN&lt;/td&gt;
&lt;td class="org-left"&gt;CMN X28,X0&lt;/td&gt;
&lt;td class="org-left"&gt;X28 与 X0 相加，并根据结果更新 CPSR 中的条件标志位&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;ADDS/SUBS&lt;/td&gt;
&lt;td class="org-left"&gt;ADDS X0,X1,X2&lt;/td&gt;
&lt;td class="org-left"&gt;带 S 的指令运算结果会影响 CPSR 中的条件标志位，后面出现的其他指令也同理&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;常用跳转指令

&lt;ul class="org-ul"&gt;
&lt;li&gt;条件跳转&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;
&lt;caption class="t-above"&gt;&lt;span class="table-number"&gt;Table 3:&lt;/span&gt; 条件跳转指令&lt;/caption&gt;

&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;指令&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;示例&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;B.cond&lt;/td&gt;
&lt;td class="org-left"&gt;B.cond label&lt;/td&gt;
&lt;td class="org-left"&gt;若 cond 为真，则跳转到 label&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;CBNZ&lt;/td&gt;
&lt;td class="org-left"&gt;CBNZ Xn,label&lt;/td&gt;
&lt;td class="org-left"&gt;若 Xn != 0，则跳转到 label&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;CBZ&lt;/td&gt;
&lt;td class="org-left"&gt;CBZ Xn,label&lt;/td&gt;
&lt;td class="org-left"&gt;若 Xn == 0，则跳转到 label&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;TBNZ&lt;/td&gt;
&lt;td class="org-left"&gt;TBNZ Xn,#uimm6,label&lt;/td&gt;
&lt;td class="org-left"&gt;若 Xn[uimm6] != 0，则跳转到 label&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;TBZ&lt;/td&gt;
&lt;td class="org-left"&gt;TBZ Xn,#uimm6,label&lt;/td&gt;
&lt;td class="org-left"&gt;若 Xn[uimm6] == 0，则跳转到 label&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;无条件跳转&lt;/li&gt;
&lt;/ul&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;
&lt;caption class="t-above"&gt;&lt;span class="table-number"&gt;Table 4:&lt;/span&gt; 无条件跳转指令&lt;/caption&gt;

&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;指令&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;示例&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;B&lt;/td&gt;
&lt;td class="org-left"&gt;B label&lt;/td&gt;
&lt;td class="org-left"&gt;无条件跳转&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;BL&lt;/td&gt;
&lt;td class="org-left"&gt;BL label&lt;/td&gt;
&lt;td class="org-left"&gt;无条件跳转，返回地址保存到 X30 （LR）寄存器&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;BLR&lt;/td&gt;
&lt;td class="org-left"&gt;BLR label&lt;/td&gt;
&lt;td class="org-left"&gt;无条件跳转到 Xn 寄存器的地址，返回地址保存到 X30 （LR）寄存器&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;BR&lt;/td&gt;
&lt;td class="org-left"&gt;BR label&lt;/td&gt;
&lt;td class="org-left"&gt;无条件跳转到 Xn 寄存器的地址&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;RET&lt;/td&gt;
&lt;td class="org-left"&gt;RET {Xn}&lt;/td&gt;
&lt;td class="org-left"&gt;子程序返回指令，返回地址默认保存在 LR （X30）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;常用逻辑指令&lt;/li&gt;
&lt;/ul&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;
&lt;caption class="t-above"&gt;&lt;span class="table-number"&gt;Table 5:&lt;/span&gt; 常用逻辑指令&lt;/caption&gt;

&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;指令&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;示例&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;AND&lt;/td&gt;
&lt;td class="org-left"&gt;AND X0,X1,X2&lt;/td&gt;
&lt;td class="org-left"&gt;X0 = X1 &amp;amp; X2&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;EOR&lt;/td&gt;
&lt;td class="org-left"&gt;EOR X0,X1,X2&lt;/td&gt;
&lt;td class="org-left"&gt;X0 = X1 ^ X2&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;ORR&lt;/td&gt;
&lt;td class="org-left"&gt;ORR X0,X1,X2&lt;/td&gt;
&lt;td class="org-left"&gt;X0 = X1 &amp;amp;vert; X2 ，二进制位或&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;TST&lt;/td&gt;
&lt;td class="org-left"&gt;TST W0,#0x40&lt;/td&gt;
&lt;td class="org-left"&gt;测试 W0[3] 是否为 1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;常用数据传输指令&lt;/li&gt;
&lt;/ul&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;
&lt;caption class="t-above"&gt;&lt;span class="table-number"&gt;Table 6:&lt;/span&gt; 常用数据传输指令&lt;/caption&gt;

&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;指令&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;示例&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;MOV&lt;/td&gt;
&lt;td class="org-left"&gt;MOV X19,X1&lt;/td&gt;
&lt;td class="org-left"&gt;X19 = X1&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;MOVZ&lt;/td&gt;
&lt;td class="org-left"&gt;MOVZ Xn,#uimm16{,LSL #pos}&lt;/td&gt;
&lt;td class="org-left"&gt;Xn = LSL(uimm16,pos)&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;MOVN&lt;/td&gt;
&lt;td class="org-left"&gt;MOVN Xn,#uimm16{,LSL #pos}&lt;/td&gt;
&lt;td class="org-left"&gt;Xn = NOT(LSL(uimm16,pos))&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;MOVK&lt;/td&gt;
&lt;td class="org-left"&gt;MOVK Xn,#uimm16{,LSL #pos}&lt;/td&gt;
&lt;td class="org-left"&gt;Xn &amp;lt; pos+15:pos&amp;gt;=uimm16&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;常用地址偏移指令&lt;/li&gt;
&lt;/ul&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;
&lt;caption class="t-above"&gt;&lt;span class="table-number"&gt;Table 7:&lt;/span&gt; 常用地址偏移指令&lt;/caption&gt;

&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;指令&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;示例&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;ADR&lt;/td&gt;
&lt;td class="org-left"&gt;ADR Xn,label&lt;/td&gt;
&lt;td class="org-left"&gt;Xn = PC + label&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;ADRP&lt;/td&gt;
&lt;td class="org-left"&gt;ADRP Xn,label&lt;/td&gt;
&lt;td class="org-left"&gt;base = PC[11:0] = ZERO(12); Xd = base + label;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;常用移位运算指令&lt;/li&gt;
&lt;/ul&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;
&lt;caption class="t-above"&gt;&lt;span class="table-number"&gt;Table 8:&lt;/span&gt; 常用移位运算指令&lt;/caption&gt;

&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;指令&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;示例&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;ASR&lt;/td&gt;
&lt;td class="org-left"&gt;ASR Xd,Xn,#uimm&lt;/td&gt;
&lt;td class="org-left"&gt;算术右移，结果带符号&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;LSL&lt;/td&gt;
&lt;td class="org-left"&gt;LSL Xd,Xn,#uimm&lt;/td&gt;
&lt;td class="org-left"&gt;逻辑左移，移位后寄存器空出的低位补 0&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;LSR&lt;/td&gt;
&lt;td class="org-left"&gt;LSR Xd,Xn,#uimm&lt;/td&gt;
&lt;td class="org-left"&gt;逻辑右移，移位后寄存器空出的高位补 0&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;ROR&lt;/td&gt;
&lt;td class="org-left"&gt;LSR Xd,Xn,#uimm&lt;/td&gt;
&lt;td class="org-left"&gt;循环右移，从右端移除的位将被插入左端空出的位，可理解为“首尾相连”&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;常用加载/存储指令&lt;/li&gt;
&lt;/ul&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;
&lt;caption class="t-above"&gt;&lt;span class="table-number"&gt;Table 9:&lt;/span&gt; 常用加载/存储指令&lt;/caption&gt;

&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;指令&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;示例&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;LDR&lt;/td&gt;
&lt;td class="org-left"&gt;LDR Xn/Wn,addr&lt;/td&gt;
&lt;td class="org-left"&gt;从内存地址 addr 读取 8/4 字节内容到 Xn/Wn 中&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;STR&lt;/td&gt;
&lt;td class="org-left"&gt;STR Xn/Wn,addr&lt;/td&gt;
&lt;td class="org-left"&gt;将 Xn/Wn 写入内存地址 addr&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;LDUR&lt;/td&gt;
&lt;td class="org-left"&gt;LDUR Xn/Wn [base,#simm9]&lt;/td&gt;
&lt;td class="org-left"&gt;从 base + #simm9 地址中读取数据到 Xn/Wn 中，U （Unscaled）表示不需要按字节对齐，取多少就是多少&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;STUR&lt;/td&gt;
&lt;td class="org-left"&gt;STUR Xn/Wn,[base,#simm9]&lt;/td&gt;
&lt;td class="org-left"&gt;将 Xn/Wn 写入 base + #simm9 的内存地址&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;STP&lt;/td&gt;
&lt;td class="org-left"&gt;STP Xn1,Xn2,addr&lt;/td&gt;
&lt;td class="org-left"&gt;将 Xn1 和 Xn2 写入到内存地址 addr 中。P （pair）表示一对，即同时操作两个寄存器&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;LDP&lt;/td&gt;
&lt;td class="org-left"&gt;LDP Xn1,Xn2,addr&lt;/td&gt;
&lt;td class="org-left"&gt;从内存地址 addr 读取数据到 Xn1 和 Xn2 中&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
加载/存储指令都是成对出现，有时也会遇到这些指令的一些扩展，如 LDRB 、LDRSB 等，其含义见下表：
&lt;/p&gt;

&lt;p&gt;
注意：ARM64 开始取消 32 位的 LDM 、STM 、PUSH 、POP 指令。取而代之的是 LDR/LDP 、STR/STP 。ARM64 中对栈的操作是 16 字节对齐的。
&lt;/p&gt;

&lt;p&gt;
内存读写都是往高地址读/写：
&lt;/p&gt;

&lt;p&gt;
STR ：将数据从寄存器中读出来，存到内存中，即压栈；
LDR ：将数据从内存中读出来，放到寄存器中，即出栈。
&lt;/p&gt;

&lt;p&gt;
此 LDR 和 STR 的变种 LDP 和 STP 可以同时操作两个寄存器。
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;
&lt;caption class="t-above"&gt;&lt;span class="table-number"&gt;Table 10:&lt;/span&gt; 加载/存储指令的扩展&lt;/caption&gt;

&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;扩展&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;B&lt;/td&gt;
&lt;td class="org-left"&gt;无符号 8bit&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;SB&lt;/td&gt;
&lt;td class="org-left"&gt;有符号 8bit&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;H&lt;/td&gt;
&lt;td class="org-left"&gt;无符号 16bit&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;SH&lt;/td&gt;
&lt;td class="org-left"&gt;有符号 16bit&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;W&lt;/td&gt;
&lt;td class="org-left"&gt;无符号 32bit&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;SW&lt;/td&gt;
&lt;td class="org-left"&gt;有符号 32bit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
ARM 指令的一个重要特点是可以条件执行，每条 ARM 指令的条件码域包含 4 位条件码，共 16 种。几乎所有指令均根据 CPSR 中条件码的状态和指令条件码域的设置有条件地执行。当指令执行条件满足时，指令被执行，否则被忽略。指令条件码及其助词符后缀见下表：
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-right"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-right"&gt;条件码&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;助记符后缀&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;标志&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-right"&gt;0000&lt;/td&gt;
&lt;td class="org-left"&gt;EQ&lt;/td&gt;
&lt;td class="org-left"&gt;Z 置位&lt;/td&gt;
&lt;td class="org-left"&gt;相等&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;0001&lt;/td&gt;
&lt;td class="org-left"&gt;NE&lt;/td&gt;
&lt;td class="org-left"&gt;Z 清零&lt;/td&gt;
&lt;td class="org-left"&gt;不相等&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;0010&lt;/td&gt;
&lt;td class="org-left"&gt;CS&lt;/td&gt;
&lt;td class="org-left"&gt;C 置位&lt;/td&gt;
&lt;td class="org-left"&gt;无符号数大于或等于&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;0011&lt;/td&gt;
&lt;td class="org-left"&gt;CC&lt;/td&gt;
&lt;td class="org-left"&gt;C 清零&lt;/td&gt;
&lt;td class="org-left"&gt;无符号小于&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;0100&lt;/td&gt;
&lt;td class="org-left"&gt;MI&lt;/td&gt;
&lt;td class="org-left"&gt;N 置位&lt;/td&gt;
&lt;td class="org-left"&gt;负数&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;0101&lt;/td&gt;
&lt;td class="org-left"&gt;PL&lt;/td&gt;
&lt;td class="org-left"&gt;N 清零&lt;/td&gt;
&lt;td class="org-left"&gt;正数或零&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;0110&lt;/td&gt;
&lt;td class="org-left"&gt;VS&lt;/td&gt;
&lt;td class="org-left"&gt;V 置位&lt;/td&gt;
&lt;td class="org-left"&gt;溢出&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;0111&lt;/td&gt;
&lt;td class="org-left"&gt;VC&lt;/td&gt;
&lt;td class="org-left"&gt;V 清零&lt;/td&gt;
&lt;td class="org-left"&gt;未溢出&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;1000&lt;/td&gt;
&lt;td class="org-left"&gt;HI&lt;/td&gt;
&lt;td class="org-left"&gt;C 置位、Z 清零&lt;/td&gt;
&lt;td class="org-left"&gt;无符号数大于&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;1001&lt;/td&gt;
&lt;td class="org-left"&gt;LS&lt;/td&gt;
&lt;td class="org-left"&gt;C 清零、Z 置位&lt;/td&gt;
&lt;td class="org-left"&gt;无符号数小于或等于&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;1010&lt;/td&gt;
&lt;td class="org-left"&gt;GE&lt;/td&gt;
&lt;td class="org-left"&gt;N 等于 V&lt;/td&gt;
&lt;td class="org-left"&gt;带符号数大于或等于&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;1011&lt;/td&gt;
&lt;td class="org-left"&gt;LT&lt;/td&gt;
&lt;td class="org-left"&gt;N 不等于 V&lt;/td&gt;
&lt;td class="org-left"&gt;带符号数小于&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;1100&lt;/td&gt;
&lt;td class="org-left"&gt;GT&lt;/td&gt;
&lt;td class="org-left"&gt;Z 清零且 N==V&lt;/td&gt;
&lt;td class="org-left"&gt;带符号数大于&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;1101&lt;/td&gt;
&lt;td class="org-left"&gt;LE&lt;/td&gt;
&lt;td class="org-left"&gt;Z 置位或 N != V&lt;/td&gt;
&lt;td class="org-left"&gt;带符号数小于或等于&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;1110&lt;/td&gt;
&lt;td class="org-left"&gt;AL&lt;/td&gt;
&lt;td class="org-left"&gt;忽略&lt;/td&gt;
&lt;td class="org-left"&gt;无条件执行&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgc44d768" class="outline-4"&gt;
&lt;h4 id="orgc44d768"&gt;&lt;span class="section-number-4"&gt;0.2.2.&lt;/span&gt; Objective-C&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-0-2-2"&gt;
&lt;p&gt;
Objective-C 中的方法调用是通过消息机制来实现的（即[object method:arg]），X0 寄存器保存对象本身，X1 寄存器保存方法名，从 X2 ~ X7 开始便是参数，其他的参数通过栈传递。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org1828e84" class="outline-4"&gt;
&lt;h4 id="org1828e84"&gt;&lt;span class="section-number-4"&gt;0.2.3.&lt;/span&gt; 工具&lt;/h4&gt;
&lt;/div&gt;

&lt;div id="outline-container-orga875e9b" class="outline-4"&gt;
&lt;h4 id="orga875e9b"&gt;&lt;span class="section-number-4"&gt;0.2.4.&lt;/span&gt; otool 检查应用是否加壳&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-0-2-4"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;otool -l Portal | grep crypt
     cryptoff 16384
    cryptsize 97026048
      cryptid 0
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
如以上输出中 cryptid 字段，cryptid = 1 表示已加壳，cryptid = 0  表示未加壳。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgb21d759" class="outline-4"&gt;
&lt;h4 id="orgb21d759"&gt;&lt;span class="section-number-4"&gt;0.2.5.&lt;/span&gt; 砸壳工具&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-0-2-5"&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;a href="https://github.com/KJCracks/Clutch"&gt;Clutch&lt;/a&gt; （新系统无法使用）&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/MJavad/bfinject"&gt;bfinject&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
CrackerXI
&lt;/p&gt;

&lt;p&gt;
安装方法：在 Cydia 中添加源地址 &lt;a href="http://cydia.iphonecake.com/"&gt;http://cydia.iphonecake.com/&lt;/a&gt; 后搜索安装即可。
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/stefanesser/dumpdecrypted"&gt;dumpdecrypted&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/AloneMonkey/frida-ios-dump"&gt;frida-ios-dump&lt;/a&gt; 现在这个比较好用。&lt;/li&gt;

&lt;li&gt;LLDB 手动脱壳

&lt;ul class="org-ul"&gt;
&lt;li&gt;将应用程序执行文件复制到本地 （可使用scp）&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ scp -P2222 localhost:/var/containers/Bundle/Application/165833F7-4B85-49BB-9EE3-D6EDF4C41995/Charles.app/Charles ./
Charles
&lt;/pre&gt;&lt;/div&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;使用 otool 工具查看该二进制文件的 &lt;code&gt;LC_ENCRYPTION_INFO&lt;/code&gt; 信息：&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$  otool -arch arm64 -l ./Charles | grep -A 4 LC_ENCRYPTION_INFO
          cmd LC_ENCRYPTION_INFO_64
      cmdsize 24
     cryptoff 28672
    cryptsize 4096
      cryptid 1
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
记住如上的 cryptoff 和 cryptsize 的值。
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;p&gt;
在设备启动 debugserver ，使用 LLDB 附加进程，然后获取应用的内存加载地址：
&lt;/p&gt;

&lt;p&gt;
iOS 端：
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;debugserver -x auto 192.168.199.121:12345  /var/containers/Bundle/Application/165833F7-4B85-49BB-9EE3-D6EDF4C41995/Charles.app/Charles
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
电脑端：
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;lldb
(lldb) process connect connect://192.168.199.123:12345
Process 2686 stopped
 thread #1, stop reason = signal SIGSTOP
    frame #0: 0x0000000102a99000 cy-y9Ee3S.dylib`_dyld_start
cy-y9Ee3S.dylib`_dyld_start:
-&amp;gt;  0x102a99000 &amp;lt;+0&amp;gt;:  mov    x28, sp
    0x102a99004 &amp;lt;+4&amp;gt;:  and    sp, x28, #0xfffffffffffffff0
    0x102a99008 &amp;lt;+8&amp;gt;:  mov    x0, #0x0
    0x102a9900c &amp;lt;+12&amp;gt;: mov    x1, #0x0
Target 0: (Charles) stopped.
(lldb) image list -f -o Charles
[  0] /private/var/containers/Bundle/Application/165833F7-4B85-49BB-9EE3-D6EDF4C41995/Charles.app/Charles 0x0000000002694000(0x0000000102694000)
(lldb) memory read 0x0000000102694000+28672 -c 4096 --force --binary -outfile ./CharlesDecrypted
4096 bytes written to 'CharlesDecrypted'
(lldb)
&lt;/pre&gt;&lt;/div&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;p&gt;
修复文件
&lt;/p&gt;

&lt;p&gt;
因为 dump 出来的数据是没有 Mach-O 头部信息，所以需要修复才能使用。将 dump 出来的数据重新写回脱壳前的文件以替换加密的数据即可：
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ dd seek=28672 bs=1 conv=notrunc if=./CharlesDecrypted of=Charles-new
4096+0 records in
4096+0 records out
4096 bytes transferred in 0.009814 secs (417363 bytes/sec)
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
seek 值指明需要在 Charles 的何处开始写入解密后的数据，目标程序只有一个 ARM64 架构，因此架构偏移值是 0 ，28672 是加密数据的偏移值 cryptoff ，两者相加即 seek 的值。
&lt;/p&gt;

&lt;p&gt;
如果目标程序有多个架构，就要先使用 &lt;code&gt;otool -hf&lt;/code&gt; 查看待修复架构的 offset 字段，然后和 cryptoff 相加，即得到 seek 值。
&lt;/p&gt;

&lt;p&gt;
最后一步就是修改加密标记：使用 MachOView 打开修复后的文件，定位到 “LC_ENCRYPTION_INFO_64”，修改 cryptid 的值为 0 即可。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org2c358c8" class="outline-4"&gt;
&lt;h4 id="org2c358c8"&gt;&lt;span class="section-number-4"&gt;0.2.6.&lt;/span&gt; lipo 分离架构&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-0-2-6"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;lipo -info WeChat # 查看目标文件架构
lipo WeChat -thin arm64 -output WeChat_arm64
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org8c3cb71" class="outline-4"&gt;
&lt;h4 id="org8c3cb71"&gt;&lt;span class="section-number-4"&gt;0.2.7.&lt;/span&gt; class-dump 将二进制文件中的类、方法及属性导出为头文件&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-0-2-7"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;class-dump --arch arm64 -a -A -H Portal -o ./Headers/
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org004d543" class="outline-4"&gt;
&lt;h4 id="org004d543"&gt;&lt;span class="section-number-4"&gt;0.2.8.&lt;/span&gt; &lt;a href="http://www.cycript.org/"&gt;Cycript&lt;/a&gt;&lt;/h4&gt;
&lt;/div&gt;

&lt;div id="outline-container-org622adcf" class="outline-4"&gt;
&lt;h4 id="org622adcf"&gt;&lt;span class="section-number-4"&gt;0.2.9.&lt;/span&gt; Reveal 界面分析工具&lt;/h4&gt;
&lt;/div&gt;

&lt;div id="outline-container-org83e5dcf" class="outline-4"&gt;
&lt;h4 id="org83e5dcf"&gt;&lt;span class="section-number-4"&gt;0.2.10.&lt;/span&gt; &lt;a href="https://github.com/FLEXTool/FLEX"&gt;FLEX&lt;/a&gt; 应用内部调试工具&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-0-2-10"&gt;
&lt;p&gt;
为 APP 添加一个悬浮的工具栏，通过其查看和修改视图的层次结构、动态修改类的属性、动态调用补全和方法、动态查看类和框架以及动态修改 UI 等。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org1eb48d3" class="outline-4"&gt;
&lt;h4 id="org1eb48d3"&gt;&lt;span class="section-number-4"&gt;0.2.11.&lt;/span&gt; &lt;a href="https://frida.re/"&gt;Frida&lt;/a&gt; 轻量级 Hook 框架&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-0-2-11"&gt;
&lt;p&gt;
提供了精简的 Python 接口和功能丰富的 JS 接口，除了使用自身的控制台交互以外，还可以利用 Python 将 JS 脚本库注入目标进程。使用 Frida 可以获取进程详细信息、拦截和调用指定函数、注入代码、修改参数、从 iOS 应用程序中 dump 类和类方法信息等。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org3fe0a90" class="outline-4"&gt;
&lt;h4 id="org3fe0a90"&gt;&lt;span class="section-number-4"&gt;0.2.12.&lt;/span&gt; LLDB 调试&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-0-2-12"&gt;
&lt;p&gt;
相关命令
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;
&lt;caption class="t-above"&gt;&lt;span class="table-number"&gt;Table 11:&lt;/span&gt; LLDB 命令&lt;/caption&gt;

&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;命令&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;示例&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;po&lt;/td&gt;
&lt;td class="org-left"&gt;po $x0&lt;/td&gt;
&lt;td class="org-left"&gt;打印 Objective-C 对象&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;x/s&lt;/td&gt;
&lt;td class="org-left"&gt;x/s $x1&lt;/td&gt;
&lt;td class="org-left"&gt;将 x1 寄存器的 C 字符串打印出来&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;p/x&lt;/td&gt;
&lt;td class="org-left"&gt;p/x $x7&lt;/td&gt;
&lt;td class="org-left"&gt;以 16 进制显示寄存器 x7 中的数据&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;p/d&lt;/td&gt;
&lt;td class="org-left"&gt;p/d $x7&lt;/td&gt;
&lt;td class="org-left"&gt;以 10 进制显示寄存器 x7 中的数据&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;p/t&lt;/td&gt;
&lt;td class="org-left"&gt;p/t $x7&lt;/td&gt;
&lt;td class="org-left"&gt;以 2 进制显示寄存器 x7 中的数据&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;register read&lt;/td&gt;
&lt;td class="org-left"&gt;register read $x4&lt;/td&gt;
&lt;td class="org-left"&gt;读取寄存器 x4 中的内容&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;register write&lt;/td&gt;
&lt;td class="org-left"&gt;register write $x4 0&lt;/td&gt;
&lt;td class="org-left"&gt;写寄存器 x4&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;memory read&lt;/td&gt;
&lt;td class="org-left"&gt;memory read $x0&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgdaa3a83" class="outline-4"&gt;
&lt;h4 id="orgdaa3a83"&gt;&lt;span class="section-number-4"&gt;0.2.13.&lt;/span&gt; framework 注入&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-0-2-13"&gt;
&lt;p&gt;
load
&lt;/p&gt;

&lt;p&gt;
两个重要概念
MachO
&lt;/p&gt;

&lt;p&gt;
MachO 介绍：
&lt;/p&gt;

&lt;p&gt;
源码：&lt;a href="https://github.com/apple/darwin-xnu/tree/main/EXTERNAL_HEADERS/mach-o"&gt;https://github.com/apple/darwin-xnu/tree/main/EXTERNAL_HEADERS/mach-o&lt;/a&gt;
格式说明文档：&lt;a href="https://github.com/aidansteele/osx-abi-macho-file-format-reference/blob/master/Mach-O_File_Format.pdf"&gt;https://github.com/aidansteele/osx-abi-macho-file-format-reference/blob/master/Mach-O_File_Format.pdf&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
dyld
&lt;/p&gt;


&lt;p&gt;
代码注入（注意路径）：&lt;a href="https://www.fuqionglin.com/%E6%8A%80%E6%9C%AF/2018/03/16/%E4%BB%A3%E7%A0%81%E6%B3%A8%E5%85%A5.html"&gt;https://www.fuqionglin.com/%E6%8A%80%E6%9C%AF/2018/03/16/%E4%BB%A3%E7%A0%81%E6%B3%A8%E5%85%A5.html&lt;/a&gt;
&lt;/p&gt;


&lt;p&gt;
hook
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;fishhook&lt;/li&gt;
&lt;li&gt;cydia substrate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
crash 分析
&lt;/p&gt;

&lt;p&gt;
lldb image 命令
&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://github.com/facebook/chisel"&gt;chisel&lt;/a&gt; 、&lt;a href="https://github.com/DerekSelander/LLDB"&gt;LLDB&lt;/a&gt; （如 sbt 恢复符号）插件
&lt;/p&gt;


&lt;p&gt;
yololib
&lt;/p&gt;

&lt;p&gt;
optool
&lt;/p&gt;

&lt;p&gt;
砸壳工具：
&lt;/p&gt;


&lt;p&gt;
恢复符号：
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;a href="https://github.com/tobefuturer/restore-symbol"&gt;restore-symbol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;restore block symbol &lt;a href="https://github.com/4ch12dy/xia0LLDB"&gt;https://github.com/4ch12dy/xia0LLDB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
iOS Crash 的监听：&lt;a href="https://www.jianshu.com/p/5e1c60de9c32"&gt;https://www.jianshu.com/p/5e1c60de9c32&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
程序堆是由底部往上增长，栈是由上面往下申请。当堆和栈和撞到一起的时候表示内存用完了，即堆栈溢出。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgc2b763e" class="outline-2"&gt;
&lt;h2 id="orgc2b763e"&gt;&lt;span class="section-number-2"&gt;1.&lt;/span&gt; ida 调试&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;adb forward tcp:23946 tcp:23946
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
参考：
&lt;/p&gt;

&lt;p&gt;
iOS 应用逆向与安全之道，罗巍
&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://jmpews.github.io/2017/08/09/darwin/%E5%8F%8D%E8%B0%83%E8%AF%95%E5%8F%8A%E7%BB%95%E8%BF%87/"&gt;反调试及绕过&lt;/a&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>reverse</category><guid>https://blog.jiya.net/posts/2022/08/reverse-note.html</guid><pubDate>Fri, 05 Aug 2022 14:50:00 GMT</pubDate></item><item><title>iOS 砸壳</title><link>https://blog.jiya.net/posts/2017/05/iOS-dumpdecrypt.html</link><dc:creator>Aaron Ji</dc:creator><description>&lt;div id="outline-container-orgae7a2e0" class="outline-2"&gt;
&lt;h2 id="orgae7a2e0"&gt;方法1 ：使用 dumpdecrypted&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgae7a2e0"&gt;
&lt;p&gt;
砸壳需在应用文档目录下执行故，需要将 &lt;code&gt;dumpdecrypted.dylib&lt;/code&gt; 放到应用文档目录：
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;scp dumpdecrypted.dylib root@192.168.199.104:/var/mobile/Containers/Data/Application/263FF722-78DD-48A9-B6B0-FF9D27E02225/Documents/dumpdecrypted.dylib
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
在应用文档目录下执行如下命令即可：
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/CAAC410E-CEC0-40FB-8B4C-73263867E946/APP.app/APP mach-o decryption dumper
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
最后将数据取出：
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;scp root@192.168.199.104:/var/mobile/Containers/Data/Application/263FF722-78DD-48A9-B6B0-FF9D27E02225/Documents/APP.decrypted APP.decrypted
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;
导出头文件：
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;class-dump -H APP.decrypted -o head
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
获取Bundle identifier： &lt;a href="https://gist.github.com/JeOam/f7a28be21eefa05bfc7f"&gt;https://gist.github.com/JeOam/f7a28be21eefa05bfc7f&lt;/a&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org6bda175" class="outline-2"&gt;
&lt;h2 id="org6bda175"&gt;方法2 ：使用 frida-ios-dump&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org6bda175"&gt;
&lt;p&gt;
参考：&lt;a href="https://github.com/AloneMonkey/frida-ios-dump"&gt;https://github.com/AloneMonkey/frida-ios-dump&lt;/a&gt;
&lt;/p&gt;


&lt;p&gt;
使用 Xcode 编译 tweak 的时候报 Foundation/Foundation.h' file not found 错误，解决方法：
&lt;/p&gt;

&lt;p&gt;
preprocessor macros  增加  XcodeTheos=1 配置即可。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>reverse</category><guid>https://blog.jiya.net/posts/2017/05/iOS-dumpdecrypt.html</guid><pubDate>Sat, 20 May 2017 21:31:45 GMT</pubDate></item></channel></rss>