藏着掖着干啥 —— VB6实现Ring3下直接调用Ring0层函数,反一切R3下API Hook

a1875566250 2012-05-18 06:14:38
加精
一切爱好者喜欢玩ntdll那些Nt***、Rtl***的函数,可毕竟那些东西也是能Hook的,而且大多数也就是Hook那些,这次给大家一个新玩法,直接通过Ring3去call到Ring0,此时R3下对ntdll那些R3下函数的“最终入口”的Hook都无法捕获到我们的调用,除非在R0下Hook了函数。(当然根据下面的原理我想某些人也知道该如何搞个万能Hook了)
小弟技术很菜,代码难免绕了很多圈子,而且下面的东西也不是什么新玩意,只不过是给VB6涨涨气焰罢了。。。大大们看到了不要嘲我。。。

添加一个Form1,一个Text1、一个Command1
Private Declare Function TabbedTextOut& Lib "user32 " Alias "TabbedTextOutA" (ByVal DC As Long, ByVal X As Long, ByVal Y As Long, ByVal Text As String, ByVal Size As Long, Optional ByVal TabPositions As Long, Optional TabStopPositions As Long, Optional ByVal Origin As Long)
Private Declare Function RtlAdjustPrivilege& Lib "ntdll" (ByVal Privileges As Long, Optional ByVal NewValue As Long = 1, Optional ByVal Thread As Long, Optional Value As Long)
Private Declare Function CallWindowProc& Lib "user32" Alias "CallWindowProcW" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long)
Private Declare Function GetModuleHandleA& Lib "kernel32" (ByVal n$)
Private Declare Function GetProcAddress& Lib "kernel32" (ByVal m&, ByVal n$)
Private Declare Function CloseHandle& Lib "kernel32" (ByVal h&)
Private Declare Sub RtlMoveMemory Lib "kernel32" (ByVal Dst&, ByVal Src&, ByVal Size&)
Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal Ptr As Long, ByVal RetVal As Long)
Private KiFastSystemCall&

Private Sub Command1_Click()
Dim handle&
handle = OpenProcess(Text1.Text, 2035711)
TerminateProcess handle, 0
CloseHandle handle
MsgBox "Handle:" & handle & ",Have tried killed."
End Sub

Private Sub Form_Load()
RtlAdjustPrivilege 20
KiFastSystemCall = GetProcAddress(GetModuleHandleA("ntdll.dll"), "KiFastSystemCall")
End Sub

Private Function ReadFunctionIndex&(ByVal Name$, Optional ByVal DllFile$ = "ntdll.dll")
Dim pEntry&, dwIndex&
pEntry = GetProcAddress(GetModuleHandleA(DllFile), Name)
GetMem4 pEntry + 1, VarPtr(dwIndex)
ReadFunctionIndex = dwIndex
End Function

Private Function OpenProcess&(ByVal dwPID&, ByVal dwAccess&)
Dim hProcess&, ret&
Dim objAttr&(5), cid&(1)
cid(0) = dwPID
Dim dwIndex&
dwIndex = ReadFunctionIndex("ZwOpenProcess")
Dim ASMCode(42) As Byte
ASMCode(0) = &H68 'push CLIENT_ID struct
RtlMoveMemory VarPtr(ASMCode(1)), VarPtr(VarPtr(cid(0))), 4
ASMCode(5) = &H68 'push OBJ_ATTR struct
RtlMoveMemory VarPtr(ASMCode(6)), VarPtr(VarPtr(objAttr(0))), 4
ASMCode(10) = &H68 'push dwAccess
RtlMoveMemory VarPtr(ASMCode(11)), VarPtr(dwAccess), 4
ASMCode(15) = &H68 'push hProcess
RtlMoveMemory VarPtr(ASMCode(16)), VarPtr(VarPtr(hProcess)), 4
ASMCode(20) = &H68 'push Return Address
RtlMoveMemory VarPtr(ASMCode(21)), VarPtr(VarPtr(ret)), 4
ASMCode(25) = &HBA 'mov edx,KiFastSystemCall Address
RtlMoveMemory VarPtr(ASMCode(26)), VarPtr(KiFastSystemCall), 4
ASMCode(30) = &HB8 'mox eax,Kernel Function Index
RtlMoveMemory VarPtr(ASMCode(31)), VarPtr(dwIndex), 4
ASMCode(35) = &HFF 'call edx
ASMCode(36) = &HD2
ASMCode(37) = &H59 'pop
ASMCode(38) = &H59 'pop
ASMCode(39) = &H59 'pop
ASMCode(40) = &H59 'pop
ASMCode(41) = &H59 'pop
ASMCode(42) = &HC3 'ret
CallWindowProc VarPtr(ASMCode(0)), 0, 0, 0, 0
OpenProcess = hProcess
End Function
Private Function TerminateProcess&(ByVal hProcess&, ByVal ExitStatus&)
Dim ret&
Dim dwIndex&
dwIndex = ReadFunctionIndex("ZwTerminateProcess")
Dim ASMCode(30) As Byte
ASMCode(0) = &H68 'push ExitStatus
RtlMoveMemory VarPtr(ASMCode(1)), VarPtr(ExitStatus), 4
ASMCode(5) = &H68 'push hProcess
RtlMoveMemory VarPtr(ASMCode(6)), VarPtr(hProcess), 4
ASMCode(10) = &H68 'push Return Address
RtlMoveMemory VarPtr(ASMCode(11)), VarPtr(VarPtr(ret)), 4
ASMCode(15) = &HBA 'mov edx,KiFastSystemCall Address
RtlMoveMemory VarPtr(ASMCode(16)), VarPtr(KiFastSystemCall), 4
ASMCode(20) = &HB8 'mox eax,Kernel Function Index
RtlMoveMemory VarPtr(ASMCode(21)), VarPtr(dwIndex), 4
ASMCode(25) = &HFF 'call edx
ASMCode(26) = &HD2
ASMCode(27) = &H59 'pop
ASMCode(28) = &H59 'pop
ASMCode(29) = &H59 'pop
ASMCode(30) = &HC3 'ret
TerminateProcess = CallWindowProc(VarPtr(ASMCode(0)), 0, 0, 0, 0)
End Function

Private Function GetDC&(ByVal hWnd&)
Dim ret&
Dim dwIndex&
dwIndex = ReadFunctionIndex("GetDC", "user32.dll")
Dim ASMCode(24) As Byte
ASMCode(0) = &H68 'push hWnd
RtlMoveMemory VarPtr(ASMCode(1)), VarPtr(hWnd), 4
ASMCode(5) = &H68 'push Return Address
RtlMoveMemory VarPtr(ASMCode(6)), VarPtr(VarPtr(ret)), 4
ASMCode(10) = &HBA
RtlMoveMemory VarPtr(ASMCode(11)), VarPtr(KiFastSystemCall), 4
ASMCode(15) = &HB8
RtlMoveMemory VarPtr(ASMCode(16)), VarPtr(dwIndex), 4
ASMCode(20) = &HFF 'call edx
ASMCode(21) = &HD2
ASMCode(22) = &H59 'pop
ASMCode(23) = &H59 'pop
ASMCode(24) = &HC3 'ret
GetDC = CallWindowProc(VarPtr(ASMCode(0)), 0, 0, 0, 0)
End Function

Private Sub Form_Paint()
Form_Resize
End Sub

Private Sub Form_Resize()
TabbedTextOut GetDC(Me.hWnd), 0, 0, "123", -1
End Sub
...全文
5812 84 打赏 收藏 转发到动态 举报
写回复
用AI写文章
84 条回复
切换为时间正序
请发表友善的回复…
发表回复
david1814 2014-05-31
  • 打赏
  • 举报
回复
干嘛不直接抄zw。。。
咸清 2014-03-20
  • 打赏
  • 举报
回复
引用 82 楼 u011288385 的回复:
[quote=引用 7 楼 ybh37 的回复:] 呵呵,API活字典现身说法了? 我来顶帖!
API活字典什么意思? [/quote] 老用户都知道这号人,新来的估计没听过其传说。
Sanda_Chang 2014-02-20
  • 打赏
  • 举报
回复
引用 7 楼 ybh37 的回复:
呵呵,API活字典现身说法了? 我来顶帖!
API活字典什么意思?
  • 打赏
  • 举报
回复
你只是改了下进门的方法 ,可人家修改了门里的东西!你还是要执行人家的代码
ckqyq2008 2012-05-29
  • 打赏
  • 举报
回复
LZ太给力啊!
LAONINGA098 2012-05-29
  • 打赏
  • 举报
回复
感谢分享。
myjisgreat 2012-05-27
  • 打赏
  • 举报
回复
如果要绕开各种HOOK的话只有自己写驱动手动实现API
myjisgreat 2012-05-27
  • 打赏
  • 举报
回复
高手~~~~
vb+汇编+手动实现内核API调用

但是SSDT HOOK一下就全完了

LZ原理貌似是 push系统调用号 syscall自陷进入内核吧
c实现LZ功能的话就没几行代码
sunylf 2012-05-26
  • 打赏
  • 举报
回复
这个功能的主要用途是?
Tishion 2012-05-25
  • 打赏
  • 举报
回复
楼主的想法不错,不过基本原理您还是没弄懂。

去了解下 系统调用的实现方法

1.中断
2.快速系统调用
cosdp 2012-05-25
  • 打赏
  • 举报
回复
vb ,用的很少了
Michael_g 2012-05-25
  • 打赏
  • 举报
回复
ntdll.dll 并没有运行在ring 0 它只是一个代理,直正功能不在这个dll中。你这个先搞清楚吧。
liu112012 2012-05-24
  • 打赏
  • 举报
回复
不错哦,支持一下哦
chinayu2007 2012-05-24
  • 打赏
  • 举报
回复
不错!可以关掉360SD,我测试的是windows server 2003
baoxing1979 2012-05-24
  • 打赏
  • 举报
回复
支持一下
自卑的我 2012-05-24
  • 打赏
  • 举报
回复
古老的代码,菜鸟看了连声叫好。
codymax2 2012-05-24
  • 打赏
  • 举报
回复
不懂VB HOOK了驱动的zw系列 就没用了吧
zgq275 2012-05-24
  • 打赏
  • 举报
回复
vb的代码真风骚
ahp101 2012-05-23
  • 打赏
  • 举报
回复
多种设备控制原理图多种设备控制原理图多种设备控制原理图是不是把“SetHook”的功能都给屏蔽了?那我是没戏了,因为我是要先用“SetHook”来把DLL注入到进程空间,然后再去修改程序代码的。
TOETCQ 2012-05-23
  • 打赏
  • 举报
回复
很好的东西!!!!!!!!!11
加载更多回复(49)

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧