博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iphone4 电话截获
阅读量:7286 次
发布时间:2019-06-30

本文共 3466 字,大约阅读时间需要 11 分钟。

开发环境: iphone4 (ios4.3.2)

使用hook截获系统处理通知事件,然后进行相应的处理来达到截获的效果。目前的截获不是很完美,黑名单中的人打电话时会先出现“嘟.."声之后才会提示所拨打的用户正在通话中……

前提:需要class-dump CoreTelephony framework,并配置hook开发环境

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

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

2. 挂断电话的函数

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

CTCallDisconnect为挂断电话的函数,但是却没有在头文件中找到相应的声明,故使用dlsym来获取函数指针,进而来使用该函数。
disconnectCall被我定义在Util.m中,做为一个object clss去使用的,不过最好还是定义成C类型的,比较方便使用。
disconnectCall作为挂断电话的函数在下面的截获实现中会使用到。
dlopen等函数在#include 
头文件中, dlopen之后一定要dlclose去关闭,否则会出现一些问题。
3. 截获电话通知处理事件
CTCallCenter中有些函数是对电话的状态进行通知的,故对CTCallCenter中的handleNotificationFromConnection进行了处理,代码如下:
1 1 extern "C" void replaced_CTCallCenter_handleNotificationFromConnection(CTCallCenter *self, SEL cmd, void *arg1, id arg2, id arg3)  2  2 {
3 3 // NSLog(@"------------------------------------------replaced_CTCallCenter_handleNotificationFromConnection, arg1 = %@, arg2 = %@, arg3 = %@", arg1, arg2, arg3); 4 4 5 5 // NSLog(@"------------arg2Type = %@, arg3Type = %@", NSStringFromClass([arg2 class]), NSStringFromClass([arg3 class])); 6 6 7 7 NSDictionary *dic = (NSDictionary *)arg3; 8 8 9 9 // 此处获得电话状态,CTCallStateDialing, CTCallStateIncoming, CTCallStateConnected, CTCallStateDisconnected等,定义在CTCallCenter.h(非class-dump的头文件)中 10 10 NSLog(@"-------kCTCallStatus = %@", [dic objectForKey:@"kCTCallStatus"]); 11 11 12 12 NSLog(@"--------currentCalls = %@, callEventHandler = %@", self.currentCalls, self.callEventHandler); 13 13 14 14 // 获得CTCall对象 15 15 CTCall *call = [dic objectForKey:@"kCTCall"]; 16 16 17 17 // NSLog(@"------callId = %@, callState = %@", call.callID, call.callState); 18 18 19 19 // 这里可以根据kCTCallStatus来判断需要进行的操作 20 20 if (call.callState == CTCallStateDialing) 21 21 { 22 22 NSLog(@"Call has been CTCallStateDialing"); 23 23 } 24 24 else if (call.callState == CTCallStateIncoming) 25 25 {
26 26 NSLog(@"Call has just been CTCallStateIncoming"); 27 27 //这儿可接可挂 28 28 // 挂断电话 29 29 BOOL flag = [Util disconnectCall:call]; 30 30 NSLog(@"----------------是否挂断. flag = %d", flag); 31 31 } 32 32 else if(call.callState == CTCallStateConnected) 33 33 {
34 34 NSLog(@"Call is CTCallStateConnected"); 35 35 } 36 36 else if (call.callState == CTCallStateDisconnected) 37 37 {
38 38 NSLog(@"Call is CTCallStateDisconnected"); 39 39 } 40 40 else 41 41 {
42 42 43 43 NSLog(@"None of the conditions"); 44 44 45 45 } 46 46 47 47 original_CTCallCenter_handleNotificationFromConnection(self, cmd, arg1, arg2, arg3); 48 48 }
 
上面的代码会对所有的电话都进行过滤处理,电话也都打不进来的,但是会留下一个未接电话。
此处只是提供一个思路,具体的截获需要对传进来的参数等等进行一些解析,并提供一些细致的处理。
在CoreTelephony framework中还含有其他的一些函数,例如对于电话状态改变等等的都可以去细致的研究下,相信会有很大的收获

转载于:https://www.cnblogs.com/pengyingh/articles/2341280.html

你可能感兴趣的文章
数据结构-线性表操作
查看>>
5Python全栈之路系列之算法
查看>>
一个效果不错的Java Swing模拟屏幕截图工具类
查看>>
MySQL 的主从复制
查看>>
把合同中红色印章实现打印不显示方法
查看>>
linux调优工具使用
查看>>
php.ini中开启段标签
查看>>
php-扩展编译安装扩展(通用版)
查看>>
信号槽的实现实例—— Qt 和 Boost
查看>>
一段简单的php翻页代码
查看>>
AMD峰会:AMD继续领先intel 并走在节能前沿
查看>>
MySQL第三方复制工具 --- Tungsten-Replicator
查看>>
软件平台与框架的生命周期
查看>>
mysql 引擎MyISAM 和 InnoDB区别
查看>>
Docker(二十)在 Kubernetes 中配置私有 DNS 和上游域名服务器
查看>>
AIX 6.1 + HACMP 6.1 + Oracle 11g双机实施 (1) --- AIX 6.1配置HACMP 6.1
查看>>
我的友情链接
查看>>
mysqldump 使用
查看>>
做最好的自己,人生十件事(事业,人生,情感)
查看>>
jboss 优化
查看>>