【iOS】一不小心破解了别人的静态库
来源:互联网 发布:解除绑定mac地址 编辑:程序博客网 时间:2024/05/16 12:12
注:本文目的仅为了交流学习之用,切勿商业用途,否则后果自负,本文作者概不负责。
好吧其实不是不小心,是有预谋的。手头上有个别人写的.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】一不小心破解了别人的静态库
- 一不小心就撞上了静态初始化的相依性问题
- 一不小心,进入了晚婚的行列!!
- 一不小心了解了行间距的真相.
- 一不小心入了引用类型的坑
- 一不小心oracle当掉了!
- 一不小心上报纸了
- 一不小心,又哭了~
- 一不小心,漏了!
- 一不小心搞错了
- 一不小心点错了
- 一不小心,七月了
- 一不小心成了傻白甜
- 今天一不小心,激活了俺的blog,开心:)
- testing--一不小心成了我的第一份工作
- 一不小心,愚人节就成了我们的节日
- 现在一不小心是全身360的产品了
- 我好像。。。一不小心注册了一个好专业的网站。。。
- 无聊改装充电宝赠品,废的还是废,成不了宝!
- Shortest path of the king
- 第7章 第3题
- C++学习笔记之 引用
- CAN基础一
- 【iOS】一不小心破解了别人的静态库
- 自定义AlertDialog(二)
- 对C++中3种顺序容器的特性的认识
- 同一项目中的广播(音乐播放进度的UI跟新)
- Linux帐号管理与ACL权限
- 红黑树
- Activity的四种加载模式
- native关键字和transient关键字
- lua内存机制分析