剑客
关注科技互联网

手把手教你改写别人的app

自从微信出了 消息撤回
之后,有时候跟一些比较在意的人聊天的时候,就会遇到消息被撤回。然而内心是非常想看到这些消息的,此时就非常非常无奈,如果能把撤回的消息找回来,或者干脆把撤回消息直接给弄没了,那真是太好了。

于是乎就动手做了一些操作,满足了自己的心愿。

但是我可不敢把搞微信的过程给放出来的,只能另搞一个demo来讲述改写的过程。

前戏

首先,我们先撸一个待破解的app。

手把手教你改写别人的app

为了展示方便,撸一个最简单的,并写了方法 testFunction
,后期就是要破解这个方法。

然后将这个app打包,产生如图所示的 .ipa
文件。

手把手教你改写别人的app

注意,由于我没有上传到app store,所以不需要砸壳(app store会加壳,我们也可以破壳,详情见我另一篇 文章
),只能修改没有壳的app。

目的

所谓改写别人的app,无非就是想把一些功能点替换或者去掉。而功能点必然是由方法实现的,所以到了代码这层,就是 将我们写的方法替换掉原来的方法
。那如何做到去掉这个功能呢?同理,我们实现一个空方法,然后替换掉原来的方法即可。

而眼前改写这个app的目的很简单,将上述的 testFunction
方法换成我们想要执行的方法(对于我想去掉微信撤回消息的功能就相当于拿个空方法替换掉相应方法)。

OK,很多人会说,这个demo是你自己写的,你当然知道该替换哪个方法了。 那你怎么去定位到想破解的app对应的功能点是哪个方法呢?

这是一个好问题,我们怎么去定位方法呢?答案是猜。

当然并不是乱猜,我们可以class-dump想改写的app(教程上面提到的文章有),拿到所有类和对应方法,然后根据类名和方法名去猜,当然猜的过程运气好,一下就命中了,如果运气不好,那就多点耐心吧。

原理

demo下载地址

我们只有 .ipa
文件,那么可选择的路就很少了,原理实际上很简单。

首先,创建一个伪工程,然后将.ipa解包,拿出 HackAppDemo.app
文件。这个文件的作用是我们需要欺骗Xcode,让它把这个作为执行文件而非我们实际工程产出的东东。

其次,如何将我们的代码注入到改写的app里呢?分为两个思路,静态库和动态库。

静态库是无解的,因为我们没法去改变已经生成好的二进制mach-o文件。那么解决办法只剩下一个了,只能去撸一个动态库挂载上去。

换句话说,这个工程的作用是欺骗Xcode,让其run需要改写的app,并且注入我们写好的动态库。

手把手教你改写别人的app

这一切怎么做到的呢?细看工程里的两个脚本。

手把手教你改写别人的app

第一个脚本的作用是欺骗Xcode脚本( 重签名,替换包

另一个是利用 optool
工具注入我们写的动态库

这里需要注意的是,我们需要将伪工程的Bundle ID改为要改写的Bundle ID,否则会报错。

OK,接下来就比较容易了。我们在动态库里写个类,然后写个 +load
方法,在里面进行 method swizzling
即可。代码如下:

手把手教你改写别人的app

OK,事情都做完了,让我们跑起工程,看看前后的结果吧。

手把手教你改写别人的app
手把手教你改写别人的app

至此,改写结束。

PS:附上之前改写微信的demo截图

手把手教你改写别人的app

总结

改写别人的app,只需要拿到破壳后的.app文件,然后建个伪工程,欺骗Xcode执行拿到的.app文件,并且注入我们写的动态库即可。

然后,这篇文章的目的是学习,而不是怂恿大家去随意破解别人的app。

事实上市面上已经出现很多相同的app(原理相同),亦或是为了私利去破坏一些平衡性的东西。这些都是要 承担法律责任
的。

作为开发者,我们需要给这个生态一个美好的环境。

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址