读书人

VB变态HOOK API也疯狂有哪位高手有办

发布时间: 2012-12-14 10:33:07 作者: rapoo

VB变态HOOK API也疯狂,有谁有办法可以让函数继续运行吗?
本帖最后由 xiaoyao961 于 2011-08-25 22:13:15 编辑 http://hi.baidu.com/cxwr/blog/item/ac15ecc3ff89d556b319a884.html
http://cxwr.ys168.com/
http://cxwr.ys168.com/note/fd.htm?http://ys-C.ys168.com/?VB变态HOOK API也疯狂.rar_50c1bsq0d7ejs5bt0bspn0c0bks0bsolpo5b5btll5btp0bu14z97f14z

比方拦截了MSGBOX,然后就不显示这个弹出窗了,现在是想自由控制,要么用我另外的窗口显示,要么先处理我的函数,再接着运行



Public Function NewMessageBox(ByVal hWnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long

'默认HOOK的是MessageBoxA函数,所以我们用 MessageBoxW 给我们弹出消息
'这里没有写还原函数,其实这个都很好解决,我们在用 WriteProcessMemory写入HOOK代码时可以还通过
'ReadProcessMemory读取原始代码,当需要恢复时再通过 WriteProcessMemory写回去就OK了..

MessageBoxW 0, "哈哈...被我们给HOOK了", "嘿嘿~~啦啦啦..", 16

NewMessageBox = 1
End Function

就是需要把这三句话所说的代码写出来

'默认HOOK的是MessageBoxA函数,所以我们用 MessageBoxW 给我们弹出消息
'这里没有写还原函数,其实这个都很好解决,我们在用 WriteProcessMemory写入HOOK代码时可以还通过
'ReadProcessMemory读取原始代码,当需要恢复时再通过 WriteProcessMemory写回去就OK了..


[解决办法]
学习下……………………
[解决办法]
先看看,学习,学习。。。
[解决办法]
本问题上面的方示可以拦截到API的参数,却无法继续运行,还要弄什么基地址,还要先把别的程序弄一下TLB文件生成。而下面的这个可以直接用VB完成拦截API,还能中途暂停停中断,却没法显示所执行的API函数的参数。
2个工程能结合起来就好了,有高手吗,能解决此类问题的话,500元可以付给你。

基于API的VB HOOK钩子拦截程序
http://www.codefans.net/soft/4579.shtml


Private Sub Command1_Click()
Dim hProcess As Long, tm As Long, Data4 As Long
Command1.Enabled = False
Dim lFunc As Long, lVarAdd As Long, tmNuAdd As Long
n_Ex = False
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0&, n_ProcessID)
If hProcess Then
ReadProcessMemory hProcess, ByVal Imp_p(n_index).lIAT_Address, n_Old_Address, Len(n_Old_Address), tm
MsgBox "old Address is" & Hex(n_Old_Address)
lFunc = CreateMemory(n_ProcessID, 4096) '注射函
lVarAdd = CreateMemory(n_ProcessID, 4096) '注射

'先外部1 截到API 被成0
Data4 = 1
WriteProcessMemory hProcess, ByVal lVarAdd, Data4, Len(Data4), tm

'函原位址到lVarAdd + 256
WriteProcessMemory hProcess, ByVal lVarAdd + 256, n_Old_Address, Len(n_Old_Address), tm

'入截函
'-----------------------------------
tmNuAdd = lFunc
'Int 3
'WByteToCode hProcess, tmNuAdd, &HCC

'push eax
WByteToCode hProcess, tmNuAdd, &H50

'mov eax, 00000000


WByteToCode hProcess, tmNuAdd, &HB8
WLongToCode hProcess, tmNuAdd, &H0

'mov dword ptr [lVarAdd], eax
WByteToCode hProcess, tmNuAdd, &HA3
WLongToCode hProcess, tmNuAdd, lVarAdd

'lp1:
'cmp eax, dword ptr [lVarAdd]
WByteToCode hProcess, tmNuAdd, &H3B
WByteToCode hProcess, tmNuAdd, &H5
WLongToCode hProcess, tmNuAdd, lVarAdd

'je lp1
WByteToCode hProcess, tmNuAdd, &H74
WByteToCode hProcess, tmNuAdd, &HF8

'pop eax
WByteToCode hProcess, tmNuAdd, &H58


'Int 3
'WByteToCode hProcess, tmNuAdd, &HCC

'jmp dword ptr [lVarAdd + 256] ;其中[lVarAdd + 256]=原函位址
WByteToCode hProcess, tmNuAdd, &HFF
WByteToCode hProcess, tmNuAdd, &H25
WLongToCode hProcess, tmNuAdd, lVarAdd + 256 '
'----------------------------------------------

'修改IAT Address
WriteProcessMemory hProcess, ByVal Imp_p(n_index).lIAT_Address, lFunc, Len(lFunc), tm

'截理
Dim bProcessMemory As Long, RtnV
Do
'等待函被截
Do
If ReadProcessMemory(hProcess, ByVal lVarAdd, bProcessMemory, Len(bProcessMemory), tm) = 0 Then
MsgBox "重"
GoTo Exp
End If
DoEvents
If n_Ex Then
GoTo Exp
End If
Loop While bProcessMemory

Me.Show

'==============================================================================
Dim rtnV2 As Integer
rtnV2 = MsgBox("截到目程式呼叫" & Imp_p(n_index).sFunctionName & vbCrLf & _
"是否结束进程?", vbYesNo, "抓到了")


If rtnV2 = vbYes Then
Shell "taskkill /f /pid " & CStr((CLng(Mid(Combo1.Text, 5, 8)))), vbHide
MsgBox "等待10秒", , "抓到了"
End If
'==============================================================================
RtnV = MsgBox("截到目程式呼叫" & Imp_p(n_index).sFunctionName & vbCrLf & _
"要截下次呼叫?", vbOKCancel, "抓到了")
If RtnV = vbCancel Then
WriteProcessMemory hProcess, ByVal Imp_p(n_index).lIAT_Address, n_Old_Address, Len(n_Old_Address), tm
bProcessMemory = 1
WriteProcessMemory hProcess, ByVal lVarAdd, bProcessMemory, Len(bProcessMemory), tm
Exit Do
End If
bProcessMemory = 1
WriteProcessMemory hProcess, ByVal lVarAdd, bProcessMemory, Len(bProcessMemory), tm
DoEvents
Loop
Exp:
DeleteMemory n_ProcessID, lFunc
DeleteMemory n_ProcessID, lVarAdd
CloseHandle hProcess
Else
MsgBox "Process"
End If
Command1.Enabled = True
End Sub


[解决办法]
用这个方法的话,可以拦截本程序EXE内的一些API函数,却无法拦截其他程序或进程的调用中的DLL中的函数,奇怪了

通过API HOOK 创建SYSTEM用户进程
http://blog.csdn.net/chenhui530/article/details/1932599

[解决办法]
一调用就提示该内存不可为READ,然后就记事本死了
[解决办法]
没写过hook程序,
LZ好像把hook想的太简单来,没权限写(访问)其他程序内存(提权),其他程序要进入你自己的程序内存,

LZ快点解决来,我也来学习学习
[解决办法]
我已经基本解决了,HOOK记事本的弹出窗口,提示内容和标题都OK了,HOOK一个软件中的浏览器控件发出去的数据包也完成了,可以解析为get*** pot**之类的文字了,关键是HOOK时会造成原软件死机或HOOK程序没收到信息了还一直在提示收到信息。

数据量大了就不稳定,原因可能是那个程序被人改过了有的地方不完善。
[解决办法]
其实总的说来也是不难的,只是这种东西一般人用不到,所以资料几乎没地方可查,难得找到几个的也是不完整的代码或有很大BUG。如果把编程接口统一,那就几乎不存在难度了。就像是如果你不会装XP,假如给你一个光盘,你放上去之后只要点下一步下一步,就算不会设置什么域之类的东西,你也下一步,最后也是能用的。
[解决办法]
高手在哪
[解决办法]
稳定的方案,还是使用DLL插入到其它进程中去HOOK,做好与本进程的通讯就行了.

直接代码插入如果不稳定的话,再方便再简单,又有何用?

读书人网 >VB

热点推荐