文章目录

  • 一、前言
  • 二、Unity获取设备ID
  • 三、安装虚拟机
  • 四、虚拟机中测试deviceUniqueIdentifier
  • 五、结束语

一、前言

嗨,大家好,我是新发。
项目发布了Windows平台的版本,运行过程中发现有部分玩家的设备ID是相同的。
莫非这些玩家破解了代码,篡改了获取设备ID的逻辑,使之相同。

没理由,如果是为了刷号,正常是修改成不同的设备ID才对。
直觉告诉我,问题可能是虚拟机,如果我安装两个虚拟机,那么这两个虚拟机的设备ID是一样的吗?好奇心驱使我做了下面的实验。

二、Unity获取设备ID

Unity官方提供了SystemInfo类,方便开发者获取系统信息,其中就包括我们说的设备标识符,也就设备IDSystemInfo.deviceUniqueIdentifier
我们可以通过反射的方式把SystemInfo类的所有成员答应出来。
例:

using System;
using System.Reflection;
using System.Text;
using UnityEngine;public class PrintSystemInfo : MonoBehaviour
{void Start(){Type type = typeof(SystemInfo);PropertyInfo[] propertyInfos = type.GetProperties(BindingFlags.Static | BindingFlags.Public | BindingFlags.GetProperty);StringBuilder sbr = new StringBuilder();sbr.AppendLine("总共" + propertyInfos.Length + "个成员");for (int i = 0; i < propertyInfos.Length; i++){sbr.AppendFormat("{0:D2}. {1,-50} = ", i + 1, propertyInfos[i].Name);sbr.Append(type.InvokeMember(propertyInfos[i].Name, BindingFlags.Static | BindingFlags.Public | BindingFlags.GetProperty, null, null, null));sbr.AppendLine();}Debug.Log(sbr.ToString());}
}

输出如下:

总共89个成员
01. batteryLevel                                       = -1
02. batteryStatus                                      = Charging
03. operatingSystem                                    = Windows 10  (10.0.18363) 64bit
04. operatingSystemFamily                              = Windows
05. processorType                                      = Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
06. processorFrequency                                 = 3292
07. processorCount                                     = 4
08. systemMemorySize                                   = 16284
09. deviceUniqueIdentifier                             = f54dd0ef5a143be2fb44a65178603d0b37e126aa
10. deviceName                                         = LINXINFAPC
11. deviceModel                                        = B85M-D2V (Gigabyte Technology Co., Ltd.)
12. supportsAccelerometer                              = False
13. supportsGyroscope                                  = False
14. supportsLocationService                            = False
15. supportsVibration                                  = False
16. supportsAudio                                      = True
17. deviceType                                         = Desktop
18. graphicsMemorySize                                 = 2007
19. graphicsDeviceName                                 = NVIDIA GeForce GT 740
20. graphicsDeviceVendor                               = NVIDIA
21. graphicsDeviceID                                   = 4040
22. graphicsDeviceVendorID                             = 4318
23. graphicsDeviceType                                 = Direct3D11
24. graphicsUVStartsAtTop                              = True
25. graphicsDeviceVersion                              = Direct3D 11.0 [level 11.0]
26. graphicsShaderLevel                                = 50
27. graphicsMultiThreaded                              = True
28. renderingThreadingMode                             = MultiThreaded
29. hasHiddenSurfaceRemovalOnGPU                       = False
30. hasDynamicUniformArrayIndexingInFragmentShaders    = True
31. supportsShadows                                    = True
32. supportsRawShadowDepthSampling                     = True
33. supportsMotionVectors                              = True
34. supports3DTextures                                 = True
35. supportsCompressed3DTextures                       = True
36. supports2DArrayTextures                            = True
37. supports3DRenderTextures                           = True
38. supportsCubemapArrayTextures                       = True
39. copyTextureSupport                                 = Basic, Copy3D, DifferentTypes, TextureToRT, RTToTexture
40. supportsComputeShaders                             = True
41. supportsConservativeRaster                         = False
42. supportsMultiview                                  = False
43. supportsGeometryShaders                            = True
44. supportsTessellationShaders                        = True
45. supportsRenderTargetArrayIndexFromVertexShader     = False
46. supportsInstancing                                 = True
47. supportsHardwareQuadTopology                       = False
48. supports32bitsIndexBuffer                          = True
49. supportsSparseTextures                             = True
50. supportedRenderTargetCount                         = 8
51. supportsSeparatedRenderTargetsBlend                = True
52. supportedRandomWriteTargetCount                    = 8
53. supportsMultisampledTextures                       = 1
54. supportsMultisampled2DArrayTextures                = True
55. supportsMultisampleAutoResolve                     = False
56. supportsTextureWrapMirrorOnce                      = 1
57. usesReversedZBuffer                                = True
58. npotSupport                                        = Full
59. maxTextureSize                                     = 16384
60. maxCubemapSize                                     = 16384
61. maxComputeBufferInputsVertex                       = 128
62. maxComputeBufferInputsFragment                     = 128
63. maxComputeBufferInputsGeometry                     = 128
64. maxComputeBufferInputsDomain                       = 128
65. maxComputeBufferInputsHull                         = 128
66. maxComputeBufferInputsCompute                      = 32
67. maxComputeWorkGroupSize                            = 1024
68. maxComputeWorkGroupSizeX                           = 1024
69. maxComputeWorkGroupSizeY                           = 1024
70. maxComputeWorkGroupSizeZ                           = 64
71. supportsAsyncCompute                               = False
72. supportsGpuRecorder                                = True
73. supportsGraphicsFence                              = True
74. supportsAsyncGPUReadback                           = True
75. supportsRayTracing                                 = False
76. supportsSetConstantBuffer                          = True
77. constantBufferOffsetAlignment                      = 0
78. minConstantBufferOffsetAlignment                   = False
79. hasMipMaxLevel                                     = True
80. supportsMipStreaming                               = True
81. usesLoadStoreActions                               = False
82. hdrDisplaySupportFlags                             = Supported, RuntimeSwitchable, AutomaticTonemapping
83. supportsRenderTextures                             = True
84. supportsRenderToCubemap                            = True
85. supportsImageEffects                               = True
86. supportsStencil                                    = 1
87. graphicsPixelFillrate                              = -1
88. supportsVertexPrograms                             = True
89. supportsGPUFence                                   = False

可以看到我的电脑的设备IDf54dd0ef5a143be2fb44a65178603d0b37e126aa

关于SystemInfo更多的说明,可以参见我之前写的这篇文章:《Unity获取系统信息SystemInfo(CPU、显卡、操作系统等信息)》

三、安装虚拟机

系统镜像下载:https://msdn.itellyou.cn/
我在上面那个网站中下载了win7系统镜像。

通过Oracle VM VirtualBox安装了两个win7虚拟机。

关于Oracle VM VirtualBox安装虚拟机,可以参见我之前写的这篇文章:《手把手教,使用Oracle VM VirtualBox虚拟机安装Windows XP系统,爷青回》

四、虚拟机中测试deviceUniqueIdentifier

弄个测试脚本,获取设备ID,如下:

using UnityEngine;
using UnityEngine.UI;public class NewBehaviourScript : MonoBehaviour
{public Text text;void Start(){text.text = SystemInfo.deviceUniqueIdentifier;}
}

在我的本机(win10系统)中运行结果如下:

我发布到windows平台,然后弄到两台虚拟机中。运行效果如下:

虚拟机与本地机的设备ID不同,但两台虚拟机的设备ID是相同的。
下次再有出现相同设备ID的,就可以怀疑对方是否使用了虚拟机啦。

五、结束语

喜欢Unity的同学,不要忘记点击关注,如果有什么Unity相关的技术难题,也欢迎留言或私信~

安装两个虚拟机只为验证一个猜测,结果不出所料(Unity | deviceUniqueIdentifier | 设备ID相同)相关推荐

  1. 一万粉的时候,我爬光了我所有的粉丝,只为验证一个事情

    一万粉的时候,我爬光了我所有的粉丝,只为验证一个事情 前言 CSDN 博客网站的粉丝增长和访问增长是一件很离奇的事情. 如果你不发博客,粉丝几乎零增长.你发了一篇文字数量充分多的博客之后的一两天,会有 ...

  2. 2019-8-24 [Linux] 15.搭建两台虚拟机实现互联组成一个小型网络 详细版

    文章目录 15.1 需求说明 1.2 分技术介绍 1.2.1 JDK 1.2.2 Tomcat 1.2.3 MySQL 1.2.4 Nginx 1.2.4.1 序言 1.2.4.2 Nginx常用功能 ...

  3. 两个scanf只运行了一个

    不知道为什么,在每次循环的时候,刚输入了a 10,就已经自动跳到第三个循环了.试了好多次才发现,第二个scanf没有执行,直接跳过了,百思不得其解. 后来才知道scanf函数当变量是%c类型的时候,下 ...

  4. 戴尔R730服务器,安装好系统后,多出一个OEMDRV的可移动存储设备。

    戴尔R730服务器,借助光盘安装好系统之后,在资源管理器中看到一个名为OEMDRV的可移动存储设备. 这个是安装系统预留的分区,删除也没有关系,一般会在后期的运行过程中自动消失,或者开机进F10再退出 ...

  5. hadoop 多机全分布式安装步骤(虚拟机1master+2slave)

    文章目录 1. 虚拟机安装Centos7 2. 配置静态IP 3. 更改主机名 4. 编辑域名映射 5. 安装配置Java 6. 配置SSH免密登录 7 .安装Hadoop 8. 关闭防火墙 9. 格 ...

  6. 云计算|OpenStack|社区版OpenStack安装部署文档(九--- 创建一个虚拟机实例---Rocky版)

    官方文档: Launch an instance - Installation Guide documentation 如果neutron创建的时候使用的是provider network网络模型,只 ...

  7. 模拟linux终端测试java,介绍一个在线的Linux,没有安装Linux或者虚拟机不喜欢用的童鞋可以简单的用这个jslinux测试各种命令...

    介绍一个在线的Linux,没有安装Linux或者虚拟机不喜欢用的童鞋可以简单的用这个jslinux测试各种命令 这个是不错的选择,注意IE浏览器不能使用,用的话换成Chrome或者FireFox浏览器 ...

  8. 又一面试题:一个猎人带着一只狼,一个女人带着两个小女孩,一个男人带着两个小男孩,他们要渡船过河。...

    一个猎人带着一只狼,一个女人带着两个小女孩,一个男人带着两个小男孩,他们要渡船过河.  猎人离开狼,狼会把所有的人吃掉  女人离开两个小女孩,男孩会打死两个小女孩  男人离开两个小男孩,女人要把两个小 ...

  9. 怎样从一个手机上安两个不同版本的软件_一部手机上怎么安装两个不同版本的微信?一部手机安装两个不同版本微信的方法...

    一部手机上怎么安装两个不同版本的微信?一部手机安装两个不同版本微信的方法.很多朋友都不是很清楚,其实方法很简单的,下面小编就为大家介绍一下,一起来看看吧. 1.安卓微信双卡方法:准备工作 从上图我们可 ...

最新文章

  1. MYSQL的MERGE存储引擎
  2. php5.4 mysql connect,php5.4 Call to undefined function mysql_connect()
  3. Session的配置
  4. 虚拟机vmnet8每次都要先禁用再启用_【零成本 amp; 超详细】使用Win10自带的Hyper-V管理工具搭建虚拟机...
  5. python 循环内部添加多个条件判断会出现越界
  6. ngnix 执行php 慢,【nginx】PHP有什么办法可以排查那些脚本或方法执行慢,需要优化?...
  7. 制造型企业呼叫中心搭建-SDCC呼叫中心
  8. 【回眸】Lunix内核 网络编程
  9. PTA 1033 旧键盘打字
  10. [GIS] 火星坐标GCJ-02的实质 | 高德地图的实际坐标系
  11. Speedoffice(excel)如何快捷隐藏表格内所有空行
  12. 个人网站选择支付宝api
  13. 64位32位 java 浏览器_Java编程语言下 Selenium 驱动各个浏览器代码
  14. python查找文字在图片中的位置_使用Python识别图片中的中/英文字
  15. 【精】ContentProvider
  16. 查看linux系统的ip
  17. pip联网问题 SSLError(SSLError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:748
  18. 29 外观模式(Facade模式)详解
  19. 卸载office后桌面上的word文件图标变成了白色
  20. 计算机专业和新能源专业哪个好就业,新能源科学与工程专业就业前景与方向(五篇)...

热门文章

  1. BigDecimal运算和比较大小
  2. get_sequencer的用法总结
  3. [Java] 类和对象(简介,封装,内存机制,构造方法)
  4. 开机后显示服务器正在启动,电脑开机后卡在Windows正在启动界面上怎么办?
  5. iOS App技术支持网址(URL)
  6. IntelliJ IDEA详细安装步骤
  7. redis之禁用保护模式以及修改监听IP
  8. 使用jQuery发送简单的Ajax请求
  9. 分享一些正确的放松方式
  10. 如何保障银行日志安全合规审计