比如拿书中讨论过的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);
}
嗯。。那么这一块有什么问题吗?
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的结果吧…有可能是这个函数根本没触发…
eden_sion
(eden_sion)
10
自己写了个应用测试了下,测试的私有函数为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。。。
eden_sion
(eden_sion)
11
找了很多国外网站上对MSFindSymbol的使用发现,hook私有函数时第二个参数貌似可以以ida得到的结果为准吧。。。
下面两张图片里就是一个例子。。。不知我的理解是否有误。。。
@snakeninny
你既然已经extern了,为什么还要MSFindSymbol?
MSFindSymbol主要是用在private symbol上,已经声明为extern的函数是不需要使用MSFindSymbol的。也就是说,对于那些非extern函数,才需要使用MSFindSymbol
我碰到使用MSFindSymbol的情况比较少,一般是游戏里面的C++函数,至于IDA中看到的函数下划线前缀,我印象是IDA给加上去的,实际是没有下划线的
eden_sion
(eden_sion)
14
额测了下确实有道理。。。
用extern不是用MSFindSymbol可以hook到
还有单独用MSFindSymbol搜_CTSettingCopyMyPhoneNumber也可以。。。
不过这个确实是使用ida里面的字符搜。。。
彻底懂了。。。非常感谢。。。
eden_sion
(eden_sion)
15
封贴。。。两端代码如下
#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 个赞