iOS crake dynamic ASM for ARM64 tongyong jicunqi.
- iOS破解
- 2022-04-03
- 98热度
- 0评论
Lesson01 , 汇编可以调试别人 app和debug源码出错位置
really machine, : arm64 asm,
jicunqi ,
zhiling
duizhan
Lesson02,寄存器,指令,堆栈
16进制和二进制占满32位分别需要多少字符
首先先要明确计算机是以二进制来进行计算的,下面的位是
所以计算的系统32位(bit位),则二进制占满32位,也是需要32位的
而16进制,是满16进1,而二进制是满2进1,则说明16进制的一个位置是需要二进制的4位才能占满的(16=2^4),则32位对于16进制来说需要8位(每一位是二进制的4个位)
·

C语言中,为什么64位下指针变成8字节?
作者:C语言刘老师
链接:https://www.zhihu.com/question/421682130/answer/1479334309
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
现在先引入一个计算机常识,那就是,无论是什么类型的指针变量,在32位系统下,寻址范围是32位,一个指针变量所占用的空间是4个字节,在64位下寻址范围是64位,一个指针变量所占用的空间是8个字节。
那么为何会是这个值呢?就听我给你细细讲来。
首先,我们得知道另一个计算机常识,那就是,一个字节(byte)占用多少位(bit),没错,是8位。这里,你可能会发现一个有趣的地方,32 bit == 4 byte , 64 == 8 byte。这不是巧合,哈哈哈。
现在我问你一个问题,64位能表示的数值个数是多少?很简单,2^64个,数值范围就是从0到2^64 - 1,这也是如今64位CPU的寻址范围,用16进制表示就是:0---FFFF FFFF FFFF FFFF(F是数值15,二进制就是1111,刚好是四位,所以2个16进制位就是一个字节),那么重点就从这儿开始了,如果想让一个指针变量存储的数值能表示完所有的寻址范围(也就是所有的地址值),那么毋庸置疑,他的存储空间必须是大于等于64bit,也就是8个字节,少一个bit,都不能完整的表示完所有的寻址范围,刚好,8个字节刚好能不多一位不少一位的表示完所有的寻址范围,因此就是8个字节。同理的32位下就是4个字节


Lesson03 Mov指令
外部建立一个汇编文件。
.text // 这是代码段, 证明这个以后是要放到代码段里面去的。
.data // 数据段
.stack // 栈段




Lesson04 ADD和 Sub指令







Lesson05 汇编答疑
如果你的返回值比较巨大,那么会放到堆栈里面去。 然后返回那段的内存的地址。这样的话 retn 多大的内容都可以。
x0, 又当参数又当返回值,不会乱套吗? A , 因为操作时间是分开的。 eg: 什么时候是参数, 进入函数的那一刻,里面装的是参数, ret的时候后,他就是返回值。
Q: _text 为什么plus 下划线, 应为这是非常底层的东西, 汇编是低级语言。语言特性。一但你的函数是公开的,就要在globe, 声明 。 公开。
Q:变量保护, 你要protect谁的值, 则先存起来对吧。 比如 line27 需要保护x0的值, 先move x0值到x2, 最后再 mov x0,x2,归还。
或: 比如说存到堆栈,需要用时再调用回来。
Lesson 06 --比较指令CMP 影响CPSR程序状态寄存器,相当于SUBS






这个就是cpsr 状态的指令
Lesson 07 --b指令,跳过后面,向前执行

使用 LLDB, 单步执行。 si, si, 输入两次, 就跳走了。
08ARM64汇编, 带条件的b指令;BNE B?? 带条件的跳转,



The following table lists the available condition codes, their meanings (where the flags were set by a cmp or subs instruction), and the flags that are tested:
Code Meaning (for cmp or subs) Flags Tested
eq Equal. Z==1
ne Not equal. Z==0
cs or hs Unsigned higher or same (or carry set). C==1
cc or lo Unsigned lower (or carry clear). C==0
mi Negative. The mnemonic stands for "minus". N==1
pl Positive or zero. The mnemonic stands for "plus". N==0
vs Signed overflow. The mnemonic stands for "V set". V==1
vc No signed overflow. The mnemonic stands for "V clear". V==0
hi Unsigned higher. (C==1) && (Z==0)
ls Unsigned lower or same. (C==0) || (Z==1)
ge Signed greater than or equal. N==V
lt Signed less than. N!=V
gt Signed greater than. (Z==0) && (N==V)
le Signed less than or equal. (Z==1) || (N!=V)
al (or omitted) Always executed. None tested.


Lesson09 ARM64 反汇编带 if .......else ..... 的反汇编 和cmp配合使用,eg:B.LE, (less equal)



Lesson 10 ARM64 反汇编,BL指令-(带返回的跳转)
单纯使用B指令是不会跳到17th执行的

Lesson 11 汇编答疑
具体需要多多联系~
Lesson 12 汇编ARM64 ---- LDR指令,常用加载/存储指令
W0 是32位的寄存器, 只有4byte, 而 X0是64位寄存器,有8byte。8个字节。int只有4个字节
Lesson13 汇编ARM64 , LDP指令

不管LDR,还是LDUR, 都是取内存中的数据,放到register中去, 区别在内存寻址的问题,



Lesson 14 ARM64 汇编 LDP指令 例子:ldp w0 w1 [x2, #0x10]

排序的话 W1 ,W0 所以, hex16进制 1,2,3,4, 所以倒着来
Lesson15 -ARM64汇编-str、stur、stp指令

str指令, 从register 写入 RAM 。 如果w0 就是写入4个字节到RAM, 如果x0 就是写入8个字节到RAM。
格式: str ,register, [ram-address] 把寄存器的值写入 RAM-address




MOV只能操作 寄存器~
Lesson16-ARM64汇编16-wzr、xzr寄存器


Lesson17 -- ARM64汇编17-pc、lr寄存器


当函数执行完毕后, RET 指令, 直接返回到了LR 寄存器的值, 下一行
Lesson18 -ARM64汇编18-bl指令的本质



BL 执行时候,将下行代码地址赋值LR寄存器,函数完毕后,用RET 执行将 LR 的值赋值PC 寄存器,然后返回。
关于bl和ret指令的作用
Lesson19-函数的分类



Lesson20 叶子函数的堆栈平衡


回收♻️函数栈底
Lesson21 -非叶子函数01-开辟栈空间



Lesson22 ---非叶子函数-恢复堆栈平衡
bl带返回跳转指令会修改lr寄存器的内容。
本小节见上。

120位, 一个byte是8位, 那么 20个字节就是160bit位。


codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/Frameworks/Amplitude.framework
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/Frameworks/AppAuth.framework
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/Frameworks/GoogleCast.framework
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/Frameworks/Log4Cocoa.framework
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/Frameworks/Lottie.framework
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/Frameworks/RDInAppPurchaseManager.framework
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/Frameworks/RDMPEG.framework
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/Frameworks/RDPDFKit.framework
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/Frameworks/RDUIKit.framework
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/Frameworks/ReaddleLib.framework
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/Frameworks/VPNApplicationSDK.framework
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/libsubstitute.dylib
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/libsubstrate.dylib
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/DocumentsbyReaddlePremium.dylib
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 "./Payload/Documents.app/PlugIns/Copy to Documents.appex"
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/PlugIns/DocsExtFileProvider.appex
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/PlugIns/DocsExtFileProviderUI.appex
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/PlugIns/DocsExtIntentHandler.appex
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/PlugIns/DocsExtPacketTunnelProvider.appex
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/PlugIns/DocsExtWidget.appex
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 ./Payload/Documents.app/PlugIns/DocsShareExtension.appex
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 --no-strict --entitlements=entitlements.plist ./Payload/Documents.app
codesign -fs 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 entitlements.plist ./Payload/Documents.app
codesign -vv -d ./Payload/Documents.app
codesign --verify ./Payload/Documents.app
zip -qr Documents.0.6.ipa Payload/
security cms -D -i ./Payload/Documents.app/embedded.mobileprovision > temp.plist
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier nanchensiyu.imning-kong" Info.plist
https://cloud.tencent.com/developer/news/836327。 iOS打包签名,你真的懂吗
iOS需要了解的ARM64汇编https://www.jianshu.com/p/23a9110cff96
当静态分析无法获取足够的信息时,就需要进行动态分析,在 app 运行时,追踪方法调用、查看内存信息。最后找到想要分析的关键函数
exp@expdeMac-mini 2022 % security find-identity -v -p codesigning
1) 7A457DDF1BE5889D11B91D1BF447788F5179B70C "Apple Development: piazza1@sina.com (UN8TQ684XM)"
2) 0E9CB9768BF23C6AF54998FD9A9A1C22E6C967C6 "Apple Development: piazza@vivaldi.net (AW734B3D8B)"
3) 9F8091CE6D1CAE019EFED152F364ABB67416F2F7 "Apple Development: t.hink@foxmail.com (MP4J44DZ4J)"
4) F42546C21DE2EDDFA27E997FEEBC7E6B16AEFC18 "iPhone Developer: mei jutao (NYFZ8TQDTJ)"
5) 82E0C50728639B2EAEACC1147FA923EA2CFC0CCB "Apple Development: Yan Liu (72B9X88MKN)"
5 valid identities found
codesign -fs 82E0C50728639B2EAEACC1147FA923EA2CFC0CCB entitlements.plist ./Payload/
08 2022-04-11 18:00 cp -r /Users/exp/Downloads/kingfarm.mobileprovision ./embedded.mobileprovision
1009 2022-04-11 18:00 security cms -D -i ./embedded.mobileprovision > ./../../temp.plist\n
1010 2022-04-11 18:00 cd ..
1011 2022-04-11 18:00 cd ..
1012 2022-04-11 18:00 ls
1013 2022-04-11 18:00 ll
1014 2022-04-11 18:00 /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
1015 2022-04-11 18:00 history | grep security
1016 2022-04-11 18:00 security find-identity -v -p codesigning
1017 2022-04-11 18:00 codesign -fs 82E0C50728639B2EAEACC1147FA923EA2CFC0CCB entitlements.plist ./Payload/AVPlayer.app
1018 2022-04-11 18:00 codesign -vv -d ./Payload/AVPlayer.app
1019 2022-04-11 18:00 codesign --verify ./Payload/AVPlayer.app
1020 2022-04-11 18:00 zip -qr avp4.ipa Payload/
1021 2022-04-11 18:00 ls
1022 2022-04-11 18:00 cd Payload/AVPlayer.app
1023 2022-04-11 18:00 ls
1024 2022-04-11 18:00 /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.kingfarm.farmserve.service" Info.plist
1025 2022-04-11 18:00 cd ..
1026 2022-04-11 18:00 cd ..
1027 2022-04-11 18:00 codesign -fs 82E0C50728639B2EAEACC1147FA923EA2CFC0CCB entitlements.plist ./Payload/AVPlayer.app
1028 2022-04-11 18:00 codesign -vv -d ./Payload/AVPlayer.app
1029 2022-04-11 18:00 zip -qr avp4.ipa Payload/
1030 2022-04-11 18:00 zip -qr avp5.ipa Payload/
imning-kong`main:
//01
0x1040f628c <+0>: sub sp, sp, #0x30 ; =0x30
0x1040f6290 <+4>: stp x29, x30, [sp, #0x20]. // 把xn1 和 xn2写入到内存 addr中,P (pair)表示一对,即同时操作两个寄存器
0x1040f6294 <+8>: add x29, sp, #0x20 ; =0x20
//02
0x1040f6298 <+12>: stur wzr, [x29, #-0x4]。 // STUR Xn/Wn, [base, #simm9] 讲 Xn/Wn 写入 base+#simm9的内存地址
//讲 wzr, 写入 x29+#-0x4 的内存地址
0x1040f629c <+16>: stur w0, [x29, #-0x8]
0x1040f62a0 <+20>: str x1, [sp, #0x10]
-> 0x1040f62a4 <+24>: mov w0, #0xa
0x1040f62a8 <+28>: mov w1, #0x14
0x1040f62ac <+32>: bl 0x1040f626c ; mul at main.m:23
//03
0x1040f62b0 <+36>: mov x2, x0
0x1040f62b4 <+40>: mov x8, sp
0x1040f62b8 <+44>: str x2, [x8]
0x1040f62bc <+48>: adrp x0, 1
0x1040f62c0 <+52>: add x0, x0, #0xf86 ; =0xf86
0x1040f62c4 <+56>: bl 0x1040f661c ; symbol stub for: printf
// 04
0x1040f62c8 <+60>: mov w9, #0x0
0x1040f62cc <+64>: str w0, [sp, #0xc]
0x1040f62d0 <+68>: mov x0, x9
//05
0x1040f62d4 <+72>: ldp x29, x30, [sp, #0x20]。// 从内存地址 addr 读取数据到 Xn1 和 Xn2
0x1040f62d8 <+76>: add sp, sp, #0x30 ; =0x30
0x1040f62dc <+80>: ret
