大神cm逆向题-解题步骤
最近再学习so逆向,前天某大神出了个CM,正好当学习。下面是我的解题步骤,解法比较基础,大牛自行略过。题目http://bbs.pediy.com/showthread.php?t=206967
1. 拖入jeb里,查看java层代码

核心代码在此,输入字符串,然后调用jni函数EatRice()。
2.导入so到IDA中,查看EatRice()函数代码。

从这里可以看出输入的位数为7位,前两位已经给出。分别是ascii码为88和35。也就是X和#字符。
伪c代码效果不是很好,汇编视图显示的代码要全些。但是发现两大断的汇编没有联系在一起。不知道咋弄了,于是就动态调试so。
3.下面IDA动态调式so。
在EatRice()函数设置断点。

这个时候tab键,就可以看到比较全的伪c代码了。(结合汇编看感觉好些)
这个函数里面写了几个算法,分别求出输入字符串的各位。下面一位一位的求。之前前面2位已经知道了。
第3位对应核心算法:

对应解法:

求出第三位ascii码为121,即y字符。当然这里计算器算也行的。
第4位对应核心算法:

对应解法:

这里a4值是根据下面算出:

后面的有的也要根据上面的算法进行计算,下面就不贴了。
最终求得c4=42,即就是*字符。
第5位对应核心算法:

对应解法:
这个手算的,就不贴代码了。结果C5=56,也就是字符8.
第6位对应核心算法:

这个也是手算,结果C6=64,也就是@字符。
第7位对应核心算法:

对应解法:

求出C7=76,也就是L字符。
最终结果就是:X#y*8@L
