关于在Mac下使用MSHookFunction的疑惑

需求:

本人最近在研究hook一个Mac程序,通过这几天在论坛的学习已经学会了使用logos语法hookOC方法,但是各位肯定知道这远远是不够的_(:」∠)

所以我现在又开始研究如何hook一个Mac软件的C/C++函数。

通过看了论坛里请问私有函数怎么hook。。。](http://bbs.iosre.com/t/hook/345/10) 、怎么hook C++类的方法?等文章已经查阅了相关资料后,本人开始尝试hook我自己写的一个私有的C方法。

操作步骤:

  1. 编写了一个小demo,核心代码如下
#import "ViewController.h"

size_t abcd(int x,int y,int z) {
    return x + y + z;
}

@interface ViewController ()
@property (weak) IBOutlet NSTextField *ll;
@property(nonatomic,assign) size_t length;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    _length = abcd(1, 2, 3);
}

- (IBAction)cc:(id)sender {
    _ll.stringValue = [NSString stringWithFormat:@"%zu",_length];
}

@end

简单来说,就是点击按钮,软件上会显示一个数字,这个数字是由函数abcd生成,我写死了为6

demo

  1. 编写hook代码

    • 我首先写了一个Tweak.xm,内容如下,想要把返回值改为8
%config(generator=internal)

#import <Foundation/Foundation.h>
#include "substrate.h"

/*
size_t abcd(int x,int y,int z) {
    return x + y + z;
}
*/
size_t (*ori_abcd)(int x,int y,int z);
size_t new_abcd(int x,int y,int z) {
    return 8;
}

%ctor {
    NSLog(@"!!!!!!inject success!!!!!!!");

    void *abcd = MSFindSymbol(NULL,"_abcd");
    if (abcd) {
        MSHookFunction(abcd, new_abcd, &ori_abcd);
    }else{
        NSLog(@"!!!!!!inject fail!!!!!!!");
    }
}
  • 把要注入的app包和substrate.h放在同一个目录,运行了下面这个脚本
#!/bin/
function getName {
    ls | grep *.app
}
path=$(getName)
temp='temp'
name=${path%.app}

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

rm -f ./$temp.mm
  • 终端显示没有任何异常
Found thin header...
Load command already exists
Successfully inserted a LC_LOAD_DYLIB command for x86_64
Writing executable to Target.app/Contents/MacOS/Target...
  • 但是运行就崩溃
2017-09-07 02:00:21.358 Target[10039:636481] !!!!!!inject success!!!!!!!
dyld: lazy symbol binding failed: Symbol not found: _MSFindSymbol
Referenced from: ~/Desktop/Target/abc/Target.app/Contents/MacOS/lib.dylib
Expected in: flat namespace

dyld: Symbol not found: _MSFindSymbol
Referenced from: ~/Desktop/Target/abc/Target.app/Contents/MacOS/lib.dylib
Expected in: flat namespace

[1]    10039 abort      

[进程已完成]
  1. 然后我又仔细研究了一下请问私有函数怎么hook。。。,将Tweak.xm改为以下内容
%config(generator=internal)

#import <Foundation/Foundation.h>
#include "substrate.h"

/*
size_t abcd(int x,int y,int z) {
    return x + y + z;
}
*/

extern "C" size_t abcd(int x,int y,int z);

size_t (*ori_abcd)(int x,int y,int z);
size_t new_abcd(int x,int y,int z) {
    return 8;
}

%ctor {
    NSLog(@"!!!!!!inject success!!!!!!!");

    MSHookFunction((void *)abcd, (void *)new_abcd, (void **)&ori_abcd);
}

其他同上,最后依然失败,失败信息如下:

dyld: Symbol not found: _abcd
    Referenced from: ~/Desktop/Target/abc/Target.app/Contents/MacOS/lib.dylib
    Expected in: flat namespace
in ~/Desktop/Target/abc/Target.app/Contents/MacOS/lib.dylib
[1]    10310 abort      

[进程已完成]

请问各位大大我的姿势哪里出错了,感觉应该可以成功的啊_(:」∠)

搜下 lazy symbol ,也就是一般指动态库导出的符号(不严谨)。

自己写的c/c++方法abcd,不是lazy symbol ,编译后已经没有了符号信息。

对于这种hook,应该只能通过找编译后的地址的方法hook。

具体可以请 hookzz的作者来答。

dyld: Symbol not found: _MSFindSymbol

你这个符号在哪里?

咦,这样的么,我看到坛子里很多人都是这样来hook手机上私有库的C/C++函数的,还以为可以用在任何地方的:joy:

如帖子所述,我并没有写这个符号,而是_abcd。。。

请问楼主,你运行的这个脚本是干什么的?是用来注入dylib的吗?
还有想问一下,你是怎样用theos语法来hook macOS应用程序的?你用的项目模板是什么?