-
-
[原创]Unity3D mono模式游戏保护之浅谈
-
发表于:
2018-8-31 23:21
20743
-
[原创]Unity3D mono模式游戏保护之浅谈
前面两篇文章都是以破解为主,因为研究Unity3D的保护已经有段时间了,目前已迭代了几版了,因为某些原因,暂时不能公开,这里就只能先将以前用过的一种简单的保护方式分享出来,希望对研究Unity3D mono模式游戏保护的童鞋有所帮助。这种保护方式需要对CLR PE文件格式有所了解,特别是其中的metadata数据项。这边分析的mono源码版本为5.6。
这里的保护方式通过修改mono的源码,自己编译出libmono.so的方式来保护。mono_image_open_from_data_with_name这个关键的函数就不用说了,跟随函数的执行流程,通过过代码流程跟随到do_mono_image_load函数:
其中对Assembly-CSharp.dll和Assembly-CSharp-firstpass.dll加载的关键函数为mono_image_load_pe_data和mono_image_load_cli_data。可通过自定义do_mono_image_load、mono_image_load_pe_data、mono_image_load_cli_data以及后面相关的关键函数来对自定义的文件进行加载。
mono_image_load_pe_data函数内容如下:
这里主要对文件的dos头进行判断,在这里可自行定义dos头,再往下继续跟,这里加载pe头的关键函数do_load_header。在这个函数中可以自行定义PE中的数据。函数原型如下:
在这个函数中可以针对pe头文件中数据结构进行修改,类似于dnSpy这类的软件,都是使用标准的pe格式,在mono中标准的PE头结构定义如下:
这里将其分成了几个部分,这样一来就可以针对不同的部分进行数据的改组了,当然,改变后需要在自己的do_load_header函数中进行相应的修改。这里跟踪完成后便可以将PE文件中的前200个字节(具体字节数可根据自己定义的pe格式来进行确定,200是我以前使用的个数)加密或者直接抹零。
接下来便是更重要的metadata的加载了。
继续跟踪load_metadata函数:
这里可以通过定义修改load_metadata_ptrs函数来加载自己定义的dll文件。原始函数如下:
其中最主要的就是image->raw_metadata这个数据的位置了,因为这里是指针,所以可以在image->raw_metadata的位置之前塞入一定量的垃圾数据,然后通过image->raw_metadata+offset(也就是塞入垃圾数据的字节数)的方式来修改image->raw_metadata的位置。
总结一下这种保护方式的主要思路:
方法思路比较简单,望大牛们轻喷。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课