经过动态分析之后,我们顺利找出点击骰子时的堆栈调用信息,接下来我们就运用静态分析的方式来分析这几个方法的源代码实现,使用去加载已脱壳的二进制文件 。
我们首先分析-[ ::pid::]
这个方法,因为它是Path之后调用的 。
通过分析该方法的伪代码,我们可以知道这个方法没做什么实事,只是做了一个代理转发,接着看-[ ::::]
这个方法的伪代码实现,由于这个方法的代码逻辑比较多,所以简单描述下这个方法做了什么事情,该方法判断选择的表情包是否为自定义表情,如果是就异步上传,最终调用-[ :]方法,
我们知道了传入的参数是r27,具体r27是什么类型我们并不清楚,但从伪代码的上下文中可以发现r27有调用以下几个方法:
[r27 m_emojiInfo][r27 m_isAsyncUpload][r27 attachObject:r20 forKey:@"emoticonpageid"]
再通过去寻找这些方法对应的类
由此可知传入的参数是类,而骰子的结果应该是保存在这个类中,接着继续分析-[ :]方法的伪代码实现:
这个方法的实现比较简单,也只是进行了一个代理转发操作,接着分析-[ :]
这个方法仍然是进行了代理转发,继续分析-[ ]
这里用到了来判断,而是arg2的属性,由上可知,arg2是类,使用class-dump把该二进制文件所有的头文件导出来,然后找到这个类的头文件:
我们打印一下arg2,编写脚本,打印该参数的所有属性值: