关于在10.13(High Sierra)中hook一个Mac应用的疑问与猜想

前言

最近因为工作原因接触到了逆向开发,虽说目前阶段已经转回了正向,但是国庆期间因为无聊就回顾了一下最近新学的姿势_(:_」∠)_结果发现我仿佛什么又都不会了( ̄▽ ̄)

需求

写一个非常简单的Mac程序,然后hook其中一个oc方法,使其实现其他功能……

总之一个最基础最入门的功能_(:」∠)

步骤

  1. 写了一个demo,核心代码如下:
   - (void)viewDidLoad {
       [super viewDidLoad];

       // Do any additional setup after loading the view.
   }

   - (IBAction)buttonAction:(NSButton *)sender {
       NSAlert *alert = NSAlert.new;
       alert.messageText = [self hi];
       [alert runModal];
   }

   - (NSString *)hi {
       return @"Hi!";
   }

功能就是点击主界面中的按钮,弹窗显示Hi!

屏幕快照 2017-10-09 下午11.16.19

  1. 导出这个demo的release版

    • 到这里我就发现我完全不会了233DD5A0A8E21A3F3E542A32D1B9C72F

    • 因为我发现苹果好像又对被穷逼进行了限制:

 ​	以前这里是可以导出没有签名的版本的啊_(:_」∠)_
  • 没有办法我只能使用穷逼多年经验领悟的show in finder把xcode编译好的app包拷出来备用
  1. 然后编写了一个Tweak.xm文件,内容如下:
   %config(generator=internal)

   #import <Foundation/Foundation.h>

   %hook ViewController

   - (NSString *)hi {
   return @"Hello world!";
   }

   %end

   %ctor {
   NSLog(@"!!!!!!inject success!!!!!!!");
   }
  1. 运行下面的shell脚本
   #!/bin/bash
   function getName {
       ls | grep *.app
   }
   path=$(getName)
   temp='abc'
   name=${path%.app}

   $THEOS/bin/logos.pl ./Tweak.xm > ./$temp.m
   clang -shared -undefined dynamic_lookup -o ./$path/Contents/MacOS/lib.dylib ./$temp.m
   optool install -c load -p @executable_path/lib.dylib -t ./$path/Contents/MacOS/$name

   rm -f $temp.m

终端打印:

   Found thin header...
   Inserting a LC_LOAD_DYLIB command for architecture: x86_64
   Successfully inserted a LC_LOAD_DYLIB command for x86_64
   Writing executable to SayHi.app/Contents/MacOS/SayHi...

本来到这里应该就大功告成了,但是实际上直接闪退了

[1] 3887 killed

本想在console中查看更对信息,但是滚动的太快,完全没找到……

我初步估计是10.13新机制,或者是签名修改过的原因,毕竟使用codesign -v之后显示

SayHi.app: invalid signature (code or signature have been modified)
In architecture: x86_64

但是如果是签名的原因的话以前我也是这么搞得,完全没问题啊

后记

经过我几天的Google+实践,我发现了如果不新建项目,而使用以前的老项目,那么还是可以导出没有签名的版本的

屏幕快照 2017-10-10 上午12.16.37

于是我就在这个项目中重现了上面的那个demo,并用同种方式hook之,然后果然不闪退了。使用codesign -v 命令后显示invalid signature (code or signature have been modified)所以我感觉这是苹果对我这种穷逼的歧视。难道以后还要买个开发者账号才能愉快的hook么_(:」∠)

不知道各位大大有没有什么解决的办法???

1 个赞

Mac的hook,@alonemonkey 好像搞过

codesign --remove-signature
然后关掉gate keeper

这样确实是可以运行了,不过瞬间一个几m的app包变成了接近2g_(:」∠)

那是codesign的bug。社区有开源替代方案

原来如此,是时候去学习一波了