如何获得客户端的机器码或者其他可以唯一标识的,要不财富都被他们领光了,5555555...

zlpvicky 2007-03-31 01:42:59

我在做一个游戏网站,主页有个功能:一个身份证号可以领取一个游戏帐号和密码,
帐号里送了3w财富。
一开始是根据ip地址来限制的,一个ip地址限领5次,后来发现有人生成很多身份证号码,换着ip地址天天来领取,1w个帐号很快就没了....
怎么能获得客户端的机器码或者别的唯一标识? 就可以控制换ip的问题了。
或者,大家有更好的办法吗?
谢谢,在线等待.........

...全文
1131 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
job_2006 2007-04-02
  • 打赏
  • 举报
回复
取mac的有时也有问题,这个问题跟那个投票系统原理差不多,想取唯一的标识,但一般来说不太可能达到很理想的目的,毕竟是客户端的东西,如果全部那么容易的就取到了,还有什么安全可言
sproll 2007-04-02
  • 打赏
  • 举报
回复
可以获取硬盘、主板等序列号。

///////////////////////////////////////////////////////////////////////
//
// 读取硬盘序列号
// 参数: vstrSNo 硬盘序列号
// vstrType 硬盘型号
// 返回值:0 正确
// 时间: 2006-01-09
// 版本: 1.0
// 历史:
//
///////////////////////////////////////////////////////////////////////
int GetDiskSNo(vector<CString> & vstrSNo, vector<CString> & vstrType)
{
BYTE ucTemp;
BYTE pucSNo[20];
BYTE pucType[40];
BYTE pucTemp[40];
int nStartPos;
int nEndPos;
int nSCount;
int nTemp;
DWORD ulOutBytes;
CString strDisk;
CString strTemp;

HANDLE hDisk;

GETVERSIONINPARAMS uVersionParams;

memset(&uVersionParams, 0, sizeof(GETVERSIONINPARAMS));

vstrSNo.clear();
vstrType.clear();

//枚举硬盘
for (int nCount = 0; nCount < 4; nCount++)
{
strDisk.Format( "\\\\.\\PHYSICALDRIVE%d", nCount );
hDisk = CreateFile(strDisk, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDisk != INVALID_HANDLE_VALUE)
{
if (DeviceIoControl(hDisk, 0x00074080/*DFP_GET_VERSION*/,
NULL, 0, &uVersionParams, sizeof(GETVERSIONINPARAMS),
&ulOutBytes, NULL))
{
if (uVersionParams.bIDEDeviceMap != 0)
{
BYTE ucIDCmd = 0;
SENDCMDINPARAMS uSendCmd;

memset(&uSendCmd, 0, sizeof(SENDCMDINPARAMS));

ucIDCmd = (uVersionParams.bIDEDeviceMap >> nCount & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
BYTE pucIdOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1] = { 0 };

// Set up data structures for IDENTIFY command.
uSendCmd.cBufferSize = IDENTIFY_BUFFER_SIZE;
uSendCmd.irDriveRegs.bFeaturesReg = 0;
uSendCmd.irDriveRegs.bSectorCountReg = 1;
uSendCmd.irDriveRegs.bSectorNumberReg = 1;
uSendCmd.irDriveRegs.bCylLowReg = 0;
uSendCmd.irDriveRegs.bCylHighReg = 0;

// calc the drive number.
ucTemp = (BYTE)nCount;
uSendCmd.irDriveRegs.bDriveHeadReg = 0xA0 | ((ucTemp & 1) << 4);

// The command can either be IDE identify or ATAPI identify.
uSendCmd.irDriveRegs.bCommandReg = ucIDCmd;
uSendCmd.bDriveNumber = ucTemp;
uSendCmd.cBufferSize = IDENTIFY_BUFFER_SIZE;

if (DeviceIoControl(hDisk, DFP_RECEIVE_DRIVE_DATA,
&uSendCmd, sizeof(SENDCMDINPARAMS) - 1,
pucIdOutCmd,
sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,
&ulOutBytes, NULL))
{
//拷贝序列号
memset(pucTemp, 0, 40);
strTemp.Empty();

memcpy(pucSNo,
((IDINFO*)(((PSENDCMDOUTPARAMS)pucIdOutCmd)->bBuffer))->sSerialNumber, 20);
nStartPos = 0;
while (pucSNo[nStartPos] == 32)
{
nStartPos++;
}
nEndPos = 19;
while (pucSNo[nEndPos] == 0)
{
nEndPos--;
}
memcpy(pucTemp, &pucSNo[nStartPos], nEndPos - nStartPos + 1);
for (nSCount = 0; nSCount < nEndPos - nStartPos; nSCount += 2)
{
ucTemp = pucTemp[nSCount + 1];
pucTemp[nSCount + 1] = pucTemp[nSCount];
pucTemp[nSCount] = ucTemp;
}
pucTemp[nEndPos - nStartPos + 1] = '\0';
strTemp = pucTemp;
vstrSNo.push_back( strTemp );

//拷贝型号
memset(pucTemp, 0, 40);
strTemp.Empty();

memcpy(pucType,
((IDINFO*)(((PSENDCMDOUTPARAMS)pucIdOutCmd)->bBuffer))->sModelNumber, 40);
for (nSCount = 0; nSCount < 40; nSCount++)
{
if (pucType[nSCount] == 32)
{
break;
}
else
{
nTemp = nSCount;
pucTemp[nSCount] = pucType[nSCount];
}
}
for (nSCount = 0; nSCount < nTemp; nSCount += 2)
{
ucTemp = pucTemp[nSCount + 1];
pucTemp[nSCount + 1] = pucTemp[nSCount];
pucTemp[nSCount] = ucTemp;
}
pucTemp[nTemp + 1] = '\0';
strTemp = pucTemp;
vstrType.push_back(strTemp);
}
}
}

CloseHandle(hDisk);
}
}

return 0;
}
bigcactus 2007-04-02
  • 打赏
  • 举报
回复
哈。。。。。有14。。。。
quanyy 2007-04-02
  • 打赏
  • 举报
回复
这个问题不能纯靠技术解决
就像CSDN的帐户一样
zlpvicky 2007-04-02
  • 打赏
  • 举报
回复
谢谢大家了,大家把玩家当作技术高手了,呵呵^_^
公司要求这么发放的(因为是初期阶段,为了聚集人气),有些玩家稍微多领点也容许。
现在就试试MAC地址的方法,真是非常感谢大家,有时间去我们游戏里玩,我多送你们财富:)

网址:www.gamektv.com (不过送财富活动被我暂时取消了,因为1w个帐号已经被领完了,
做完mac地址限制后再放上去)
Atai-Lu 2007-04-02
  • 打赏
  • 举报
回复
MAC地址也可以用软件修改之后,欺骗你的程序.
IP地址,更不可靠.这种问题,不能用纯技术来解决的...
cat_hsfz 2007-04-01
  • 打赏
  • 举报
回复
无法通过技术解决的问题,客户端总有办法将自己伪装成一个新的客户端。

你可以设置例如财富不能转赠之类的策略,让用户每次领取财富都分配到一个新的账号,而无法把财富集中的一个账号。
fxqyyzg 2007-04-01
  • 打赏
  • 举报
回复
上面代码是客户端获取网卡,IP,计算机名称的代码
fxqyyzg 2007-04-01
  • 打赏
  • 举报
回复
<HTML><HEAD><TITLE>WMI Scripting HTML</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<SCRIPT language=JScript event="OnCompleted(hResult,pErrorObject, pAsyncContext)" for=foo>
document.forms[0].txtMACAddr.value=unescape(MACAddr);
document.forms[0].txtIPAddr.value=unescape(IPAddr);
document.forms[0].txtDNSName.value=unescape(sDNSName);
//document.formbar.submit();
</SCRIPT>

<SCRIPT language=JScript event=OnObjectReady(objObject,objAsyncContext) for=foo>
if(objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true)
{
if(objObject.MACAddress != null && objObject.MACAddress != "undefined")
MACAddr = objObject.MACAddress;
if(objObject.IPEnabled && objObject.IPAddress(0) != null && objObject.IPAddress(0) != "undefined")
IPAddr = objObject.IPAddress(0);
if(objObject.DNSHostName != null && objObject.DNSHostName != "undefined")
sDNSName = objObject.DNSHostName;
}
</SCRIPT>

<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY>
<OBJECT id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT>
<OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>
<SCRIPT language=JScript>
var service = locator.ConnectServer();
var MACAddr ;
var IPAddr ;
var DomainAddr;
var sDNSName;
service.Security_.ImpersonationLevel=3;
service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
</SCRIPT>

<FORM id="formfoo" name="formbar" action="index.do" method="post"><INPUT value="00-11-11-B4-52-EF" name="txtMACAddr"> <INPUT value="202.102.188.170" name="txtIPAddr"> <INPUT value="jackly" name="txtDNSName"> </FORM></BODY></HTML>
fxqyyzg 2007-04-01
  • 打赏
  • 举报
回复
楼上的是获取服务器的网卡号
wangzhaoli1982 2007-04-01
  • 打赏
  • 举报
回复
获取MAC

using System;
using System.Security.Cryptography;
using System.Management;
public ArrayList GetIt()
{
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
ArrayList strArr = new ArrayList();

//网卡数
foreach(ManagementObject mo in moc)
{
if((bool)mo["IPEnabled"])
{
strArr.Add(mo["MacAddress"].ToString().Replace(":",""));
}
mo.Dispose();
}

return strArr;
}
hy_lihuan 2007-04-01
  • 打赏
  • 举报
回复
是的,我觉得lz的思路走进了死胡同,在游戏开发中间,因为你就是指定法律的人,下面哪些玩家就是在你的法律下生存的人,所以你不能靠一些损害玩家的方式去限制(网吧的玩家可能就因为你的绑定而不能注册了),而是应该通过你制定的法律限制那些恶意的人群.
上面的一些点子还有有借鉴意义的
hertcloud 2007-04-01
  • 打赏
  • 举报
回复
mac一样可以改掉
....

楼主应该 考虑更合理的 发放方式
lgnet 2007-04-01
  • 打赏
  • 举报
回复
zzmsl 2007-04-01
  • 打赏
  • 举报
回复
IE在安全设置里面是禁止不安全的 ActiveX 控件的,用 JavaScript 是获取不到 Mac,ip,机器名的。
zahota 2007-04-01
  • 打赏
  • 举报
回复
获取客户端的mac地址,这个能唯一标示
phisy 2007-03-31
  • 打赏
  • 举报
回复
呵呵,,对..用变通的方式。。
beyongpaul 2007-03-31
  • 打赏
  • 举报
回复
LZ 逻辑没考虑好
lih163 2007-03-31
  • 打赏
  • 举报
回复
o
xinfan 2007-03-31
  • 打赏
  • 举报
回复
这个问题不能纯靠技术解决
就像CSDN的帐户一样
加载更多回复(9)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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