Crakeme01.apk包含了反调试、RC4解密等内容,这次主要从题目角度入手,找出密码。IDA静态分析+Frida动态调试。
Java层大致浏览一下,可以看到很明确主要都在so层
打开IDA 加载so,首先查看导出函数
找不到对应的方法,查看JNI_Onload可以看到明显的动态注册
AD方法点进去可以看到很明显的防调试检测
这里ptrace 和检测23946端口,防止IDA动态调试
由于这里我们使用FridaHook密码,可以无视这里的反调试。继续往下分析找到可疑的代码。
可以看到ST方法里面调用了java层的方法,这里做了最后的错误提示。按住X键查看引用。
一步一步往上找
在网上找的过程中总能看到一个关键函数wolf_de()
通过引用列表可以依次查看
最终发现 下图非常可疑 怀疑是解密获取密码 我们只要Hook一下就可疑了
Frida脚本
var soAddr = Module.findBaseAddress("libwolf.so");
send(soAddr);
var real = soAddr.add(0x12050);
Interceptor.attach(real, {
onEnter: function(args){
console.log(hexdump(args[0], {
offset: 0,
length: 64,
header: true,
ansi: false
}));
},
onLeave: function(retval){
console.log(hexdump(retval, {
offset: 0,
length: 64,
header: true,
ansi: false
}));
}
});
输出
0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
f3fc5129 36 33 36 44 35 35 42 32 41 41 38 36 30 39 43 42 636D55B2AA8609CB
f3fc5139 00 05 08 41 08 06 03 01 4e 61 44 80 00 00 00 00 ...A....NaD.....
f3fc5149 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
f3fc5159 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
ee96ceb0 68 65 6c 6c 6f 35 2e 31 00 00 00 00 00 00 00 00 hello5.1........
ee96cec0 00 00 00 00 00 00 09 00 00 0a 00 00 00 00 00 00 ................
ee96ced0 3c 37 73 f4 3c 37 73 f4 00 d3 91 ee 00 00 00 00 <7s.<7s.........
ee96cee0 04 00 48 00 1b 00 00 00 0c 32 c5 e7 00 00 00 00 ..H......2......
这里用hello5.1去测试成功 说明程序就是解密了636D55B2AA8609CB这串得到密码然后与我们输入的对比。经过后续分析,加解密算法为RC4,既然密码已经知道了就懒得再去深究了。
当然也可以用IDA动态调试,关键的就是要把AD的反调试NPO掉。
总结:Frida在逆向中非常强大,灵活运用IDA动静态分析和Frida的快速Hook可以快速对关键点进行逆向分析