安装两个虚拟机只为验证一个猜测,结果不出所料(Unity | deviceUniqueIdentifier | 设备ID相同)
文章目录
- 一、前言
- 二、Unity获取设备ID
- 三、安装虚拟机
- 四、虚拟机中测试deviceUniqueIdentifier
- 五、结束语
一、前言
嗨,大家好,我是新发。
项目发布了Windows
平台的版本,运行过程中发现有部分玩家的设备ID
是相同的。
莫非这些玩家破解了代码,篡改了获取设备ID
的逻辑,使之相同。
没理由,如果是为了刷号,正常是修改成不同的设备ID
才对。
直觉告诉我,问题可能是虚拟机,如果我安装两个虚拟机,那么这两个虚拟机的设备ID
是一样的吗?好奇心驱使我做了下面的实验。
二、Unity获取设备ID
Unity
官方提供了SystemInfo
类,方便开发者获取系统信息,其中就包括我们说的设备标识符,也就设备ID
:SystemInfo.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
可以看到我的电脑的设备ID
是f54dd0ef5a143be2fb44a65178603d0b37e126aa
。
关于
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相同)相关推荐
- 一万粉的时候,我爬光了我所有的粉丝,只为验证一个事情
一万粉的时候,我爬光了我所有的粉丝,只为验证一个事情 前言 CSDN 博客网站的粉丝增长和访问增长是一件很离奇的事情. 如果你不发博客,粉丝几乎零增长.你发了一篇文字数量充分多的博客之后的一两天,会有 ...
- 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常用功能 ...
- 两个scanf只运行了一个
不知道为什么,在每次循环的时候,刚输入了a 10,就已经自动跳到第三个循环了.试了好多次才发现,第二个scanf没有执行,直接跳过了,百思不得其解. 后来才知道scanf函数当变量是%c类型的时候,下 ...
- 戴尔R730服务器,安装好系统后,多出一个OEMDRV的可移动存储设备。
戴尔R730服务器,借助光盘安装好系统之后,在资源管理器中看到一个名为OEMDRV的可移动存储设备. 这个是安装系统预留的分区,删除也没有关系,一般会在后期的运行过程中自动消失,或者开机进F10再退出 ...
- hadoop 多机全分布式安装步骤(虚拟机1master+2slave)
文章目录 1. 虚拟机安装Centos7 2. 配置静态IP 3. 更改主机名 4. 编辑域名映射 5. 安装配置Java 6. 配置SSH免密登录 7 .安装Hadoop 8. 关闭防火墙 9. 格 ...
- 云计算|OpenStack|社区版OpenStack安装部署文档(九--- 创建一个虚拟机实例---Rocky版)
官方文档: Launch an instance - Installation Guide documentation 如果neutron创建的时候使用的是provider network网络模型,只 ...
- 模拟linux终端测试java,介绍一个在线的Linux,没有安装Linux或者虚拟机不喜欢用的童鞋可以简单的用这个jslinux测试各种命令...
介绍一个在线的Linux,没有安装Linux或者虚拟机不喜欢用的童鞋可以简单的用这个jslinux测试各种命令 这个是不错的选择,注意IE浏览器不能使用,用的话换成Chrome或者FireFox浏览器 ...
- 又一面试题:一个猎人带着一只狼,一个女人带着两个小女孩,一个男人带着两个小男孩,他们要渡船过河。...
一个猎人带着一只狼,一个女人带着两个小女孩,一个男人带着两个小男孩,他们要渡船过河. 猎人离开狼,狼会把所有的人吃掉 女人离开两个小女孩,男孩会打死两个小女孩 男人离开两个小男孩,女人要把两个小 ...
- 怎样从一个手机上安两个不同版本的软件_一部手机上怎么安装两个不同版本的微信?一部手机安装两个不同版本微信的方法...
一部手机上怎么安装两个不同版本的微信?一部手机安装两个不同版本微信的方法.很多朋友都不是很清楚,其实方法很简单的,下面小编就为大家介绍一下,一起来看看吧. 1.安卓微信双卡方法:准备工作 从上图我们可 ...
最新文章
- MYSQL的MERGE存储引擎
- php5.4 mysql connect,php5.4 Call to undefined function mysql_connect()
- Session的配置
- 虚拟机vmnet8每次都要先禁用再启用_【零成本 amp; 超详细】使用Win10自带的Hyper-V管理工具搭建虚拟机...
- python 循环内部添加多个条件判断会出现越界
- ngnix 执行php 慢,【nginx】PHP有什么办法可以排查那些脚本或方法执行慢,需要优化?...
- 制造型企业呼叫中心搭建-SDCC呼叫中心
- 【回眸】Lunix内核 网络编程
- PTA 1033 旧键盘打字
- [GIS] 火星坐标GCJ-02的实质 | 高德地图的实际坐标系
- Speedoffice(excel)如何快捷隐藏表格内所有空行
- 个人网站选择支付宝api
- 64位32位 java 浏览器_Java编程语言下 Selenium 驱动各个浏览器代码
- python查找文字在图片中的位置_使用Python识别图片中的中/英文字
- 【精】ContentProvider
- 查看linux系统的ip
- pip联网问题 SSLError(SSLError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:748
- 29 外观模式(Facade模式)详解
- 卸载office后桌面上的word文件图标变成了白色
- 计算机专业和新能源专业哪个好就业,新能源科学与工程专业就业前景与方向(五篇)...