从RCTF 2017 MyDriver2看Windows驱动中的Inline Hook实战与逆向分析

张开发
2026/4/19 0:41:52 15 分钟阅读

分享文章

从RCTF 2017 MyDriver2看Windows驱动中的Inline Hook实战与逆向分析
1. Windows驱动逆向分析入门对于刚接触Windows驱动逆向分析的朋友来说看到.sys文件可能会感到无从下手。其实驱动程序和普通应用程序在逆向分析上有许多相似之处但也有一些关键区别需要特别注意。我在分析RCTF 2017 MyDriver2这道题时就遇到了典型的驱动逆向场景。首先需要明确的是驱动程序运行在内核模式这意味着它可以访问系统底层资源同时也承担着更大的风险。在分析过程中我发现这个驱动使用了Inline Hook技术来保护关键逻辑。Inline Hook是一种常见的内核级Hook技术通过修改函数指令来实现拦截和重定向。2. 初步分析驱动文件拿到MyDriver2.sys文件后我首先用IDA Pro加载它进行分析。和普通PE文件一样驱动也有.text、.data等标准节区。在数据区.data扫描时我发现了两个可疑的全局变量qword_16310和qword_16390。经验告诉我在逆向分析中数据区的可疑常量往往是重要线索。我顺着这两个变量的交叉引用很快定位到了关键函数sub_113C8。这个函数虽然不长但包含了几个关键操作动态解密一段代码sub_11DF0执行解密后的代码对数据进行异或处理memmove(Dst, sub_11DF0, 0x22ui64); v0 ExAllocatePool(0, 0x22ui64); memmove(v0, Dst, 0x22ui64); dword_16414 ((__int64 (__fastcall *)(signed __int64, signed __int64))v0)(3435209541i64, 1412570316i64);这段代码展示了典型的动态代码执行模式先将函数代码拷贝到堆内存然后将其作为函数指针调用。这种技术在恶意代码中很常见目的是增加分析难度。3. 深入分析Inline Hooksub_11DF0函数虽然只有短短几行却是整个保护机制的核心unsigned __int64 __fastcall sub_11DF0(__int64 a1, __int64 a2) { return a2 0xF0F0F0F0F0F0F0F0ui64 ^ a1 0x0F0F0F0F0F0F0F0Fui64; }这个函数实际上是一个解密算法使用了位掩码和异或操作。在CTF比赛中这类简单的加密算法很常见关键是要能快速识别出它的模式。通过动态调试我确认这个函数被用来解密两个关键参数第一个参数0xCCC12345第二个参数0x54321CCC解密后的结果是0x5C3113C5这个值随后被用作异或密钥来处理其他数据。这种层层递进的数据处理方式在逆向题中很典型需要一步步跟踪数据流。4. 完整解密流程还原理解了核心算法后接下来就是还原整个解密流程。根据sub_113C8函数的逻辑解密过程可以分为三个阶段动态代码执行阶段复制sub_11DF0的代码到堆内存执行这段代码得到初始密钥0x5C3113C5第一轮解密使用0x5C3113C5对qword_16310指向的数据进行异或解密长度由v242决定0x5C3113C5 - 1546720155第二轮解密使用第一轮解密结果对qword_16390指向的数据进行异或采用循环使用密钥的方式i%42用Python实现这个解密过程from pwn import * # 第一阶段计算初始密钥 v 0x54321CCC 0xF0F0F0F0F0F0F0F0 ^ 0xCCC12345 0x0F0F0F0F0F0F0F0F print(hex(v)) # 输出0x5c3113c5 # 第二阶段解密第一段数据 a [0x5C5813A25C6E1395,0x5C5413885C5413B3,0x5C5013A95C57139A, 0x5C0213F75C6E13A2,0x5C4913B15C1F13F6,0x13B1] b b for i in a: b p64(i ^ 0x5c3113c55c3113c5) print(b) # 第三阶段解密第二段数据 c [0x6105664765377470,0x733A416D730C2011,0x6E285F096C166D36, 0x6F5C686D6531690B,0x780002726A5F58,0x67005F00500074, 0x4D006500760069,0x6C0066005F0065,0x32005F00670061, 0x74002E00330033,0x5F005000740078,0x65007600690067, 0x66005F0065004D,0x5F00670061006C,0x2E003300330032, 0x50007400780074] d b for i in c: d p64(i) e [] for i,v in enumerate(d): e.append(v ^ b[i%42]) print(bytes(e))最终解密出的字符串是A_simple_Inline_hook_Drv也就是这道题的FlagRCTF{A_simple_Inline_hook_Drv}。5. Inline Hook技术详解这道题展示了一个典型的Inline Hook应用场景。在Windows驱动开发中Inline Hook是一种强大的技术可以用来监控或修改系统行为。它的基本原理是直接修改目标函数的指令通常是替换前几条指令为跳转指令将执行流重定向到自定义函数。实现一个基本的Inline Hook通常需要以下步骤定位要Hook的函数地址保存原始指令编写跳转指令通常是jmp指令修改目标函数头部的指令在自定义函数中处理逻辑后恢复原始指令并调用原函数在本题中虽然表面上看起来是简单的加密解密但实际上展示了一个Inline Hook的典型应用场景通过动态修改代码来保护关键逻辑。这种技术在商业软件保护和恶意软件中都经常出现。6. 逆向分析技巧总结通过这道题我总结了几点驱动逆向的重要技巧数据区分析优先全局变量和字符串常量往往是突破口交叉引用追踪通过变量和函数的交叉引用快速定位关键代码动态调试结合静态分析对于动态解密执行的代码需要结合调试器观察实际行为注意内核API驱动程序中会使用ExAllocatePool等内核API熟悉这些API有助于理解代码逻辑小步验证对于加密算法可以分段验证假设逐步还原整个流程在实际工作中遇到类似的保护技术时最重要的是保持耐心一步步跟踪数据流和控制流。有时候看似复杂的保护核心算法可能非常简单就像这道题中的位运算一样。

更多文章