原贴:
http://community.csdn.net/Expert/topic/4883/4883617.xml?temp=.5169641
今天又读了读WINDOWS核心编程,有所感悟啊,不过还不行,得继续,VB真的不能写一个DLL去HOOK别人吗?想讨论讨论。。不过我现在的知识还停留在入门阶段,哈哈。。先不讨论了,再学学再说。继续用其他语言开发DLL供VB调用以截获指定进程封包问题~!~昨天开的帖子一激动开成20了,结了重新开。
http://community.csdn.net/Expert/topic/4883/4883617.xml?temp=.5169641
今天又读了读WINDOWS核心编程,有所感悟啊,不过还不行,得继续,VB真的不能写一个DLL去HOOK别人吗?想讨论讨论。。不过我现在的知识还停留在入门阶段,哈哈。。先不讨论了,再学学再说。继续用其他语言开发DLL供VB调用以截获指定进程封包问题~!~昨天开的帖子一激动开成20了,结了重新开。
至于dll的话需要一些处理
http://210.33.91.106/cy_filesxxx/vbsrc/VBAPIHooker.rar
把那个东西做成ocx,有数据的时候触发一个Event给你,就象winsock一样但是不知怎么的,就是没有办法把截取的数据外传,非常的奇怪!!!!!!
老大,你的代码我看了,简直。看见了春天一样。。呵呵,奉为经典!!看来我现在的水平只停留在“背课本”阶段啊,强烈需要仔细研究核心编程!强烈需要仔细研究WINDOWS深度历险!!哭了,这一个简单的读读就得个把月,哈哈,仔细研究,半年不干别的,但是我还得当老师啊,看来这个HOOK封包现在还是要寄托于各位高手了,特别是二位啊!
绿豆老大能推荐本VB比较深入研究核心的书吗?说实在的,学了10来年了,都是没事弄弄,没事捣鼓捣鼓,现在当个高中老师,没想到哇,兴趣突然上来这么多。。呵呵不怕大伙笑话,我的水平连VB自带的那些控件是干什么的都不知道,用到VB函数的时候经常去查,API更别提了,没几个会用的,都是现看现搬研究这个问题对我来说确实是不知道天高地厚了,不过兴趣所至,么办法了,前些天雪貂给的消息拦截还没怎么研究呢,这些天一直捣鼓这个了
现在有些茫然
绿豆的代码看着都眼热,哈哈,问个有关的问题我挂接了游戏的WSOCK32.DLL的RECV函数,然后当接收到信息的时候,堆栈信息中是否包含了接收到的数据内容呢。。
堆栈情况:
02 02 00 00 A4 2A 5A 04
A0 2A 5A 04 00 00 00 00
F4 FB D4 04 01 00 00 00
63 16 00 00 A0 2A 5A 04
1B FC D4 04 80 06 00 00
1B FC D4 04 01 00 00 00
02 00 00 00 A4 2A 5A 04
1F E2 F7 77 F0 DB 5A 04
48 FC D4 04 A0 2A 5A 04
00 00 00 00 C2 B6 18 76
F8 A6 1E 76 F8 A6 1E 76
F0 DB 5A 04 84 DC 5A 04
FE 63 16 00 30 DC 5A 04
3C DC 5A 04 A0 2A 5A 04
DC FF D4 04 04 A7 1E 76
B7 18 17 76 00 00 00 00参数堆栈情况:
00000680 04D4FC1B 00000001 00000002
045A2AA4 77F7E21F 045ADBF0 04D4FC48
045A2AA0 00000000 7618B6C2 761EA6F8
761EA6F8 045ADBF0 045ADC84 001663FEEAX值:
04D4FC1BECX值:
045A2AA0EDX值:
00001663EBX值:
00000001ESP值:
04D4FBF4EBP值:
00000000ESI值:
045A2AA0EDI值:
045A2AA4EFLAGS值:
00000202函数返回地址:
7618B5C8。以上部分基本不懂啊,哈哈,堆栈没学过,就是听说而已,
SOCKET s,
char FAR *buf,
int len,
int flags
);s = 680 buf=4d4fc1b(局部变量), len=1, flags=2=MSG_PEEK
buf[0] = 0 = [4d4fc1b]
问斑竹老大一个问题怎么捐赠可用分啊,捐赠的时候少的是什么东东?我的可用分还是不够给加到500的有点纳闷呢。。那天VirtualDesktop(吴滂) 兄捐赠给了我300,我也想学学,哈哈,然后要点分好实现诺言,完成这个程序给500分。
'---------------
楼主,不好意思,说了一些和主题不相干的话.呵呵,最近,公司的机子坏了,上不了网,只能在家里上上网,不过,CSDN好像越来越不好玩了.
SOCKET s,
char FAR *buf,
int len,
int flags
);
s, FAR *buf, len, flags
参数堆栈情况:
000000D8 019FD2A8 0000000C 00000000
73D4A202 019FD2A8 0000000C 00000000
004773A0 0012FC50 00454DDB 019FD2A8
0000000C 00000000 0000000C 004773A0那也就是说,我把这个堆栈情况里面的第2组数据作为内存拷贝的起点,复制长度为第3个参数就可以得到整个发送的数据了吗?
可是一共 四组呢。。是不是每次调用这个API就会得到一个数据包的内容呢。。还是我需要在这四组数据里面怎么处理啊。。迷糊中
s=alArgs(0)
buf=alArgs(1)
len=alArgs(2)
flags=alArgs(3)
所以,要获得封包内容,只要再这样就可以了
ReDim b(alArgs(2)-1) As Byte
.Pmemcpy2local VarPtr(b(0)),alArgs(1),alArgs(2)现在数组b里就是封包内容了
代码我修改以后,在HOOK RECV函数的时候偶尔目标进程会停止相应。。我主要修改了这些部分,
定义了一个变量,表示函数是否完成,如果没完成不可以撤消钩子Private mAA As BooleanPrivate Sub m_oExpHooker_BeforeAction(ByVal lHookID As Long, ByVal lHookType As Long, ByVal sAPIName As String, ByVal lpArgs As Long, fBlock As Boolean, lArgCount As Long, ByVal lReturnAddress As Long) mAA = False
'*******************************
Dim alArgsEx() As Long
Dim mBuff() As Byte
Dim mIndex As Long
'*******************************
With m_oExpHooker
' .DumpStack abDumpData(), 128
' .GetArguments alArgs(), 16
'******************************************
.GetArguments alArgsEx(), 4
If alArgsEx(2) = 20 Then
ReDim mBuff(alArgsEx(2) - 1) As Byte
.Pmemcpy2local VarPtr(mBuff(0)), alArgsEx(1), alArgsEx(2)
If CLng(mBuff(4)) = 1 Then
Text2.Text = Text2.Text & "==============================================" & vbCrLf
For mIndex = 0 To UBound(mBuff)
Text2.Text = Text2.Text & Right$("0" & Hex(mBuff(mIndex)), 2) & " "
Next
Text2.Text = Text2.Text & vbCrLf
Text2.SelStart = Len(Text2.Text)
End If
End If
End With
End SubPrivate Sub m_oExpHooker_AfterAction(ByVal lHookID As Long, ByVal lHookType As Long, ByVal sAPIName As String, ByVal fIntercepted As Boolean, lRetValue As Long)
mAA = True
End Sub
Private Sub mnuUnhook2_Click()
Do
If mAA Then
With lvExportList.SelectedItem
.SmallIcon = 0
With .ListSubItems(1)
.ForeColor = 0
.Bold = False
End With
If .Tag > -1 Then
If m_oExpHooker.Unhook(.Tag) Then
.Tag = ""
MsgBox "钩子卸载成功!"
Else
MsgBox "钩子卸载失败!"
End If
End If
End With
lvExportList.Refresh
Exit Do
End If
DoEvents
Loop
End Sub
Private Sub Text2_DblClick()
Text2.Text = ""
End SubPrivate Sub Timer1_Timer()
If GetProcEntries(m_atProcEntries) Then
FillProcList m_atProcEntries()
End If
End Sub
Private Sub Form_Load() Call AquireDebugToken Set m_oExpHooker = New CVBAPIHooker
End Sub并且把m_oImgHooker 删除了。基本就是修改了这些部分。。其他的应该无关紧要了。。添加了一个TEXT2,可是在运行的时候HOOK RECV函数有比较多的时候会使目标进程停止响应,原因是什么呢?是不是目标正在调用RECV,所以就挂掉了,应该怎么解决这个问题呢
1、遇到问题还可以继续问问,嘿嘿。偶改代码经常颠三倒四的。
2、现在可用分还不多,不够提供500分的,这500分现在应该是给绿豆的。
3、VirtualDesktop(吴滂) 兄改的BCB代码不知道怎么样了,那是一个DLL文件,如果成了也给500
4、让大家多关注关注,看看绿豆的代码,非常经典了,写的又工整,思路也很清晰(参照《WINDOWS核心编程》22.9.3一节,HOOK API的内容)。
5、等待大家捐赠可用分。现在这个帖子的分一样是要散一部分给帮忙的同志们的,VirtualDesktop(吴滂) 兄捐赠的分结的时候至少要给到的,上一个帖子才给了160,差很多;绿豆的500分我还在筹集。。希望大家多顶顶,多学习学习这个代码,里边不但有一些高级的技术,还有一些基本问题绿豆解决的也非常好,象传递一个数组参数时用其指针传递,用默认事件来击活操作等等等等,都是应该学习的地方。
就是
'''''''''
我只对单线程的情况做了处理,所以,如果目标进程有多个线程调用这个函数的话就有可能产生阻塞现象...解决的办法么...偶写的时候偷懒没有想过,呵呵。解决思路有一个,在拦截函数的时候就把目标进程中的其他线程挂起(suspend),等处理完了,再恢复……或者给vb的接收部分弄个队列,呵呵,想想就很麻烦了~
''''''''''''
这个问题能解决吗,我估计不是个问题
93 02 00 00 DC FD 12 00
90 45 1B 00 34 FD 12 00
10 FD 12 00 00 00 00 00
31 00 5B DA 54 43 1B 00
00 20 00 00 6C 05 00 00
E0 5C 1D 00 00 20 00 00
00 00 00 00 DC FD 12 00
90 45 1B 00 00 00 00 00
E0 5C 1D 00 54 FD 12 00
58 B0 17 22 00 20 00 00
98 E3 17 00 BE B1 17 22
90 45 1B 00 00 00 00 00
98 E3 17 00 74 FD 12 00
3D B0 17 22 6C 05 00 00
01 00 00 00 7E 14 17 22
2E 59 17 22 6C 05 00 00参数堆栈情况:
0000056C 001D5CE0 00002000 00000000
0012FDDC 001B4590 00000000 001D5CE0
0012FD54 2217B058 00002000 0017E398
2217B1BE 001B4590 00000000 0017E398EAX值:
00002000ECX值:
001B4354EDX值:
DA5B0031EBX值:
00000000ESP值:
0012FD10EBP值:
0012FD34ESI值:
001B4590EDI值:
0012FDDCEFLAGS值:
00000293函数返回地址:
22177363
帮我看看 如何获取封包啊
怎么参数堆栈都一样啊?
VirtualDesktop(吴滂) 兄偶的可用分就100多了,哈哈,正象你说的无法捐赠了吧好象把自己绕进去了。。BCB研究的怎么样了?嘿嘿,我看封包看的头都和门口一样大了,出门的时候总怕撞到门框
最近严重失眠,到半夜3点左右才能睡着,而非常不幸的是来个新主任,还嚷嚷着要解聘一些人,整天上班和蹲监狱一样,去厕所也要打招呼,由于失眠还得挺着不瞌睡,所以中午回家精神都没了,分析个没有加密的封包也好多天了没弄出来,我真郁闷本来是每天喝点啤酒就能睡的,可是现在酒虫子又作祟,昨天喝了5个也没效果,根本没困,觉得今天该换白的了,哎,痛苦啊!!!!!假期加班补助还不一定给呢,呵呵,呵呵无语了,迷茫中。。
Dim alArgsEx() As Long
Dim mBuff() As Byte
Dim mIndex As Long
With m_oExpHooker
.GetArguments alArgsEx(), 4
ReDim mBuff(alArgsEx(2) - 1) As Byte
.Pmemcpy2local VarPtr(mBuff(0)), alArgsEx(1), alArgsEx(2)
Text1.Text = Text1.Text & "==============================================" & vbCrLf
For mIndex = 0 To UBound(mBuff)
Text1.Text = Text1.Text & Right$("0" & Hex(mBuff(mIndex)), 2) & " "
Next
Text1.Text = Text1.Text & vbCrLf
Text1.SelStart = Len(Text1.Text)
End With
'''''
为什么就是接受一个字节 程序也会接收 好多自己
帮我看看是那的错误沾光中........
为什么BeforeAction调用2次
每次数据长度都是1152
我也快崩溃了;
'*******************************
Dim alArgsEx() As Long
Dim mBuff() As Byte
Dim mIndex As Long
Dim TempStr As String
'*******************************
With m_oExpHooker
' .DumpStack abDumpData(), 128
' .GetArguments alArgs(), 16
'******************************************
.GetArguments alArgsEx(), 4
If alArgsEx(2) = 20 Then 'Or alArgsEx(2) = 8 Then
ReDim mBuff(alArgsEx(2) - 1) As Byte
.Pmemcpy2local VarPtr(mBuff(0)), alArgsEx(1), alArgsEx(2)
'If CLng(mBuff(4)) = 1 Or alArgsEx(2) = 8 Then
TempStr = "==============================================" & vbCrLf
For mIndex = 0 To UBound(mBuff)
TempStr = TempStr & Right$("0" & Hex(mBuff(mIndex)), 2) & " "
'TempStr = TempStr & Chr(mBuff(mIndex)) & " "
Next
Text2.Text = Text2.Text & TempStr & vbCrLf
Text2.SelStart = Len(Text2.Text)
'End If
End If
End With
End Sub为什么就是接受一个字节 程序也会接收不是接收一个字节,这段程序是从类中返回勾的函数的参数,并且把参数中的内容转化为16进制显示出来,以便“封包解密”。
你应该好好看看绿豆给出的代码,看我改的对你没什么帮助啊,而且我改的地方关键部分是请教绿豆他告诉的你也是在做这个东东吗?呵呵。。先研究绿豆的代码吧,至少应该知道各个接口和参数的作用以后才能拿来用吧。。
绿豆:500
吴滂:200+
其他帮忙的同志把分散了,700分刚好,,,不够嘿嘿。。
雪貂捐给我500+吧~~~~~~~等我再有分了,雪貂同志一定要大大地感谢的~~~~~~
调用 .GetArguments alArgs(), 4 就可以把 s, FAR *buf, len, flags 四个参数值依次保存到alArgs(0)-alArgs(3)中,即
s=alArgs(0)
buf=alArgs(1)
len=alArgs(2)
flags=alArgs(3)
所以,要获得封包内容,只要再这样就可以了
ReDim b(alArgs(2)-1) As Byte
.Pmemcpy2local VarPtr(b(0)),alArgs(1),alArgs(2)现在数组b里就是封包内容了\\
为什么我每次得到的 b 都不是我发的内容
都特别大
但是;里面有我发的东西
其他的数据是什么?
怎么提出来
我每次得到的 alArgs(2) 都是1152 大小 为什么呢
.Pmemcpy2local VarPtr(b(0)),alArgs(1),alArgs(2)
你对上面这句理解有点问题,应该是这样的,b是接收的数组是你要的内容,而alArgs(1)是基地址也就是开始读内存的位置,alArgs(2)是数组大小也就是要读的长度。你去看CVBAPIHooker类的Pmemcpy2local方法,其中调用了ReadProcessMemory这个API,而参数就是供这个API使用的,根据ReadProcessMemory中参数意义就可以知道Pmemcpy2local各个参数的意义了。还是那句老话,自己多看看人家的代码,弄明白接口和参数的意义。
不过还是迷惑中
哎 水平低啊!
我自己做的测试程序
发送 123 收到封包 有123 但是还有1000多的垃圾数据是那的
是我.Pmemcpy2local VarPtr(b(0)),alArgs(1),alArgs(2)
调用有问题
自己继续研究
哎
我想在检测到对方加载了WSOCK.DLL以后马上锁他的进程,然后HOOK RECV函数,HOOK上以后解除锁定,可以实现吗?我在分析封包的时候没发截获到从一开始就发过来的封包,所以有些信息得不到,象上面这样的想法能实现吗?各位高手说说,我不行了
各位帮帮忙吧~~~~~~~明天这个帖子就结了,再开一个200的。。继续
在绿老大的博客上列出许多诱人的代码,可惜下载地址都过期了。那天一看到他贴出那个 api hook,偶就试了,果然把那些宝藏找到了 :-)
在绿老大的博客上列出许多诱人的代码,可惜下载地址都过期了。那天一看到他贴出那个 api hook,偶就试了,果然把那些宝藏找到了 :-)
绿豆的博客在那啊
绿豆还做无盘啊
我以前也做过
Modest(塞北雪貂)·(偶最欣赏楼主的分)
我太感谢各位老大的支持了!!!!!!无语了,想流泪啊!!虽然时间不多,但我会把海绵里每一滴水都挤出来!!尽快写完这个代码,然后发布在下载区里面,附加代码(嘿嘿,我改的部分肯定不如绿豆写的好,不过应该能将就着看了:))。
:)绿豆的代码都被大家“盗取”了啊,呵呵,看来大家经常把人家地址分开用啊,哈哈。
绿豆的代码我有些部分还没详细看,粗略的看过几次,有些地方不详细研究还是不懂的,星期 4休息,争取把大部分代码完成。最近大家就会见到的!!
封包我决定不接了其实分包也好,虽然处理上代码要判断哪一部分有用,不过我觉得既然我没分析明白封包中其他内容的意思(其他内容中除了指令字一定还有其他的,因为好长好长啊),那接起来也没啥用,直接用知道什么意思的那段就好了!!对了,顺便问问,如果把人家的游戏弄出外挂还公开代码,人家不会送我去小岛吧。。
哈哈哈哈啊
http://community.csdn.net/Expert/topic/4916/4916268.xml?temp=.9895899