一些软件取本地唯一机器码是个啥原理?

66i88 2016-06-14 07:14:37
一些软件取本地唯一机器码是个啥原理?
有没有源代码?
谢谢
...全文
630 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lx624909677 2016-06-15
  • 打赏
  • 举报
回复
//MyDiskInfo.h头文件
#pragma once

class MyDiskInfo
{
public:
MyDiskInfo(void);
public:
~MyDiskInfo(void);
public: 
int GetDiskInfo(int driver=0); 
char szModelNumber[64]; 
char szSerialNumber[64]; 
};
//MyDiskInfo.cpp文件

// MyDiskInfo.cpp: implementation of the CMyDiskInfo class. 
// 
////////////////////////////////////////////////////////////////////// 

#include "stdafx.h" 
#include "MyDiskInfo.h" 

#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 

const WORD IDE_ATAPI_IDENTIFY = 0xA1;  // 读取ATAPI设备的命令 
const WORD IDE_ATA_IDENTIFY  = 0xEC;  // 读取ATA设备的命令 

#define _WIN32_WINNT 0x0400 
#include "winioctl.h" 

//#include "NTDDSCSI.h" 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 

MyDiskInfo::MyDiskInfo(void)
{
}

MyDiskInfo::~MyDiskInfo(void)
{
}


BOOL __fastcall DoIdentify( HANDLE hPhysicalDriveIOCTL, 
   PSENDCMDINPARAMS pSCIP, 
   PSENDCMDOUTPARAMS pSCOP, 
   BYTE btIDCmd, 
   BYTE btDriveNum, 
   PDWORD pdwBytesReturned) 
{ 
pSCIP->cBufferSize = IDENTIFY_BUFFER_SIZE; 
pSCIP->irDriveRegs.bFeaturesReg = 0; 
pSCIP->irDriveRegs.bSectorCountReg  = 1; 
pSCIP->irDriveRegs.bSectorNumberReg = 1; 
pSCIP->irDriveRegs.bCylLowReg  = 0; 
pSCIP->irDriveRegs.bCylHighReg = 0; 

pSCIP->irDriveRegs.bDriveHeadReg = (btDriveNum & 1) ? 0xB0 : 0xA0; 
pSCIP->irDriveRegs.bCommandReg = btIDCmd; 
pSCIP->bDriveNumber = btDriveNum; 
pSCIP->cBufferSize = IDENTIFY_BUFFER_SIZE; 

return DeviceIoControl( hPhysicalDriveIOCTL, 
SMART_RCV_DRIVE_DATA, 
(LPVOID)pSCIP, 
sizeof(SENDCMDINPARAMS) - 1, 
(LPVOID)pSCOP, 
sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1, 
pdwBytesReturned, NULL); 
} 

char *__fastcall ConvertToString(DWORD dwDiskData[256], int nFirstIndex, int nLastIndex) 
{ 
static char szResBuf[1024]; 
char ss[256]; 
int nIndex = 0; 
int nPosition = 0; 

for(nIndex = nFirstIndex; nIndex <= nLastIndex; nIndex++) 
{ 
ss[nPosition] = (char)(dwDiskData[nIndex] / 256); 
nPosition++; 

// Get low BYTE for 2nd character 
ss[nPosition] = (char)(dwDiskData[nIndex] % 256); 
nPosition++; 
} 

// End the string 
ss[nPosition] = '\0'; 

int i, index=0; 
for(i=0; i <nPosition; i++) 
{ 
if(ss[i]==0 || ss[i]==32) continue; 
szResBuf[index]=ss[i]; 
index++; 
} 
szResBuf[index]=0; 

return szResBuf; 
} 

int MyDiskInfo::GetDiskInfo(int driver) 
{ 
char sFilePath[64]={0}; 
sprintf(sFilePath,"\\\\.\\PHYSICALDRIVE%d",driver);//modify by lonkil 2008-07-13 

HANDLE hFile = INVALID_HANDLE_VALUE; 
hFile = ::CreateFile(sFilePath, 
GENERIC_READ | GENERIC_WRITE, 
FILE_SHARE_READ | FILE_SHARE_WRITE, 
NULL, OPEN_EXISTING, 
0, NULL); 
if (hFile == INVALID_HANDLE_VALUE) return -1; 

DWORD dwBytesReturned; 
GETVERSIONINPARAMS gvopVersionParams; 
DeviceIoControl(hFile, 
SMART_GET_VERSION, 
NULL, 
0, 
&gvopVersionParams, 
sizeof(gvopVersionParams), 
&dwBytesReturned, NULL); 

if(gvopVersionParams.bIDEDeviceMap <= 0) return -2; 

// IDE or ATAPI IDENTIFY cmd 
int btIDCmd = 0; 
SENDCMDINPARAMS InParams; 
int nDrive =0; 
btIDCmd = (gvopVersionParams.bIDEDeviceMap >> nDrive & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY; 


// 输出参数 
BYTE btIDOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1]; 

if(DoIdentify(hFile, 
&InParams, 
(PSENDCMDOUTPARAMS)btIDOutCmd, 
(BYTE)btIDCmd, 
(BYTE)nDrive, &dwBytesReturned) == FALSE) return -3; 
::CloseHandle(hFile); 

DWORD dwDiskData[256]; 
USHORT *pIDSector; // 对应结构IDSECTOR,见头文件 

pIDSector = (USHORT*)((SENDCMDOUTPARAMS*)btIDOutCmd)->bBuffer; 
for(int i=0; i < 256; i++) dwDiskData[i] = pIDSector[i]; 

// 取系列号 
ZeroMemory(szSerialNumber, sizeof(szSerialNumber)); 
strcpy(szSerialNumber, ConvertToString(dwDiskData, 10, 19)); 

// 取模型号 
ZeroMemory(szModelNumber, sizeof(szModelNumber)); 
strcpy(szModelNumber, ConvertToString(dwDiskData, 27, 46)); 

return 0; 
} 
按照楼上的一些方法自己百度下就好,这个代码是获取硬盘的物理序列号的
encoderlee 2016-06-15
  • 打赏
  • 举报
回复
MAC地址、硬盘、CPU序号等,然后通过算法进行变换。 可以网上搜索“VC 机器码”找一些代码看一看
赵4老师 2016-06-15
  • 打赏
  • 举报
回复
奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中!
homesos 2016-06-14
  • 打赏
  • 举报
回复
根据一些硬件信息来变换组合、组合变换。 可以获取CPU、硬盘、主板、网卡等硬件的ID或其他信息。
worldy 2016-06-14
  • 打赏
  • 举报
回复
一般,使用网卡或主板或硬盘的序号,然后进行某种变换,或组合进行转换

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧