越狱开发之iPhone原生短信hook

一直在研究iphone上的短信,想在原生的短信上面做一些修改,研究了一段时间,现在部分讲解给大家,希望对大家有所帮助。

我主要是对原生短信进行hook操作,捕捉到系统的一些类来进行自己的功能操作。

大家打开iphone的framework的头文件可以看到有个ChatKit,这个framework里面就包含了很多关于原生短信运行所用到的类,例如CKSMSService.h 和CKSMSMessage.h以及CKTranscriptController.h等。里面有很多的头文件我就不一一介绍出来。如果要进行详细的开发还需自己去慢慢怀疑和操作,毕竟里面上上千个头文件里面又有上万个接口,我不能说出。

关于怎么越狱开发,我想大家查阅资料都知道,可以使用Theos这个集成环境来进行动态库的开发,在此我不对theos环境的搭建做说明了。

CKTranscriptController.h主要是用于显示短信的会话界面,无论是新建短信的界面还是已经存在的会话的界面,只是根据不同类型来加载不同的控件而已。

里面有很多函数,例如可以对CKTranscriptController.h进行hook

%hook CKTranscriptController

-(id)tableView:(id)view willSelectRowAtIndexPath:(id)indexPath{
    
    CKTranscriptBubbleData *data =[self bubbleData];
    
    NSString *str = [[NSString alloc]initWithString:[NSString stringWithFormat:@"      CKTranscriptBubbleData    %@",   data  ]];
    
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Welcome" 
        message:str
        delegate:nil 
        cancelButtonTitle:@"Thanks" 
        otherButtonTitles:nil];
    [alert show];
    [alert release];

    return %orig;
}

%end

钩住这个方法,我们就能够在某个会话里面点击某条信息的时候,弹出一个对话框,输出值为CKTranscriptBubbleData    这个对象。

CKTranscriptBubbleData   这个对象是顾名思义是气泡数据,通过这个对象可以获得当前点击的会话的内容,也可以获得当前会话的联系人的电话号码等。

当然,如果想要修改会话界面上的发送按钮,或者觉得iphone原生短信的,新建会话的内容输入框只有一行觉得太窄的话,我们可以去进行修改。这块控件的代码在CKMessageEntryView.h里实现,于是例子代码可以这样:

%hook  CKMessageEntryView
//底部栏的高度
+(float)defaultHeight{
  %orig;
  return 70.0f;
}

%end

这样修改之后,输入框的初始高度就是原来的两倍了。


暂时说那么多吧,还有很多函数,包括发短信还有收短信的接口,都在这些framework的头文件里面,至于怎样要自己慢慢去尝试。

自我感觉说得比较乱,还请大家多多谅解。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在iOS越狱开发中,常用的Hook检测包括以下几种: 1. 检测当前进程是否被其他进程注入 ``` void anti_injection() { char path[1024]; int ret = proc_pidpath(getpid(), path, sizeof(path)); if (ret <= 0) { NSLog(@"anti_injection: proc_pidpath failed"); exit(1); } if (strstr(path, "/Library/MobileSubstrate") != NULL) { NSLog(@"anti_injection: MobileSubstrate detected"); exit(1); } if (strstr(path, "/Library/Frameworks/CydiaSubstrate.framework") != NULL) { NSLog(@"anti_injection: CydiaSubstrate detected"); exit(1); } } ``` 2. 检测是否被调试 ``` void anti_debugging() { int name[4]; struct kinfo_proc info; size_t info_size = sizeof(info); name[0] = CTL_KERN; name[1] = KERN_PROC; name[2] = KERN_PROC_PID; name[3] = getpid(); if (sysctl(name, 4, &info, &info_size, NULL, 0) == -1) { NSLog(@"anti_debugging: sysctl failed"); exit(1); } if (info.kp_proc.p_flag & P_TRACED) { NSLog(@"anti_debugging: traced"); exit(1); } } ``` 3. 检测是否被hook ``` void anti_hooking() { const char *functionName = "ptrace"; void *handle = dlopen("/usr/lib/libc.dylib", RTLD_GLOBAL | RTLD_NOW); if (handle == NULL) { NSLog(@"anti_hooking: dlopen failed"); exit(1); } void *ptrace_func = dlsym(handle, functionName); if (ptrace_func == NULL) { NSLog(@"anti_hooking: dlsym failed"); exit(1); } if (ptrace_func != (void *)&ptrace) { NSLog(@"anti_hooking: hook detected"); exit(1); } } ``` 4. 检测是否被注入Cycript等调试工具 ``` void anti_cycript() { char *cycript = strstr(getenv("DYLD_INSERT_LIBRARIES"), "cycript"); if (cycript != NULL) { NSLog(@"anti_cycript: cycript detected"); exit(1); } } ``` 此外,还可以在代码中添加闪退检测断点,当程序发生闪退时就可以打断点进行调试,例如: ``` void crash_handler(int signal) { signal(SIGTRAP, NULL); NSLog(@"crash_handler: signal=%d", signal); exit(1); } void set_crash_handler() { signal(SIGTRAP, crash_handler); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值