iOS crake dynamic ASM for ARM64 tongyong jicunqi.

Lesson01 , 汇编可以调试别人 app和debug源码出错位置

really machine, : arm64 asm,

jicunqi ,

zhiling

duizhan

Lesson02,寄存器,指令,堆栈

64位,意味着有8个字节,64bit register, 32bit register 有4个字节
x1有64个格子, 那么w1则有32个格子,合计29个64位X寄存器,29个32位W寄存器
x0=8个字节,十六进制显示就是16个站位符号,w0=4个字节,占一半就是8个站位符显示

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 register as ZERO, so , at 31bit was 1
cpsr = #0x3-#0x2= #0x1 so, At 31bit was ZERO.| HEX"0x20000000" was =64Bit as 31th was Zero
cpsr = ZERO, cmp x0=x0-x1,so equal ZERO

这个就是cpsr 状态的指令

Lesson 07 --b指令,跳过后面,向前执行

等价于8086汇编的JMP指令

使用 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)

可以带条件跳转,一般和CMP指令配合使用

Lesson 10 ARM64 反汇编,BL指令-(带返回的跳转)

单纯使用B指令是不会跳到17th执行的

Lesson 11 汇编答疑

具体需要多多联系~

Lesson 12 汇编ARM64 ---- LDR指令,常用加载/存储指令

从右边中括号内部的内存地址开始,根据寄存器是32bit还是64bit分别取4byte或8byte
int a 是4个字节,因为读取8个字节,另外加上就不是8了,
右边是高位,在内(部)存(储)数据中,左边是低位, 寄存器的数据是反向着来

W0 是32位的寄存器, 只有4byte, 而 X0是64位寄存器,有8byte。8个字节。int只有4个字节

Lesson13 汇编ARM64 , LDP指令

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

一个LDR是正数的地址,一个是LDUR是负数的地址,正数是高地址,负数是低地址。

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

LDP赋值给两个64bit寄存器
取出变量a的值64bit
继续,写入数据到x2 register 64bit, 求x的地址
单步,下一步
得到的值,w0 is 4bytes,w1 is 4bytes,so,8byte include 16个数字 hex 16进制

排序的话 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

起落落落起的春招找实习之旅

Object-C 编程从入门到精通(大神亲授)

OC基础 ---- > 属性和点语法

OC-基础总结(一)

iOS逆向:动态调试

当静态分析无法获取足够的信息时,就需要进行动态分析,在 app 运行时,追踪方法调用、查看内存信息。最后找到想要分析的关键函数

iOS符号表恢复&逆向支付宝 2016-08-25

MacOS 10.15安装IDA7

MacOS安装IDA Pro 7.0 Crack

arm64 架构之入栈/出栈操作

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