iOS逆向第一站——搞定某车联网APP

感谢牛轧糖大佬我涛哥带我走向车联网生涯,为我的研究生生涯积累了大量的样本。某美系车APP在更新之后登录数据变成了加密传输,而且最关键的是上篇文章的CC_hook.js竟然hook不到,这就引起了我的兴趣了。
点击登录

砸壳参考AloneMonkey大佬的frida-ios-dump,IDA加载完二进制文件后在String窗口搜索loginbypassword

找到[WebService loginWithInfo:withCompletionHandler:]

fuctions窗口搜索(或者直接双击)callWebAPI:data:method:ssl:completionHandler:
找到[WebService callWebAPI:data:method:ssl:completionHandler:]
看到data关键加密信息,接着搜索setValue:forKey

[_priv_NBSSafeMutableDictionary setValue:forKey:]

无结果,说明很有可能是一个赋值的操作,加密不在这。回到上一步

v87由v86 = -[WebService returnDictionaryWithDataPath:](v11, “returnDictionaryWithDataPath:”, v201)返回
双击returnDictionaryWithDataPath:

因为APP使用的是RSA加密,这也就证明了CC_hook.js hook为什么不到了。
v8 = +[RSA encryptString:privateKey:](&OBJC_CLASS___RSA, “encryptString:privateKey:”, v4, v6);
v4由convertToJsonData:返回(明文),v6由iBuickAppPrivate返回(密钥)。看一下密钥返回函数iBuickAppPrivate

最后,进入encryptString:privateKey:函数

到这里我们可以直接动态调试了(还不会…)或者是hook了,老方法首先用r2frida找到类和方法

hook +[RSA encryptString:privateKey:] 的两个参数(因为数据类型是id,可以直接转成ObjC类型)

if (ObjC.available){
    try{
        var className = "RSA";
        var funcName = "+ encryptString:privateKey:";
        var hook = eval('ObjC.classes.' + className + '["' + funcName + '"]');
        console.log("[*] Class Name: " + className);
        console.log("[*] Method Name: " + funcName);
        Interceptor.attach(hook.implementation, {
          onEnter: function(args) {
            var param1 = new ObjC.Object(args[2]);
            console.log("args[2] -> " + param1);

            var param2 = new ObjC.Object(args[3]);
            console.log("args[3] -> " + param2);
          },
          onLeave: function(retval) {
            var retur = new ObjC.Object(retval);
            console.log("retval -> " + retur);     
          }
        });
    }
    catch(err){
        console.log("[!] Exception2: " + err.message);
    }
}
else{
    console.log("Objective-C Runtime is not available!");
}

frida -U -f com.industryillusion.ibuick -l frida_ios_hook.js –no-pause

验证正确!

另外hook除了使用frida还可以直接使用objection的命令
ios hooking watch method “+[RSA encryptString:privateKey:]” –dump-args
ios hooking watch method “+[RSA encryptString:privateKey:]” –dump-return

但是参数的返回值它没有处理好,而且只适用于参数都是id(Objc)类型的,所以这里直接修改本地的源码转换成Objc类型再重新打印返回值

2019.2.27更新:objection v1.5.2版本修改位置

下面来看如何来hook非id(Objc)类型的参数 这里的三个参数类型是char *json, signed __int64 len, id a5,只有带id的才是ObjC对象,所以对于不同参数要注意这里的打印方式

参考:
在iOS上使用Frida