代码执行到这个模块之间出现越界还是什么问题不能继续运行

代码执行到这个模块之间出现越界还是什么问题不能继续运行

img

img


//获取自己主机的MAC地址
int GetSelfMac(pcap_t* adhandle, const char* ip_addr, unsigned char* ip_mac)
{
    unsigned char sendbuf[42];
    int i = -1;
    int res;
    struct ethernet_head eh;
    struct arp_head ah;
    struct pcap_pkthdr* pkt_header;
    const u_char* pkt_data;
    memset(eh.dst_mac_add, 0xff, 6); //目的地址全为广播地址
    memset(eh.src_mac_add, 0x0f, 6);
    memset(ah.src_mac_add, 0x0f, 6);
    memset(ah.dst_mac_add, 0x00, 6);
    eh.type = htons(ETH_ARP);
    ah.hardware_type = htons(ARP_HARDWARE);
    ah.protocol_type = htons(ETH_IP);
    ah.hardware_add_len = 6;
    ah.hardware_add_len = 4;
    ah.src_ip_add = inet_addr("100.100.100.100"); //随便设一个请求方ip
    ah.operation_field = htons(ARP_REQUEST);
    ah.dst_ip_add = inet_addr(ip_addr);
    memset(sendbuf, 0, sizeof(sendbuf));
    memcpy(sendbuf, &eh, sizeof(eh));
    memcpy(sendbuf + sizeof(eh), &ah, sizeof(ah));
    if (pcap_sendpacket(adhandle, sendbuf, 42) == 0) {
        printf("\nPacketSend succeed\n");
    }
    else {
        printf("PacketSendPacket in getmine Error: %d\n",(int) GetLastError());
        return 0;
    }

    while ((res = pcap_next_ex(adhandle, &pkt_header, &pkt_data)) >= 0) {
        if (*(unsigned short *)(pkt_data + 12) == htons(ETH_ARP)
            && *(unsigned short*)(pkt_data + 20) == htons(ARP_REPLY)
            && *(unsigned long*)(pkt_data + 38)
            == inet_addr("100.100.100.100")) {
            for (i = 0; i < 6; i++) {
                ip_mac[i] = *(unsigned char *)(pkt_data + 22 + i);
            }
            printf("获取自己主机的MAC地址成功!\n");
            break;
        }
    }
    if (i == 6) {
        return 1;
    }
    else {
        return 0;
    }
}

//向局域网内所有可能的IP地址发送ARP请求包线程
DWORD WINAPI SendArpPacket(LPVOID lpParameter)
{
    struct sparam* spara = (struct sparam*)lpParameter;
    pcap_t* adhandle = spara->adhandle;
    char* ip = spara->ip;
    unsigned char* mac = spara->mac;
    char* netmask = spara->netmask;
    printf("ip_mac:%02x-%02x-%02x-%02x-%02x-%02x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
    printf("自身的IP地址为:%s\n", ip);
    printf("地址掩码NETMASK为:%s\n", netmask);
    printf("\n");
    unsigned char sendbuf[42];
    struct ethernet_head eh;
    struct arp_head ah;
    memset(eh.dst_mac_add, 0xff, 6);
    memcpy(eh.src_mac_add, mac, 6);
    memcpy(ah.src_mac_add, mac, 6);
    memset(ah.dst_mac_add, 0xff, 6);
    eh.type = htons(ETH_ARP);
    ah.hardware_type = htons(ARP_HARDWARE);
    ah.protocol_type = htons(ETH_IP);
    ah.hardware_add_len = 6;
    ah.protocol_add_len = 4;
    ah.src_ip_add = inet_addr(ip);
    ah.operation_field = htons(ARP_REQUEST);

    //向局域网内广播发arp包  
    unsigned long myip = inet_addr(ip);
    unsigned long mynetmask = inet_addr(netmask);
    unsigned long hisip = htonl((myip & mynetmask));
    for (int i = 0; i < HOSTNUM; i++)
    {
        ah.dst_ip_add = htonl(hisip + i);
        memset(sendbuf, 0, sizeof(sendbuf));
        memcpy(sendbuf, &eh, sizeof(sendbuf));
        memcpy(sendbuf + sizeof(eh), &ah, sizeof(ah));
        if (pcap_sendpacket(adhandle, sendbuf, 42) == 0)
        {
            printf("\nPacketSend succeed\n");
            printf("\nPacketSend succeed\n");
        }
        else
        {
            printf("PacketSendPacket in getmine Error: %d\n", (int)GetLastError());
        }
        Sleep(50);
    }
    Sleep(1000);
    flag = 1;
    return 0;
}

//分析截留的数据包获取活动的主机IP地址
DWORD WINAPI GetLivePC(LPVOID lpParameter)
{
    struct gparam* gparam = (struct gparam*)lpParameter;
    pcap_t* adhandle = gparam->adhandle;
    int res;
    unsigned char Mac[6];
    struct pcap_pkthdr* pkt_header;
    const char* pkt_data;
    while (1)
    {
        if (flag)
        {
            printf("扫描完毕,按任意键退出!\n");
            break;
        }
        if ((res = pcap_next_ex(adhandle, &pkt_header, &pkt_data)) >= 0)
        {
            if (*(unsigned short*)(pkt_data + 12) == htons(ETH_ARP))
            {
                struct arp_packet* recv = (struct arp_packet*)pkt_data;
                if (*(unsigned short*)(pkt_data + 20) == htons(ARP_REPLY))
                {
                    printf("------------------------------\n");
                    printf("IP地址:%d.%d.%d.%d  MAC地址:", recv->ah.src_ip_add & 255, recv->ah.src_ip_add >> 8 & 255,
                        recv->ah.src_ip_add >> 16 & 255, recv->ah.src_ip_add >> 24 & 255);
                    for (int i = 0; i < 6; i++)
                    {
                        Mac[i] = *(unsigned char*)(pkt_data + 22 + i);
                        printf("%02x", Mac[i]);
                    }
                    printf("\n");
                }
            }
        }
        Sleep(10);
    }
    return 0;
}

你的代码中存在一些可能的问题,可能导致程序无法正常运行。以下是一些可能的问题和解决方案:

  1. 内存越界:在你的SendArpPacket函数中,你使用memcpy函数将ehah结构体复制到sendbuf中。但是,你使用sizeof(sendbuf)作为memcpy的长度参数,这可能会导致内存越界,因为sendbuf的大小可能小于ehah的总大小。你应该使用sizeof(eh)sizeof(ah)作为memcpy的长度参数。

  2. 权限问题:如果你的程序在运行时需要管理员权限,但没有得到足够的权限,那么它可能无法正常运行。你可以尝试以管理员权限运行你的程序。

  3. 网络问题:如果你的网络设置或网络设备有问题,那么你的程序可能无法正常运行。你应该检查你的网络设置和网络设备,确保它们能够正常工作。

  4. 错误的IP地址或MAC地址:如果你提供的IP地址或MAC地址是错误的,那么你的程序可能无法正常运行。你应该检查你的IP地址和MAC地址,确保它们是正确的。

如果以上的建议都无法解决你的问题,你可能需要使用调试工具来调试你的程序,找出导致程序无法正常运行的具体原因。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7517403
  • 你也可以参考下这篇文章:如何知道结构体中某个成员相对于结构体起始位置的偏移量
  • 除此之外, 这篇博客: 常用数据结构与经典算法 简单讲解与示例代码中的 魔术师发牌问题 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    问题描述

    魔术师发牌问题的简介:一位魔术师掏出一叠扑克牌,魔术师取出其中13张黑桃,洗好后,把牌面朝下。
    说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一,将第一张牌翻过来看正好是A;
    魔术师将黑桃A放到桌上,继续数手里的余牌,
    第二次数1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌子上。
    第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3,这样依次将13张牌翻出,全部都准确无误。

    示例代码(C语言)
    魔术师发牌 Visual Studio 2019

    /**
     * 数据结构 C语言 魔术师发牌
     * @FileName									MagicCard.c
     * @author										W.Lionel.Esaka
     */
    
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    #define Status int;
    #define CORRECT 1;
    #define ERROR 0;
    #define OVERFLOW -1;
    
    #define CardNumber 13;
    
    typedef int ElemType;
    /*定义循环链表结点*/
    typedef struct CLinkedList {
    	ElemType data;
    	struct CLinkedList* Next;
    }Node;
    
    /*初始化链表*/
    void ListInit(Node** p, int number)
    {						 
    	int item = 0;
    	Node* temp;
    	Node* target;
    
    	for (int i = 1; i <= number; i++)
    	{
    		if (*p == NULL)
    		{
    			*p = (Node*)malloc(sizeof(Node));
    			if (!*p)exit(0);
    			(*p)->data = item;
    			(*p)->Next = *p;
    		}
    		else		
    		{
    			for (target = *p; target->Next != *p; target = target->Next);
    
    			temp = (Node*)malloc(sizeof(Node));
    			if (!temp)exit(0);
    			temp->data = item;
    			temp->Next = *p;
    			target->Next = temp;
    		}
    	}
    }
    
    /*设定牌堆顺序*/
    void CardOrder(Node** card)
    {
    	int PokerSize = 2;
    	Node* temp;
    	temp = (*card);
    	(*card)->data = 1;
    
    	while (1)
    	{
    		for (int j = 0; j < PokerSize; j++)
    		{
    			temp = temp->Next;
    			if (temp->data != 0)
    			{
    				temp->Next;
    				j--;
    			}
    		}
    
    		if (temp->data == 0)
    		{
    			temp->data = PokerSize;
    			PokerSize++;
    
    			if (PokerSize == 14)
    				break;
    		}
    	}
    }
    
    /*遍历链表*/
    void CardDisplay(Node* list)
    {
    	Node* target;
    	target = list;
    	do {
    		printf("黑桃%d  ", target->data);
    		target = target->Next;
    	} while (target != list);
    	printf("\n");
    }
    
    /*销毁链表*/
    void DestoryList(Node** list)
    {
    	Node* ptr = (*list);
    	Node* buff[13];
    	int i = 0;
    
    	while (i < 13)
    	{
    		buff[i++] = ptr;
    		ptr = ptr->Next;
    	}
    
    	for (i = 0; i < 13; i++)
    	{
    		free(buff[i]);
    	}
    
    	*list = 0;
    	printf("表已销毁\n");
    }
    
    /*入口*/
    int main(void)
    {
    	Node* list = NULL;
    
    	ListInit(&list, 13);
    	CardOrder(&list);
    	CardDisplay(list);
    	DestoryList(&list);
    }
    
  • 您还可以看一下 CSDN讲师老师的【在线峰会】物联网全栈开发之道视频教程课程中的 【第一场】现代物联网应用系统构架与技术栈小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^