我们做逆向的知道IDA这一神器,但是神器也会犯错,使用神器进阶的时候这时候就需要人工来辅助,下面就IDA F5中一个问题做记录。。
问题篇:
什么问题呢?
我们就拿鬼哥之前那个等级破解那个样本,我们放在IDA中看核心.so文件,看汇编代码:
然而用F5看到的伪C代码是:
显然是不对的,没有对语句分析出来,接下来我们就系问题解决。。
原理篇:
由于Java_com_ggndktest1_JniGg_VipLevel是一个JNI函数,因此我们在JNI开发的过程中知道r0参数为JNIEnv*,r1参数为jobject,可以看到loc_c64应该为break语句,里面有一个 0x29c,详细解释为:
R0所指的JNIEnv*地址的内容赋给了R2,R2加上0x29c地址处的内容赋给了R3,我们知道这块其实就是NewStringUTF函数,因此BLX R3,输出的就是个字符串,但是F5为什么没有输出呢?
曰:这是ida f5插件的一个特性:代码优化。由于使用了 blx r3寄存器跳转,ida并不知道r3即NewStringUTF函数的原型,参数情况。也就不知道str参数会被NewStringUTF函数所使用。因此它认为switch...case {}中对str的赋值(如str = "Copper Vip";)并没有用,可以优化掉。
解决篇:
1.导入jni.h;(附件有详细说明)
2.在F5下,由于参数是“int a1”不对,因此按“Y”键,改为JNIEnv*;
3.在函数NewStringUTF上面右键选Force call type;
结果是: