《一种基于内核驱动钩子技术的电子标签数据保护方法.pdf》由会员分享,可在线阅读,更多相关《一种基于内核驱动钩子技术的电子标签数据保护方法.pdf(11页珍藏版)》请在专利查询网上搜索。
1、(10)申请公布号 CN 103559450 A (43)申请公布日 2014.02.05 CN 103559450 A (21)申请号 201310472008.3 (22)申请日 2013.10.11 G06F 21/60(2013.01) G06K 7/00(2006.01) (71)申请人 南京邮电大学 地址 210000 江苏省南京市栖霞区亚东新城 区文苑路 9 号 (72)发明人 张伟 曹承志 李鹏 王汝传 徐鹤 (74)专利代理机构 江苏爱信律师事务所 32241 代理人 唐小红 (54) 发明名称 一种基于内核驱动钩子技术的电子标签数据 保护方法 (57) 摘要 一种基于内核驱。
2、动钩子技术的电子标签数据 保护方法, 是一种使用 Windows 内核驱动钩子技 术来实现从电子标签 (RFID) 系统的底层直接截 取电子标签读卡器的读卡数据, 使得读卡数据跳 过在传输层的多次驻留与转换, 从而保护电子标 签数据的方法。通过直接从电子标签系统底层获 取电子标签数据, 跳过在传输过程中可能出现的 数据篡改情况, 从而保护标签数据不被篡改。 与传 统的保护电子标签本身的方法不同, 本方法从读 卡器的内核驱动着手, 使用内核驱动钩子技术在 电子标签底层获取电子标签数据。通过本发明提 出的方法可以达到在电子标签系统底层截取电子 标签读卡器读出的电子标签数据, 从而达到对电 子标签数。
3、据进行保护的目的。 (51)Int.Cl. 权利要求书 1 页 说明书 7 页 附图 2 页 (19)中华人民共和国国家知识产权局 (12)发明专利申请 权利要求书1页 说明书7页 附图2页 (10)申请公布号 CN 103559450 A CN 103559450 A 1/1 页 2 1. 一种基于内核驱动钩子技术的电子标签数据保护方法, 其特征在于采用 Windows 内 核驱动钩子技术从电子标签系统的底层直接获取电子标签数据, 从而达到保护电子标签数 据的目的, 具体是使用 Windows 内核驱动钩子技术对读卡器驱动程序进行处理, 即通过定 位钩子位置、 编写钩子 DLL 程序并通过钩。
4、子注入器将钩子 DLL 程序注入到读卡程序中来获 取电子标签数据 ; 该方法所包含的步骤为 : 步骤 1). 用户使用电子标签读卡器读取电子标签的数据, 如果能正常读取, 则转步骤 2) , 如果不能正常读取, 转步骤 6) ; 步骤 2). 用户运行钩子注入器 ; 步骤 3). 用户使用步骤 2) 中的钩子注入器将钩子 DLL 程序注入到读卡程序中, 如不能 成功注入则转步骤 6) ; 步骤 4). 等待钩子 DLL 程序注入成功提示, 然后重新使用读卡器对电子标签进行读卡 操作 ; 步骤5).等待读卡程序显示出读取的电子标签数据, 如果显示的数据与步骤) 中正常 读取的数据相同, 则电子标。
5、签数据保护成功 ; 否则, 转步骤 6) ; 步骤 6). 检查出错原因, 然后回步骤 1) 执行。 2. 根据权利要求 1 所述的基于内核驱动钩子技术的电子标签数据保护方法, 其特征在 于所述的钩子 DLL 程序, 使用内联钩子技术, 通过解析原读卡函数的头五个字节, 把它们复 制到数组保存起来, 然后用守护读卡函数的地址替换掉它们, 达到一旦用户执行原读卡函 数, 就会跳转执行守护读卡函数的目的 ; 钩子 DLL 程序所包含的步骤为 : 步骤 1) 定位原读卡函数的头五个字节, 然后修改原读卡函数的内存属性, 改为 “可读 可写” ; 步骤 2) 将原读卡函数的头五个字节保存到临时数组中,。
6、 并使用 0xE9+ 守护读卡函数 的地址替换掉原读卡函数的头五个字节 ; 步骤 3) 程序执行守护读卡函数, 守护读卡函数用来获取电子标签的数据 ; 步骤 4) 程序将保存在临时数组中的原读卡函数的头五个字节取出并恢复 ; 步骤 5) 程序恢复到原读卡程序正常的执行流程。 3. 根据权利要求 1 所述的基于内核驱动钩子技术的电子标签数据保护方法, 其特征在 于所述的钩子注入器, 使用 DLL 注入技术中的远线程注入技术, 通过在读卡程序进程中创 建远线程的方法进入到读卡程序进程的内存地址空间, 并通过该远线程将钩子 DLL 程序注 入到读卡程序进程的地址空间中, 从而达到在读卡程序进程中注入。
7、钩子 DLL 程序的目的 ; 钩子注入器所包含的步骤为 : 步骤 1) 使用 OpenProcess 函数得到读卡程序进程的句柄 ; 步骤2) 在读卡程序进程中为钩子DLL程序分配内存, 然后把钩子DLL程序的文件路径 写到分配的内存中 ; 步骤3) 使用CreateRemoteThread和LoadLibrary函数把钩子DLL程序映射到读卡程 序进程中 ; 步骤 4) 等待远线程结束, 然后释放步骤 2) 中分配的内存 ; 步骤5) 用CreateRemoteThread和FreeLibrary把钩子DLL程序从读卡程序进程中卸 载。 权 利 要 求 书 CN 103559450 A 2 。
8、1/7 页 3 一种基于内核驱动钩子技术的电子标签数据保护方法 技术领域 0001 本发明是一种使用 Windows 内核驱动钩子技术来实现从电子标签 (RFID) 系统的 底层直接截取电子标签读卡器的读卡数据, 使得读卡数据跳过在传输层的多次驻留与转 换, 从而保护电子标签数据的方法。属于物联网与信息安全的交叉领域。 0002 背景技术 0003 目前, 物联网 (The Internet of Things) 被人们广泛应用, 它可以将人们和身边 无数物品联系起来, 使物品成为网络中用户的一分子, 给人们带来诸多便利。作为物联网 核心基础之一的电子标签 (RFID) 技术因其具有防水防磁、。
9、 读取距离远、 读取速度快、 存储容 量大、 可重复使用等优点, 已被广泛应用于交通、 物流、 医疗、 食品安全、 零售、 制造、 海关、 安 检、 机场等领域。可见, 电子标签安全直接关系到物联网安全和应用的推广。因此, 电子标 签技术一直是研究的热点问题。 0004 最基本的电子标签系统主要由作为数据载体的电子标签、 读写电子标签数据的读 卡器、 用于存储、 处理电子标签数据的后台数据库三个部分组成。一般情况下, 读卡器和后 台数据库之间的通信被认为是安全可靠的。关键是电子标签、 读卡器的安全。因此, 我们把 电子标签系统安全问题分为 : 物理安全、 通信安全、 数据安全三个方面 : (1。
10、) 电子标签物理安全 : 包括电子标签读卡器伪造、 电子标签伪造、 电子标签冲突问题 等。 0005 (2) 电子标签通信安全 : 电子标签使用的是无线通信信道, 这就给非法用户的攻击 带来了方便。攻击者可以非法截取通信数据 ; 可以通过发射干扰信号来堵塞通信链路, 使 得读卡器过载, 无法接收正常的标签数据, 制造 DoS 攻击 ; 可以冒名顶替向电子标签发送数 据, 篡改或伪造数据。 0006 (3) 电子标签数据安全 : 电子标签系统中最主要的安全风险是 “数据保密性” 。信 息泄露是指暴露标签发送信息, 这个信息包括标签用户或识别对象的相关信息。包括窃取 电子标签数据、 篡改电子标签数。
11、据、 往电子标签植入病毒、 泄露电子标签数据格式。 0007 Rootkit 是安全领域的一个术语, 来自 root 和 kit 两个单词的组合, 其中 root 是 Unix系统中超级用户的名称, 拥有系统的最高权限 ; kit则是工具套件的意思。 维基百科中 关于Rootkit的定义如下 :“Rootkit是攻击者在入侵系统后用来保持对系统的超级用户访 问权限, 创建后门和隐藏攻击痕迹等常采用的一种技术。 Rootkit存在于Linux、 Solaris和 Windows 等各种操作系统上。 ” 钩子技术是 Rootkit 的一个核心内容。 0008 钩子 (Hook), 是 Window。
12、s 消息处理机制的一个平台 , 应用程序可以在上面设置子 程以监视指定窗口的某种消息, 而且所监视的窗口可以是其它进程所创建的。当消息到达 后, 在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理 Windows 消息或特 定事件。钩子实际上是一个处理消息的程序段, 通过系统调用, 把它挂入系统。每当特定 的消息发出, 在没有到达目的窗口前, 钩子程序就先捕获该消息, 亦即钩子函数先得到控制 说 明 书 CN 103559450 A 3 2/7 页 4 权。 这时钩子函数即可以加工处理该消息, 也可以不作处理而继续传递该消息, 还可以强制 结束消息的传递。一般来说有三种常见的钩子技术 。
13、: (1) 内联钩子 (Inline Hook) : Inline Hook 通过硬编码的方式向内核 API 函数的内存 空间 (通常是开始的一段字节, 但理论上可以在任何位置) 写入跳转语句, 从而对函数执行 流程进行修改, 达到控制函数过滤操作的目的, 之后只要该 API 函数被调用, 程序就会跳转 运行我们的函数。 0009 (2) Ring3 下钩子 (IAT Hook) : IAT 即导入地址表。IAT Hook 就是通过修改 IAT 表 中的函数地址而达到 API 截获的方法。每个被调用的 API 函数地址都保存在 IAT 表中。程 序中每个被调用的 API 函数的 CALL 指令。
14、所使用的地址都是相应函数登记在 IAT 表的地址。 所以为了截获 API 函数, 我们只需将 IAT 表中的地址换成用户自己的 API 函数地址即可。 0010 (3) Ring0下钩子(SSDT Hook) : SSDT的全称系统服务描述符表, 就是一个把Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来的表。SSDT 并不仅仅只包含一个庞大的地址索 引表, 它还包含着一些其它有用的信息, 诸如地址索引的基地址、 服务函数个数等。通过修 改此表的函数地址可以对常用 Windows 函数及 API 进行挂钩, 从而实现对一些关心的系统 动作进行过滤、 监控的目的。因此。
15、, 修改在 SSDT 这个数组中保存的系统服务的地址, 就可以 将这个地址对应保存的服务地址替换掉, 将我们自己的钩子处理函数的地址来替换掉原来 的地址, 这样当每次调用这个地址时就会调用我们自己的这个钩子处理函数了。 0011 发明内容 0012 技术问题 : 本发明的目的是提供一种基于内核驱动钩子技术的电子标签数据保护 方法, 通过直接从电子标签系统底层获取电子标签数据, 跳过在传输过程中可能出现的数 据篡改情况, 从而保护标签数据不被篡改。 与传统的保护电子标签本身的方法不同, 本方法 从读卡器的内核驱动着手, 使用内核驱动钩子技术在电子标签底层获取电子标签数据。通 过本发明提出的方法可。
16、以达到在电子标签系统底层截取电子标签读卡器读出的电子标签 数据, 从而达到对电子标签数据进行保护的目的。 0013 技术方案 : 本发明的方法是一种使用传统 PC 技术应用于新型物联网环境的方法, 通过 Rootkit 中钩子技术对读卡器驱动进行处理, 然后达到预计效果。其目标是提出一种 电子标签数据的安全隐患, 通过本方法验证并提供安全方案。 0014 本发明的基于内核驱动钩子技术的电子标签数据保护方法采用 Windows 内核驱 动钩子技术从电子标签系统的底层直接获取电子标签数据, 从而达到保护电子标签数据的 目的, 具体是使用 Windows 内核驱动钩子技术对读卡器驱动程序进行处理, 。
17、即通过定位钩 子位置、 编写钩子 DLL 程序并通过钩子注入器将钩子 DLL 程序注入到读卡程序中来获取电 子标签数据 ; 该方法所包含的步骤为 : 步骤 1). 用户使用电子标签读卡器读取电子标签的数据, 如果能正常读取, 则转步骤 2) , 如果不能正常读取, 转步骤 6) ; 步骤 2). 用户运行钩子注入器 ; 步骤 3). 用户使用步骤 2) 中的钩子注入器将钩子 DLL 程序注入到读卡程序中, 如不能 成功注入则转步骤 6) ; 说 明 书 CN 103559450 A 4 3/7 页 5 步骤 4). 等待钩子 DLL 程序注入成功提示, 然后重新使用读卡器对电子标签进行读卡 操。
18、作 ; 步骤5).等待读卡程序显示出读取的电子标签数据, 如果显示的数据与步骤) 中正常 读取的数据相同, 则电子标签数据保护成功 ; 否则, 转步骤 6) ; 步骤 6). 检查出错原因, 然后回步骤 1) 执行。 0015 所述的钩子 DLL 程序, 使用内联钩子技术, 通过解析原读卡函数的头五个字节, 把 它们复制到数组保存起来, 然后用守护读卡函数的地址替换掉它们, 达到一旦用户执行原 读卡函数, 就会跳转执行守护读卡函数的目的 ; 钩子 DLL 程序所包含的步骤为 : 步骤 1) 定位原读卡函数的头五个字节, 然后修改原读卡函数的内存属性, 改为 “可读 可写” ; 步骤 2) 将原。
19、读卡函数的头五个字节保存到临时数组中, 并使用 0xE9+ 守护读卡函数 的地址替换掉原读卡函数的头五个字节 ; 步骤 3) 程序执行守护读卡函数, 守护读卡函数用来获取电子标签的数据 ; 步骤 4) 程序将保存在临时数组中的原读卡函数的头五个字节取出并恢复 ; 步骤 5) 程序恢复到原读卡程序正常的执行流程。 0016 所述的钩子注入器, 使用 DLL 注入技术中的远线程注入技术, 通过在读卡程序进 程中创建远线程的方法进入到读卡程序进程的内存地址空间, 并通过该远线程将钩子 DLL 程序注入到读卡程序进程的地址空间中, 从而达到在读卡程序进程中注入钩子 DLL 程序的 目的 ; 钩子注入器。
20、所包含的步骤为 : 步骤 1) 使用 OpenProcess 函数得到读卡程序进程的句柄 ; 步骤2) 在读卡程序进程中为钩子DLL程序分配内存, 然后把钩子DLL程序的文件路径 写到分配的内存中 ; 步骤3) 使用CreateRemoteThread和LoadLibrary函数把钩子DLL程序映射到读卡程 序进程中 ; 步骤 4) 等待远线程结束, 然后释放步骤 2) 中分配的内存 ; 步骤5) 用CreateRemoteThread和FreeLibrary把钩子DLL程序从读卡程序进程中卸 载。 0017 有益效果 : 本发明方法提出了一种基于内核驱动钩子技术的电子标签数据保护新 方法, 。
21、主要用于保护电子标签的数据安全。本发明具有以下一些特殊优点和有益成果 : (1) 使用较少的资源 : 当多个程序使用同一个函数库时, DLL 形式的钩子程序可以减少 在磁盘和物理内存中加载的代码的重复量。这能影响到在前台运行的程序, 而且可以影响 其他在 Windows 操作系统上运行的程序。 0018 (2) 模块式体系结构 : DLL 形式的钩子程序有助于模块式程序的开发。这可以帮助 开发多个语言版本的模块式体系结构的程序。 方便版本更新, 新功能加入以及代码修改等。 0019 (3) 简化部署和安装 : 当 DLL 中的函数需要更新或修复时, 部署和安装 DLL 不要求 重新建立程序与该。
22、 DLL 的链接。此外, 如果多个程序使用同一个 DLL, 那么多个程序都将从 该更新或修复中获益。 0020 (4) 应用广泛 : 钩子技术涵盖了从用户层的 IAT 钩子到内核层的 SSDT 钩子、 IDT 钩 子等方方面面, 应用广泛。 说 明 书 CN 103559450 A 5 4/7 页 6 0021 (5) 可扩展性强 : 在本发明方法的基础上, 只需根据特定的技术要求而改变钩子编 程的内容, 就能实现特定要求的电子标签数据处理方法, 可扩展性强。 0022 附图说明 0023 图 1 是内联钩子技术的流程示意图。图中比较了钩子前后的程序执行流程。 0024 图2是本发明的结构示意。
23、图。 图中包括 : 电子标签读卡器、 电子标签、 显示器、 后台 数据库以及守护用户。 0025 图 3 是电子标签数据的流向图。表示本发明方法示例的电子标签数据流向情况。 其中, 实心线代表原程序电子标签数据流向 ; 空心线代表执行本发明方法后的电子标签数 据流向。 0026 图 4 是本发明的技术体系框图。图中分三个层次说明了本发明的体系结构。 具体实施方式 0027 本发明主要分为三大部分 : (1) 定位钩子位置部分 : 该部分技术方案主要用到反汇编 (Disassembly) 技术。反汇 编技术就是把目标代码转为汇编代码的过程, 也可说是把机器语言转为汇编语言代码的过 程。反汇编分为。
24、静态反汇编和动态反汇编。静态反汇编是从反汇编出来的程序清单上分 析, 从提示信息入手进行分析。常用的静态分析工具是 W32DASM、 PEiD、 FileInfo、 Hex Rays Ida 和 HIEW 等。动态反汇编即在程序运行中进行反汇编处理以及调试工作, 常用的动态分 析工具有 OD、 IDA Pro、 DEBUG、 C32 等。本发明使用反汇编技术动态分析读卡程序, 通过断 点与调试来定位读卡函数的位置, 并通过会汇编代码的阅读, 确定读卡函数的入口地址。 读 卡函数即本发明的钩子点。 0028 钩子DLL编程部分 : 该部分技术方案核心技术为内联钩子 (Inline Hook) 技。
25、术。 内 联钩子就是对函数执行流程进行修改, 达到控制函数过滤操作的目的。内联钩子通过解析 函数钩子点的几条指令, 把它们复制到数组保存起来, 然后用一个调用我们的函数的几条 指令来替换, 如果要执行原函数, 则在我们函数处理完毕, 再执行我们保存起来的钩子点的 几条指令, 然后调回我们取指令之后的地址执行。理论上我们可以在函数任何地方把原来 指令替换成我们的跳转指令。常见的内联钩子点位置通常有三种 : a. 将目标函数开头部分代码修改为跳转语句 : 这样钩子函数在目标函数执行前获得 执行权, 它调用真正的目标函数。该方法的优点是容易定位修改点, 操作简单。本发明采取 此种方法。 0029 b。
26、. 将目标函数中间部分指令修改为跳转语句 : 在目标函数执行到一定步骤时, 钩 子函数获得执行权, 对目标函数内部数据进行修改。 该方法的优点是不易检测, 缺点是较难 定位插入点和目标数据的位置。 0030 c. 修改目标函数某处 call 或 jump 指令的目标地址 : 该方法与方法 b 类似, 其缺 点是通用性能差, 不容易找到合适的 call 或 jmp 指令。 0031 本发明采取 a 方法, 本发明的内联钩子 (Inline Hook) 流程图用图 1 来解释。相 关步骤如下 : 说 明 书 CN 103559450 A 6 5/7 页 7 步骤 1) 通过反汇编定位到钩子点函数的。
27、头五个字节, 本发明实例中为读卡函数的字 节 0x55, 0x8B, 0xEC, 0x6A, 0xFF。 0032 步骤 2) 修改 Api 函数的内存属性, 改为 “可读可写” 。 0033 步骤 3) 将头五个字节保存到 Resume Function 函数中。Resume Function 函数 用于恢复操作, 该函数运行完这五个字节后, 跳转到原函数第六字节指令所在地址。 0034 步骤 4) 将头五个字节改成 0xE9+My Function 函数的地址 (4 个字节) 。0xE9 代 表汇编指令 JMP。My Function 函数用于完成截取数据操作。 0035 步骤 5) My。
28、 Function 函数首先执行处理函数, 即完成在底层截取标签数据的功 能, 然后跳转到 Resume Function 函数中。 0036 步骤 6) Resume Function 函数执行之后, 就恢复到原程序正常的执行流程。 0037 为了方便注入, 本发明钩子编程的最终结果以 DLL (动态链接库) 的形式出现。DLL 是一个包含可由多个程序同时使用的代码和数据的库, DLL 不是可执行文件。动态链接提 供了一种方法, 使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中, 该 DLL 包含一个或多个已被编译、 链接并与使用它们的进程分开存储的函数。 003。
29、8 DLL 有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内 容。使用 DLL 还有助于促进代码的模块化、 代码重用、 内存的有效使用和减少所占用的磁盘 空间。因此, 操作系统和程序能够更快地加载和运行, 并且在计算机中占用较少的磁盘空 间。一旦 DLL 的文件映像被映射到进程的地址空间中, DLL 函数就可以供进程中运行的所 有线程使用。 0039 钩子注入器部分 : 该部分技术方案主要用到 DLL 注入 (DLL Injection) 技术。常 用的 DLL 注入技术有三种。 0040 a. 用 Windows 钩子把 DLL 映射到进程中 : Windows 钩子。
30、的主要作用就是监视某个 线程的消息流动。如果被挂钩 (监视) 的线程属于别的进程, 此时你的钩子过程必须放在一 个动态连接库 (DLL) 中。当钩子设置成功, 调用 SetWindowHookEx 时, 系统会自动映射这个 DLL 到被挂钩的线程, 但并不是立即映射。因为所有的 Windows 钩子都是基于消息的, 直到 一个适当的事件发生后这个 DLL 才被映射。 0041 b. 创建远线程注入 : 指通过在另一个进程中创建远程线程的方法进入目标进程 的内存地址空间。在进程中可以通过 CreateThread 函数创建线程, 被创建的新线程与主线 程共享地址空间以及其他的资源。同样, 通过 。
31、CreateRemoteThread 函数可以在其他进程内 创建新线程, 新创建的远程线程可以共享远程进程的地址空间。因此可以使用插入到目标 进程中的远程线程将DLL插入到目标进程的地址空间, 即利用该线程通过调用Windows API LoadLibrary 函数来注入 DLL。 0042 c. 利 用 注 册 表 注 入 : 在 Windows NT/2000/XP/2003 中, 有 一 个 注 册 表 键 值 HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsHKEY_LOCAL_MACHINESoftware MicrosoftWindowsNTCu。
32、rrentVersion WindowsAppInit_DLLs。 当 某 个 进 程 加 载 User32.DLL时, 这里面列出的所有的DLL都将利用LoadLibrary函数加载到该进程空间中。 我们可以把自己的 DLL 加入该键值, 这样就可以注入到进程中了。 0043 本发明采取的是 b 方法, 即使用远线程注入技术来实现 DLL 注入。相关步骤如下 : 步骤 1) 得到远程进程的 HANDLE(使用 OpenProcess) 。 说 明 书 CN 103559450 A 7 6/7 页 8 0044 步骤 2) 在远程进程中为 DLL 文件名分配内存 (VirtualAllocEx。
33、) 。 0045 步骤 3) 把 DLL 的文件名 (全路径) 写到分配的内存中 (WriteProcessMemory) 步骤 4) 使用 CreateRemoteThread 和 LoadLibrary 把 DLL 映射近远程进程。 0046 步骤 5) 等待远程线程结束 (WaitForSingleObject) , 即等待 LoadLibrary 返回。 也就是说当 DLLMain(是以 DLL_PROCESS_ATTACH 为参数调用的) 返回时远程线程就立即结 束了。 0047 步骤 6) 取回远程线程的结束码 (GetExitCodeThtread) , 即 LoadLibrar。
34、y 的返回 值, 也就是 DLL 加载后的基地址 (HMODULE) 。 0048 步骤 7) 释放步骤 2) 分配的内存 (VirtualFreeEx) 。 0049 步骤 8) 用 CreateRemoteThread 和 FreeLibrary 把 DLL 从远程进程中卸载。调用 时传递步骤 6) 取得的 HMODULE 给 FreeLibrary (通过 CreateRemoteThread 的 lpParameter 参数) 。 0050 步骤 9) 等待线程的结束 (WaitSingleObject) 。 0051 为了方便描述, 我们假定有如下应用实例 : 一个守护用户 (用 A。
35、 表示) 要保护电子标签读卡器 (用 B 表示) 读出的电子标签 (用 C 表 示) 数据。为方便描述, 假设读卡函数为 F, 守护读卡函数为 MyF。则其具体实施方式为 : (1) 首先描述正常情况下。 正常用户使用读卡器读取电子标签数据为正确的卡序列号, 记为 R。字符串 R 初始值为一长串二进制数字, 经程序转换成 8 位 16 进制数值。正常读卡 流程即通过读卡器驱动将电子标签 C 的序列号 R 读取出来, 然后读卡程序对 R 进行转换处 理后在显示器上显示处理。 0052 (2) 守护用户 A 进入该环境。守护用户 A 使用钩子注入器将钩子 DLL 程序注入到 读卡程序中。钩子 DL。
36、L 程序的具体编写步骤如下 : 步骤 1) 在 DLL 注入时触发守护读卡函数 使 用 DLLMain 函 数 实 现 触 发 守 护 函 数 代 码 块。DLLMain 函 数 声 明 如 下 : DLLMain(HINSTANCE hmodule,DWORD reason, LPVOID lpreserved) if(reason=DLL_PROCESS_ATTACH) / 此处实现守护函数 if(reason=DLL_PROCESS_DETACH) 此处实现卸载钩子函数 即 在 reason=DLL_PROCESS_ATTACH 时 触 发 守 护 函 数 代 码 块, 在 reason。
37、=DLL_ PROCESS_DETACH 时触发卸载钩子代码块。 0053 步骤 2) 获取读卡函数 F 的地址 使用GetModuleHandle函数获取读卡函数所在DLL的模块句柄。 使用GetProcAddress 函数获取读卡函数的地址。 0054 步骤 3) 声明一个伪造的读卡函数 MyF, 即守护读卡函数 使用 WINAPI 函数声明守护读卡函数 MyF, 保证 MyF 函数与 F 函数所有参数及返回值都 相同, 不然程序会报错。 说 明 书 CN 103559450 A 8 7/7 页 9 0055 步骤 4) 构造守护读卡函数 MyF 的地址来代替读卡函数 F 通过字节的形式来。
38、代表 MyF 的地址, 保存到变量 tem 里面。地址计算公式为 : MyF 函数 地址的 4 个字节 =MyF 函数地址 -(F 函数地址 +5) 步骤 5) 构造跳转函数 跳转函数用来将执行 F 函数的地址跳转到执行 MyF。首先声明一个字节数组 _data, 字 节长度为5。 其中_data0=0xE9, 0xE9代表汇编指令JMP。 然后使用VirtualProtect函数 来修改内存属性, 否则内存地址是无法跳转的。最后使用 memcpy 函数来修改内存。至此, 跳转函数完成, 执行到这一步的时候, 钩子 DLL 程序所要完成的功能已经编写完成。 0056 步骤 6) 在 DLL 卸。
39、载时卸载钩子 DLL 程序 使用 memcpy 函数, 通过字节数组的形式把 F 函数原地址的前五个字节 (本发明实例中 为 8B,FF,55,8B,EC) , 写入 F 函数地址, 用来恢复原函数执行流程。达到卸载钩子的目的。 0057 (3) 使用本发明实例编写的钩子注入器将钩子 DLL 程序注入到读卡程序之后, 显 示器将直接显示从电子标签系统底层获取的电子标签数据, 避免电子标签数据在传输层出 现数据篡改的情况, 从而保护电子标签数据。 0058 (4) 守护读卡函数完成后, 将钩子 DLL 程序卸载掉, 然后退出钩子注入器。本发明 方法实施方式到此结束。 说 明 书 CN 103559450 A 9 1/2 页 10 图 1 图 2 图 3 说 明 书 附 图 CN 103559450 A 10 2/2 页 11 图 4 说 明 书 附 图 CN 103559450 A 11 。