找回密码
 加入
搜索
查看: 13305|回复: 17

[网络通信] 【已解决】关于拦截某个端口的数据,看P版的!

 火.. [复制链接]
发表于 2011-4-27 22:44:54 | 显示全部楼层 |阅读模式
本帖最后由 chenronting 于 2012-7-7 21:11 编辑

搜索了一下论坛里的资料, 貌似没有我想要的
其中一个
#Include <WinAPIEx.au3>
_WinAPI_GetTCPTable()
可以算是比较符合,不过好像没有实时?
说了这么多废话,,我说下我的需求,请大家帮助我:

我需要监测一个端口,这个端口不是每时都连接着的
但是会时不时接收一些数据,而我需要的就是接收到的数据
与发送数据的机器IP
以下是我描述的另一版本:
S=Service
C=Client

一台机器上装有S端软件,接收C端的数据
C只在有动作时才会发送一些数据,而我需要它
并需要得到是哪个C发送的

发表于 2011-4-27 23:01:57 | 显示全部楼层
呵呵,怎么和我要做的东西这么像啊,暂未动手,曾经想了一个方案你看看行不行。
不试图直接捕捉server端的数据,用端口转发软件,将server指定端口数据发到可控制端(比如本机),直接接受tcp数据分析,即可
 楼主| 发表于 2011-4-27 23:06:31 | 显示全部楼层
回复 2# bakefish


    是一个好方法,我现在想拦截到Client发上来的信息, 不知道你有什么好办法呢
发表于 2011-4-27 23:30:14 | 显示全部楼层
回复 3# chenronting


    奥,看来你还要针对性的做过滤了,这个我也不知道怎么能办到。
    如果只是简单发现有限定内的机器就阻断它,不妨试试arp攻击,可以利用winpacp,发送假的arp包,伪装客户端的mac地址,使得它暂时阻断。
 楼主| 发表于 2011-4-28 00:17:13 | 显示全部楼层
回复 4# bakefish


    不是过滤, 是截取他的信息,还需要得知它的IP地址
而Service软件本身, 还是可以得到信息的
发表于 2011-4-28 00:42:51 | 显示全部楼层
GetTcpTable遍历所有TCP端口,找到占用此端口的进程,然后挂钩相关的wsock函数,比如recv、WSARecv、WSARecvFrom等函数,在钩子函数中判断 socket句柄是否是 打开指定端口的那个,是则截取,不是则放行。
发表于 2011-4-28 11:43:17 | 显示全部楼层
好深奥呀!
发表于 2011-4-28 11:53:22 | 显示全部楼层
有个问题没描述清楚,你需要的软件是要在哪个位置执行的.Server还是Client还是同网段的第三方主机?
 楼主| 发表于 2011-4-30 10:49:38 | 显示全部楼层
回复 8# easefull


    谢谢提醒, 是在server 同台机器上执行的
 楼主| 发表于 2011-4-30 10:50:17 | 显示全部楼层
回复 6# pusofalse


   
GetTcpTable 我也看过一下, 只是好像没有看到 占用 那个端口的程序?有这种可能吗
发表于 2011-4-30 11:14:35 | 显示全部楼层
既然是可以在Server上执行,那么可以用第三方sniffer工具获取那些信息.
只要嗅探本机ip.筛选出那个端口就可以了.

不过如果你想要把这些信息用au3读出来可能还需要自己写简单的sinffer工具.这个我也不会,不过你可以搜索学习wincacp的au3函数.
 楼主| 发表于 2011-5-2 19:45:24 | 显示全部楼层
回复 11# easefull


    非常感谢你的回答, 我尝试下。
发表于 2011-5-4 14:43:36 | 显示全部楼层
回复 10# chenronting


    抱歉记错了,Iphlpapi.dll中的GetTcpTable2函数才有这个功能,可惜没在XP中实现。在XP中,可以调用NtQuerySystemInformation、DuplicateHandle一类的函数 找到开启指定端口的进程。
发表于 2011-5-4 19:37:24 | 显示全部楼层
GetTcpTable遍历所有TCP端口,找到占用此端口的进程,然后挂钩相关的wsock函数,比如recv、WSARecv、WSARec ...
pusofalse 发表于 2011-4-28 00:42



来个例子看看。。。例如拦3899端口
发表于 2011-5-5 16:11:36 | 显示全部楼层
本帖最后由 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[8]")

        $iResult = DllCall("Ws2_32.dll", "long", "getpeername", "handle", $hSocket, _
                        "ptr", DllStructGetPtr($tSockAddr), "long*", 16)

        If $iResult[0] Then Return 0

        $iResult = DllCall("Ws2_32.dll", "str", "inet_ntoa", "long", DllStructGetData($tSockAddr, "IPAddress"))
        Return $iResult[0]
EndFunc        ;==>_GetRemoteIP

Func _GetSocketPort($hSocket)
        Local $tSockAddr, $iResult

        $tSockAddr = DllStructCreate("word Family;word Port;long IPAddress;byte Zero[8]")

        $iResult = DllCall("Ws2_32.dll", "long", "getsockname", "handle", $hSocket, _
                        "ptr", DllStructGetPtr($tSockAddr), "long*", 16)

        If $iResult[0] Then Return 0

        $iResult = DllCall("Ws2_32.dll", "word", "htons", "word", DllStructGetData($tSockAddr, "Port"))
        Return $iResult[0]
EndFunc        ;==>_GetSocketPort

Func _GetOpenedPortProcess()
        Local $hWnd = WinGetHandle("My Server (IP: " & @IPAddress1 & ")")
        Return _RTGetWindowThreadProcessId($hWnd)
EndFunc        ;==>_GetOpenedPortProcess
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2025-1-11 12:54 , Processed in 0.084139 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表