学习逆向过程中的一些总结
参考资料链接
基本操作
unzip appname.ipa
ipa解压,appname.app/appname就是二进制文件
file appname.app/appname
查看包含哪些架构
armv7 32位真机架构
arm64 64位真机架构
otool -l WeChat.app/WeChat | grep -B 2 crypt
otool可以输出app的load commands,然后通过查看cryptid这个标志位来判断app是否被加密。1代表加密了,0代表被解密了
重签名
resign直接指定ipa,证书和配置文件就自动给app重签名
resign自动给所有需要重签名的plugin重签名
上传fir可以查看是否重签名成功
替换embedded.mobileprovision(app store没有这个文件,将develop拷贝进去)(resign会自动处理)
使用fastlane resign给app重签名,会自动重新下载需要的文件,包括plugin下的
resign(
ipa: "./wangyi.ipa"
signing_identity: "iPhone Distribution: XXX Technology XXXX Inc. (HAABBCCDD1122)",
provisioning_profile: "./fastlane/XC_iOS_Ad_Hoc_.mobileprovision"
)
静态分析
class_dump(导出头文件) MonkeyDev已经集成
build settings最下面开启该功能 User-Defined->MONKEYDEV_CLASS_DUMP设置成YES MONKEYDEV_RESTORE_SYMBOL 设置成YES
hopper disassembler使用
IDA使用
伪代码还原说明 a1,a2表示的是参数 v8表示self objc_msgSend(v8, "accquirePendingLock") 表示[self accquirePendingLock]; if ( objc_msgSend(v8, "accquireLoginLock") & 0xFF ) 表示if ([self accquireLoginLock]) (*(v11 + 12))(v11, 1, v17); block调用 &v48 传递地址表示传block
动态分析
CaptainHook学习 文档
- 方法Hook:
CHOptimizedMethod(count, optimization, return_type, class_type, name1, type1, arg1)
hook原来的方法(如果不加CHSuper(0, className, Method)表示替换原来的方法,CHSuper表示在当前位置调用原来的方法实现)
count表示hook的方法参数个数,optimization一般填self,return_type即方法返回值类型,class_type填当前类的类名,name1是方法名,arg1是参数,如果没有参数不填写arg,以此类推。
类方法: CHOptimizedClassMethod
实例方法: CHOptimizedMethod
喜马拉雅FM不能播放: bundleID为aaa,版本号为应用本身的版本号
Logos Tweek
Logos语法
选择Logos Tweak模板之后,新建出来的工程目录结构如下图所示,注意.xm文件格式Xcode不识别需要在Xcode右侧选择Type为Objective-C++ Source,然后重新打开。
logify.pl使用
$THEOS/bin/logify.pl ./SSDownloadAsset.h
cycript
先下载cycript,然后进入cycript目录
执行如下命令
./cycript -r 192.168.0.103:6666
常用命令中文博客 Cycript Tricks 官网
// Objective-C objects from addresses
cy# var p = #0x8614390
["<SKPaymentTransaction: 0x8613d80>"]
// 获取属性
cy# *controller
// 获取视图层级
cy# UIApp.keyWindow.recursiveDescription
// 获取当前控制器
cy# function currentVC() {
var app = [UIApplication sharedApplication]
var keyWindow = app.keyWindow
var rootController = keyWindow.rootViewController
var visibleController = rootController.visibleViewController
if (!visibleController){
return rootController
}
return visibleController.childViewControllers[0]
}
cy# var vc = currentVC()
可以直接初始化需要的类来看是否hook成功