IOS逆向笔记之HOOK实现(非越狱)

   HOOK是越狱的最终目标,目的是给应用添加功能如插件或者是更改应用的某个功能来满足我们的需求,如微信中添加抢红包插件。本文将以最近比较火的“快看”漫画为例子去除付费漫画中的收费弹窗,实现免费看漫画的功能,然而当我去除弹窗时,才发现是我想多了。。。。,不多说了,下面我将一步一步详细解析如实现去出收费弹窗的步骤。(一下都是基于非越狱设备上实现的)

  首先,需要一个已经破壳并且重新签名的的“快看”漫画的IPA,如果还不清楚如何制作,请看上篇这里 IOS逆向笔记之重新签名(非越狱)。注意,从appstore直接下载下来的应用是不能用的,因为无法破壳也无法重新签名。其次是HOOK中要用到的工具:

   界面调试工具Reveal,用来查看应用的界面。这个是付费版,破解版自己网上找去吧,这里就不方面放上去了。

   IOS逆向笔记之HOOK实现(非越狱)_第1张图片


   Hopper 是将二进制文件转为汇编语言和OC语言的工具。功能很强大,但看起来比较难,需要多次使用才能看懂里面的代码逻辑。这个软件也是收费的。其中二进制文件是在对应的app文件内,右键显示包内容,从里面可以看到一个于与app同名的一个二进制文件,就是它了,如快看的app文件是Kuaikan.app,它的二进制文件就是Kuaikan。

  IOS逆向笔记之HOOK实现(非越狱)_第2张图片

  

  下载Cycript的脚本文件:Cycript下载。并解压文件,解压后如下图:

  IOS逆向笔记之HOOK实现(非越狱)_第3张图片


  Cycript 的功能是在运行时动态的更改对象的属性或者调用方法,能够帮助我们快速的定位到们需要的某个类或者某个属性。


   最后一个工具是AloneMonkey这是最重要的一个工具,很好用,把各种越狱需要到的工具都集成到了xcode里面。集成了theos+Tweaks+Reveal.framework +Cycript +class-dump+CaptainHook。它的作用是用来动态HOOK 应用中的函数,我们所有的HOOK逻辑都在这个创建的工程里面写,以及配置Reveal和Cycript。下面说一下AloneMonkey的安装方法:

   第一步,安装theos:

   安装最新的theos
   sudo git clone --recursive https://github.com/theos/theos.git /opt/theos

  第二步: 安装ldid

  brew install ldid

  第三步:安装AloneMokey

  git clone https://github.com/AloneMonkey/MonkeyDev.git
  cd MonkeyDev/bin
  sudo ./md-install

  卸载:sudo ./md-uninstall

  更新:sudo ./md-update

  安装成功后,打开xcode,可以看到如下界面:

  IOS逆向笔记之HOOK实现(非越狱)_第4张图片

   点击MonkeyApp创建工程。具体集成步骤请参考这里Monykey集成。创建成功后,目录如下:

  IOS逆向笔记之HOOK实现(非越狱)_第5张图片 

   创建后注意几点:依赖需要手动添加一下在build phases-->target dependencies,reveal的framework需要更换你所安装的reveal中的framework,class-dump需要手动开启。工程只能在真机上运行,模拟器不支持,因为硬件不一样,模拟器上无法执行。

 

  接下来进入主题,选择真机,点击run开始运行工程,同时打开reveal,查看的app图标是否显示。若成功,如下图:

  IOS逆向笔记之HOOK实现(非越狱)_第6张图片

  

  注意,核心步骤来了。首先保证iphone和Mac处于同一个局域网并且程序当前在运行态,条件缺一不可,然后终端下进入刚才解压的Cycript的目录下根据sokec(ip:端口)t连接手机,从而实现Cycript的动态注入代码。连接成功后如下图:

  IOS逆向笔记之HOOK实现(非越狱)_第7张图片

  至于cycript的语法这里就不多说了。详情请官网学习。

  然后手机进入到收费动漫的页面,如下图:

  IOS逆向笔记之HOOK实现(非越狱)_第8张图片

  这里可以看到,上面有一个弹窗遮住了后面的漫画内容,如果能去掉弹窗,岂不是能看到后面的漫画,那不是美滋滋。。。。。好,那我就动手了。最开始我的思路是这样的,首先定位到这个页面的视图控制器controller,然后再通过Hopper看看是通过那个方法打开的弹窗,只要重写那个方法就行了。。。后来发现并不能找到弹窗的方法,于是放弃了这种思路。通过一段时间的琢磨,在reveal上发现,其实上面的弹框是组合空间,并且是同级的控件。因此,只需要找到它们共同的父view,在便利自 view,去除弹框就行了。第一步还是定位到当前的controller,第二步获取弹窗父 view,第三步将弹窗的view的alpha值设为0就行了。

  reveal分析:

  IOS逆向笔记之HOOK实现(非越狱)_第9张图片


  Cycript实现:

  IOS逆向笔记之HOOK实现(非越狱)_第10张图片


  这样就能去除弹窗了,效果如下:

  IOS逆向笔记之HOOK实现(非越狱)_第11张图片

  

   知道了如何能去除弹窗,就只剩下最后一步了,在monkey程序中实现刚才在cycript中的逻辑,可以在xxxDylib.m中修改,也可以在xxxDylib.xm中修改,区别是.m中用的是CaptainHook实现,而xm中用的Tweaks实现。这里我选择使用CaptainHook实现,代码如下:

  IOS逆向笔记之HOOK实现(非越狱)_第12张图片


  到这里,就结束了。我以为一切都和我预期的一样,然而,残酷的是。。。。。。。。。

  只能看一画。。。。。。













你可能感兴趣的:(iOS开发学习)