天天看点

ios使用swift和oc混编framework_swift逆向iOS工程

swift相比OC来说,难度要大一些,其方法调用类似于C++,反汇编出来都是sub_xxx之类的调用,但是swift工程的底层还是Cocoa,而iOS系统的Cocoa层目前还是OC开发的,并且大部分swift App也都是混编的工程,虽然难度比起OC工程来说,会稍微大一点,并且资料也不多,但是只要牢牢掌握swift对象的内存模型,以及方法调用的参数传递,就不会是什么难事。

1.砸壳,并创建MonkeyDev工程

下面我们找一个swift App来练练手,已知丰巢App是swift开发的,那我们就以该App来做实验吧:

1.首先就是frida砸壳,创建MonkeyDev工程,添加Lookin的pod依赖。具体步骤就不再描述了,这些都是非常基础的操作。在丰巢App的包里面,我们可以看到它用到了如下第三方库:

ios使用swift和oc混编framework_swift逆向iOS工程

由于swift工程的pod文件必须使用 use_framework!, 因此第三方库都将编译成动态库,打包到App中就是上图这样。

2.打开.xcworkspace工程,运行即可。App正常运行,说明没有反调试。那我们再抓包看看,打开charles,下拉刷新一下首页。抓包结果如图:

ios使用swift和oc混编framework_swift逆向iOS工程

从抓包结果上看,接口都是明文的,这实在没啥好分析的。如图,在请求的Http header中有一个 REQUEST_ID参数,通过charles对接口下断点,修改一下REQUEST_ID,正常返回response,说明后台并未对该ID做校验,我猜测它就是某些请求字段组合得到的一个字符串的md5值,既然后台没有对其做检验,那就不管了。

2.分析注册功能

现在我们来看看注册功能:在输入验证码界面,我们随便输入一个错误的验证码,截图如下:

ios使用swift和oc混编framework_swift逆向iOS工程

通过截图我们发现,当输入错误验证码时,App会弹框提示,通过Lookin,我们知道这个弹框toast的类名是 ToastView, 现在我们打开IDA,搜索ToastView,我们得到ToastView的真实符号名是_TtC19HiveConsumerRelease9ToastView,如图:

ios使用swift和oc混编framework_swift逆向iOS工程

然后对该类下断点,并打印堆栈。堆栈截图如下:

ios使用swift和oc混编framework_swift逆向iOS工程

由于App使用的是Http + JSON 请求,因此必定会进行Json解析,于是给NSJSONSerialization下个断点,然后继续输入一个错误的验证码看看效果,果然断下来了,打印堆栈看看,如图:

ios使用swift和oc混编framework_swift逆向iOS工程

和抓包看到的返回数据一致:

ios使用swift和oc混编framework_swift逆向iOS工程

2.1 请求调用栈分析

我们发现,上面看到的调用栈只有数据返回后的调用栈,而没有请求时的调用栈。下面我们分析一下请求调用栈,首先我们在Lookin上看看验证码的输入框的视图层次,我们知道它是一个textfield, 在看看它的响应事件,如图:

ios使用swift和oc混编framework_swift逆向iOS工程

打开IDA,找到[LoginViewCodeViewController textDidEnd:]的伪代码,如图:

ios使用swift和oc混编framework_swift逆向iOS工程

只有一个 sub_xxx(),直接双击它就好了,点进去可以看到一些逻辑判断,粗略看看即可。看到有sub_xxx()继续双击,粗略了解即可。知道找到一个Alamofire的方法:_s9Alamofire14SessionManagerC7request_6method10parameters8encoding7headersAA11DataRequestCAA14URLConvertible_p_AA10HTTPMethodOSDySSypGSgAA17ParameterEncoding_pSDyS2SGSgtF,直接对其下符号断点,发现不行,那只能对函数地址下断咯,在IDA中,打开该函数的伪代码界面,按tab键盘切换到汇编界面,得到函数的基地址为0x0000000100B484CC, 然后下断,效果如下:

ios使用swift和oc混编framework_swift逆向iOS工程

然后运行,继续输入一个错误的验证码,被断下来了,打印堆栈看看,如图:

ios使用swift和oc混编framework_swift逆向iOS工程

倒影cc

这就是请求时的堆栈,由于该App没啥分析的意义,这里就不做继续了