晚上再看雪搜到第二题,再拿来玩玩儿。链接:http://bbs.pediy.com/showthread.php?t=193824
和第一题不同, Attach到进程后,IDA module里面木有crack.so,但maps文件中存在。这样貌似就找不到被注册的JNI函数下断点了。
好像木有什么办法,不过有一点,这个是JNI函数,故可以在 类的Method结构体insn找到函数地址。
具体做法就有点之前的NDK native函数HOOK了,减少替换函数而已。找到 crack.so的基地址和insn保存的函数地址,计算出偏移值。
这里,APK第一次运行时,insn指向NULL,说明这个native函数值 Java_com的形式,而不是On_load中注册的。随便输入code确定,
让其解析出native地址,再注入进程即可找到偏移值。
重新调试apk,根据maps找到基地址,加上偏移值,找到native函数下断点调试。
发现初始化部分和第一题相同。。。
而check部分, 先调用setjmp保存,然后接着初始化code table,也和第一题相同。
之后调试发现,username passwd 以及根据passed生成code的算法也相同。
额,难不成都一样? 最后username 和 code比较时为逆序比较,仅一这点和第一题不同^_^