iOS逆向笔记

3,208 阅读2分钟

学习逆向过程中的一些总结

参考资料链接

资料汇总

基本操作

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成功

lldb+debugserver(远程断点调试)待学习