此题apk和so都没有加壳,但是so里面的一个关键函数jolin是加密的,在so加载时解密。并且so加入了反调试技术。
由于我学习安卓的so调试是从比赛前3天开始的,也就会一个最最基本的。无法对抗反调试,一度想放弃这题。不过后来发现,这个反调试要到JNI_Onload函数退出后才触发。所以在JNI_Onload入口处下断点,添加watch,在4450这个地址(就是wojiushidaan这个字符串保存的地方)。F8一直走,看到这个地址的内容变化,就是答案了。
securityCheck函数有价值的就是while循环,很明显就是用户输入的字符串和628c这个间接应用地址上的字符串比较。(实际地址在4450)
关键函数,如果F7进去,可以发现jolin解密后的代码,这个函数用来解密出4450处的答案。
hex view窗口可以看到4450地址内容的变化。
这题高手们有patch securityCheck函数的,利用__android_log_print输出4450的内容。(这个是我需要继续学习的——patch so)
还有是允许后dump出so,4450的地方就是答案了。
能做出这个题目纯属运气,因为反调试设置的要等到Onload退出才触发异常,而so的解码已经在Onload里面完成了。只需要正确分析出securityCheck函数用于比较的字符串存放的地方。根本需要去关心解密函数是如何被解密出来的。
期待哪位大牛能详细指点一下android的so里面所用到的反调试技术。