百度一下 藏锋者 就能快速找到本站! 每日资讯归档 下载藏锋者到桌面一键访问

当前位置:主页 > 网络安全 > 编程实现手机来电防火墙原理

编程实现手机来电防火墙原理

所在栏目:网络安全 时间:04-13 00:25 分享:

防止手机自动拨打电话,或者接收电话的功能,我们称之为“手机来电防火墙”,它的原理类似与我们计算机系统上的网络防火墙功能。
手机病毒程序往往会利用自动拨打电话功能来实现对手机用户的语音监听。同时,手机病毒还可以实现将用户个人信息发送给病毒制造者,然后病毒制造者就可以利用这些资料信息,打电话给该用户进行欺骗。
如果我们不能很好地防范手机病毒,尤其是新的手机病毒,就必须采用一定的方式来防止病毒自动拨打电话或者接收莫名电话,尤其是匿名电话,因为病毒制造者为了隐藏自己,往往使用匿名电话来欺骗手机用户。
这种防止手机自动拨打电话或者接收电话的功能非常类似我们计算机系统上的网络防火墙功能。防火墙就是用来阻止或者限制系统外部数据进入内部,同时也可以防止内部没有规定的程序访问系统外部。既然我们需要在手机上实现的是对语音通讯的限制,尤其是对手机来电进行防护,那么实现这种功能的软件我们就称之为“来电防火墙”。

编程实现手机来电防火墙原理


要想在手机系统上实现对电话语音的监视,需要首先明确手机系统是不是提供有相应的系统方法或者系统函数。普通的手机系统是不会向外提供这些比较关键的方法的,出于对手机使用者群体的考虑,手机系统只会自带或者干脆不实现电话语言监视功能,因为这种功能最大的用处就是可以进行来电地区查询,也就是说可以实现手机接收到来电时,同时告诉手机使用者该来电来自于什么地方。这种功能在一般低端的手机上都没有自带实现。
对于中高端手机来讲,其手机系统就会额外提供这种语音监听功能。在手机系统开发商向外提供的应用程序开发环境中(如SDK)就会有相关的方法或者函数说明。这里以Symbian系统下的语音监视功能开发为例,讲解一下手机来电防火墙的一般实现原理。
对于来电监视这样的功能来说,它一定是处于手机系统后台工作的,因为它需要随时监视系统是不是收到了来电语音信号,同时,它的工作不能占据手机系统正常的工作使用。对于Symbian系统来讲,这就需要将来电监视程序编写成为一个叫做“活动对象”的目标程序。
对于Symbian系统来讲,系统对需要处理的事件都有一个优先级的概念在里面,例如一个外来语音电话,系统中的关键程序就会马上处理这个来电,然后再交由系统以外的程序进行处理。活动对象就是用于处理无优先级事件的。
作为后台运行的服务程序,创建活动对象时首先必须继承于CActive类。CActive类主要包含以下一些变量和方法:
iStatus:系统的活动对象管理器通过检查iStatus变量的值,来判断其相应请求是否完成。
iActive:主要是用来表明自己需要响应哪些事件。当系统接收到某种事件后,活动对象管理器会根据所有活动对象iActive值的不同来判断需不需要将该事件交由它进行处理。
SetActive():用来设定iActive值,将其设置为true,表明此活动对象已经申请了一个请求,进行处理事件。
Cancel():检查iActive的值,如果其值为false,表明没有请求,则什么也不做。否则调用DoCancel()来结束请求,表明该活动对象没有正在等待的请求。
DoCancel():由Cancel()调用。
RunL():这是一个关键函数,将由活动对象管理器进行调用。
为此,我们的来电监视程序就需要先继承这个CActive类,基本代码如下:

CIncomingCall::CIncomingCall():CActive(EPriorityStandard),
//这里表明我们的来电监视类CIncomingCall继承于CActive
iRemParty(iRemInfoUse),
iCallInfo(iCallInfoUse),
iCallSelection(iCallSelectionUse),
iCallStatusPkg(iCallStatus)
{……}

接下来,作为主体的CIncomingCall类需要实现自己的构建函数,其代码为:

void CIncomingCall:: IncomingCall ()
{
_LIT( KNotifyExamplePanic, "CNotifyExample" );
__ASSERT_ALWAYS( !IsActive(), User::Panic( KNotifyExamplePanic, 1 ));
iTelephony->NotifyChange(iStatus, CTelephony::EVoiceLineStatusChange, iCallStatusPkg);
SetActive();//激活活动对象,也可就是开始接收关于语音通讯的事件
}

这里最关键的一句代码是:“iTelephony->NotifyChange(iStatus,CTelephony::EVoiceLineStatusChange, iCallStatusPkg);”,其中iTelephony是一个CTelephony类的实例。
CTelephony类的作用是提供一个简单的使用方法,编程人员可以通过这个方法在系统核心函数与用户层中间建立关于语音电话的过滤层。这个类可以支持对来电进行设置,或者控制语音拨号、语音网络信息,以及一些其它基本的语音设置,它是一个非常有用的电话类。
在CTelephony类中,NotifyChange是一个回调函数,其作用主要是监视语音电话的状态,也即手机是不是处于电话接通状态或者是不是有新的来电等等。
我们的来电防火墙就是一个对语音电话进行监视的程序,为此,我们必须使用CTelephony类的NotifyChange函数来获得手机语音电话的变化信息,同时需要将信息事件传递给CIncomingCall进行处理。
为了处理NotifyChange提供的电话状态信息,CIncomingCall需要实现RunL()函数,其具体代码为:

void CIncomingCall::RunL()
{
if(iStatus==KErrNone)
//首先检查活动对象本身的状态是不是正常,正常则开始处理电话事件
{
CTelephony::TCallStatus status = iCallStatus.iStatus;
//获得当前电话事件信息
switch ( status )//开始判读现在的电话事件具体内容
{
case CTelephony::EStatusRinging: //来电开始响铃
{
WriteToFile(_L8("EStatusRinging\n"));
//在一个文本文件中记录下电话事件信息,如果是防火墙则记录在来电日志里
iCallSelectionUse.iLine = CTelephony::EVoiceLine;
iCallSelectionUse.iSelect = CTelephony::EInProgressCall;
iTelephony->GetCallInfo(iCallSelection,iCallInfo,iRemParty);
//获取此刻来电信息
TBuf8<100> CallerNumber;
CallerNumber.Copy(iRemInfoUse.iRemoteNumber.iTelNumber);
//获取来电号码
WriteToFile(CallerNumber);//将来电号码写入文本文件
}
break;
case CTelephony::EStatusConnected :
{//此刻手机已经接通电话
WriteToFile(_L8("EStatusConnected\n"));
//记录下手机正处于接通状态
}
break;
case CTelephony::EStatusAnswering :
{//对方开始有应答信号
WriteToFile(_L8("EStatusAnswering\n"));
//记录下此时对方已经有应答
}
break;
case CTelephony::EStatusDialling:
{//手机处于拨号状态
WriteToFile(_L8("EStatusDialling\n"));
//记录下手机处于拨号状态
}
break;
case CTelephony::EStatusDisconnecting:
{//手机此时无法正常连接对方,就是我们常见的手机拨对方后,出现嘟嘟响声的状态
WriteToFile(_L8("EStatusDisconnecting\n"));
//记录下此刻手机处于无法正常连接状态
}
break;
case CTelephony::EStatusConnecting:
{//手机正在进行电话连接
WriteToFile(_L8("EStatusConnecting\n"));
}
break;
case CTelephony::EStatusUnknown:
{//手机在语音通话中发生未知名错误
WriteToFile(_L8("EStatusUnknown\n"));
}
break;
case CTelephony::EStatusIdle:
{//手机处于待机状态,即此刻手机没有任何语音通话
WriteToFile(_L8("EStatusIdle\n"));
}
break;
case CTelephony::EStatusReconnectPending:
{//网络信号不好,此刻是手机无法正常连接
WriteToFile(_L8("EStatusReconnectPending\n"));
}
break;
case CTelephony::EStatusHold:
{//通话被挂起
WriteToFile(_L8("EStatusHold\n"));
}
break;
case CTelephony::EStatusTransferring:
{//通话进行中
WriteToFile(_L8("EStatusTransferring\n"));
}
break;
case CTelephony::EStatusTransferAlerting:
{//手机处于回铃音状态
WriteToFile(_L8("EStatusTransferAlerting\n"));
}
break;
}
iTelephony->NotifyChange( iStatus,
CTelephony::EVoiceLineStatusChange,
iCallStatusPkg );
//本次手机通话状态处理完毕后,继续激活,以便接收下一次通话事件
SetActive();
}
else
{
CEikonEnv::Static()->InfoWinL(_L("Error in:"), _L("status"));
//出现错误状态则挂起程序
}
}
通过对上面代码的解读,我们明白了,在Symbian系统下,可以通过在后台设置一个活动对象程序,主要工作就是接收由系统传递给它的关于语音通讯的所有事件,然后再按照这些事件的不同意义进行处理,这样就可以完成对手机语音通讯的状态进行监视了。
在上面的程序中,我们没有过多的对语音事件进行处理,而是将其所有状态写进了一个文本文件中,其具体代码也列在这里,以便读者进行参考。

void CRetrieveNumber::WriteToFile(TDesC8& aContent8)
{
_LIT(KFileSpec,"C:\\Nokia\\LogsTelephony.txt");
//被创建的用来记录手机语音状态的文本文件名称
TInt iPos=0;
RFs iFs;
User::LeaveIfError(iFs.Connect());
//连接文件系统,Symbian系统要求所有操作文件的动作必须首先连接文件系统
RFile iFile;//创建一个文件操作对象,我们将使用这个文件对象来读写文本文件
TInt err = iFile.Open(iFs, KFileSpec, EFileShareExclusive|EFileStreamText|EFileWrite);
//打开创建的文本文件
if(err!= KErrNone)
{//如果出现错误,则证明文件还没有创建
if (iFile.Create(iFs, KFileSpec, EFileShareExclusive|EFileStreamText|EFileWrite) != KErrNone)
//创建文件
{
err = iFile.Open(iFs, KFileSpec, EFileShareExclusive|EFileStreamText|EFileWrite);
//再次打开创建好的文件
}
}
err =iFile.Seek(ESeekEnd,iPos);
//依据上一次的文件末尾,开始新的记录添加
if (err != KErrNone)
{
TBuf<10> errBuf;
errBuf.AppendNum(err);
CEikonEnv::InfoWinL(_L("Seek Unsuccessful"), errBuf);
//可能出现了文件错误
}
err = iFile.Write(aContent8);
//如果没有错误,就直接将此刻的手机状态记录在文件中
iFile.Flush();//刷新
if (err != KErrNone)
{
TBuf<10> errBuf;
errBuf.AppendNum(err);
CEikonEnv::InfoWinL(_L("Write Unsuccessful"),errBuf);
//在文件记录中出现了错误
}
iFile.Close();//关闭文件对象,以便释放系统资源
iFs.Close();//关闭文件系统连接,以便释放系统资源
}

现在,Symbian系统下的来电防火墙的基本核心我们已经实现,上面的演示代码中只进行了一个日志文件记录,如果要对来电号码进行筛选屏蔽,就需要我们在处理CTelephony::EStatusRinging事件时,对获取到的来电号码进行数据匹配,检查该号码与我们在防火墙中设定需要屏蔽的号码是否一致,如果一样,则可以直接切断此次来电;如果不一样,则可以放行。
其实,手机来电防火墙只是保护手机通讯安全的一种方式,手机病毒程序还可以通过短消息来实现对用户手机的控制,如利用短消息扣去用户手机话费或者向外发送用户手机上的私人信息。

编程实现手机来电防火墙原理 免费邮件订阅: 邮件订阅

图片推荐

热点排行榜

CopyRight? 2013 www.cangfengzhe.com All rights reserved