免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2895 | 回复: 0
打印 上一主题 下一主题

关于网卡物理地址-mac [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-29 01:25 |只看该作者 |倒序浏览
网卡地址这个概念有点混淆不清。因为实际上有两个地址,mac地址和物理地址,一般说网卡地址是指物理地址
物理 地址指的是网卡上的存放地址的ROM里的地址,
mac地址是这块卡工作的时候用的地址,一般情况下这两个地址是一样的,所以很多人都混用了,甚至不知道有区别  -_-

   网卡工作的时候,一个以太网帧60到1514(不包括crc),帧的crc是网卡自动加的,前导码是自动加的。网卡目的地址和源地址是驱动程序加的.
所以实际上网卡工作的时候用什么地址作为工作地址完全是由驱动程序决定的 因此,我们完全可以在不改变网卡的物理地址的情况下用软件方法改变具体的网卡的工作地址.

   MAC地址一般保存在注册表里,可以修改,于是就有下面连个问题:

   第1,可以肆无忌弹的盗用ip

   第2,可以破一些垃圾加密软件...

   很多软件是通过网卡地址加密的,这里面有两种不同。有些做的比较好的是通过物理地址加密。有些是通过工作地址加密.通过工作地址加密的像通过guidgen,netbios等方法得到的地址都是mac地址。一般都可以用该方法破解。通过物理地址加密的有点难破,但是也不是没有办法。

下面介绍比较苯的修改MAC的方法

修改方法:



1、  在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\

Class{4D36E972-E325-11CE-BFC1-08002BE10318}\0000、0001、0002等主键下,查

找DriverDesc内容为你要修改的网卡的描述的,如0000。下面的方法和rifter



2、在其下,添一个字符串,名字为NetworkAddress,值设为你要的MAC地(指在0000主键下)

址,要连续写。如004040404040。

3、然后到其下NDI\params中加一项NetworkAddress的主键,在该主键下添加名为default的字符串,值写要设的MAC地址,要连续写,如004040404040。(实际上这只是设置在后面提到的高级属性中的**初始值**,实际使用的MAC地址还是取决于在第2点中提到的NetworkAddress参数,而且一旦设置后,以后高级属性中值就是NetworkAddress给出的值而非default给出的了。)

4、在NetworkAddress的主键下继续添加名为ParamDesc的字符串,其作用为指定NetworkAddress主键的描述,其值可为“MAC Address”,这样以后打开网络邻居的属性,双击相应网卡项会发现有一个高级设置,其下存在MAC Address 的选项,就是你在注册表中加的新项NetworkAddress,以后只要在此修改MAC地址就可以了。

5、关闭注册表,重新启动,你的网卡地址已改。打开网络邻居的属性,双击相应网卡项会发现有一个MAC Address的高级设置项。用于直接修改MAC地址。

修改mac地址 定制物理地址 QQ 1624110


修改mac全功略
2 MAC address type:

OID_802_3_PERMANENT_ADDRESS

OID_802_3_CURRENT_ADDRESS



modify registry can change : OID_802_3_CURRENT_ADDRESS

but OID_802_3_PERMANENT_ADDRESS, you must modify driver





Use following APIs, you can get PERMANENT_ADDRESS.

CreateFile:  opened the driver

DeviceIoControl: send query to driver



Use softice to track where the OID_802_3_PERMANENT_ADDRESS is processed:

Find the location:

.................

  1. .................

  2. :0001ACB6 8D B3 EA 00 00 00            lea esi, dword ptr [ebx+000000EA]

  3. :0001ACBC 8D7DDC                  lea edi, dword ptr [ebp-24]

  4. :0001ACBF A5                      movsd   //CYM: move out the mac address

  5. :0001ACC0 66A5                    movsw

  6. :0001ACC2 C745F406000000          mov [ebp-0C], 00000006

  7. :0001ACC9 8D75DC                  lea esi, dword ptr [ebp-24]

  8. :0001ACCC E926070000              jmp 0001B3F7

  9. ............

  10. change to:

  11. :0001ACB6 8D75DC                  lea esi, dword ptr [ebp-24]

  12. :0001ACB9 C70600002003            mov dword ptr [esi], 03200000 //CYM

  13. :0001ACBF 66C746041224            mov [esi+04], 2412

  14. :0001ACC5 C745F406000000          mov [ebp-0C], 00000006

  15. :0001ACCC E926070000              jmp 0001B3F7

  16. .....





  17. DASM driver .sys file, find NdisReadNetworkAddress



  18. ......

  19. :000109B9 50                      push eax



  20. * Reference To: NDIS.NdisReadNetworkAddress, Ord:00EAh

  21.                                   |

  22. :000109BA FF1538040100            Call dword ptr [00010438]

  23. :000109C0 837DF400                cmp dword ptr [ebp-0C], 00000000

  24. :000109C4 7516                    jne 000109DC                                               //is set mac addr in registry, use it. others jump

  25. :000109C6 8B45E8                  mov eax, dword ptr [ebp-18]

  26. :000109C9 8B08                    mov ecx, dword ptr [eax]

  27. :000109CB 898EE4000000            mov dword ptr [esi+000000E4], ecx

  28. :000109D1 668B4004                mov ax, word ptr [eax+04]

  29. :000109D5 668986E8000000          mov word ptr [esi+000000E8], ax

  30. ......



  31. set w memory breal point at esi+000000e4, find location:

  32. ......

  33. // mac addr 2nd byte

  34. :000124D6 8A83E5000000            mov al, byte ptr [ebx+000000E5]        

  35. // mac addr 3rd byte

  36. :000124DC 0A83E6000000            or al, byte ptr [ebx+000000E6]        

  37. :000124E2 0A83E7000000            or al, byte ptr [ebx+000000E7]         

  38. ...

  39. :000124E8 0A83E8000000            or al, byte ptr [ebx+000000E8]

  40. // mac addr 6th byte

  41. :000124EE 0A83E9000000            or al, byte ptr [ebx+000000E9]           

  42. :000124F4 0A07                    or al, byte ptr [edi]                                      

  43. :000124F6 7503                    jne 000124FB                                             

  44. :000124F8 A5                      movsd                                                           

  45. :000124F9 66A5                    movsw

  46. // if  no station addr use permanent address as mac addr

  47. .....



  48. change to

  49. :000124D6 C683E500000000          mov byte ptr [ebx+000000E5], 00 //CYM

  50. :000124DD C683E600000020        mov byte ptr [ebx+000000E6], 20

  51. :000124E4 C683E700000003        mov byte ptr [ebx+000000E7], 03

  52. :000124EB C683E800000012        mov byte ptr [ebx+000000E8], 12

  53. :000124F2 C683E900000024         mov byte ptr [ebx+000000E9], 24

  54. :000124F9 90                      nop

  55. :000124FA 90                      nop

复制代码




相关exe下载

http://www.chinassnet.com/ss/change_mac.rar

××××××××××××××××××××××××××××××××××××

  用NetBIOS的API获得网卡MAC地址

××××××××××××××××××××××××××××××××××××



  1. #include "Nb30.h"

  2. #pragma comment (lib,"netapi32.lib")





  3. typedef struct tagMAC_ADDRESS

  4. {

  5.        BYTE b1,b2,b3,b4,b5,b6;

  6. }MAC_ADDRESS,*LPMAC_ADDRESS;



  7. typedef struct tagASTAT

  8. {

  9.        ADAPTER_STATUS adapt;

  10.        NAME_BUFFER    NameBuff [30];

  11. }ASTAT,*LPASTAT;



  12. UCHAR GetAddressByIndex(int lana_num, ASTAT &Adapter)

  13. {

  14.        NCB ncb;

  15.        UCHAR uRetCode;

  16.        memset(&ncb, 0, sizeof(ncb) );

  17.        ncb.ncb_command = NCBRESET;

  18.        ncb.ncb_lana_num = lana_num;

  19.        //指定网卡号,首先对选定的网卡发送一个NCBRESET命令,以便进行初始化

  20.        uRetCode = Netbios(&ncb );

  21.        memset(&ncb, 0, sizeof(ncb) );

  22.        ncb.ncb_command = NCBASTAT;

  23.        ncb.ncb_lana_num = lana_num;   //指定网卡号

  24.        strcpy((char *)ncb.ncb_callname,"*      " );

  25.        ncb.ncb_buffer = (unsigned char *)&Adapter;

  26.        //指定返回的信息存放的变量

  27.        ncb.ncb_length = sizeof(Adapter);

  28.        //接着,可以发送NCBASTAT命令以获取网卡的信息

  29.        uRetCode = Netbios(&ncb );

  30.        return uRetCode;

  31. }



  32. int GetMAC(LPMAC_ADDRESS pMacAddr)

  33. {

  34.        NCB ncb;

  35.        UCHAR uRetCode;

  36.        int num = 0;

  37.        LANA_ENUM lana_enum;

  38.        memset(&ncb, 0, sizeof(ncb) );

  39.        ncb.ncb_command = NCBENUM;

  40.        ncb.ncb_buffer = (unsigned char *)&lana_enum;

  41.        ncb.ncb_length = sizeof(lana_enum);

  42.        //向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡

  43.        //每张网卡的编号等

  44.        uRetCode = Netbios(&ncb);

  45.        if (uRetCode == 0)

  46.        {

  47.               num = lana_enum.length;

  48.               //对每一张网卡,以其网卡编号为输入编号,获取其MAC地址

  49.               for (int i = 0; i < num; i++)

  50.               {

  51.                      ASTAT Adapter;

  52.                      if(GetAddressByIndex(lana_enum.lana[i],Adapter) == 0)

  53.                      {

  54.                             pMacAddr[i].b1 = Adapter.adapt.adapter_address[0];

  55.                             pMacAddr[i].b2 = Adapter.adapt.adapter_address[1];

  56.                             pMacAddr[i].b3 = Adapter.adapt.adapter_address[2];

  57.                             pMacAddr[i].b4 = Adapter.adapt.adapter_address[3];

  58.                             pMacAddr[i].b5 = Adapter.adapt.adapter_address[4];

  59.                             pMacAddr[i].b6 = Adapter.adapt.adapter_address[5];

  60.                      }

  61.               }

  62.        }

  63.        return num;

  64. }



  65. ======= 调用:



  66. MAC_ADDRESS m_MacAddr[10];        // 比如最多10个网卡

  67. int n = GetMAC(m_MacAddr);           // 获得网卡数量



  68. TCHAR szAddr[128];

  69. wsprintf(szAddr,_T("%02x-%02x-%02x-%02x-%02x-%02x"),

  70.                      m_MacAddr[0].b1,m_MacAddr[0].b2,

  71.                    m_MacAddr[0].b3,m_MacAddr[0].b4,

  72.                             m_MacAddr[0].b5,m_MacAddr[0].b6);

  73. _tcsupr(szAddr);           
复制代码
     

// 这样就能获得诸如    00-E0-aa-aa-aa-aa  这样的MAC地址字符串





××××××××××××××××××××××××××××××××××××

  用IP Helper API来获得网卡地址

××××××××××××××××××××××××××××××××××××



   呵呵,最常用的方法放在了最后



   用 GetAdaptersInfo函数



   这里获得了一个网卡的大部分信息,兄弟们可酌情选用^_^



  1. #include <Iphlpapi.h>

  2. #pragma comment(lib, "Iphlpapi.lib")



  3. typedef struct tagAdapterInfo         

  4. {

  5.        char szDeviceName[128];              // 名字

  6.        char szIPAddrStr[16];                  // IP

  7.        char szHWAddrStr[18];                // MAC

  8.        DWORD dwIndex;                     // 编号         

  9. }INFO_ADAPTER, *PINFO_ADAPTER;



  10. INFO_ADAPTER     AdapterList[ 10];               // 网卡列表,比如十个

  11. /***********************************************************************

  12. *    Name & Params::

  13. *     formatMACToStr

  14. *     (

  15. *            LPSTR lpHWAddrStr : 显示出来的加 "-"的 mac字符串

  16. *              unsigned char *HWAddr :  传入的MAC字符串

  17. *     )

  18. *    Purpose:

  19. *       将用户输入的MAC地址字符转成相应格式

  20. **********************************************************************/

  21. void formatMACToStr(LPSTR lpHWAddrStr,const unsigned char *HWAddr)

  22. {

  23.        int i;

  24.        short temp;

  25.        char szStr[3];



  26.        strcpy(lpHWAddrStr, "");

  27.        for (i=0; i<6; ++i)

  28.        {

  29.               temp = (short)(*(HWAddr + i));

  30.               _itoa(temp, szStr, 16);

  31.               if (strlen(szStr) == 1)  strcat(lpHWAddrStr, "0");

  32.               strcat(lpHWAddrStr, szStr);

  33.               if (i<5)    strcat(lpHWAddrStr, "-");         // 加上 -

  34.        }

  35. }



  36. // 填充结构

  37. void GetAdapterInfo()

  38. {

  39.        char tempChar;

  40.        ULONG uListSize=1;

  41.        PIP_ADAPTER_INFO pAdapter;   // 定义PIP_ADAPTER_INFO结构存储网卡信息

  42.        int nAdapterIndex = 0;



  43.        DWORD dwRet = GetAdaptersInfo((PIP_ADAPTER_INFO)&tempChar,

  44.                         &uListSize); // 关键函数



  45.        if (dwRet == ERROR_BUFFER_OVERFLOW)

  46.        {

  47.        PIP_ADAPTER_INFO pAdapterListBuffer =

  48.                      (PIP_ADAPTER_INFO)new(char[uListSize]);

  49.        dwRet = GetAdaptersInfo(pAdapterListBuffer, &uListSize);

  50.        if (dwRet == ERROR_SUCCESS)

  51.        {

  52.             pAdapter = pAdapterListBuffer;

  53.             while (pAdapter) // 枚举网卡

  54.               {

  55.               CString strTemp =  pAdapter->AdapterName;   // 网卡名字

  56.               strTemp = "\\Device\\NPF_" + strTemp;    // 加上前缀

  57.            strcpy(AdapterList[nAdapterIndex].szDeviceName,strTemp);



  58.      strcpy(AdapterList[nAdapterIndex].szIPAddrStr,

  59.                       pAdapter->IpAddressList.IpAddress.String );// IP



  60.   formatMACToStr( AdapterList[nAdapterIndex].szHWAddrStr,

  61.                       pAdapter->Address ); // MAC!!!!!!!!!!!!!!!!!



  62.   AdapterList[nAdapterIndex].dwIndex = pAdapter->Index;        // 编号



  63.   pAdapter = pAdapter->Next;



  64.            nAdapterIndex ++;

  65.        }

  66.        delete pAdapterListBuffer;

  67. }

  68. }

  69. }


复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP