精易论坛

标题: [伪]IPV4/IPV6地址修改器 [打印本页]

作者: mike4678    时间: 2022-5-29 19:02
标题: [伪]IPV4/IPV6地址修改器
         

程序最开始是基于易语言论坛上的一个IP修改器来进行修改的,随后在慢慢的修改中增加了一些自己觉得缺少的功能,例如:多DNS选择、IP保存
目前查询了整个论坛都没有发现关于IPV6的读取,自己虽然找到IPV6地址信息在注册表中的位置,无奈注册表中所能看到的实在缺少,而目前可以读取IPV6地址的api,GetAdaptersAddresses,在论坛中也是几乎没有资料

所以这个程序可以这么说,更像是一个基于VC 2019而开发的易语言界面程序,核心读取部分为VC2019编写,界面显示部分为易语言

软件运行后通过释放位于图片资源里的GetAdaptersAddresses.exe(VC2019编写,源码可见帖子底部,也期待有人能把这部分代码转换成易语言版本),然后通过运行这个程序生成一个network.net的文件到系统temp目录下,随后软件通过读取这个network.net来显示IP信息,其中dns.db与iplist.db为xml结构文件,dns.db保存的是dns管理中公共DNS信息及自定义dns信息,iplist.db保存的是修改的ip地址信息

模块为云外归鸟的枚举对象模块,已包含在易语言源码压缩包中

易语言源码: Desktop.zip (835.91 KB, 下载次数: 88)

最后也附上VC2019部分源码:
[C++] 纯文本查看 复制代码
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <ws2tcpip.h>

// Link with Iphlpapi.lib
#pragma comment(lib, "IPHLPAPI.lib")
#pragma comment(lib, "Ws2_32.lib")

#define WORKING_BUFFER_SIZE 15000
#define MAX_TRIES 3

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))

/* Note: could also use malloc() and free() */

int __cdecl main(int argc, char** argv)
{

    /* Declare and initialize variables */

    DWORD dwSize = 0;
    DWORD dwRetVal = 0;

    unsigned int i = 0;

    // Set the flags to pass to GetAdaptersAddresses
    ULONG flags = GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_INCLUDE_GATEWAYS;

    // default to unspecified address family (both)
    ULONG family = AF_UNSPEC;

    LPVOID lpMsgBuf = NULL;

    PIP_ADAPTER_ADDRESSES pAddresses = NULL;
    ULONG outBufLen = 0;
    ULONG Iterations = 0;

    PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
    PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;
    PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL;
    PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL;
    IP_ADAPTER_DNS_SERVER_ADDRESS* pDnServer = NULL;
    IP_ADAPTER_PREFIX* pPrefix = NULL;

    const DWORD Size = 512;
    DWORD bufflen = Size;
    char buff[Size];
    char IP[130] ={0};
    char getway[130] = { 0 };
    char dhcpv6[130] = { 0 };
    char dhcpv4[130] = { 0 };

    if (argc != 2) {
        printf(" Usage: getadapteraddresses family\n");
        printf("        getadapteraddresses 4 (for IPv4)\n");
        printf("        getadapteraddresses 6 (for IPv6)\n");
        printf("        getadapteraddresses A (for both IPv4 and IPv6)\n");
        exit(1);
    }

    if (atoi(argv[1]) == 4)
        family = AF_INET;
    else if (atoi(argv[1]) == 6)
        family = AF_INET6;

    printf("Calling GetAdaptersAddresses function with family = ");
    if (family == AF_INET)
        printf("AF_INET\n");
    if (family == AF_INET6)
        printf("AF_INET6\n");
    if (family == AF_UNSPEC)
        printf("AF_UNSPEC\n\n");

    // Allocate a 15 KB buffer to start with.
    outBufLen = WORKING_BUFFER_SIZE;

    do {

        pAddresses = (IP_ADAPTER_ADDRESSES*)MALLOC(outBufLen);
        if (pAddresses == NULL) {
            printf
            ("Memory allocation failed for IP_ADAPTER_ADDRESSES struct\n");
            exit(1);
        }

        dwRetVal =
            GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);

        if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
            FREE(pAddresses);
            pAddresses = NULL;
        }
        else {
            break;
        }

        Iterations++;

    } while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (Iterations < MAX_TRIES));

    if (dwRetVal == NO_ERROR) {
        // If successful, output some information from the data we received
        pCurrAddresses = pAddresses;
        while (pCurrAddresses) {
            //printf("\tLength of the IP_ADAPTER_ADDRESS struct: %ld\n",
            //    pCurrAddresses->Length);
            //printf("\tIfIndex (IPv4 interface): %u\n", pCurrAddresses->IfIndex);
            printf("\t[%s]\n", pCurrAddresses->AdapterName);
            //printf("\tAdapter name: %s\n", pCurrAddresses->AdapterName);
            pUnicast = pCurrAddresses->FirstUnicastAddress;
            if (pUnicast != NULL) {
                int i = 0;
                while (pUnicast) {  
                    i++;
                    if (AF_INET == pUnicast->Address.lpSockaddr->sa_family) // IPV4 地址,使用 IPV4 转换
                    {
                        inet_ntop(PF_INET, &((sockaddr_in*)pUnicast->Address.lpSockaddr)->sin_addr, IP, sizeof(IP));
                        printf("\tUnicast Addresses[%d]= %s\n",i ,IP);
                    }
                    else if (AF_INET6 == pUnicast->Address.lpSockaddr->sa_family) // IPV6 地址,使用 IPV6 转换
                    {
                        inet_ntop(PF_INET6, &((sockaddr_in6*)pUnicast->Address.lpSockaddr)->sin6_addr, IP, sizeof(IP));
                        printf("\tUnicast Addresses[%d]= %s\n",i, IP);
                    }
                    pUnicast = pUnicast->Next;
                }
                printf("\tNumber of Unicast Addresses= %d\n", i);
            }
            else
                printf("\tNo Unicast Addresses\n");

            pMulticast = pCurrAddresses->FirstMulticastAddress;
            if (pMulticast) {
                for (i = 0; pMulticast != NULL; i++)
                    pMulticast = pMulticast->Next;
                printf("\tNumber of Multicast Addresses: %d\n", i);
            }
            else
                printf("\tNo Multicast Addresses\n");

            pDnServer = pCurrAddresses->FirstDnsServerAddress;
            if (pDnServer != NULL) {
                int i = 0;
                while (pDnServer) {
                    i++;
                    if (AF_INET == pDnServer->Address.lpSockaddr->sa_family) // IPV4 地址,使用 IPV4 转换
                    {
                        inet_ntop(PF_INET, &((sockaddr_in*)pDnServer->Address.lpSockaddr)->sin_addr, IP, sizeof(IP));
                        printf("\tDNS Server Addresses[%d]= %s\n", i, IP);
                    }
                    else if (AF_INET6 == pDnServer->Address.lpSockaddr->sa_family) // IPV6 地址,使用 IPV6 转换
                    {
                        inet_ntop(PF_INET6, &((sockaddr_in6*)pDnServer->Address.lpSockaddr)->sin6_addr, IP, sizeof(IP));
                        printf("\tDNS Server Addresses[%d]= %s\n", i, IP);
                    }
                    pDnServer = pDnServer->Next;
                }

                printf("\tNumber of DNS Server Addresses= %d\n", i);
            }
            else
                printf("\tNo DNS Server Addresses\n");
            auto pGetway = pCurrAddresses->FirstGatewayAddress;
            while (pGetway) //网关
            {
                if (AF_INET == pGetway->Address.lpSockaddr->sa_family)
                    inet_ntop(PF_INET, &((sockaddr_in*)pGetway->Address.lpSockaddr)->sin_addr, getway, sizeof(getway));
                else if (AF_INET6 == pGetway->Address.lpSockaddr->sa_family)
                    inet_ntop(PF_INET6, &((sockaddr_in6*)pGetway->Address.lpSockaddr)->sin6_addr, getway, sizeof(getway));
                pGetway = pGetway->Next;
            }
            printf("\tGateway Addresses= %s\n", getway);

            //printf("\tDNS Suffix: %wS\n", pCurrAddresses->DnsSuffix);
            printf("\tDescription= %wS\n", pCurrAddresses->Description);
            printf("\tFriendly name= %wS\n", pCurrAddresses->FriendlyName);

            if (pCurrAddresses->PhysicalAddressLength != 0) {
                printf("\tPhysical address= ");
                for (i = 0; i < (int)pCurrAddresses->PhysicalAddressLength;
                    i++) {
                    if (i == (pCurrAddresses->PhysicalAddressLength - 1))
                        printf("%.2X\n",
                            (int)pCurrAddresses->PhysicalAddress);
                    else
                        printf("%.2X-",
                            (int)pCurrAddresses->PhysicalAddress);
                }
            }

            //printf("\tFlags: %ld\n", pCurrAddresses->Flags);
            printf("\tMtu: %lu\n", pCurrAddresses->Mtu);

            //接口类型
            switch(pCurrAddresses->IfType)
            {
                case MIB_IF_TYPE_ETHERNET:printf("\tIfType: %s\n", "以太网接口"); break;

                case MIB_IF_TYPE_PPP:printf("\tIfType: %s\n", "PPP接口"); break;

                case MIB_IF_TYPE_LOOPBACK:printf("\tIfType: %s\n", "软件环回接口"); break;

                case IF_TYPE_IEEE80211:printf("\tIfType: %s\n", "无线网络接口"); break;

            }
            printf("\tOperStatus: %ld\n", pCurrAddresses->OperStatus);
           // printf("\tIpv6IfIndex (IPv6 interface): %u\n",
            //    pCurrAddresses->Ipv6IfIndex);

            if (pCurrAddresses->Dhcpv6Server.lpSockaddr)//IPV6DHCP
            {
                if (AF_INET6 == pCurrAddresses->Dhcpv6Server.lpSockaddr->sa_family)
                {
                    inet_ntop(PF_INET6, &((sockaddr_in6*)pCurrAddresses->Dhcpv6Server.lpSockaddr)->sin6_addr, dhcpv6, sizeof(dhcpv6));
                }
            }

            printf("\tDhcp IPv4 Enable= %lu\n", pCurrAddresses->Dhcpv4Enabled);
            printf("\tIPv6 Enable= %lu\n", pCurrAddresses->Ipv6Enabled);
            printf("\tIPv4 Enable= %lu\n", pCurrAddresses->Ipv4Enabled);
            printf("\tTransmit link speed= %I64u\n", pCurrAddresses->TransmitLinkSpeed);
            printf("\tReceive link speed= %I64u\n", pCurrAddresses->ReceiveLinkSpeed);

            //pPrefix = pCurrAddresses->FirstPrefix;
            //if (pPrefix) {
                //for (i = 0; pPrefix != NULL; i++)
                    //pPrefix = pPrefix->Next;
                //printf("\tNumber of IP Adapter Prefix entries: %d\n", i);
            //}
            //else
               // printf("\tNumber of IP Adapter Prefix entries: 0\n");

            printf("\n");

            pCurrAddresses = pCurrAddresses->Next;
        }
    }
    else {
        printf("Call to GetAdaptersAddresses failed with error: %d\n",
            dwRetVal);
        if (dwRetVal == ERROR_NO_DATA)
            printf("\tNo addresses were found for the requested parameters\n");
        else {

            if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                // Default language
                (LPTSTR)&lpMsgBuf, 0, NULL)) {
                printf("\tError: %s", lpMsgBuf);
                LocalFree(lpMsgBuf);
                if (pAddresses)
                    FREE(pAddresses);
                exit(1);
            }
        }
    }

    if (pAddresses) {
        FREE(pAddresses);
    }

    return 0;
}



作者: xjshuaishuai    时间: 2022-5-29 22:47
谢谢分享!
作者: happyweeks365    时间: 2022-5-30 06:39
66666666666666666
作者: wuqingg    时间: 2022-5-30 08:51
支持开源~
作者: jysoft2022    时间: 2022-5-30 10:44
支持开源~!感谢分享
作者: 爱易编程    时间: 2022-5-30 11:45
谢谢分享啊!
作者: longgekaifa    时间: 2022-5-30 16:24
支持开源~!感谢分享
作者: 艺术就是爆炸    时间: 2022-5-30 16:41
支持开源~!感谢分享
作者: sinewtec    时间: 2022-5-30 17:26
支持开源~!感谢分享
作者: 深圳梦    时间: 2022-5-30 18:31
        支持开源~!感谢分享
作者: 牙子    时间: 2022-5-30 18:55

作者: 得意须尽欢    时间: 2022-5-30 19:32
请问一下这个最大的用处是啥
作者: mike4678    时间: 2022-5-31 07:14
得意须尽欢 发表于 2022-5-30 19:32
请问一下这个最大的用处是啥

在需要频繁切换IP的环境下可以快速切换IP
作者: alanwoo    时间: 2022-5-31 08:25
感谢分享
作者: zhaode2888    时间: 2022-5-31 09:07
感谢分享
作者: aini1wna2    时间: 2022-6-2 23:50
开源精神必须支持~
作者: 难忘的回忆    时间: 2022-6-5 15:26
需要这个!!
作者: 灵猫作者    时间: 2022-6-11 21:23
开源精神必须支持~
作者: huxian    时间: 2022-7-2 12:43
为什么没有支持库了哦
作者: 99882620    时间: 2022-11-19 06:00
收藏了        开源精神必须支持~
作者: 12240771    时间: 2022-11-29 12:47
感谢分享




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4