前言
最近因为工作原因接触到了逆向开发,虽说目前阶段已经转回了正向,但是国庆期间因为无聊就回顾了一下最近新学的姿势_(:_」∠)_结果发现我仿佛什么又都不会了( ̄▽ ̄)
需求
写一个非常简单的Mac程序,然后hook其中一个oc方法,使其实现其他功能……
总之一个最基础最入门的功能_(:」∠)
步骤
- 写了一个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!
-
导出这个demo的release版
-
到这里我就发现我完全不会了
-
因为我发现苹果好像又对被穷逼进行了限制:
-
以前这里是可以导出没有签名的版本的啊_(:_」∠)_
- 没有办法我只能使用穷逼多年经验领悟的show in finder把xcode编译好的app包拷出来备用
- 然后编写了一个Tweak.xm文件,内容如下:
%config(generator=internal)
#import <Foundation/Foundation.h>
%hook ViewController
- (NSString *)hi {
return @"Hello world!";
}
%end
%ctor {
NSLog(@"!!!!!!inject success!!!!!!!");
}
- 运行下面的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+实践,我发现了如果不新建项目,而使用以前的老项目,那么还是可以导出没有签名的版本的
于是我就在这个项目中重现了上面的那个demo,并用同种方式hook之,然后果然不闪退了。使用codesign -v 命令后显示invalid signature (code or signature have been modified)
所以我感觉这是苹果对我这种穷逼的歧视。难道以后还要买个开发者账号才能愉快的hook么_(:」∠)
不知道各位大大有没有什么解决的办法???