一种基于内核驱动钩子技术的电子标签数据保护方法

文档序号:6515080阅读:203来源:国知局
一种基于内核驱动钩子技术的电子标签数据保护方法
【专利摘要】一种基于内核驱动钩子技术的电子标签数据保护方法,是一种使用Windows内核驱动钩子技术来实现从电子标签(RFID)系统的底层直接截取电子标签读卡器的读卡数据,使得读卡数据跳过在传输层的多次驻留与转换,从而保护电子标签数据的方法。通过直接从电子标签系统底层获取电子标签数据,跳过在传输过程中可能出现的数据篡改情况,从而保护标签数据不被篡改。与传统的保护电子标签本身的方法不同,本方法从读卡器的内核驱动着手,使用内核驱动钩子技术在电子标签底层获取电子标签数据。通过本发明提出的方法可以达到在电子标签系统底层截取电子标签读卡器读出的电子标签数据,从而达到对电子标签数据进行保护的目的。
【专利说明】—种基于内核驱动钩子技术的电子标签数据保护方法
【技术领域】
[0001]本发明是ー种使用Windows内核驱动钩子技术来实现从电子标签(RFID)系统的底层直接截取电子标签读卡器的读卡数据,使得读卡数据跳过在传输层的多次驻留与转换,从而保护电子标签数据的方法。属于物联网与信息安全的交叉领域。
[0002]
【背景技术】
[0003]目前,物联网(The Internet of Things)被人们广泛应用,它可以将人们和身边无数物品联系起来,使物品成为网络中用户的一分子,给人们带来诸多便利。作为物联网核心基础之ー的电子标签(RFID)技术因其具有防水防磁、读取距离远、读取速度快、存储容量大、可重复使用等优点,已被广泛应用于交通、物流、医疗、食品安全、零售、制造、海关、安检、机场等领域。可见,电子标签安全直接关系到物联网安全和应用的推广。因此,电子标签技术一直是研究的热点问题。
[0004]最基本的电子标签系统主要由作为数据载体的电子标签、读写电子标签数据的读卡器、用于存储、处理电子标签数据的后台数据库三个部分組成。一般情况下,读卡器和后台数据库之间的通信被认为是安全可靠的。关键是电子标签、读卡器的安全。因此,我们把电子标签系统安全问题分为:物理安全、通信安全、数据安全三个方面:
(I)电子标签物理安全:包括电子标签读卡器伪造、电子标签伪造、电子标签冲突问题
坐寸o
[0005](2)电子标签通信安全:电子标签使用的是无线通信信道,这就给非法用户的攻击带来了方便。攻击者可以非法截取通信数据;可以通过发射干扰信号来堵塞通信链路,使得读卡器过载,无法接收正常的标签数据,制造DoS攻击;可以冒名顶替向电子标签发送数据,篡改或伪造数据。
[0006](3)电子标签数据安全:电子标签系统中最主要的安全风险是“数据保密性”。信息泄露是指暴露标签发送信息,这个信息包括标签用户或识别对象的相关信息。包括窃取电子标签数据、篡改电子标签数据、往电子标签植入病毒、泄露电子标签数据格式。
[0007]Rootkit是安全领域的一个术语,来自root和kit两个单词的组合,其中root是Unix系统中超级用户的名称,拥有系统的最高权限;kit则是工具套件的意思。维基百科中关于Rootkit的定乂如下:“Rootkit是攻击者在入侵系统后用来保持对系统的超级用户访问权限,仓Il建后门和隐藏攻击痕迹等常采用的ー种技术。Rootkit存在于Linux、Solaris和Windows等各种操作系统上。”钩子技术是Rootkit的ー个核心内容。
[0008]钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗ロ的某种消息,而且所监视的窗ロ可以是其它进程所创建的。当消息到达后,在目标窗ロ处理函数之前处理它。钩子机制允许应用程序截获处理Windows消息或特定事件。钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理该消息,也可以不作处理而继续传递该消息,还可以強制结束消息的传递。一般来说有三种常见的钩子技术:
(I)内联钩子(Inline Hook):Inline Hook通过硬编码的方式向内核API函数的内存空间(通常是开始的一段字节,但理论上可以在任何位置)写入跳转语句,从而对函数执行流程进行修改,达到控制函数过滤操作的目的,之后只要该API函数被调用,程序就会跳转运行我们的函数。
[0009](2)Ring3下钩子(IAT Hook):1AT即导入地址表。IAT Hook就是通过修改IAT表中的函数地址而达到API截获的方法。每个被调用的API函数地址都保存在IAT表中。程序中每个被调用的API函数的CALL指令所使用的地址都是相应函数登记在IAT表的地址。所以为了截获API函数,我们只需将IAT表中的地址换成用户自己的API函数地址即可。
[0010](3)RingO下钩子(SSDT Hook):SSDT的全称系统服务描述符表,就是ー个把Ring3的Win32 API和RingO的内核API联系起来的表。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。通过修改此表的函数地址可以对常用Windows函数及API进行挂钩,从而实现对ー些关心的系统动作进行过滤、监控的目的。因此,修改在SSDT这个数组中保存的系统服务的地址,就可以将这个地址对应保存的服务地址替换棹,将我们自己的钩子处理函数的地址来替换掉原来的地址,这样当每次调用这个地址时就会调用我们自己的这个钩子处理函数了。
[0011]

【发明内容】

[0012]技术问题:本发明的目的是提供一种基于内核驱动钩子技术的电子标签数据保护方法,通过直接从电子标签系统底层获取电子标签数据,跳过在传输过程中可能出现的数据篡改情况,从而保护标签数据不被篡改。与传统的保护电子标签本身的方法不同,本方法从读卡器的内核驱动着手,使用内核驱动钩子技术在电子标签底层获取电子标签数据。通过本发明提出的方法可以达到在电子标签系统底层截取电子标签读卡器读出的电子标签数据,从而达到对电子标签数据进行保护的目的。
[0013]技术方案:本发明的方法是ー种使用传统PC技术应用于新型物联网环境的方法,通过Rootkit中钩子技术对读卡器驱动进行处理,然后达到预计效果。其目标是提出ー种电子标签数据的安全隐患,通过本方法验证并提供安全方案。
[0014]本发明的基于内核驱动钩子技术的电子标签数据保护方法采用Windows内核驱动钩子技术从电子标签系统的底层直接获取电子标签数据,从而达到保护电子标签数据的目的,具体是使用Windows内核驱动钩子技术对读卡器驱动程序进行处理,即通过定位钩子位置、编写钩子DLL程序并通过钩子注入器将钩子DLL程序注入到读卡程序中来获取电子标签数据;该方法所包含的步骤为:
步骤I).用户使用电子标签读卡器读取电子标签的数据,如果能正常读取,则转步骤2),如果不能正常读取,转步骤6);
步骤2).用户运行钩子注入器;
步骤3).用户使用步骤2)中的钩子注入器将钩子DLL程序注入到读卡程序中,如不能成功注入则转步骤6); 步骤4).等待钩子DLL程序注入成功提示,然后重新使用读卡器对电子标签进行读卡操作;
步骤5).等待读卡程序显示出读取的电子标签数据,如果显示的数据与步骤I )中正常读取的数据相同,则电子标签数据保护成功;否则,转步骤6);
步骤6).检查出错原因,然后回步骤I)执行。
[0015]所述的钩子DLL程序,使用内联钩子技术,通过解析原读卡函数的头五个字节,把它们复制到数组保存起来,然后用守护读卡函数的地址替换掉它们,达到一旦用户执行原读卡函数,就会跳转执行守护读卡函数的目的;钩子DLL程序所包含的步骤为:
步骤I)定位原读卡函数的头五个字节,然后修改原读卡函数的内存属性,改为“可读可写,,;
步骤2)将原读卡函数的头五个字节保存到临时数组中,并使用0xE9+守护读卡函数的地址替换掉原读卡函数的头五个字节;
步骤3)程序执行守护读卡函数,守护读卡函数用来获取电子标签的数据;
步骤4)程序将保存在临时数组中的原读卡函数的头五个字节取出并恢复;
步骤5)程序恢复到原读卡程序正常的执行流程。
[0016]所述的钩子注入器,使用DLL注入技术中的远线程注入技术,通过在读卡程序进程中创建远线程的方法进入到读卡程序进程的内存地址空间,并通过该远线程将钩子DLL程序注入到读卡程序进程的地址空间中,从而达到在读卡程序进程中注入钩子DLL程序的目的;钩子注入器所包含的步骤为:
步骤I)使用OpenProcess函数得到读卡程序进程的句柄;
步骤2)在读卡程序进程中为钩子DLL程序分配内存,然后把钩子DLL程序的文件路径写到分配的内存中;
步骤3)使用CreateRemoteThread和LoadLibrary函数把钩子DLL程序映射到读卡程序进程中;
步骤4)等待远线程结束,然后释放步骤2)中分配的内存;
步骤5)用CreateRemoteThread和FreeLibrary把钩子DLL程序从读卡程序进程中卸载。
[0017]有益效果:本发明方法提出了一种基于内核驱动钩子技术的电子标签数据保护新方法,主要用于保护电子标签的数据安全。本发明具有以下ー些特殊优点和有益成果:
(I)使用较少的资源:当多个程序使用同一个函数库时,DLL形式的钩子程序可以减少在磁盘和物理内存中加载的代码的重复量。这能影响到在前台运行的程序,而且可以影响其他在Windows操作系统上运行的程序。
[0018](2)模块式体系结构:DLL形式的钩子程序有助于模块式程序的开发。这可以帮助开发多个语言版本的模块式体系结构的程序。方便版本更新,新功能加入以及代码修改等。
[0019](3)简化部署和安装:当DLL中的函数需要更新或修复吋,部署和安装DLL不要求重新建立程序与该DLL的链接。此外,如果多个程序使用同一个DLL,那么多个程序都将从该更新或修复中获益。
[0020](4)应用广泛:钩子技术涵盖了从用户层的IAT钩子到内核层的SSDT钩子、IDT钩子等方方面面,应用广泛。[0021](5)可扩展性強:在本发明方法的基础上,只需根据特定的技术要求而改变钩子编程的内容,就能实现特定要求的电子标签数据处理方法,可扩展性強。
[0022]
【专利附图】

【附图说明】
[0023]图1是内联钩子技术的流程示意图。图中比较了钩子前后的程序执行流程。
[0024]图2是本发明的结构示意图。图中包括:电子标签读卡器、电子标签、显示器、后台数据库以及守护用户。
[0025]图3是电子标签数据的流向图。表示本发明方法示例的电子标签数据流向情況。其中,实心线代表原程序电子标签数据流向;空心线代表执行本发明方法后的电子标签数据流向。
[0026]图4是本发明的技术体系框图。图中分三个层次说明了本发明的体系结构。
【具体实施方式】
[0027]本发明主要分为三大部分:
(I)定位钩子位置部分:该部分技术方案主要用到反汇编(Disassembly)技木。反汇编技术就是把目标代码转为汇编代码的过程,也可说是把机器语言转为汇编语言代码的过程。反汇编分为静态反汇编和动态反汇编。静态反汇编是从反汇编出来的程序清单上分析,从提示信息入手进行分析。常用的静态分析工具是W32DASM、PEiD、FileInfo、Hex RaysIda和HIEW等。动态反汇编即在程序运行中进行反汇编处理以及调试工作,常用的动态分析エ具有0D、IDA Pro、DEBUG、C32等。本发明使用反汇编技术动态分析读卡程序,通过断点与调试来定位读卡函数的位置,并通过会汇编代码的阅读,确定读卡函数的入口地址。读卡函数即本发明的钩子点。
[0028]钩子DLL编程部分:该部分技术方案核心技术为内联钩子(Inline Hook)技术。内联钩子就是对函数执行流程进行修改,达到控制函数过滤操作的目的。内联钩子通过解析函数钩子点的几条指令,把它们复制到数组保存起来,然后用一个调用我们的函数的几条指令来替换,如果要执行原函数,则在我们函数处理完毕,再执行我们保存起来的钩子点的几条指令,然后调回我们取指令之后的地址执行。理论上我们可以在函数任何地方把原来指令替换成我们的跳转指令。常见的内联钩子点位置通常有三种:
a.将目标函数开头部分代码修改为跳转语句:这样钩子函数在目标函数执行前获得执行权,它调用真正的目标函数。该方法的优点是容易定位修改点,操作简单。本发明采取此种方法。
[0029]b.将目标函数中间部分指令修改为跳转语句:在目标函数执行到一定步骤时,钩子函数获得执行权,对目标函数内部数据进行修改。该方法的优点是不易检测,缺点是较难定位插入点和目标数据的位置。
[0030]c.修改目标函数某处call或jump指令的目标地址:该方法与方法b类似,其缺点是通用性能差,不容易找到合适的call或jmp指令。
[0031]本发明采取a方法,本发明的内联钩子(Inline Hook)流程图用图1来解释。相关步骤如下: 步骤I)通过反汇编定位到钩子点函数的头五个字节,本发明实例中为读卡函数的字节 0x55,0x8B,OxEC,0x6A,OxFF。
[0032]步骤2)修改Api函数的内存属性,改为“可读可写”。
[0033]步骤3)将头五个字节保存到Resume Function函数中。Resume Function函数用于恢复操作,该函数运行完这五个字节后,跳转到原函数第六字节指令所在地址。
[0034]步骤4)将头五个字节改成0xE9+My Function函数的地址(4个字节)。0xE9代表汇编指令JMP。My Function函数用于完成截取数据操作。
[0035]步骤5) My Function函数首先执行处理函数,即完成在底层截取标签数据的功能,然后跳转到Resume Function函数中。
[0036]步骤6) Resume Function函数执行之后,就恢复到原程序正常的执行流程。
[0037]为了方便注入,本发明钩子编程的最終结果以DLL (动态链接库)的形式出现。DLL是ー个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了ー种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于ー个DLL中,该DLL包含ー个或多个已被编译、链接并与使用它们的进程分开存储的函数。
[0038]DLL有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL副本的内容。使用DLL还有助于促进代码的模块化、代码重用、内存的有效使用和減少所占用的磁盘空间。因此,操作系统和程序能够更快地加载和运行,并且在计算机中占用较少的磁盘空间。一旦DLL的文件映像被映射到进程的地址空间中,DLL函数就可以供进程中运行的所有线程使用。
[0039]钩子注入器部分:该部分技术方案主要用到DLL注入(DLL Injection)技术。常用的DLL注入技术有三种。
[0040]a.用Windows钩子把DLL映射到进程中:Windows钩子的主要作用就是监视某个线程的消息流动。如果被挂钩(监视)的线程属于别的进程,此时你的钩子过程必须放在一个动态连接库(DLL)中。当钩子设置成功,调用SetWindowHookEx时,系统会自动映射这个DLL到被挂钩的线程,但并不是立即映射。因为所有的Windows钩子都是基于消息的,直到一个适当的事件发生后这个DLL才被映射。
[0041]b.创建远线程注入:指通过在另一个进程中创建远程线程的方法进入目标进程的内存地址空间。在进程中可以通过CreateThread函数创建线程,被创建的新线程与主线程共享地址空间以及其他的资源。同样,通过CreateRemoteThread函数可以在其他进程内创建新线程,新创建的远程线程可以共享远程进程的地址空间。因此可以使用插入到目标进程中的远程线程将DLL插入到目标进程的地址空间,即利用该线程通过调用Windows APILoadLibrary函数来注入DLL。
[0042]c.利用注册表注入:在Windows NT/2000/XP/2003中,有一个注册表键值HKEY_LOCAL_MACHINE\Software\Microsoft\ffindowsHKEY_LOCAL_MACHINE\Software\Microsoft\ffindowsNT\CurrentVersion\ Windows\AppInit_DLLs0 当某个进程加载User32.DLL时,这里面列出的所有的DLL都将利用LoadLibrary函数加载到该进程空间中。我们可以把自己的DLL加入该键值,这样就可以注入到进程中了。
[0043]本发明采取的是b方法,即使用远线程注入技术来实现DLL注入。相关步骤如下: 步骤I)得到远程进程的HANDLE (使用OpenProcess)。[0044]步骤2)在远程进程中为DLL文件名分配内存(VirtualAllocEx)。
[0045]步骤3)把DLL的文件名(全路径)写到分配的内存中(WriteProcessMemory) 步骤4)使用CreateRemoteThread和LoadLibrary把DLL映射近远程进程。
[0046]步骤5)等待远程线程结束(WaitForSingleObject),即等待LoadLibrary返回。也就是说当DLLMain (是以DLL_PROCESS_ATTACH为參数调用的)返回时远程线程就立即结束了。
[0047]步骤6)取回远程线程的结束码(GetExitCodeThtread),即LoadLibrary的返回值,也就是DLL加载后的基地址(HM0DULE)。
[0048]步骤7)释放步骤2)分配的内存(VirtualFreeEx)。
[0049]步骤8)用CreateRemoteThread和FreeLibrary把DLL从远程进程中卸载。调用时传递步骤 6)取得的 HM0DULE 给 FreeLibrary(通过 CreateRemoteThread 的 IpParameter參数)。
[0050]步骤9)等待线程的结束(WaitSingleObject)。
[0051]为了方便描述,我们假定有如下应用实例:
ー个守护用户(用A表示)要保护电子标签读卡器(用B表示)读出的电子标签(用C表示)数据。为方便描述,假设读卡函数为F,守护读卡函数为MyF。则其【具体实施方式】为:
(I)首先描述正常情况下。正常用户使用读卡器读取电子标签数据为正确的卡序列号,记为R。字符串R初始值为ー长串二进制数字,经程序转换成8位16进制数值。正常读卡流程即通过读卡器驱动将电子标签C的序列号R读取出来,然后读卡程序对R进行转换处理后在显示器上显示处理。
`[0052](2)守护用户A进入该环境。守护用户A使用钩子注入器将钩子DLL程序注入到读卡程序中。钩子DLL程序的具体编写步骤如下:
步骤I)在DLL注入时触发守护读卡函数
使用DLLMain函数实现触发守护函数代码块。DLLMain函数声明如下:DLLMain(HINSTANCE hmodule, DWORD reason, LPVOID lpreserved)
{
if (reason==DLL_PROCESS_ATTACH)............1l此处实现守护函数
if (reason==DLL_PROCESS_DETACH)............此处实现卸载钩子函数
}
即在reason==DLL_PROCESS_ATTACH时触发守护函数代码块,在reason==DLL_PR0CESS_DETACH时触发卸载钩子代码块。
[0053]步骤2)获取读卡函数F的地址
使用GetModuleHandle函数获取读卡函数所在DLL的模块句柄。使用GetProcAddress函数获取读卡函数的地址。
[0054]步骤3)声明一个伪造的读卡函数MyF,即守护读卡函数
使用WINAPI函数声明守护读卡函数MyF,保证MyF函数与F函数所有參数及返回值都相同,不然程序会报错。[0055]步骤4)构造守护读卡函数MyF的地址来代替读卡函数F
通过字节的形式来代表MyF的地址,保存到变量tem里面。地址计算公式为:MyF函数地址的4个字节=MyF函数地址-(F函数地址+5)
步骤5)构造跳转函数
跳转函数用来将执行F函数的地址跳转到执行MyF。首先声明ー个字节数组_data,字节长度为5。其中_(1&セ&[0]=(^£9,(^£9代表汇编指令譯?。然后使用VirtualProtect函数来修改内存属性,否则内存地址是无法跳转的。最后使用memcpy函数来修改内存。至此,跳转函数完成,执行到这ー步的时候,钩子DLL程序所要完成的功能已经编写完成。
[0056]步骤6)在DLL卸载时卸载钩子DLL程序
使用memcpy函数,通过字节数组的形式把F函数原地址的前五个字节(本发明实例中为SB,FF, 55,SB, EC),写入F函数地址,用来恢复原函数执行流程。达到卸载钩子的目的。
[0057](3)使用本发明实例编写的钩子注入器将钩子DLL程序注入到读卡程序之后,显示器将直接显示从电子标签系统底层获取的电子标签数据,避免电子标签数据在传输层出现数据篡改的情况,从而保护电子标签数据。
[0058](4)守护读卡函数完成后,将钩子DLL程序卸载掉,然后退出钩子注入器。本发明方法实施方式到此结束。`
【权利要求】
1.一种基于内核驱动钩子技术的电子标签数据保护方法,其特征在于采用Windows内核驱动钩子技术从电子标签系统的底层直接获取电子标签数据,从而达到保护电子标签数据的目的,具体是使用Windows内核驱动钩子技术对读卡器驱动程序进行处理,即通过定位钩子位置、编写钩子DLL程序并通过钩子注入器将钩子DLL程序注入到读卡程序中来获取电子标签数据;该方法所包含的步骤为: 步骤I).用户使用电子标签读卡器读取电子标签的数据,如果能正常读取,则转步骤2),如果不能正常读取,转步骤6); 步骤2).用户运行钩子注入器; 步骤3).用户使用步骤2)中的钩子注入器将钩子DLL程序注入到读卡程序中,如不能成功注入则转步骤6); 步骤4).等待钩子DLL程序注入成功提示,然后重新使用读卡器对电子标签进行读卡操作; 步骤5).等待读卡程序显示出读取的电子标签数据,如果显示的数据与步骤I )中正常读取的数据相同,则电子标签数据保护成功;否则,转步骤6); 步骤6).检查出错原因,然后回步骤I)执行。
2.根据权利要求1所述的基于内核驱动钩子技术的电子标签数据保护方法,其特征在于所述的钩子DLL程序,使用内联钩子技术,通过解析原读卡函数的头五个字节,把它们复制到数组保存起来,然后用守护读卡函数的地址替换掉它们,达到一旦用户执行原读卡函数,就会跳转执行守护读卡函数的目的;钩子DLL程序所包含的步骤为: 步骤I)定位原读卡函数的头五个字节,然后修改原读卡函数的内存属性,改为“可读可写,,; 步骤2)将原读卡函数的头五个字节保存到临时数组中,并使用0xE9+守护读卡函数的地址替换掉原读卡函数的头五个字节; 步骤3)程序执行守护读卡函数,守护读卡函数用来获取电子标签的数据; 步骤4)程序将保存在临时数组中的原读卡函数的头五个字节取出并恢复; 步骤5)程序恢复到原读卡程序正常的执行流程。
3.根据权利要求1所述的基于内核驱动钩子技术的电子标签数据保护方法,其特征在于所述的钩子注入器,使用DLL注入技术中的远线程注入技木,通过在读卡程序进程中创建远线程的方法进入到读卡程序进程的内存地址空间,并通过该远线程将钩子DLL程序注入到读卡程序进程的地址空间中,从而达到在读卡程序进程中注入钩子DLL程序的目的;钩子注入器所包含的步骤为: 步骤I)使用OpenProcess函数得到读卡程序进程的句柄; 步骤2)在读卡程序进程中为钩子DLL程序分配内存,然后把钩子DLL程序的文件路径写到分配的内存中; 步骤3)使用CreateRemoteThread和LoadLibrary函数把钩子DLL程序映射到读卡程序进程中; 步骤4)等待远线程结束,然后释放步骤2)中分配的内存; 步骤5)用CreateRemoteThread和FreeLibrary把钩子DLL程序从读卡程序进程中卸载。
【文档编号】G06F21/60GK103559450SQ201310472008
【公开日】2014年2月5日 申请日期:2013年10月11日 优先权日:2013年10月11日
【发明者】张伟, 曹承志, 李鹏, 王汝传, 徐鹤 申请人:南京邮电大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1