<?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</title><link>https://blog.jiya.net/</link><description>Log Memo, Log Notes.</description><atom:link href="https://blog.jiya.net/rss.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>Code tag</title><link>https://blog.jiya.net/posts/2023/12/code-tag.html</link><dc:creator>Aaron Ji</dc:creator><description>&lt;ul class="org-ul"&gt;
&lt;li&gt;TODO&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Use TODO to note missing features or functionality that should be added at a later date.
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;p&gt;
FIXME
&lt;/p&gt;

&lt;p&gt;
Use FIXME to note broken code that needs to be fixed.
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;OPTIMIZE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Use OPTIMIZE to note slow or inefficient code that may cause performance problems.
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;HACK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Use HACK to note code smells where questionable coding practices were used and should be refactored away.
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;REVIEW&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Use REVIEW to note anything that should be looked at to confirm it is working as intended.
&lt;/p&gt;

&lt;p&gt;
One advantage of using these tags is that they are easy to search for and give an understanding of where the code can be improved.
&lt;/p&gt;

&lt;p&gt;
reference: &lt;a href="https://gist.github.com/brun0xff/755438491898e8b12999f9492e537e53"&gt;https://gist.github.com/brun0xff/755438491898e8b12999f9492e537e53&lt;/a&gt;
&lt;/p&gt;</description><category>technology</category><guid>https://blog.jiya.net/posts/2023/12/code-tag.html</guid><pubDate>Mon, 18 Dec 2023 05:30:00 GMT</pubDate></item><item><title>PVE 配置</title><link>https://blog.jiya.net/posts/2022/08/pve-config.html</link><dc:creator>Aaron Ji</dc:creator><description>&lt;div id="outline-container-org52e961a" class="outline-2"&gt;
&lt;h2 id="org52e961a"&gt;&lt;span class="section-number-2"&gt;1.&lt;/span&gt; UPS 配置&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;nut-scanner -qNU

[nutdev1]
        driver = "usbhid-ups"
        port = "auto"
        vendorid = "051D"
        productid = "0002"
        product = "Back-UPS BK650M2-CH FW:294803G -292804G"
        serial = "9B2123A10779"
        vendor = "American Power Conversion"
        bus = "003"
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
编辑 &lt;code&gt;/etc/nut/ups.conf&lt;/code&gt; 文件，在文件最后增加：
&lt;/p&gt;

&lt;p&gt;
参考：&lt;a href="https://www.cnblogs.com/LandWind/articles/pve-nut-config.html"&gt;https://www.cnblogs.com/LandWind/articles/pve-nut-config.html&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
CPU 降频，编辑 /etc/default/cpufrequtils 文件，修改为如下：
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;ENABLE="true"
GOVERNOR="powersave"
MAX_SPEED="1.2"
MIN_SPEED="1.2GHz"
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;
/etc/network/interfaces
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;# network interface settings; autogenerated
# Please do NOT modify this file directly, unless you know what
# you're doing.
#
# If you want to manage parts of the network configuration manually,
# please utilize the 'source' or 'source-directory' directives to do
# so.
# PVE will preserve these directives, but will NOT read its network
# configuration from sourced files, so do not attempt to move any of
# the PVE managed interfaces into external files!

auto lo
iface lo inet loopback

auto eno1
iface eno1 inet manual

auto vmbr0
iface vmbr0 inet static
        address 192.168.199.111/24
        gateway 192.168.199.252
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 2-4094

auto vmbr0.43
iface vmbr0.43 inet manual

auto vmbr1
iface vmbr1 inet manual
        bridge-ports vmbr0.43
        bridge-stp off
        bridge-fd 0
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orge2805a0" class="outline-2"&gt;
&lt;h2 id="orge2805a0"&gt;&lt;span class="section-number-2"&gt;2.&lt;/span&gt; dns&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;
&lt;p&gt;
新增文件：/lib/systemd/system/  ，内容如下：
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[Unit]
Description=Tencent DNS Service
After=network.target
StartLimitIntervalSec=500
StartLimitBurst=5

[Service]
Type=simple
# User=nobody
# Group=nobody
LimitNOFILE=32768
ExecStart=/usr/local/bin/tencent-dns
# PIDFile=/run/tencent-dns.pid
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=tencent-dns
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
将 tencent-dns 文件放至指定目录：
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mv tencent-dns /usr/local/bin/tencent-dns
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgea77f7b" class="outline-2"&gt;
&lt;h2 id="orgea77f7b"&gt;&lt;span class="section-number-2"&gt;3.&lt;/span&gt; 更新源&lt;/h2&gt;
&lt;/div&gt;

&lt;div id="outline-container-org988dffc" class="outline-2"&gt;
&lt;h2 id="org988dffc"&gt;&lt;span class="section-number-2"&gt;4.&lt;/span&gt; 风扇配置&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-4"&gt;
&lt;p&gt;
如果风扇不降速，声音非常响，常人是无法忍受的，因此需要通过 IPMI 将风扇降速。使用 &lt;code&gt;crontab -e&lt;/code&gt; 新增如下项目：
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;@reboot echo "powersave" | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor &amp;gt;/dev/null 2&amp;gt;&amp;amp;1
@reboot /usr/bin/ipmitool raw 0x30 0x70 0x66 0x01 0x00 0x3c
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;
&lt;i&gt;etc/apt/sources.list.d&lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;
/etc/apt/sources.list
&lt;/p&gt;

&lt;p&gt;
apt update
&lt;/p&gt;

&lt;p&gt;
apt update &amp;amp;&amp;amp; apt dist-upgrade -y
&lt;/p&gt;


&lt;p&gt;
apt-get -y install apcupsd
&lt;/p&gt;


&lt;p&gt;
apt install -y  ipmitool
&lt;/p&gt;


&lt;p&gt;
邮箱配置：
&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://fcying.com/proxmox-use-qqmail-sendmail-14589/"&gt;https://fcying.com/proxmox-use-qqmail-sendmail-14589/&lt;/a&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>nas</category><guid>https://blog.jiya.net/posts/2022/08/pve-config.html</guid><pubDate>Tue, 23 Aug 2022 14:37:00 GMT</pubDate></item><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>Install Clash as Gateway on AlmaLinux</title><link>https://blog.jiya.net/posts/2022/05/install-clash-as-gateway-on-almalinux.html</link><dc:creator>Aaron Ji</dc:creator><description>&lt;p&gt;
这两天本来想升级下 OpenWRT 系统，没想到升级到新版本后有一些问题（后来发现应该是 AdGuardHome 的问题），而且在调教 Clash 配置的时候发现 OpenWRT 非常不友好的不能按照我所想的修改配置文件，即界面修改不能生效，于是决定使用类 RHEL 系统（本文使用 AlmaLinux 配置一下）。
&lt;/p&gt;
&lt;div id="outline-container-org0c9dcc4" class="outline-2"&gt;
&lt;h2 id="org0c9dcc4"&gt;&lt;span class="section-number-2"&gt;1.&lt;/span&gt; Clash 配置&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgf4429c1" class="outline-3"&gt;
&lt;h3 id="orgf4429c1"&gt;&lt;span class="section-number-3"&gt;1.1.&lt;/span&gt; 首先从 Clash 首页下载执行文件并放至执行文件目录&lt;/h3&gt;
&lt;/div&gt;
&lt;div id="outline-container-org336a78c" class="outline-3"&gt;
&lt;h3 id="org336a78c"&gt;&lt;span class="section-number-3"&gt;1.2.&lt;/span&gt; 配置启动 &lt;code&gt;service&lt;/code&gt; 文件&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-1-2"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;vi /etc/systemd/system/clash.service
&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;[Unit]
Description=Clash daemon, A rule-based proxy in Go.
After=network.target

[Service]
Type=simple
Restart=always
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/local/bin/clash -d /etc/clash

StandardOutput=file:/var/log/clash/clash.out
StandardError=file:/var/log/clash/clash.err

[Install]
WantedBy=multi-user.target
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org6e8d8f3" class="outline-3"&gt;
&lt;h3 id="org6e8d8f3"&gt;&lt;span class="section-number-3"&gt;1.3.&lt;/span&gt; 将 Clash 的配置文件放至 &lt;code&gt;/etc/clash&lt;/code&gt; 目录下&lt;/h3&gt;
&lt;/div&gt;

&lt;div id="outline-container-org9c7a651" class="outline-3"&gt;
&lt;h3 id="org9c7a651"&gt;&lt;span class="section-number-3"&gt;1.4.&lt;/span&gt; 配置防火墙&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-1-4"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo firewall-cmd --permanent --direct --add-chain ipv4 nat clash
sudo firewall-cmd --permanent --direct --add-rule ipv4 nat clash 1 -d 0.0.0.0/8 -j RETURN
sudo firewall-cmd --permanent --direct --add-rule ipv4 nat clash 1 -d 10.0.0.0/8 -j RETURN
sudo firewall-cmd --permanent --direct --add-rule ipv4 nat clash 1 -d 127.0.0.0/8 -j RETURN
sudo firewall-cmd --permanent --direct --add-rule ipv4 nat clash 1 -d 169.254.0.0/16 -j RETURN
sudo firewall-cmd --permanent --direct --add-rule ipv4 nat clash 1 -d 172.16.0.0/12 -j RETURN
sudo firewall-cmd --permanent --direct --add-rule ipv4 nat clash 1 -d 192.168.0.0/16 -j RETURN
sudo firewall-cmd --permanent --direct --add-rule ipv4 nat clash 1 -d 224.0.0.0/4 -j RETURN
sudo firewall-cmd --permanent --direct --add-rule ipv4 nat clash 1 -d 240.0.0.0/4 -j RETURN
sudo firewall-cmd --permanent --direct --add-rule ipv4 nat clash 2 -p tcp -j REDIRECT --to-ports "7892"
sudo firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -p tcp -j clash

# 使用 Clash DNS 切非 53 端口时需要，本文使用 AdGuard Home 作为 DNS 服务，故不需要进行如下配置
sudo firewall-cmd --permanent --direct --add-chain ipv4 nat CLASH_DNS
sudo firewall-cmd --permanent --direct --remove-rules ipv4 nat CLASH_DNS
sudo firewall-cmd --permanent --direct --add-rule ipv4 nat CLASH_DNS 1 -p udp -j REDIRECT --to-port 1053
sudo firewall-cmd --permanent --direct --add-rule ipv4 nat OUTPUT 0 -p udp --dport 53 -j CLASH_DNS
sudo firewall-cmd --permanent --direct --add-rule ipv4 nat CLASH_DNS 1 -p tcp -j REDIRECT --to-port 1053
sudo firewall-cmd --permanent --direct --add-rule ipv4 nat OUTPUT 0 -p tcp --dport 53 -j CLASH_DNS

 sudo firewall-cmd --reload
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
处理后的 firewall 配置文件（/etc/firewalld/direct.xml）如下所示：
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;direct&amp;gt;
  &amp;lt;chain ipv="ipv4" table="nat" chain="clash"/&amp;gt;
  &amp;lt;chain ipv="ipv4" table="nat" chain="CLASH_DNS"/&amp;gt;
  &amp;lt;rule ipv="ipv4" table="nat" chain="clash" priority="1"&amp;gt;-d 0.0.0.0/8 -j RETURN&amp;lt;/rule&amp;gt;
  &amp;lt;rule ipv="ipv4" table="nat" chain="clash" priority="1"&amp;gt;-d 10.0.0.0/8 -j RETURN&amp;lt;/rule&amp;gt;
  &amp;lt;rule ipv="ipv4" table="nat" chain="clash" priority="1"&amp;gt;-d 127.0.0.0/8 -j RETURN&amp;lt;/rule&amp;gt;
  &amp;lt;rule ipv="ipv4" table="nat" chain="clash" priority="1"&amp;gt;-d 169.254.0.0/16 -j RETURN&amp;lt;/rule&amp;gt;
  &amp;lt;rule ipv="ipv4" table="nat" chain="clash" priority="1"&amp;gt;-d 172.16.0.0/12 -j RETURN&amp;lt;/rule&amp;gt;
  &amp;lt;rule ipv="ipv4" table="nat" chain="clash" priority="1"&amp;gt;-d 192.168.0.0/16 -j RETURN&amp;lt;/rule&amp;gt;
  &amp;lt;rule ipv="ipv4" table="nat" chain="clash" priority="1"&amp;gt;-d 224.0.0.0/4 -j RETURN&amp;lt;/rule&amp;gt;
  &amp;lt;rule ipv="ipv4" table="nat" chain="clash" priority="1"&amp;gt;-d 240.0.0.0/4 -j RETURN&amp;lt;/rule&amp;gt;
  &amp;lt;rule ipv="ipv4" table="nat" chain="clash" priority="2"&amp;gt;-p tcp -j REDIRECT --to-ports 7892&amp;lt;/rule&amp;gt;
  &amp;lt;rule ipv="ipv4" table="nat" chain="PREROUTING" priority="0"&amp;gt;-p tcp -j clash&amp;lt;/rule&amp;gt;
  &amp;lt;rule ipv="ipv4" table="nat" chain="CLASH_DNS" priority="1"&amp;gt;-p udp -j REDIRECT --to-port 1053&amp;lt;/rule&amp;gt;
  &amp;lt;rule ipv="ipv4" table="nat" chain="CLASH_DNS" priority="1"&amp;gt;-p tcp -j REDIRECT --to-port 1053&amp;lt;/rule&amp;gt;
  &amp;lt;rule ipv="ipv4" table="nat" chain="OUTPUT" priority="0"&amp;gt;-p udp --dport 53 -j CLASH_DNS&amp;lt;/rule&amp;gt;
  &amp;lt;rule ipv="ipv4" table="nat" chain="OUTPUT" priority="0"&amp;gt;-p tcp --dport 53 -j CLASH_DNS&amp;lt;/rule&amp;gt;
&amp;lt;/direct&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgbb7c2b3" class="outline-2"&gt;
&lt;h2 id="orgbb7c2b3"&gt;&lt;span class="section-number-2"&gt;2.&lt;/span&gt; AdGuard Home 配置&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;
&lt;p&gt;
附 AdGuard Home &lt;code&gt;service&lt;/code&gt; 文件 &lt;code&gt;/etc/systemd/system/AdGuardHome.service&lt;/code&gt; ：
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[Unit]
Description=AdGuard Home: Network-level blocker
ConditionFileIsExecutable=/opt/AdGuardHome/AdGuardHome

After=syslog.target network-online.target

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStartPre=/bin/mkdir -p /var/log/
# ExecStart=/opt/AdGuardHome/AdGuardHome "-s" "run"
ExecStart=/opt/AdGuardHome/AdGuardHome  -c /etc/AdGuardHome/AdGuardHome.yaml

WorkingDirectory=/opt/AdGuardHome


StandardOutput=file:/var/log/AdGuardHome/AdGuardHome.out
StandardError=file:/var/log/AdGuardHome/AdGuardHome.err

Restart=always

RestartSec=10
EnvironmentFile=-/etc/sysconfig/AdGuardHome

[Install]
WantedBy=multi-user.target
&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;sudo firewall-cmd --zone=public --add-port=53/udp --permanent
sudo firewall-cmd --zone=public --add-port=53/tcp --permanent
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org69e4013" class="outline-2"&gt;
&lt;h2 id="org69e4013"&gt;&lt;span class="section-number-2"&gt;3.&lt;/span&gt; v2ray 配置&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-3"&gt;
&lt;p&gt;
附 v2ray &lt;code&gt;service&lt;/code&gt; 配置文件（/etc/systemd/system/v2ray.service）内容：
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[Unit]
Description=V2Ray Service
Documentation=https://www.v2fly.org/
After=network.target nss-lookup.target
StartLimitIntervalSec=500
StartLimitBurst=5

[Service]
User=nobody
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ExecStart=/opt/v2ray/v2ray -config /etc/v2ray/config.json
Restart=on-failure
RestartSec=5s
RestartPreventExitStatus=23

[Install]
WantedBy=multi-user.target
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
本文中的 DNS 结构如下所示：
&lt;/p&gt;

&lt;p&gt;
客户端 -&amp;gt; AdGuard Home -&amp;gt; Clash -&amp;gt; Other DNS
&lt;/p&gt;

&lt;p&gt;
即 AdGuard Home 中的 DNS Upstream 只配置了 Clash 的地址。
&lt;/p&gt;

&lt;p&gt;
部分内容参考自网络。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>clash</category><guid>https://blog.jiya.net/posts/2022/05/install-clash-as-gateway-on-almalinux.html</guid><pubDate>Mon, 02 May 2022 14:20:00 GMT</pubDate></item><item><title>Install Nextcloud and apps</title><link>https://blog.jiya.net/posts/2022/04/install-nextcloud-and-apps.html</link><dc:creator>Aaron Ji</dc:creator><description>&lt;div id="outline-container-orgf3c343e" class="outline-2"&gt;
&lt;h2 id="orgf3c343e"&gt;docker-compose&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgf3c343e"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;version: '2'

services:
  db:
    image: mariadb
    restart: always
    ports:
      - 3300:3306
    command: --innodb-read-only-compressed=OFF --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_PASSWORD=password
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  app:
    image: nextcloud:fpm
    restart: always
    links:
      - db
    volumes:
      - ./app:/var/www/html
      - ./fonts:/usr/share/fonts
    environment:
      - MYSQL_PASSWORD=password
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db

  web:
    image: nginx
    restart: always
    ports:
      - 8081:80
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orge9c09af" class="outline-2"&gt;
&lt;h2 id="orge9c09af"&gt;Apps&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orge9c09af"&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgdc1c9a5" class="outline-3"&gt;
&lt;h3 id="orgdc1c9a5"&gt;&lt;a href="https://apps.nextcloud.com/apps/files_markdown"&gt;Markdown Editor&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;

&lt;div id="outline-container-org6f29304" class="outline-3"&gt;
&lt;h3 id="org6f29304"&gt;&lt;a href="https://apps.nextcloud.com/apps/files_texteditor"&gt;Plain text editor&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;

&lt;div id="outline-container-org21c4fc0" class="outline-3"&gt;
&lt;h3 id="org21c4fc0"&gt;&lt;a href="https://apps.nextcloud.com/apps/drawio"&gt;Draw.io&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;

&lt;div id="outline-container-org2328cc3" class="outline-3"&gt;
&lt;h3 id="org2328cc3"&gt;&lt;a href="https://apps.nextcloud.com/apps/richdocuments"&gt;Nextcloud Office&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;

&lt;div id="outline-container-org10dc06c" class="outline-3"&gt;
&lt;h3 id="org10dc06c"&gt;&lt;a href="https://apps.nextcloud.com/apps/richdocumentscode"&gt;Collabora Online - Built-in CODE Server&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;

&lt;div id="outline-container-orge825c29" class="outline-3"&gt;
&lt;h3 id="orge825c29"&gt;&lt;del&gt;&lt;a href="https://apps.nextcloud.com/apps/onlyoffice"&gt;ONLYOFFICE&lt;/a&gt;&lt;/del&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>nextcloud</category><guid>https://blog.jiya.net/posts/2022/04/install-nextcloud-and-apps.html</guid><pubDate>Fri, 08 Apr 2022 04:10:00 GMT</pubDate></item><item><title>Deploy Jenkins With docker-compose</title><link>https://blog.jiya.net/posts/2022/03/deploy-jenkins-with-docker-compose.html</link><dc:creator>Aaron Ji</dc:creator><description>&lt;p&gt;
The docker-compose yaml file as follows:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;---
version: '3'

services:
  jenkins:
    image: jenkins/jenkins:lts-jdk11
    privileged: true
    user: root
    restart: always
    ports:
      - 50000:50000
      - 8088:8080 # local port is 8088, container port is 8080
    volumes:
      - /data/work/jenkins/jenkins_home:/var/jenkins_home
    container_name: jenkins
    networks:
      jenkins:
        ipv4_address: 172.16.128.2
    environment:
      - TZ=Asia/Shanghai

  centos6:
     image: centos6-i386:20220321
     container_name: centos6-i386
     restart: always
     expose:
      - "22"
     networks:
       jenkins:
          ipv4_address: 172.16.128.6
     command: /bin/bash -c '/usr/sbin/sshd -D &amp;amp;&amp;amp; /bin/bash'
     volumes:
       - /data/work/jenkins/centos6-i386/home/centos:/home/centos

  centos7:
    image: centos7:20220321
    container_name: centos7
    restart: always
    expose:
      - "22"
    networks:
      jenkins:
        ipv4_address: 172.16.128.7
    command: /bin/bash -c '/usr/sbin/sshd -D &amp;amp;&amp;amp; /bin/bash'
    volumes:
      - /data/work/jenkins/centos7/home/centos:/home/centos

networks:
  jenkins:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.16.128.0/24
          gateway: 172.16.128.1
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Since the slave nodes, &lt;code&gt;centos6&lt;/code&gt; and &lt;code&gt;centos7&lt;/code&gt; container's image is migrated from another host, and some issues occurred during the migration, the solution logged at  &lt;a href="https://blog.jiya.net/posts/2021/04/docker-note.html#migrate-container-from-a-host-to-another-host"&gt;Docker Note&lt;/a&gt; .
&lt;/p&gt;</description><category>jenkins</category><guid>https://blog.jiya.net/posts/2022/03/deploy-jenkins-with-docker-compose.html</guid><pubDate>Mon, 28 Mar 2022 05:27:00 GMT</pubDate></item><item><title>批量删除 jumpserver 节点</title><link>https://blog.jiya.net/posts/2022/03/jumpserver-delete-nodes-in-bulk.html</link><dc:creator>Aaron Ji</dc:creator><description>&lt;p&gt;
由于 jumpserver 中删除节点只能一部分一部分的删除，无法进行大量批量删除，分析后发现 jumpserver 中节点相关信息主要存储在以下数据表中：
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
assets_authbook
&lt;/p&gt;

&lt;p&gt;
assets_asset_nodes
&lt;/p&gt;

&lt;p&gt;
assets_historicalauthbook
&lt;/p&gt;

&lt;p&gt;
ops_adhoc_hosts
&lt;/p&gt;

&lt;p&gt;
ops_commandexecution_hosts
&lt;/p&gt;

&lt;p&gt;
perms_assetpermission_assets
&lt;/p&gt;

&lt;p&gt;
assets_asset
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
因此，若想批量删除节点，则需要删除这些节点中的对应节点的数据。
&lt;/p&gt;

&lt;p&gt;
首先，使用 SQL 命令拼组删除命令（除 &lt;code&gt;assets_asset&lt;/code&gt; 表）：
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;CONCAT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s1"&gt;'delete from assets_asset_nodes where asset_id =\'',&lt;/span&gt;
&lt;span class="s1"&gt;                `id`,&lt;/span&gt;
&lt;span class="s1"&gt;                '&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s1"&gt;';'&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;CONCAT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s1"&gt;'delete from ops_commandexecution_hosts where asset_id =\'',&lt;/span&gt;
&lt;span class="s1"&gt;                `id`,&lt;/span&gt;
&lt;span class="s1"&gt;                '&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s1"&gt;';'&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;CONCAT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s1"&gt;'delete from assets_authbook where asset_id =\'',&lt;/span&gt;
&lt;span class="s1"&gt;                `id`,&lt;/span&gt;
&lt;span class="s1"&gt;                '&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s1"&gt;';'&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;CONCAT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s1"&gt;'delete from assets_asset_nodes where asset_id =\'',&lt;/span&gt;
&lt;span class="s1"&gt;                `id`,&lt;/span&gt;
&lt;span class="s1"&gt;                '&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s1"&gt;';'&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;CONCAT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s1"&gt;'delete from assets_historicalauthbook where asset_id =\'',&lt;/span&gt;
&lt;span class="s1"&gt;                `id`,&lt;/span&gt;
&lt;span class="s1"&gt;                '&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s1"&gt;';'&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;CONCAT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s1"&gt;'delete from ops_adhoc_hosts where asset_id =\'',&lt;/span&gt;
&lt;span class="s1"&gt;                `id`,&lt;/span&gt;
&lt;span class="s1"&gt;                '&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s1"&gt;';'&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;CONCAT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="s1"&gt;'delete from perms_assetpermission_assets where asset_id =\'',&lt;/span&gt;
&lt;span class="s1"&gt;                `id`,&lt;/span&gt;
&lt;span class="s1"&gt;                '&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s1"&gt;';'&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;assets_asset&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'%192.168.199%'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
然后执行得到的 &lt;code&gt;SQL&lt;/code&gt; 语句。
&lt;/p&gt;

&lt;p&gt;
最后再删除 &lt;code&gt;assets_asset&lt;/code&gt; 表中的数据。
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;assets_asset&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;LIKE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'%192.168.199%'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
最后发现 WEB 终端更新的服务器数量还是原来的数量，点刷新没有作用，此时需要修改 &lt;code&gt;assets_node&lt;/code&gt; 表中的参数使数值变化。
&lt;/p&gt;

&lt;p&gt;
此外，还可以使用 JumpServer 服务 API 执行删除节点操作，详见&lt;a href="https://docs.jumpserver.org/zh/master/dev/rest_api/"&gt;JumpServer API&lt;/a&gt;。
&lt;/p&gt;

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

&lt;p&gt;
&lt;a href="https://blog.csdn.net/madman163/article/details/115579814"&gt;https://blog.csdn.net/madman163/article/details/115579814&lt;/a&gt;
&lt;/p&gt;</description><category>jumperserver</category><guid>https://blog.jiya.net/posts/2022/03/jumpserver-delete-nodes-in-bulk.html</guid><pubDate>Mon, 28 Mar 2022 03:42:00 GMT</pubDate></item><item><title>Effective tools for improving productivity</title><link>https://blog.jiya.net/posts/2022/03/best-productivity-tools.html</link><dc:creator>Aaron Ji</dc:creator><description>&lt;div id="outline-container-orgcc66052" class="outline-2"&gt;
&lt;h2 id="orgcc66052"&gt;macOS&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgcc66052"&gt;
&lt;/div&gt;
&lt;div id="outline-container-org9481206" class="outline-3"&gt;
&lt;h3 id="org9481206"&gt;&lt;a href="https://www.devontechnologies.com/apps/devonthink"&gt;DEVONthink&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org9481206"&gt;
&lt;p&gt;
macOS 平台下的资料管理神器，支持 OCR 及全文搜索，科研必备。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org57ae277" class="outline-3"&gt;
&lt;h3 id="org57ae277"&gt;&lt;a href="https://www.alfredapp.com/"&gt;Alfred&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org57ae277"&gt;
&lt;p&gt;
macOS 最强启动器，支持快捷键快速启动，然后输入命令执行相关命令或查找文件、启动应用等。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgdf15864" class="outline-3"&gt;
&lt;h3 id="orgdf15864"&gt;&lt;a href="https://sw.kovidgoyal.net/kitty/"&gt;Kitty&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orgdf15864"&gt;
&lt;p&gt;
轻量级终端，非常简洁，对 &lt;code&gt;tmux&lt;/code&gt; 也非常友好。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org41d51d8" class="outline-3"&gt;
&lt;h3 id="org41d51d8"&gt;&lt;a href="https://wezfurlong.org/wezterm/index.html"&gt;WezTerm&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org41d51d8"&gt;
&lt;p&gt;
基于 Rust 实现的跨平台终端，主要配置使用 Lua 语言，可以自定义 tabbar 等样式及其他属性，定制化非常强。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org0544ec3" class="outline-3"&gt;
&lt;h3 id="org0544ec3"&gt;&lt;a href="https://keepassxc.org/"&gt;KeePassXC&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org0544ec3"&gt;
&lt;p&gt;
开源 &lt;a href="https://keepass.info/"&gt;keepass&lt;/a&gt; 客户端，还支持 Windows 、Linux 平台 ，并且有 Chrome 、Firefox 等浏览器插件，方便快速提交对应站点密码。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org5468966" class="outline-3"&gt;
&lt;h3 id="org5468966"&gt;&lt;a href="https://github.com/jgraph/drawio-desktop/releases"&gt;draw.io&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org5468966"&gt;
&lt;p&gt;
开源画图工具，可以画流程图、时序图等。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgde4273d" class="outline-3"&gt;
&lt;h3 id="orgde4273d"&gt;&lt;a href="https://onmyway133.com/pastepal/"&gt;PastePal&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orgde4273d"&gt;
&lt;p&gt;
剪切板管理工具，支持买断，非常好用，同时还支持 iOS 。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org0c1342f" class="outline-3"&gt;
&lt;h3 id="org0c1342f"&gt;&lt;a href="https://www.jumpdesktop.com"&gt;JumpDesktop&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org0c1342f"&gt;
&lt;p&gt;
远程管理工具，支持 &lt;code&gt;VNC&lt;/code&gt; 、 &lt;code&gt;RDP&lt;/code&gt; 等，还支持 &lt;code&gt;SSH&lt;/code&gt; 代理等，速度比较快，而且远程进去后快捷键也能使用。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org20e9840" class="outline-3"&gt;
&lt;h3 id="org20e9840"&gt;&lt;a href="https://www.hammerspoon.org/"&gt;Hammerspoon&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org20e9840"&gt;
&lt;p&gt;
macOS 下自动化程序，极大提升效率，主要通过 &lt;code&gt;Lua&lt;/code&gt; 脚本控制系统，比如输入法自动切换、快捷操作、与 Emacs 结合实现事项管理（在菜单栏显示事项）等。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org3bb1193" class="outline-3"&gt;
&lt;h3 id="org3bb1193"&gt;&lt;a href="https://activitywatch.net/"&gt;Activity Watch&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org3bb1193"&gt;
&lt;p&gt;
统计电脑活动详细信息，并且有详细的统计页面展示，还支持 Windows 等，可以安装浏览器插件，这样能分析浏览器浏览信息。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org84dd7e3" class="outline-3"&gt;
&lt;h3 id="org84dd7e3"&gt;&lt;a href="https://pilotmoon.com/popclip/"&gt;PopClip&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org84dd7e3"&gt;
&lt;p&gt;
快捷菜单，可以快速执行如复制、粘贴、查询等工作。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orga094d35" class="outline-3"&gt;
&lt;h3 id="orga094d35"&gt;&lt;a href="https://filezilla-project.org/"&gt;FileZilla&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orga094d35"&gt;
&lt;p&gt;
SFTP 连接工具，上传、下载非常方便，支持书签功能。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgb112ee5" class="outline-3"&gt;
&lt;h3 id="orgb112ee5"&gt;&lt;a href="https://shottr.cc"&gt;Shottr&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orgb112ee5"&gt;
&lt;p&gt;
轻量级截图工具。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgc91073a" class="outline-3"&gt;
&lt;h3 id="orgc91073a"&gt;&lt;a href="https://firecore.com/infuse"&gt;Infuse&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orgc91073a"&gt;
&lt;p&gt;
苹果全平台最强原盘播放器，PT 下载必备。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org90fc0e2" class="outline-3"&gt;
&lt;h3 id="org90fc0e2"&gt;&lt;a href="https://www.marginnote.com/"&gt;MarginNote&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org90fc0e2"&gt;
&lt;p&gt;
电子书阅读器，支持 PDF 、EPUB 等格式，方便记笔记、回顾等。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orga7d0b44" class="outline-3"&gt;
&lt;h3 id="orga7d0b44"&gt;&lt;a href="https://notmuchmail.org/"&gt;Notmuch&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orga7d0b44"&gt;
&lt;p&gt;
基于 &lt;a href="https://xapian.org/"&gt;Xapian&lt;/a&gt; 的邮件管理系统，使用 &lt;code&gt;tag&lt;/code&gt; 管理邮件，搜索非常快速，有 Emacs 、VIM 等客户端。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org016efcc" class="outline-3"&gt;
&lt;h3 id="org016efcc"&gt;&lt;a href="https://www.mozilla.org/en-US/firefox/"&gt;Firefox&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org016efcc"&gt;
&lt;p&gt;
浏览器，推荐下载官方原版。
&lt;/p&gt;
&lt;/div&gt;
&lt;div id="outline-container-org429e5ef" class="outline-4"&gt;
&lt;h4 id="org429e5ef"&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/surfingkeys_ff/"&gt;Surfingkeys 插件&lt;/a&gt;&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org429e5ef"&gt;
&lt;p&gt;
可以像操作 &lt;code&gt;VIM&lt;/code&gt; 一样操作浏览器。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgfb75df7" class="outline-3"&gt;
&lt;h3 id="orgfb75df7"&gt;Power JSON Editor&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orgfb75df7"&gt;
&lt;p&gt;
&lt;code&gt;JSON&lt;/code&gt; 编辑器，方便格式化和压缩 &lt;code&gt;JSON&lt;/code&gt; 。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org26b4c8d" class="outline-2"&gt;
&lt;h2 id="org26b4c8d"&gt;iOS&lt;/h2&gt;
&lt;/div&gt;

&lt;div id="outline-container-org2e4f3c4" class="outline-2"&gt;
&lt;h2 id="org2e4f3c4"&gt;Others&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org2e4f3c4"&gt;
&lt;/div&gt;
&lt;div id="outline-container-org1754ed4" class="outline-3"&gt;
&lt;h3 id="org1754ed4"&gt;&lt;a href="https://lftp.yar.ru/lftp-man.html"&gt;lftp&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org1754ed4"&gt;
&lt;p&gt;
另类文件传输工具，支持 FTP 、SFTP 、HTTP 等协议，方便通过命令快速将本地文件传输到远端或者将远端数据同步到本地。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org9fcb473" class="outline-3"&gt;
&lt;h3 id="org9fcb473"&gt;&lt;a href="https://github.com/nicm/fdm"&gt;fdm&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org9fcb473"&gt;
&lt;p&gt;
邮件同步工具，方便将邮件从邮件服务端下载/同步到本地，可结合 Notmuch 使用。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org4fc7fdc" class="outline-3"&gt;
&lt;h3 id="org4fc7fdc"&gt;&lt;a href="https://beancount.github.io/docs/"&gt;Beancount&lt;/a&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org4fc7fdc"&gt;
&lt;p&gt;
复式记帐工具。
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgfd29d29" class="outline-2"&gt;
&lt;h2 id="orgfd29d29"&gt;Emacs&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgfd29d29"&gt;
&lt;/div&gt;
&lt;div id="outline-container-orgbd53639" class="outline-3"&gt;
&lt;h3 id="orgbd53639"&gt;org-mode&lt;/h3&gt;
&lt;/div&gt;
&lt;div id="outline-container-org6a9ac9c" class="outline-3"&gt;
&lt;h3 id="org6a9ac9c"&gt;magit&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org6a9ac9c"&gt;
&lt;/div&gt;
&lt;div id="outline-container-org2006fdb" class="outline-4"&gt;
&lt;h4 id="org2006fdb"&gt;magit-gitflow&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>effective</category><category>productivity</category><guid>https://blog.jiya.net/posts/2022/03/best-productivity-tools.html</guid><pubDate>Sat, 12 Mar 2022 05:00:00 GMT</pubDate></item><item><title>Unset SSH_AUTH_SOCK to workaround ssh agents issues</title><link>https://blog.jiya.net/posts/2022/01/unset-ssh-auth-sock.html</link><dc:creator>Aaron Ji</dc:creator><description>&lt;p&gt;
Today, a issue occured with my MacBook that ssh hanged at &lt;code&gt;rekey after 134217728 blocks&lt;/code&gt;, it seems that something wrong with ssh(ssh agent).
&lt;/p&gt;

&lt;p&gt;
After search on the internet, I noticed that the openssh I use is version 8.8p1, and macports has dropped the support for dropped support for launchd in ssh-agent. Then can unset &lt;code&gt;SSH_AUTH_SOCK&lt;/code&gt; environment variable to workaround with this issue.
&lt;/p&gt;

&lt;p&gt;
Another solution can use gpg-agent work as ssh-agent,see &lt;a href="https://jms1.net/yubikey/make-ssh-use-gpg-agent.md"&gt;Make SSH use gpg-agent&lt;/a&gt;.
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;a href="https://trac.macports.org/ticket/61888"&gt;openssh-8.4p1 dropped support for launchd in ssh-agent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/26258157/disable-sshagent-with-command-line-option"&gt;Disable SSHAgent with command line option&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bugs.launchpad.net/ubuntu/+source/qtcreator-plugin-ubuntu/+bug/1431370"&gt;Unset SSH_AUTH_SOCK to workaround ssh agents issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>ssh</category><guid>https://blog.jiya.net/posts/2022/01/unset-ssh-auth-sock.html</guid><pubDate>Sun, 02 Jan 2022 17:03:00 GMT</pubDate></item><item><title>Enable sudo touch id on macOS</title><link>https://blog.jiya.net/posts/2021/12/macos-enable-touchid.html</link><dc:creator>Aaron Ji</dc:creator><description>&lt;div id="outline-container-orga51eb13" class="outline-2"&gt;
&lt;h2 id="orga51eb13"&gt;edit &lt;code&gt;/etc/pam.d/sudo&lt;/code&gt; file, put follow text at the beginning of the file.&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orga51eb13"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;auth sufficient pam_tid.so
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Now, you can use touchid instead of password in normal terminal.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org82bb530" class="outline-2"&gt;
&lt;h2 id="org82bb530"&gt;if you want to use touchid with tmux, you should also install &lt;a href="https://github.com/fabianishere/pam_reattach"&gt;pam_reattach&lt;/a&gt; module.&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org82bb530"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;git clone https://github.com/fabianishere/pam_reattach
cd pam_reattach &amp;amp;&amp;amp; mkdir build &amp;amp;&amp;amp; cd build
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr/local ..
make
sudo make install
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Then, edit &lt;code&gt;/etc/pam.d/sudo&lt;/code&gt; file, put the follow text at the beginning of the file.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;auth optional pam_reattach.so
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;
The result sudo file should be as following:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;# sudo: auth account password session
auth optional pam_reattach.so
auth sufficient pam_tid.so
auth       sufficient     pam_smartcard.so
auth       required       pam_opendirectory.so
account    required       pam_permit.so
password   required       pam_deny.so
session    required       pam_permit.so
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="outline-container-org98582d8" class="outline-2"&gt;
&lt;h2 id="org98582d8"&gt;Note that the latest macOS 14 (Sonoma) have a simple way to enable touchid for sudo&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org98582d8"&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;create a new file &lt;code&gt;/etc/pam.d/sudo_local&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;add following text to the file&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;# sudo_local: local config file which survives system update and is included for sudo
# uncomment following line to enable Touch ID for sudo
auth       sufficient     pam_tid.so
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>macOS</category><category>tmux</category><category>touchid</category><guid>https://blog.jiya.net/posts/2021/12/macos-enable-touchid.html</guid><pubDate>Wed, 15 Dec 2021 05:12:00 GMT</pubDate></item></channel></rss>