VB6实现Ring3下直接调用Ring0层函数,反一切R3下API Hook。

2023-11-07 22:38

本文主要是介绍VB6实现Ring3下直接调用Ring0层函数,反一切R3下API Hook。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

接论坛帖子:http://topic.csdn.net/u/20120518/18/9a00ec5c-b3d1-4a1f-9bc1-ba1a47b52463.html

例子应用如下。我只是给一个方法给大家,这个方法肯定很麻烦,有需求的人可以用。

添加Module1

[vb]  view plain copy
  1. Private asm_CallCode() As Byte, KiFastSystemCall&, KiIntSystemCall&  
  2. Private Declare Function CallWindowProcW& Lib "user32" (ByVal lpPrevWndFunc As LongByVal hWnd As LongByVal Msg As LongByVal wParam As LongByVal lParam As Long)  
  3. Private Declare Function LocalAlloc& Lib "kernel32" (ByVal f&, ByVal s&)  
  4. Private Declare Function LocalSize& Lib "kernel32" (ByVal m&)  
  5. Private Declare Function LocalFree& Lib "kernel32" (ByVal m&)  
  6. Private Declare Function GetModuleHandleA& Lib "kernel32" (ByVal n$)  
  7. Private Declare Function GetProcAddress& Lib "kernel32" (ByVal m&, ByVal n$)  
  8. Private Declare Function IsWow64Process& Lib "kernel32" (ByVal h&, IsWow64 As Boolean)  
  9. Private Declare Sub RtlMoveMemory Lib "kernel32" (ByVal Dst&, ByVal Src&, ByVal Size&)  
  10. Private Declare Sub PutMem1 Lib "msvbvm60" (ByVal Ptr As LongByVal NewVal As Byte)  
  11. Private Declare Sub PutMem2 Lib "msvbvm60" (ByVal Ptr As LongByVal NewVal As Integer)  
  12. Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Ptr As LongByVal NewVal As Long)  
  13. Private Declare Sub PutMem8 Lib "msvbvm60" (ByVal Ptr As LongByVal NewVal As Currency)  
  14.   
  15. Public Function ReadKrnlFunctionIndex&(ByVal Name$, Optional ByVal DllFile$ = "ntdll.dll"'//读取内核函数索引  
  16. Dim pEntry&, dwIndex&  
  17. pEntry = GetProcAddress(GetModuleHandleA(DllFile), Name)  
  18. RtlMoveMemory VarPtr(dwIndex), pEntry + 1, 4  
  19. ReadKrnlFunctionIndex = dwIndex  
  20. End Function  
  21.   
  22. Public Function InitCallKernel() As Boolean  '//这里初始化call代码  
  23. Dim bWow64 As Boolean  
  24. IsWow64Process -1, bWow64  
  25. If bWow64 Then Exit Function '//不支持x64  
  26. ReDim asm_CallCode(11)  
  27. KiFastSystemCall = GetProcAddress(GetModuleHandleA("ntdll.dll"), "KiFastSystemCall")  
  28. KiIntSystemCall = GetProcAddress(GetModuleHandleA("ntdll.dll"), "KiIntSystemCall")  
  29. If KiFastSystemCall = 0 Then Exit Function  
  30. If KiIntSystemCall = 0 Then Exit Function  
  31. asm_CallCode(0) = &HBA  
  32. RtlMoveMemory VarPtr(asm_CallCode(1)), IIf(CheckKiFastSystemCallHook, VarPtr(KiIntSystemCall), VarPtr(KiFastSystemCall)), 4 '//这里检测Hook,如果KiFastSystemCall被Hook、修改,就使用KiIntSystemCall  
  33. asm_CallCode(5) = &HB8  
  34. RtlMoveMemory VarPtr(asm_CallCode(6)), VarPtr(0&), 4  
  35. asm_CallCode(10) = &HFF  
  36. asm_CallCode(11) = &HD2  
  37. InitCallKernel = True  
  38. End Function  
  39.   
  40. Public Function CheckKiFastSystemCallHook() As Boolean  
  41. Dim bChar As Byte  
  42. RtlMoveMemory VarPtr(bChar), KiFastSystemCall, 1  
  43. If bChar = &HE9 Then CheckKiFastSystemCallHook = TrueExit Function '//检测jmp Hook  
  44. If bChar = &H68 Then CheckKiFastSystemCallHook = TrueExit Function '//检测push Hook  
  45. Dim dw3Char&  
  46. RtlMoveMemory VarPtr(dw3Char), KiFastSystemCall, 3  
  47. If dw3Char <> 1037451 Then CheckKiFastSystemCallHook = TrueExit Function '//检测函数头  
  48. End Function  
  49.   
  50. Public Function CallKernelFunction&(ByVal Name$, ByVal DllFile$, ParamArray pParam())  
  51. Dim dwIndex&  
  52. dwIndex = ReadKrnlFunctionIndex(Name, DllFile)  
  53. If dwIndex = 0 Then CallKernelFunction = -1: Exit Function  
  54. Dim ret&, i%, offset&  
  55. Dim hMem&  
  56. hMem = LocalAlloc(0, ((UBound(pParam) + 2) * 5) + UBound(pParam) + 1 + 1 + 12 + 1) '//申请代码内存  
  57. offset = hMem  
  58. For i = UBound(pParam) To 0 Step -1 '//压栈  
  59. PutMem1 offset, &H68 'push Param  
  60. offset = offset + 1  
  61. PutMem4 offset, pParam(i)  
  62. offset = offset + 4  
  63. Next  
  64. PutMem1 offset, &H68 'push Return Address  
  65. PutMem4 offset + 1, VarPtr(ret)  
  66. offset = offset + 5  
  67. RtlMoveMemory VarPtr(asm_CallCode(6)), VarPtr(dwIndex), 4 '//设置内核函数索引  
  68. RtlMoveMemory offset, VarPtr(asm_CallCode(0)), 12 '//把初始化的代码整个复制过去,省得重造轮子  
  69. offset = offset + 12  
  70. For i = 0 To UBound(pParam) + 1 '//出栈  
  71. PutMem1 offset, &H59 'pop  
  72. offset = offset + 1  
  73. Next  
  74. PutMem1 offset, &HC3 'retn  
  75. PutMem1 hMem + LocalSize(hMem), &H90 '//nop一行代码  
  76. CallKernelFunction = CallWindowProcW(hMem, 0, 0, 0, 0) 'call  
  77. LocalFree hMem '//释放内存  
  78. End Function  
添加Form1,一个Command1

[vb]  view plain copy
  1. Private Declare Function TextOut& Lib "gdi32" Alias "TextOutA" (ByVal DC As LongByVal X As LongByVal Y As LongByVal Text As StringByVal Size As Long)  
  2. Private Declare Function CreateThread& Lib "kernel32" (Optional ByVal Attributes As LongOptional ByVal StackSize As LongOptional ByVal Address As LongOptional Parameter As LongOptional ByVal CreationFlags As LongOptional TIDs As Long)  
  3. Private Type CONTEXT  
  4. ContextFlags As Long  
  5. Dr(5) As Long  
  6. FloatSave(111) As Byte  
  7. SegGs As Long  
  8. SegFs As Long  
  9. SegEs As Long  
  10. SegDs As Long  
  11. Edi As Long  
  12. Esi As Long  
  13. Ebx As Long  
  14. Edx As Long  
  15. Ecx As Long  
  16. Eax As Long  
  17. Ebp As Long  
  18. Eip As Long  
  19. SegCs As Long  
  20. EFlags As Long  
  21. Esp As Long  
  22. SegSs As Long  
  23. End Type  
  24.   
  25. Private Function GetAddr&(ByVal aaa&)  
  26. GetAddr = aaa  
  27. End Function  
  28.   
  29. Private Sub Command1_Click()  
  30. Dim hThread&  
  31. hThread = CreateThread(0, 0, 0, 0, 4, 0)'线程状态为暂停(开始地址为0,直接执行会崩)  
  32. MsgBox hThread  
  33. Dim i As CONTEXT  
  34. i.ContextFlags = 65543'CONTEXT_FULL  
  35. Me.Caption = CallKernelFunction("ZwGetContextThread""ntdll.dll", hThread, VarPtr(i))  
  36. i.Eip = GetAddr(AddressOf aaa)'更改执行地址  
  37. Me.Caption = CallKernelFunction("ZwSetContextThread""ntdll.dll", hThread, VarPtr(i))  
  38. CallKernelFunction "ZwResumeThread""ntdll.dll", hThread, 0'恢复线程运行  
  39. End Sub  
  40.   
  41. Private Sub Form_Load()  
  42. InitCallKernel  
  43. End Sub  
  44.   
  45. Private Sub Form_Paint()  
  46. Dim hDC&  
  47. hDC = CallKernelFunction("GetDC""user32.dll"Me.hWnd) '频繁调用可测试稳定性  
  48. TextOut hDC, 5, 5, "123", 3  
  49.   
  50. Dim hProcess&  
  51. Dim objAttr&(5), cid&(1)  
  52. cid(0) = 1192 '改成你要打开的PID  
  53. CallKernelFunction "ZwOpenProcess""ntdll.dll", VarPtr(hProcess), 2035711, VarPtr(objAttr(0)), VarPtr(cid(0))  
  54. Me.Caption = hProcess  
  55. End Sub  
添加Module2

[vb]  view plain copy
  1. Public Declare Function ExitThread& Lib "kernel32" (ByVal ExitStatus&)  
  2. Public Sub aaa(ByVal Param&)  
  3. Dim i&  
  4. For i = 0 To 10000  
  5. Form1.Caption = i  
  6. Next  
  7. ExitThread 0  
  8. End Sub  

编译运行可测试效果

*******************************

下面这个可替换Module1,InitCallKernel时加True即可。

[vb]  view plain copy
  1. Private asm_CallCode() As Byte, asm_MyCallCode() As Byte, KiFastSystemCall&, KiIntSystemCall&, MyKiFastSystemCall#  
  2. Private Declare Function CallWindowProcW& Lib "user32" (ByVal lpPrevWndFunc As LongByVal hWnd As LongByVal Msg As LongByVal wParam As LongByVal lParam As Long)  
  3. Private Declare Function LocalAlloc& Lib "kernel32" (ByVal f&, ByVal s&)  
  4. Private Declare Function LocalSize& Lib "kernel32" (ByVal m&)  
  5. Private Declare Function LocalFree& Lib "kernel32" (ByVal m&)  
  6. Private Declare Function GetModuleHandleA& Lib "kernel32" (ByVal n$)  
  7. Private Declare Function GetProcAddress& Lib "kernel32" (ByVal m&, ByVal n$)  
  8. Private Declare Function IsWow64Process& Lib "kernel32" (ByVal h&, IsWow64 As Boolean)  
  9. Private Declare Sub RtlMoveMemory Lib "kernel32" (ByVal Dst&, ByVal Src&, ByVal Size&)  
  10. Private Declare Sub PutMem1 Lib "msvbvm60" (ByVal Ptr As LongByVal NewVal As Byte)  
  11. Private Declare Sub PutMem2 Lib "msvbvm60" (ByVal Ptr As LongByVal NewVal As Integer)  
  12. Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Ptr As LongByVal NewVal As Long)  
  13. Private Declare Sub PutMem8 Lib "msvbvm60" (ByVal Ptr As LongByVal NewVal As Currency)  
  14.   
  15. Public Function ReadKrnlFunctionIndex&(ByVal Name$, Optional ByVal DllFile$ = "ntdll.dll"'//读取内核函数索引  
  16. Dim pEntry&, dwIndex&  
  17. pEntry = GetProcAddress(GetModuleHandleA(DllFile), Name)  
  18. RtlMoveMemory VarPtr(dwIndex), pEntry + 1, 4  
  19. ReadKrnlFunctionIndex = dwIndex  
  20. End Function  
  21.   
  22. Public Function InitCallKernel(Optional ByVal IsMySysenter As BooleanAs Boolean  '//这里初始化call代码  
  23. Dim bWow64 As Boolean  
  24. IsWow64Process -1, bWow64  
  25. If bWow64 Then Exit Function '//不支持x64  
  26. ReDim asm_CallCode(11)  
  27. KiFastSystemCall = GetProcAddress(GetModuleHandleA("ntdll.dll"), "KiFastSystemCall")  
  28. KiIntSystemCall = GetProcAddress(GetModuleHandleA("ntdll.dll"), "KiIntSystemCall")  
  29. If KiFastSystemCall = 0 Then Exit Function  
  30. If KiIntSystemCall = 0 Then Exit Function  
  31. asm_CallCode(0) = &HBA  
  32. RtlMoveMemory VarPtr(asm_CallCode(1)), IIf(CheckKiFastSystemCallHook, VarPtr(KiIntSystemCall), VarPtr(KiFastSystemCall)), 4 '//这里检测Hook,如果KiFastSystemCall被Hook、修改,就使用KiIntSystemCall  
  33. If IsMySysenter Then RtlMoveMemory VarPtr(asm_CallCode(1)), VarPtr(InitMyCallKernel), 4 '//自己写sysenter,省得R3下被各种Hook  
  34. asm_CallCode(5) = &HB8  
  35. RtlMoveMemory VarPtr(asm_CallCode(6)), VarPtr(0&), 4  
  36. asm_CallCode(10) = &HFF  
  37. asm_CallCode(11) = &HD2  
  38. InitCallKernel = True  
  39. End Function  
  40.   
  41. Public Function InitMyCallKernel&() '//本来不想写这招的,可见他们说各种Hook,啊那就(<ゝω·)☆  
  42. PutMem4 VarPtr(MyKiFastSystemCall), 873452683  
  43. PutMem2 VarPtr(MyKiFastSystemCall) + 4, -13117  
  44. InitMyCallKernel = VarPtr(MyKiFastSystemCall)  
  45. End Function  
  46.   
  47. Public Function CheckKiFastSystemCallHook() As Boolean  
  48. Dim bChar As Byte  
  49. RtlMoveMemory VarPtr(bChar), KiFastSystemCall, 1  
  50. If bChar = &HE9 Then CheckKiFastSystemCallHook = TrueExit Function '//检测jmp Hook  
  51. If bChar = &H68 Then CheckKiFastSystemCallHook = TrueExit Function '//检测push Hook  
  52. Dim dw3Char&  
  53. RtlMoveMemory VarPtr(dw3Char), KiFastSystemCall, 3  
  54. If dw3Char <> 1037451 Then CheckKiFastSystemCallHook = TrueExit Function '//检测函数头  
  55. End Function  
  56.   
  57. Public Function CallKernelFunction&(ByVal Name$, ByVal DllFile$, ParamArray pParam())  
  58. Dim dwIndex&  
  59. dwIndex = ReadKrnlFunctionIndex(Name, DllFile)  
  60. If dwIndex = 0 Then CallKernelFunction = -1: Exit Function  
  61. Dim ret&, i%, offset&  
  62. Dim hMem&  
  63. hMem = LocalAlloc(0, ((UBound(pParam) + 2) * 5) + UBound(pParam) + 1 + 1 + 12 + 1) '//申请代码内存  
  64. offset = hMem  
  65. For i = UBound(pParam) To 0 Step -1 '//压栈  
  66. PutMem1 offset, &H68 'push Param  
  67. offset = offset + 1  
  68. PutMem4 offset, pParam(i)  
  69. offset = offset + 4  
  70. Next  
  71. PutMem1 offset, &H68 'push Return Address  
  72. PutMem4 offset + 1, VarPtr(ret)  
  73. offset = offset + 5  
  74. RtlMoveMemory VarPtr(asm_CallCode(6)), VarPtr(dwIndex), 4 '//设置内核函数索引  
  75. RtlMoveMemory offset, VarPtr(asm_CallCode(0)), 12 '//把初始化的代码整个复制过去,省得重造轮子  
  76. offset = offset + 12  
  77. For i = 0 To UBound(pParam) + 1 '//出栈  
  78. PutMem1 offset, &H59 'pop  
  79. offset = offset + 1  
  80. Next  
  81. PutMem1 offset, &HC3 'retn  
  82. PutMem1 hMem + LocalSize(hMem), &H90 '//nop一行代码  
  83. CallKernelFunction = CallWindowProcW(hMem, 0, 0, 0, 0) 'call  
  84. LocalFree hMem '//释放内存  
  85. End Function  


这篇关于VB6实现Ring3下直接调用Ring0层函数,反一切R3下API Hook。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/366628

相关文章

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali