iphone电话截获 (越狱后)

转载请注明原创地址:http://blog.csdn.net/iflychenyang/article/details/8534586

(这篇文章是从之前的博客中搬迁过来)

前提:配置越狱开发环境

1.在说截获之前,先说说dlsym的使用

我们通常会在网上看到一些函数具有我们需要的功能,但是头文件中查找去找不到,但是使用grepframework中确实可以搜索到相应的符号,导致使用上出现一些麻烦。此时我们就可以使用dlsym来从动态库中获取相应的函数。

2. 挂断电话的函数

// CoreTelephony framework在系统中的路径
 #define CTPATH  "/XCode4.0andIphoneSDK4.3/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony"
 
 // 挂断电话函数
 - (BOOL)disconnectCall:(id)call
 {
     void *framework = dlopen(CTPATH, RTLD_LAZY);
     id (*CTCallDisconnect)(id) = dlsym(framework, "CTCallDisconnect");
     CTCallDisconnect(call);
     dlclose(framework);
     return YES;
 }

CTCallDisconnect为挂断电话的函数,但是却没有在头文件中找到相应的声明,故使用dlsym来获取函数指针,进而来使用该函数。

disconnectCall被我定义在Util.m中,做为一个object clss去使用的,不过最好还是定义成C类型的,比较方便使用。

disconnectCall作为挂断电话的函数在下面的截获实现中会使用到。

dlopen等函数在#include<dlfcn.h>头文件中, dlopen之后一定要dlclose去关闭,否则会出现一些问题。

3. 截获电话通知处理事件

CTCallCenter中有些函数是对电话的状态进行通知的,故对CTCallCenter中的handleNotificationFromConnection进行了处理,代码如下:

extern "C" void replaced_CTCallCenter_handleNotificationFromConnection(CTCallCenter *self, SEL cmd, void *arg1, id arg2, id arg3)
 {
 //    NSLog(@"------------------------------------------replaced_CTCallCenter_handleNotificationFromConnection, arg1 = %@, arg2 = %@, arg3 = %@", arg1, arg2, arg3);
     
 //    NSLog(@"------------arg2Type = %@, arg3Type = %@", NSStringFromClass([arg2 class]), NSStringFromClass([arg3 class]));
     
     NSDictionary *dic = (NSDictionary *)arg3;
     
     // 此处获得电话状态,CTCallStateDialing, CTCallStateIncoming, CTCallStateConnected, CTCallStateDisconnected等,定义在CTCallCenter.h(非class-dump的头文件)中
     NSLog(@"-------kCTCallStatus = %@", [dic objectForKey:@"kCTCallStatus"]);
     
     NSLog(@"--------currentCalls = %@, callEventHandler = %@", self.currentCalls, self.callEventHandler);
     
     // 获得CTCall对象
     CTCall *call = [dic objectForKey:@"kCTCall"];
     
 //    NSLog(@"------callId = %@, callState = %@", call.callID, call.callState);
     
 // 这里可以根据kCTCallStatus来判断需要进行的操作
     if (call.callState == CTCallStateDialing)
     { 
         NSLog(@"Call has been CTCallStateDialing");
     }
     else if (call.callState == CTCallStateIncoming) 
     {
         NSLog(@"Call has just been CTCallStateIncoming");
         //这儿可接可挂
 // 挂断电话
         BOOL flag = [Util disconnectCall:call];
         NSLog(@"----------------是否挂断. flag = %d", flag);
     }
     else if(call.callState == CTCallStateConnected)
     {
         NSLog(@"Call is CTCallStateConnected");
     }
     else if (call.callState == CTCallStateDisconnected)
     {
         NSLog(@"Call is CTCallStateDisconnected");
     }
     else
     {
         
         NSLog(@"None of the conditions");
         
     }
     
     original_CTCallCenter_handleNotificationFromConnection(self, cmd, arg1, arg2, arg3);
 }

上面的代码会对所有的电话都进行过滤处理,电话也都打不进来的,但是会留下一个未接电话。

此处只是提供一个思路,具体的截获需要对传进来的参数等等进行一些解析,并提供一些细致的处理。

CoreTelephonyframework中还含有其他的一些函数,例如对于电话状态改变等等的都可以去细致的研究下,相信会有很大的收获。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值