请问私有函数怎么hook。。。

比如拿书中讨论过的CoreTelephony.framework框架中的CTCallDisconnect函数作例子
我自己尝试写了一下代码如下:
#include <substrate.h>
#import <CoreTelephony/CTCall.h>

extern “C” void CTCallDisconnect(CTCall *call);

void (*orig_CTCallDisconnect)(CTCall *call);
void new_CTCallDisconnect(CTCall *call)
{
NSLog(@“success,wwwwwwwwwwwwwwwwwwwwwwwwwww”);
orig_CTCallDisconnect(call);
}

%ctor{
void *_CTCallDisconnect = MSFindSymbol(NULL,"_CTCallDisconnect");
MSHookFunction(_CTCallDisconnect, (void *)new_CTCallDisconnect, (void **)orig_CTCallDisconnect);
}

但感觉替换函数那有问题,或者MSFindSymbol用的有问题。。。
求问。。。

1 个赞

重排一次版…

#include <substrate.h>
#import <CoreTelephony/CTCall.h>

extern "C" void CTCallDisconnect(CTCall *call);

void (*orig_CTCallDisconnect)(CTCall *call);
void new_CTCallDisconnect(CTCall *call)
{
    NSLog(@"success,wwwwwwwwwwwwwwwwwwwwwwwwwww");
    orig_CTCallDisconnect(call);
}

%ctor{
    void *_CTCallDisconnect = MSFindSymbol(NULL,"_CTCallDisconnect");
    MSHookFunction(_CTCallDisconnect, (void *)new_CTCallDisconnect, (void **)orig_CTCallDisconnect);
}

这个函数的原型是

CTCallDisconnect

,不是

_CTCallDisconnect

嗯。。那么这一块有什么问题吗?

void new_CTCallDisconnect(CTCall *call)
{  NSLog(@"success,wwwwwwwwwwwwwwwwwwwwwwwwwww");
    orig_CTCallDisconnect(call);
}

还有顺便问下MSHook(),和MSHake()这两个是干什么的。。。最近看的很多tweak的例子里有不是很懂,看substrate的头文件里面一般有define但还不是很明白。。

这2个函数不用管,是MobileSubstrate的私有函数,一般情况下用不着。
问题就在这里

void *_CTCallDisconnect = MSFindSymbol(NULL,"_CTCallDisconnect");
    MSHookFunction(_CTCallDisconnect, (void *)new_CTCallDisconnect, (void **)orig_CTCallDisconnect);

你hook的是_CTCallDisconnect而不是CTCallDisconnect,当然hook不到了

这2个函数不用管,是MobileSubstrate的私有函数,一般情况下用不着。
问题就在这里

void *_CTCallDisconnect = MSFindSymbol(NULL,"_CTCallDisconnect");
    MSHookFunction(_CTCallDisconnect, (void *)new_CTCallDisconnect, (void **)orig_CTCallDisconnect);

你hook的是_CTCallDisconnect而不是CTCallDisconnect,当然hook不到了

额…MSFindSymbol要这么写吗?

void *_CTCallDisconnect = MSFindSymbol(NULL,"CTCallDisconnect");

我用ABAddressBookCreateWithOptions测试MSFindSymbol使用时如下是可以的呀。。。

MSImageRef image = MSGetImageByName("/System/Library/Frameworks/AddressBook.framework/AddressBook");
void *_AddressBookCreateWithOptions = MSFindSymbol(image,"_AddressBookCreateWithOptions");

那就不知道了,理论上

_ABAddressBookCreateWithOptions

是错的,但因为ABAddressBookCreateWithOptions本身是一个公开函数,所以可能让你误打误撞找到了

知道了感谢…我尝试写一下测试应用试试hook的结果吧…有可能是这个函数根本没触发…

自己写了个应用测试了下,测试的私有函数为CTSettingCopyMyPhoneNumber。。。写了三个tweak
第一个代码如下:

#include <substrate.h>
#include <CoreTelephony/CTCall.h>
#define CoreTelephony "/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony"

extern "C" NSString *CTSettingCopyMyPhoneNumber(void);

NSString *(*orig_CTSettingCopyMyPhoneNumber)(void);
NSString *new_CTSettingCopyMyPhoneNumber(void)
{
    NSLog(@"Success,wwwwwwwwwwwww");
    return orig_CTSettingCopyMyPhoneNumber();
}

%ctor{
    MSImageRef image = MSGetImageByName(CoreTelephony);
    if(image){
        NSLog(@"加载成功,wwwwwwwwwwwww");
        void *_CTSettingCopyMyPhoneNumber = MSFindSymbol(image,"_CTSettingCopyMyPhoneNumber");
        if(_CTSettingCopyMyPhoneNumber)
        {
            NSLog(@"Find!wwwwwwwwwwwww");
            MSHookFunction(_CTSettingCopyMyPhoneNumber, (void *)new_CTSettingCopyMyPhoneNumber, (void **)orig_CTSettingCopyMyPhoneNumber);
        }
        else
        {
            NSLog(@"Fail!wwwwwwwwwwwww");
        }
    }
    else
    {
        NSLog(@"加载失败,wwwwwwwwwwwww");
    }
}

结果如图:成功但是应用crash了。。。

第二个tweak修改MSFindSymbol部分如下:

void *_CTSettingCopyMyPhoneNumber = MSFindSymbol(image,"CTSettingCopyMyPhoneNumber");

结果:
失败了。。

第三个tweak修改了第一个的函数定义部分:

extern "C" NSString* CTSettingCopyMyPhoneNumber(void);

NSString* (*orig_CTSettingCopyMyPhoneNumber)(void);
NSString* new_CTSettingCopyMyPhoneNumber(void)

然后就好了。。。结果也出来了也没crash。。。

找了很多国外网站上对MSFindSymbol的使用发现,hook私有函数时第二个参数貌似可以以ida得到的结果为准吧。。。
下面两张图片里就是一个例子。。。不知我的理解是否有误。。。
@snakeninny

你既然已经extern了,为什么还要MSFindSymbol?
MSFindSymbol主要是用在private symbol上,已经声明为extern的函数是不需要使用MSFindSymbol的。也就是说,对于那些非extern函数,才需要使用MSFindSymbol

我碰到使用MSFindSymbol的情况比较少,一般是游戏里面的C++函数,至于IDA中看到的函数下划线前缀,我印象是IDA给加上去的,实际是没有下划线的

额测了下确实有道理。。。
用extern不是用MSFindSymbol可以hook到
还有单独用MSFindSymbol搜_CTSettingCopyMyPhoneNumber也可以。。。
不过这个确实是使用ida里面的字符搜。。。
彻底懂了。。。非常感谢。。。:tongue:

封贴。。。两端代码如下

#include <substrate.h>
#include <CoreTelephony/CTCall.h>
#define CoreTelephony "/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony"

NSString* (*orig_CTSettingCopyMyPhoneNumber)(void);
NSString* new_CTSettingCopyMyPhoneNumber(void)
{
    NSLog(@"Success,wwwwwwwwwwwww");
    return orig_CTSettingCopyMyPhoneNumber();
}

%ctor{
        MSHookFunction(MSFindSymbol(NULL,"_CTSettingCopyMyPhoneNumber"), (void *)new_CTSettingCopyMyPhoneNumber, (void **)&orig_CTSettingCopyMyPhoneNumber);
}
#include <substrate.h>
#include <CoreTelephony/CTCall.h>
#define CoreTelephony "/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony"
extern "C" NSString* CTSettingCopyMyPhoneNumber(void);
NSString* (*orig_CTSettingCopyMyPhoneNumber)(void);
NSString* new_CTSettingCopyMyPhoneNumber(void)
{
    NSLog(@"Success,wwwwwwwwwwwww");
    return orig_CTSettingCopyMyPhoneNumber();
}

%ctor{
        MSHookFunction(CTSettingCopyMyPhoneNumber, new_CTSettingCopyMyPhoneNumber, &orig_CTSettingCopyMyPhoneNumber);
}
2 个赞

你这个是在什么环境下运行的?