首页
社区
课程
招聘
[原创]Unity3D mono模式游戏保护之浅谈
发表于: 2018-8-31 23:21 20744

[原创]Unity3D mono模式游戏保护之浅谈

2018-8-31 23:21
20744

前面两篇文章都是以破解为主,因为研究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的位置。

总结一下这种保护方式的主要思路:

方法思路比较简单,望大牛们轻喷。

 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  junkboy   +1.00 2018/09/01
最新回复 (3)
雪    币: 573
活跃值: (222)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享。
2018-9-9 22:17
0
雪    币: 574
活跃值: (405)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享,mark下
2018-12-12 16:22
0
游客
登录 | 注册 方可回帖
返回
//