【已解决】关于拦截某个端口的数据,看P版的!
本帖最后由 chenronting 于 2012-7-7 21:11 编辑搜索了一下论坛里的资料, 貌似没有我想要的
其中一个
#Include <WinAPIEx.au3>
_WinAPI_GetTCPTable()
可以算是比较符合,不过好像没有实时?
说了这么多废话,,我说下我的需求,请大家帮助我:
我需要监测一个端口,这个端口不是每时都连接着的
但是会时不时接收一些数据,而我需要的就是接收到的数据
与发送数据的机器IP
以下是我描述的另一版本:
S=Service
C=Client
一台机器上装有S端软件,接收C端的数据
C只在有动作时才会发送一些数据,而我需要它
并需要得到是哪个C发送的
{:face (316):} 呵呵,怎么和我要做的东西这么像啊,暂未动手,曾经想了一个方案你看看行不行。
不试图直接捕捉server端的数据,用端口转发软件,将server指定端口数据发到可控制端(比如本机),直接接受tcp数据分析,即可 回复 2# bakefish
是一个好方法,我现在想拦截到Client发上来的信息, 不知道你有什么好办法呢 回复 3# chenronting
奥,看来你还要针对性的做过滤了,这个我也不知道怎么能办到。
如果只是简单发现有限定内的机器就阻断它,不妨试试arp攻击,可以利用winpacp,发送假的arp包,伪装客户端的mac地址,使得它暂时阻断。 回复 4# bakefish
不是过滤, 是截取他的信息,还需要得知它的IP地址
而Service软件本身, 还是可以得到信息的 GetTcpTable遍历所有TCP端口,找到占用此端口的进程,然后挂钩相关的wsock函数,比如recv、WSARecv、WSARecvFrom等函数,在钩子函数中判断 socket句柄是否是 打开指定端口的那个,是则截取,不是则放行。 好深奥呀! 有个问题没描述清楚,你需要的软件是要在哪个位置执行的.Server还是Client还是同网段的第三方主机? 回复 8# easefull
谢谢提醒, 是在server 同台机器上执行的 回复 6# pusofalse
GetTcpTable 我也看过一下, 只是好像没有看到 占用 那个端口的程序?有这种可能吗 既然是可以在Server上执行,那么可以用第三方sniffer工具获取那些信息.
只要嗅探本机ip.筛选出那个端口就可以了.
不过如果你想要把这些信息用au3读出来可能还需要自己写简单的sinffer工具.这个我也不会,不过你可以搜索学习wincacp的au3函数. 回复 11# easefull
非常感谢你的回答, 我尝试下。 回复 10# chenronting
抱歉记错了,Iphlpapi.dll中的GetTcpTable2函数才有这个功能,可惜没在XP中实现。在XP中,可以调用NtQuerySystemInformation、DuplicateHandle一类的函数 找到开启指定端口的进程。 GetTcpTable遍历所有TCP端口,找到占用此端口的进程,然后挂钩相关的wsock函数,比如recv、WSARecv、WSARec ...
pusofalse 发表于 2011-4-28 00:42 http://www.autoitx.com/images/common/back.gif
来个例子看看。。。例如拦3899端口 本帖最后由 pusofalse 于 2011-5-5 16:20 编辑
回复 14# auto
先运行帮助文件中TCPRecv、TCPSend函数中的两个例子,然后运行以下这段代码,截取server端接收到的数据。
这段代码假设已经知道 占用指定端口的进程。SCITE中运行。
只是段演示代码,不确保同样能够截取其他服务器程序的数据。
只截取在阻塞模式下接收的数据,对于使用重叠模式的socket,还要挂钩关联到socket的窗口过程,或检测关联到socket句柄的事件(Event)的状态。
#include <RTApiHook32.au3>
Const $PORT_NUMBER = 33891
Const $sFormat = "Remote IP: %s\nData: %s\n\n"
Local $iPid = _GetOpenedPortProcess() ; 假设已经知道占用指定端口的进程。
If ($iPid = 0) Then Exit 1
TCPStartup()
Local $hProcess = _RTOpenProcess($iPid)
Local $hCallBack = DllCallBackRegister("_MyWSARecv", "long", "handle;ptr")
Local $pCallBack = DllCallBackGetPtr($hCallBack)
Local $pWSARecv = _RTGetProcAddress("Ws2_32.dll", "WSARecv")
Local $tWSARecv = _RTApiHookEx($hProcess, $pWSARecv, 7, $pCallBack, $APIHOOK_Flags_2)
OnAutoItExitRegister("_RestoreHook")
While 1
Sleep(100)
WEnd
Func _RestoreHook()
_RTApiUnhook($hProcess, $pWSARecv, DllStructGetData($tWSARecv, "Entrypoint"))
Exit
EndFunc ;==>_RestoreHook
Func _MyWSARecv($hProcess, $pCallInfo)
Local $hSocket, $hDupSocket, $pBuffers, $pBuffer, $iBuffer, $pBytesRead, $sData
$hSocket = _RTApiHookReadParam($hProcess, $pCallInfo, 1, "handle")
$hDupSocket = _RTDuplicateHandle($hProcess, $hSocket, -1)
If _GetSocketPort($hDupSocket) <> $PORT_NUMBER Then
Return _RTCloseHandle($hDupSocket)
EndIf
$pBuffers = _RTApiHookReadParam($hProcess, $pCallInfo, 2)
$pBytesRead = _RTApiHookReadParam($hProcess, $pCallInfo, 4)
$iBuffer = _RTReadProcessMemory($hProcess, $pBytesRead, 0, 4, "long*")
$pBuffer = _RTReadProcessMemory($hProcess, $pBuffers + 4, 0, 4, "ptr*")
$sData = BinaryToString(_RTReadProcessMemory($hProcess, $pBuffer, 0, $iBuffer, "binary"))
ConsoleWrite(StringFormat($sFormat, _GetRemoteIP($hDupSocket), $sData))
_RTCloseHandle($hDupSocket)
EndFunc ;==>_MyWSARecv
Func _GetRemoteIP($hSocket)
Local $tSockAddr, $iResult
$tSockAddr = DllStructCreate("word Family;word Port;long IPAddress;byte Zero")
$iResult = DllCall("Ws2_32.dll", "long", "getpeername", "handle", $hSocket, _
"ptr", DllStructGetPtr($tSockAddr), "long*", 16)
If $iResult Then Return 0
$iResult = DllCall("Ws2_32.dll", "str", "inet_ntoa", "long", DllStructGetData($tSockAddr, "IPAddress"))
Return $iResult
EndFunc ;==>_GetRemoteIP
Func _GetSocketPort($hSocket)
Local $tSockAddr, $iResult
$tSockAddr = DllStructCreate("word Family;word Port;long IPAddress;byte Zero")
$iResult = DllCall("Ws2_32.dll", "long", "getsockname", "handle", $hSocket, _
"ptr", DllStructGetPtr($tSockAddr), "long*", 16)
If $iResult Then Return 0
$iResult = DllCall("Ws2_32.dll", "word", "htons", "word", DllStructGetData($tSockAddr, "Port"))
Return $iResult
EndFunc ;==>_GetSocketPort
Func _GetOpenedPortProcess()
Local $hWnd = WinGetHandle("My Server (IP: " & @IPAddress1 & ")")
Return _RTGetWindowThreadProcessId($hWnd)
EndFunc ;==>_GetOpenedPortProcess
页:
[1]
2