(点击上方公众号,可快速关注)
来源:kuailejim
来源:kuailejim
链接:http://www.jianshu.com/p/97cb8519db0e
链接:http://www.jianshu.com/p/97cb8519db0e
作为一名开发工程师,总有一点点(geek)想搞事的心思。而对于我而言,喜欢研究一些黑魔法,并且在适时的时候向别人炫技。当用到一些不满意的app功能时,总想着把这些功能改掉(或者去掉)来满足自己需求,更甚至可以debug别人的app。如果你对上述内容感兴趣,那就看下去,绝对不会让你失望。
背景介绍
自从微信出了消息撤回之后,有时候跟一些比较在意的人聊天的时候,就会遇到消息被撤回。然而内心是非常想看到这些消息的,此时就非常非常无奈,如果能把撤回的消息找回来,或者干脆把撤回消息直接给弄没了,那真是太好了。
于是乎就动手做了一些操作,满足了自己的心愿。
但是我可不敢把搞微信的过程给放出来的,只能另搞一个demo来讲述改写的过程。
前戏
首先,我们先撸一个待破解的app。
展开全文
原来的工程
为了展示方便,撸一个最简单的,并写了方法testFunction,后期就是要破解这个方法。
然后将这个app打包,产生如图所示的.ipa文件。
产生ipa
注意,由于我没有上传到app store,所以不需要砸壳(app store会加壳,我们也可以破壳,详情见我另一篇文章),只能修改没有壳的app。http://www.jianshu.com/p/10873c5c1e08
目的
所谓改写别人的app,无非就是想把一些功能点替换或者去掉。而功能点必然是由方法实现的,所以到了代码这层,就是将我们写的方法替换掉原来的方法。那如何做到去掉这个功能呢?同理,我们实现一个空方法,然后替换掉原来的方法即可。
而眼前改写这个app的目的很简单,将上述的testFunction方法换成我们想要执行的方法(对于我想去掉微信撤回消息的功能就相当于拿个空方法替换掉相应方法)。
OK,很多人会说,这个demo是你自己写的,你当然知道该替换哪个方法了。那你怎么去定位到想破解的app对应的功能点是哪个方法呢?
这是一个好问题,我们怎么去定位方法呢?答案是猜。
当然并不是乱猜,我们可以class-dump想改写的app(教程上面提到的文章有),拿到所有类和对应方法,然后根据类名和方法名去猜,当然猜的过程运气好,一下就命中了,如果运气不好,那就多点耐心吧。
原理
demo:https://github.com/kuailejim/demo/tree/master/HackAppDemo
我们只有.ipa文件,那么可选择的路就很少了,原理实际上很简单。
首先,创建一个伪工程,然后将.ipa解包,拿出HackAppDemo.app文件。这个文件的作用是我们需要欺骗Xcode,让它把这个作为执行文件而非我们实际工程产出的东东。
其次,如何将我们的代码注入到改写的app里呢?分为两个思路,静态库和动态库。
静态库是无解的,因为我们没法去改变已经生成好的二进制mach-o文件。那么解决办法只剩下一个了,只能去撸一个动态库挂载上去。
换句话说,这个工程的作用是欺骗Xcode,让其run需要改写的app,并且注入我们写好的动态库。
伪工程
这一切怎么做到的呢?细看工程里的两个脚本。
脚本
第一个脚本的作用是欺骗Xcode脚本(重签名,替换包)
另一个是利用optool工具注入我们写的动态库
这里需要注意的是,我们需要将伪工程的Bundle ID改为要改写的Bundle ID,否则会报错。
OK,接下来就比较容易了。我们在动态库里写个类,然后写个+load方法,在里面进行method swizzling即可。代码如下:
method swizzling
OK,事情都做完了,让我们跑起工程,看看前后的结果吧。
改写前
改写后
至此,改写结束。
PS:附上之前改写微信的demo截图
总结
改写别人的app,只需要拿到破壳后的.app文件,然后建个伪工程,欺骗Xcode执行拿到的.app文件,并且注入我们写的动态库即可。
然后,这篇文章的目的是学习,而不是怂恿大家去随意破解别人的app。
事实上市面上已经出现很多相同的app(原理相同),亦或是为了私利去破坏一些平衡性的东西。这些都是要承担法律责任的。
作为开发者,我们需要给这个生态一个美好的环境。
关注「 iOS大全 」
看更多精选 iOS 技术文章
↓↓↓