码迷,mamicode.com
首页 > 移动开发 > 详细

【iOS】一不小心破解了别人的静态库

时间:2015-06-09 23:42:43      阅读:4559      评论:0      收藏:0      [点我收藏+]

标签:

注:本文目的仅为了交流学习之用,切勿商业用途,否则后果自负,本文作者概不负责。




好吧其实不是不小心,是有预谋的。手头上有个别人写的.a库,但不知道其中某个接口是如何实现的,于是想到了破解。


首先是抓包,看发了哪些post请求,通过url看到了参数中我需要的值,参数名字是***ID。接着再丢到IDA里,发现一些比较可疑的方法名。


技术分享


看到了 get****WithKey:这个方法,从名字上看应该是我要找的,于是记下函数偏移地址,放到手机上调试。(我有个专门用来调试程序的越狱环境)关于如何在手机上反汇编调试app请点这里。由于我要crack的是静态库,是用在我自己的代码里的,所以可以直接在Xcode中反汇编自己的代码,断点下到刚才定位到的.a库中的方法上,通过Xcode的LLDB调试代码,这样方便查看寄存器中的值。下断点的方法是break *0xnnnnnnnn,调试时,菜单选择始终显示汇编代码,如图:

技术分享

单步执行,看到下面是进入了目标函数里:

技术分享

顺便说一些看汇编代码的基础,高手忽略:r0保存的是函数的返回值,如果是对象则返回的是对象的指针地址。r1~r4分别是保存参数的,sp是栈基地址,如果有多个参数,则保存到这个栈地址中。函数开始前要保存现场,push需要用到的寄存器,最后函数返回前要恢复现场,pop之前保存的寄存器。另外注意到上图中有个bl 0x1004ef3f0指令(或者是blx),这个是跳转到指定的地址执行,通常是函数的地址,所以如果此时你逐过程(next)执行这个指令后,打印r0的值:po $r0,这里面保存的就是函数的返回结果了。


一直单步执行(ni),发现函数进入了一个get***H方法中,出来后返回值竟然是我要找的那个参数值,说明真正的核心应该是在这个函数内了。

技术分享

技术分享

于是在这里面小心的单步执行,并输出寄存器的值,发现这个方法先是解密了几个加密的字符串,应该是关键的函数名字,为了防止别人破解做的处理,作者哪里想到会有我这么蛋疼的人会去调试他的代码。其实有了这几个关键字就能知道函数大概的内部实现了,最后是对执行结果做了SHA1。尽管做了动态调用而且对方法名进行了加密,执行时总会要露出真身的,这就体现了GDB(LLDB)的强大之处。最后根据解密出的方法名,猜到了实现方式,于是这个库的最有价值的机密也就被解开了。


文中为了保护隐私,隐去了部分敏感名字


【iOS】一不小心破解了别人的静态库

标签:

原文地址:http://blog.csdn.net/detecyang/article/details/46419229

(1)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!