篇首语:本文由编程笔记#小编为大家整理,主要介绍了IOS逆向学习-签名机制相关的知识,希望对你有一定的参考价值。
encrypt
decrypt
plaintext
ciphertext
在使用对称密码时,一定会遇到密钥配送问题
假设, Alice将使用对称密码加密过的消息发给了Bob
使用对称密码加密过的消息
如何解决密钥配送问题
公钥密钥
DES、3DES、AES
加密密钥、解密密钥
非对称密码
单向散列函数,可以根据消息内容计算出散列值
散列值的长度和消息的长度无关,无论消息是bit、10M、100G,单向散列函数都会计算出固定长度的散列值
单向散列函数的特点
单向散列函数,又被称为消息摘要函数(message digest function),哈希函数
输出的散列值,也被称为消息摘要(message digest)、指纹(fingerprint)
常见的几种单向散列函数
在数字签名中,有一下两种行为:
签名密钥
验证密钥
思考: 如何保证这个签名是消息发送者自己签的?
上述签名过程有一个不好的地方就是 ,既需要把明文发送过去,还要把加密之后的密文发送过去,这样可能造成传输的数据有点大
思考一下:
数字签名不能保证机密性: 数字签名的作用不是为了保证机密性,仅仅是为了能够识别内容有没有被篡改
数字签名的作用:确认消息的完整性、识别消息是否被篡改、防止消息发送人否认
数字签名无法解决的问题:
要正确使用签名,前提是用于验证签名的公钥必须属于真正的发送者
用于验证签名的公钥必须属于真正的发送者
如果遭遇了中间人攻击,那么公钥将是伪造的、数字签名将失败
公钥将是伪造的、数字签名将失败
所以在验证签名之前,首先得验证公钥的合法性
那么如何验证公钥的合法性?证书
证书
公钥证书(Public-key Certificae, PKC)
CertificteSingingRequest.certSingingRequest
ios_development.cer\\ios_distribution.cer
*.moblieprovision
我们在真机编译一个app,可以看到编译操作中一个操作是签名:
使用apple的私钥,便于Apple的对app的控制
生成Mac设备的公私钥:CertificteSingingRequest.certSingingRequest文件就是Mac设备的公钥
获取证书:把Mac的公钥上传到Apple的服务器,然后Apple使用自己私钥签名生成一个证书给我们该步骤对应着流程图的②步骤
私钥签名
获取证书:ios_development.cer\\ios_distribution.cer利用Apple后台私钥,对Mac设备的公钥进行签名后的证书文件
生成moblieprovision文件
moblieprovision
embedded.mobileprovision
.app
entitlements.plist
security cms -D -i embedded.mobileprovision > temp.plist
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
security find-identity -v -p codesigning
codesign -fs 证书ID xxx.dylib
codesign -fs 证书ID --entitlements entitlements.plist xxx.app
codesign -f -s 证书ID --entitlements entitlements.plist xxx.app
codesign
codesign或则codesign --help
man codesign
查看可用证书
获取entitlements.plist文件,然后替换.app包内的这个文件
Bundle identifier
device
抽取entitlements.plist文件
IOS App Signer
iReSign
https://github.com/maciekish/iReSign
可以对ipa进行重签名
ipa
需要提供entitlements.plist、embedded.mobileprovision文件的路劲
entitlements.plist、embedded.mobileprovision
我们编译好的tweak代码编写好,是动态库的形式安装到手机上, 当我们手机app启动时,会去Devcie/Library/MobileSubstrate/DynamicLibraries路径下去加载对应的tweak动态库, 如果我想把我们编辑好的插件工程安装到别的手机上, 那么我们应该讲这个tweak动态库
tweak
Devcie/Library/MobileSubstrate/DynamicLibraries
tweak动态库
接下来将我们的.app包拷贝出来,然后将我们的编写的tweak动态库也放到.app的包中
也可以通过MachOview来查看可执行文件会加载的动态库
可执行文件
insert_dylib
insert_dylib 动态库加载路劲 Mach-O文件
--weak
--all-yes
可以通过otool查看Mach-O的动态库依赖信息
如果不希望生成新的文件
可以使用install_name_tool修改Mach-O文件动态库中的加载地址
install_name_tool修改Mach-O文件动态库中的加载地址
install_name_tool -change 旧地址 新地址 Mach-O文件
通过Theos开发的动态库插件(dylib)
/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
CydiaSubstrate
两个常用的环境变量
@executable_path
@loader_path
利用插件来修改ipa包,然后重签名步骤
动态库中也会依赖其它动态库
使用指令更换动画库的路径
对动态库进行重签名
如果希望将破坏了签名的安装包,安装到非越狱的手机上,需要对安装包进行重签名的操作
注意
重新签名打包后,安装到设备的过程中,可能需要经常查看设备的日志信息
Window -> Devices and Simulators -> View Device Logs
Window -> Devices and Simulators -> Open Console