#ifndef CHECKID_H_ #define CHECKID_H_ #pragma warning(disable: 4996) //为解决错误error C4996: 'GetVersionExW': 被声明为已否决 //获取硬盘ID信息及网卡MAC地址的代码 /*+++ HDID.CPP Written by Lu Lin http://lu0.126.com 2000.11.3 ---*/ #define WIN32_LEAN_AND_MEAN //by zl 否则出现重定义错误 //#include #include #include //#include #include #ifdef _MSC_VER #include #include #endif extern "C" { #include "md5.h" } #pragma comment(lib, "netapi32.lib") using namespace std; #pragma pack(1) typedef struct _GETVERSIONOUTPARAMS { BYTE bVersion; // Binary driver version. BYTE bRevision; // Binary driver revision. BYTE bReserved; // Not used. BYTE bIDEDeviceMap; // Bit map of IDE devices. DWORD fCapabilities; // Bit mask of driver capabilities. DWORD dwReserved[4]; // For future use. } GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS; typedef struct _IDEREGS { BYTE bFeaturesReg; // Used for specifying SMART "commands". BYTE bSectorCountReg; // IDE sector count register BYTE bSectorNumberReg; // IDE sector number register BYTE bCylLowReg; // IDE low order cylinder value BYTE bCylHighReg; // IDE high order cylinder value BYTE bDriveHeadReg; // IDE drive/head register BYTE bCommandReg; // Actual IDE command. BYTE bReserved; // reserved for future use. Must be zero. } IDEREGS, *PIDEREGS, *LPIDEREGS; typedef struct _SENDCMDINPARAMS { DWORD cBufferSize; // Buffer size in bytes IDEREGS irDriveRegs; // Structure with drive register values. BYTE bDriveNumber; // Physical drive number to send // command to (0,1,2,3). BYTE bReserved[3]; // Reserved for future expansion. DWORD dwReserved[4]; // For future use. //BYTE bBuffer[1]; // Input buffer. } SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS; typedef struct _DRIVERSTATUS { BYTE bDriverError; // Error code from driver, // or 0 if no error. BYTE bIDEStatus; // Contents of IDE Error register. // Only valid when bDriverError // is SMART_IDE_ERROR. BYTE bReserved[2]; // Reserved for future expansion. DWORD dwReserved[2]; // Reserved for future expansion. } DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS; typedef struct _SENDCMDOUTPARAMS { DWORD cBufferSize; // Size of bBuffer in bytes DRIVERSTATUS DriverStatus; // Driver status structure. BYTE bBuffer[512]; // Buffer of arbitrary length // in which to store the data read from the drive. } SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS; typedef struct _IDSECTOR { USHORT wGenConfig; USHORT wNumCyls; USHORT wReserved; USHORT wNumHeads; USHORT wBytesPerTrack; USHORT wBytesPerSector; USHORT wSectorsPerTrack; USHORT wVendorUnique[3]; CHAR sSerialNumber[20]; USHORT wBufferType; USHORT wBufferSize; USHORT wECCSize; CHAR sFirmwareRev[8]; CHAR sModelNumber[40]; USHORT wMoreVendorUnique; USHORT wDoubleWordIO; USHORT wCapabilities; USHORT wReserved1; USHORT wPIOTiming; USHORT wDMATiming; USHORT wBS; USHORT wNumCurrentCyls; USHORT wNumCurrentHeads; USHORT wNumCurrentSectorsPerTrack; ULONG ulCurrentSectorCapacity; USHORT wMultSectorStuff; ULONG ulTotalAddressableSectors; USHORT wSingleWordDMA; USHORT wMultiWordDMA; BYTE bReserved[128]; } IDSECTOR, *PIDSECTOR; /*+++ Global vars ---*/ GETVERSIONOUTPARAMS vers; SENDCMDINPARAMS in; SENDCMDOUTPARAMS out; HANDLE h; DWORD i; BYTE j; #define DFP_GET_VERSION 0x00074080 #define DFP_SEND_DRIVE_COMMAND 0x0007c084 #define DFP_RECEIVE_DRIVE_DATA 0x0007c088 //10.247 char buff[80] = {173,216,48,114,0,0,0,0,243,228,134,42,0,0,0,0,174,104,49,7,0,0,0,0,17,113,243,100,0,0,0,0,243,77,200,20,0,0,0,0,9,72,16,89,0,0,0,0,74,62,222,47,0,0,0,0,2,191,28,42,0,0,0,0,61,111,187,90,0,0,0,0,73,241,126,71,0,0,0,0}; //8.36 short buf[8] = {1634,8068,30086,46914,54626,63006,21330}; int hdidnt(char* hd) { PIDSECTOR phdinfo; char* ptr = hd; int size = 136; ZeroMemory(&vers,sizeof(vers)); //We start in NT/Win2000 for (j=0;j<4;j++) { sprintf(hd,"\\\\.\\PhysicalDrive%d",j); h=CreateFile(hd,GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0); if (!h){ continue; } if (!DeviceIoControl(h,DFP_GET_VERSION,0,0,&vers,sizeof(vers),&i,0)){ CloseHandle(h); continue; } //If IDE identify command not supported, fails if (!(vers.fCapabilities&1)){ CloseHandle(h); return size; } //Identify the IDE drives ZeroMemory(&in,sizeof(in)); ZeroMemory(&out,sizeof(out)); if (j&1){ in.irDriveRegs.bDriveHeadReg=0xb0; }else{ in.irDriveRegs.bDriveHeadReg=0xa0; } if (vers.fCapabilities&(16>>j)){ //We don't detect a ATAPI device. continue; }else{ in.irDriveRegs.bCommandReg=0xec; } in.bDriveNumber=j; in.irDriveRegs.bSectorCountReg=1; in.irDriveRegs.bSectorNumberReg=1; in.cBufferSize=512; if (!DeviceIoControl(h,DFP_RECEIVE_DRIVE_DATA,&in,sizeof(in),&out,sizeof(out),&i,0)){ CloseHandle(h); return size; } phdinfo=(PIDSECTOR)out.bBuffer; memcpy(ptr,phdinfo->sModelNumber,40); ptr+=40; memcpy(ptr,phdinfo->sFirmwareRev,8); ptr+=8; memcpy(ptr,phdinfo->sSerialNumber,20); ptr+=20; CloseHandle(h); size-=68; if(size<68) break; } return size; } int GetMacAddress(char *mac) { NCB ncb; typedef struct _ASTAT_ { ADAPTER_STATUS adapt; NAME_BUFFER NameBuff [30]; } ASTAT, * PASTAT; ASTAT Adapter; // ADAPTER_STATUS Adapter; LANA_ENUM lana_enum; UCHAR uRetCode; memset( &ncb, 0, sizeof(ncb) ); memset( &lana_enum, 0, sizeof(lana_enum)); ncb.ncb_command = NCBENUM; ncb.ncb_buffer = (unsigned char *) &lana_enum; ncb.ncb_length = sizeof(LANA_ENUM); uRetCode = Netbios( &ncb ); if( uRetCode != NRC_GOODRET ) return uRetCode ; for( int lana=0; lana>j)){ //We don't detect a ATAPI device. cout<<"Drive "<<(int)(j+1)<<" is a ATAPI device, we don't detect it"<sModelNumber,40); s[40]=0; memcpy(s,phdinfo->sFirmwareRev,8); s[8]=0; memcpy(s,phdinfo->sSerialNumber,20); s[20]=0; } //Close handle before quit CloseHandle(h); } inline unsigned __int64 MulMod(unsigned __int64 a, unsigned __int64 b, unsigned __int64 n) { return a * b % n; } unsigned __int64 PowMod(unsigned __int64 &base, unsigned __int64 pow, unsigned __int64 &n) { unsigned __int64 a=base, b=pow, c=1; while(b) { while(!(b & 1)) { b>>=1; //a=a * a % n; //函数看起来可以处理64位的整数,但由于这里a*a在a>=2^32时已经造成了溢出,因此实际处理范围没有64位 a=MulMod(a, a, n); } b--; //c=a * c % n; //这里也会溢出,若把64位整数拆为两个32位整数不知是否可以解决这个问题。 c=MulMod(a, c, n); } return c; } int checkid(char* szid){ char szAddr[1204] = {0}; GetMacAddress(szAddr); OSVERSIONINFO VersionInfo; ZeroMemory(&VersionInfo,sizeof(VersionInfo)); VersionInfo.dwOSVersionInfoSize=sizeof(VersionInfo); GetVersionEx(&VersionInfo); switch (VersionInfo.dwPlatformId) { case VER_PLATFORM_WIN32_NT: hdidnt(szAddr+20); break; } unsigned short tmpid[8] = {0,0,0,0,0,0,0,0}; MD5_CTX context; MD5Init(&context); MD5Update(&context, (unsigned char *)szAddr, 1024); MD5Final((unsigned char *)tmpid, &context); // fprintf(stderr,"%u %u %u %u %u %u %u %u \n",tmpid[0],tmpid[1],tmpid[2],tmpid[3],tmpid[4],tmpid[5],tmpid[6],tmpid[7],tmpid[8]); unsigned __int64 n = 0; unsigned __int64 a = 0; unsigned __int64 b[8] = {0,0,0,0,0,0,0,0}; unsigned __int64 c[8] = {0,0,0,0,0,0,0,0}; unsigned short d[8] = {0,0,0,0,0,0,0,0}; char* ptr = szid; memcpy(&n,ptr,8); ptr+=8; memcpy(&a,ptr,8); ptr+=8; int i; for(i=0;i<8;i++) { memcpy(b+i,ptr,8); ptr+=8; } for(i=0;i<8;i++) { c[i] = PowMod(b[i],a,n); d[i] = c[i]; } if(memcmp(tmpid,d,16)==0) return 0; memcpy(szid,d,16); return 1; // TODO: Add your control notification handler code here } int checkid2( unsigned short * szid ) { char szAddr[1204] = {0}; GetMacAddress(szAddr); OSVERSIONINFO VersionInfo; ZeroMemory(&VersionInfo,sizeof(VersionInfo)); VersionInfo.dwOSVersionInfoSize=sizeof(VersionInfo); GetVersionEx(&VersionInfo); switch (VersionInfo.dwPlatformId) { case VER_PLATFORM_WIN32_NT: hdidnt(szAddr+20); break; } unsigned short tmpid[8] = {0,0,0,0,0,0,0,0}; MD5_CTX context; MD5Init(&context); MD5Update(&context, (unsigned char *)szAddr, 1024); MD5Final((unsigned char *)tmpid, &context); if(memcmp(tmpid,szid,16)==0) return 0; return 1; } // by zl typedef struct Key { unsigned short id[8]; }Key; int getid( ) { char result[1024] = {0}; char szAddr[1204] = {0}; GetMacAddress(szAddr); OSVERSIONINFO VersionInfo; ZeroMemory(&VersionInfo,sizeof(VersionInfo)); VersionInfo.dwOSVersionInfoSize=sizeof(VersionInfo); GetVersionEx(&VersionInfo); switch (VersionInfo.dwPlatformId) { case VER_PLATFORM_WIN32_NT: hdidnt(szAddr+20); break; } unsigned short tmpid[8] = {0,0,0,0,0,0,0,0}; MD5_CTX context; MD5Init(&context); MD5Update(&context, (unsigned char *)szAddr, 1024); MD5Final((unsigned char *)tmpid, &context); //sprintf(result, "%d, %d,%d,%d,%d,%d,%d,%d\n",tmpid[0],tmpid[1],tmpid[2],tmpid[3], // tmpid[4],tmpid[5],tmpid[6],tmpid[7]); //if(fp!=NULL){ // fwrite(result,1,strlen(result),fp); // fclose(fp); //} Key key; FILE* fp = NULL; fp =fopen("key.nlpr", "wb+"); for(int i = 0; i < 8; i++) key.id[i] = tmpid[i]; fwrite(&key, sizeof(Key),1,fp); fclose(fp); printf("key.nlpr has been generated.\n"); return 1; } #endif