本论坛为只读模式,仅供查阅,不能注册新用户,不能发帖/回帖,有问题可发邮件 xikug.xp (^) gmail.com
查看: 6921|回复: 16

[支持XIKU]第二弹TcpView [复制链接]

Rank: 2

发表于 2009-7-19 23:41:01 |显示全部楼层
扯蛋:
  首先说一下题目的问题,上次diyhack同学说我实现的和SysinternalsSuite里面不一样,并且在看雪中有TcpView的驱动逆向,这次更不敢加SysinternalsSuite了,因为我是在RING3下实现的。另外,微软有公开的函数可以很轻松的实现TcpView的功能,但是里面的实现方法是未公开的,所以还是值得我这样的菜鸟学习的。





正文:



工具介绍:
TcpView是一个查看当前电脑中存在的TCP和UDP连接的工具,并且现在被广泛应用,也有很多和它功能类似的工具。通过TcpView中观察到的结果可以检查一些非法的连接和结束不想要的连接。


原理:
WINDOWS中实现传输层TCP,UDP协议主要是在tcpip.sys中,并且每当有应用程序发起连接,就会通过tcpip.sys在内核中记录下相应的连接信息,我们获取连接信息就可以通过询问tcpip.sys来进行。
tcpip.sys建立了/device/tcp,/device/udp,/device/ip等设备,但是我们查询TCP,UDP连接只需要向/device/tcp发IOCTL请求就可以了,这个后面会解释,但是觉得有些奇怪。

微软在MSDN中介绍可以通过IOCTL_TCP_QUERY_INFORMATION_EX向/device/tcp发送请求来获得一些网络信息。
用法大概如下:
DeviceIoControl( hTcp,
                         IOCTL_TCP_QUERY_INFORMATION_EX,
                         &req,            
                         sizeof(req),   
                         udpTable,         
                         myLen,      
                         &retLen,      
                         NULL );
InBuffer是一个TCP_REQUEST_QUERY_INFORMATION_EX类型的变量
typedef struct tcp_request_query_information_ex {
  TDIObjectID ID;
  ULONG_PTR Context[CONTEXT_SIZE/sizeof(ULONG_PTR)];
} TCP_REQUEST_QUERY_INFORMATION_EX,
*PTCP_REQUEST_QUERY_INFORMATION_EX;
这个结构中第二个变量对我们没用,是获得接口信息时用的,主要输入信息在第一个变量中
typedef struct {
  TDIEntityID toi_entity;
  unsigned long toi_class;
  unsigned long toi_type;
  unsigned long toi_id;
} TDIObjectID;

typedef struct {
  unsigned long tei_entity;
  unsigned long tei_instance;
} TDIEntityID;

其中tei_entity是要获取的信息类型,获取TCP信息用CO_TL_ENTITY,获取UDP信息用CL_TL_ENTITY,tei_instance对我们来说没有用;toi_class用INFO_CLASS_PROTOCOL,toi_type用INFO_TYPE_PROVIDER,最后这个toi_id是最关键的,MSDN中也没有说要获取TCP,UDP连接信息应该设什么样的值,但是网上已经有牛人给逆出来了,我根据前人研究的结果,自己HOOK了NtDeviceIoControlFile看了一下,还拿起相当不熟练的OD调了一下IpHlpApi.dll,基本上看到的结果和前人分析的差不多,toi_id应该设为0x102
关于上面结构相应的具体解释可以看MSDN

http://msdn.microsoft.com/en-us/library/bb432313(VS.85).aspx

在OutBuffer中返回的信息也是别人研究出来了的,如下:
typedef struct _MIB_TCPROW_OWNER_PID{  
    DWORD dwState;  
    DWORD dwLocalAddr;  
    DWORD dwLocalPort;  
    DWORD dwRemoteAddr;  
    DWORD dwRemotePort;  
    DWORD dwOwningPid;
} MIB_TCPROW_OWNER_PID, *PMIB_TCPROW_OWNER_PID;

typedef struct _MIB_UDPROW_OWNER_PID{  
    DWORD dwLocalAddr;  
    DWORD dwLocalPort;  
    DWORD dwOwningPid;
} MIB_UDPROW_OWNER_PID, *PMIB_UDPROW_OWNER_PID;

大家也可以注意到,这两个结构其实就是微软公开的方法GetExtendedTcpTable(),GetExtendedUdpTable()中返回信息的结构,虽说是未公开,从这里开来好像又可以说是公开的。
主要的函数实现如下
DWORD GetTcpTable(PMIB_TCPROW_OWNER_PID *TcpRow)
{
    TCP_REQUEST_QUERY_INFORMATION_EX  req={0};
    HANDLE hTcp;
    DWORD retLen=0;
    NTSTATUS status=TDI_SUCCESS;
    if(GetTCPHandle(&hTcp) ==FALSE)
    {
        AfxMessageBox(L"取得TCP  Handle失败!");
        return -1;
    }
    req.ID.toi_entity.tei_entity=CO_TL_ENTITY;
    req.ID.toi_entity.tei_instance=0;
    req.ID.toi_class=INFO_CLASS_PROTOCOL;
    req.ID.toi_type=INFO_TYPE_PROVIDER;
    req.ID.toi_id=TCP_MIB_ADDRTABLE_ENTRY_EX_ID;
    DWORD num=0;
    DWORD myLen=0;
    PMIB_TCPROW_OWNER_PID tcpTable;
    tcpTable=(PMIB_TCPROW_OWNER_PID)malloc(100*sizeof(MIB_TCPROW_OWNER_PID));
    if(!tcpTable)
    {
        AfxMessageBox(L"malloc failed!");
    }
    myLen=100*sizeof(MIB_TCPROW_OWNER_PID);
    while(true)
    {
        DeviceIoControl( hTcp,
                         IOCTL_TCP_QUERY_INFORMATION_EX,
                         &req,            
                         sizeof(req),   
                         tcpTable,         
                         myLen,      
                         &retLen,      
                         NULL );
        if(retLen!=0)
            break;

        free(tcpTable);
        myLen=myLen*2;
        tcpTable=(PMIB_TCPROW_OWNER_PID)malloc(myLen);
        if(myLen>1024*sizeof(MIB_TCPROW_OWNER_PID))
        {
            AfxMessageBox(L"myLen>1024*sizeof(MIB_TCPROW_OWNER_PID)!");
            break;
        }
    }
                 
    status=GetLastError( );
   

    *TcpRow=tcpTable;
    num=retLen/sizeof(MIB_TCPROW_OWNER_PID);
                          

    CloseHandle(hTcp);

    return num;
}





结束:
可以用很多方法绕过这种端口察看比如HOOK   NtDeviceIoControlFile,不过还是可以学习一下的,只是对我这种菜鸟来说的。

另:本来没想到要做TcpView的,但学校的暑期实习题目竟然让我们选了个“实现驴拔相应功能”,我想TcpView好像能搭上一点,结果就做了,貌似没什么相关性。
TcpViewPic.jpg

MyTcpView.part01.rar

1.86 MB, 下载次数: 522

MyTcpView.part02.rar

1.86 MB, 下载次数: 539

MyTcpView.part03.rar

1.29 MB, 下载次数: 547

Rank: 2

发表于 2009-7-20 00:28:15 |显示全部楼层
还是学生时代好啊,有时间。
其实你把调试信息文件删掉,就不用分成三个小附件了。
我只有7zip,xikug设置的论坛不支持7z格式,所以没法传个样本了。

Rank: 1

发表于 2009-7-20 00:32:57 |显示全部楼层
好~~

Rank: 9Rank: 9Rank: 9

发表于 2009-7-20 12:54:09 |显示全部楼层
引用第1楼gz1x于2009-07-19 21:28发表的  :
还是学生时代好啊,有时间。
其实你把调试信息文件删掉,就不用分成三个小附件了。
我只有7zip,xikug设置的论坛不支持7z格式,所以没法传个样本了。
支持了。。。
悟空,退下,为师一个人就够了

Rank: 9Rank: 9Rank: 9

发表于 2009-7-20 13:06:33 |显示全部楼层
AllocateAndGetTcpExTableFromStack
AllocateAndGetUdpExTableFromStack
悟空,退下,为师一个人就够了

Rank: 2

发表于 2009-7-20 14:54:27 |显示全部楼层
引用第1楼gz1x于2009-07-19 21:28发表的  :
还是学生时代好啊,有时间。
其实你把调试信息文件删掉,就不用分成三个小附件了。
我只有7zip,xikug设置的论坛不支持7z格式,所以没法传个样本了。


我原来是想就发主要函数的,后来想想还是把所有工程发出来吧,能看明白点。

Rank: 2

发表于 2009-7-20 14:58:19 |显示全部楼层
引用第4楼xIkUg于2009-07-20 10:06发表的  :
AllocateAndGetTcpExTableFromStack
AllocateAndGetUdpExTableFromStack


WINDOWS是有公开的方法可以获取连接信息,并且还有更加强大的函数可以获取更加详细的信息

我这篇帖子只不过是自己发IOCTL获取信息,了解一下里面是怎么弄的。

Rank: 5Rank: 5

发表于 2009-7-20 16:38:48 |显示全部楼层
楼主又要被diyhack鄙视了

Rank: 4

发表于 2009-7-20 16:42:53 |显示全部楼层
以后发code一定记得要把 *.ncb, *opt, *plg, *pdb 这4个文件删除掉~
太大了

Rank: 4

发表于 2009-7-20 17:11:23 |显示全部楼层
引用第7楼MJ0011于2009-07-20 13:38发表的  :
楼主又要被diyhack鄙视了

鉴于xIkUg私下交代过。。。

算了,
不打击楼主了。。。

Rank: 2

发表于 2009-7-20 18:06:06 |显示全部楼层
引用第9楼diyhack于2009-07-20 14:11发表的  :


鉴于xIkUg私下交代过。。。

算了,
.......

尽管打击吧,我能承受的住
也好速度成长

Rank: 3Rank: 3

发表于 2009-7-20 20:30:29 |显示全部楼层
引用第10楼Holly于2009-07-20 15:06发表的  :


尽管打击吧,我能承受的住
也好速度成长
打是亲~~

Rank: 1

发表于 2009-7-20 20:46:26 |显示全部楼层
支持下

Rank: 2

发表于 2009-7-20 22:55:21 |显示全部楼层
是我的话,如果我确认我的上层没有NAT路由,我根本就不走TCP或者UDP,那就查不到了。

Rank: 2

发表于 2009-7-20 22:55:47 |显示全部楼层
引用第11楼root60931于2009-07-20 17:30发表的  :

打是亲~~
啥时候来科大搞科普?

Rank: 1

发表于 2010-11-21 18:10:26 |显示全部楼层
要下东西,当然回贴了

Rank: 1

发表于 2010-11-21 22:46:41 |显示全部楼层
mark 过段时间用得着。
您需要登录后才可以回帖 登录 | 立即加入

Archiver|手机版|第8个男人 - 论坛为只读模式,仅供查阅

GMT+8, 2019-6-27 13:25 , Processed in 0.067953 second(s), 11 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部