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

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

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

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

   


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

  

  

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

  


  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,可以看到如下界面:

  

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

   

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

 

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

  

  

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

  

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

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

  

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

  reveal分析:

  


  Cycript实现:

  


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

  

  

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

  


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

  只能看一画哭哭哭。。。。。。













  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
iOS越狱开发中,常用的Hook检测包括以下几种: 1. 检测当前进程是否被其他进程注入 ``` void anti_injection() { char path[1024]; int ret = proc_pidpath(getpid(), path, sizeof(path)); if (ret <= 0) { NSLog(@"anti_injection: proc_pidpath failed"); exit(1); } if (strstr(path, "/Library/MobileSubstrate") != NULL) { NSLog(@"anti_injection: MobileSubstrate detected"); exit(1); } if (strstr(path, "/Library/Frameworks/CydiaSubstrate.framework") != NULL) { NSLog(@"anti_injection: CydiaSubstrate detected"); exit(1); } } ``` 2. 检测是否被调试 ``` void anti_debugging() { int name[4]; struct kinfo_proc info; size_t info_size = sizeof(info); name[0] = CTL_KERN; name[1] = KERN_PROC; name[2] = KERN_PROC_PID; name[3] = getpid(); if (sysctl(name, 4, &info, &info_size, NULL, 0) == -1) { NSLog(@"anti_debugging: sysctl failed"); exit(1); } if (info.kp_proc.p_flag & P_TRACED) { NSLog(@"anti_debugging: traced"); exit(1); } } ``` 3. 检测是否被hook ``` void anti_hooking() { const char *functionName = "ptrace"; void *handle = dlopen("/usr/lib/libc.dylib", RTLD_GLOBAL | RTLD_NOW); if (handle == NULL) { NSLog(@"anti_hooking: dlopen failed"); exit(1); } void *ptrace_func = dlsym(handle, functionName); if (ptrace_func == NULL) { NSLog(@"anti_hooking: dlsym failed"); exit(1); } if (ptrace_func != (void *)&ptrace) { NSLog(@"anti_hooking: hook detected"); exit(1); } } ``` 4. 检测是否被注入Cycript等调试工具 ``` void anti_cycript() { char *cycript = strstr(getenv("DYLD_INSERT_LIBRARIES"), "cycript"); if (cycript != NULL) { NSLog(@"anti_cycript: cycript detected"); exit(1); } } ``` 此外,还可以在代码中添加闪退检测断点,当程序发生闪退时就可以打断点进行调试,例如: ``` void crash_handler(int signal) { signal(SIGTRAP, NULL); NSLog(@"crash_handler: signal=%d", signal); exit(1); } void set_crash_handler() { signal(SIGTRAP, crash_handler); } ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值