一个同事的总结---防作弊。。。日后慢慢看

  Hello all ,最近看到Colossatron 项目在做内存加密这一块的工作,基於我之前有做过一些类似的功能(应该说是做过一些Android的破解工作), 所以在这裡想跟大家分享一下我的一些想法.
         我们的游戏在android上运行时,是以一个独立的进程存在的,而Android上的每个进程之间的内存地址都是不能共享的,也就是说你在你的进程内去修改别的进程内存.如果内存修改器想要修改我们游戏进程的内存就必须是和我们在同一个进程.所以内存修改器為了能够修改我们游戏中的内存,他就会有一个注入(inject)操作,注入到我们进程.当他注入我们游戏进程以后就能对我们游戏数据进行任意的修改了,包括内存搜索等等.
         不知道大家有没有注意到,所有的Android游戏外掛或者内存修改器等 都有一个非常明显的特点,那就是必须要先啟动外掛或内存修改器,再由他来啟动游戏,这样的话他好在啟动游戏时对我们游戏进行一个注入及其他操作.
         我觉得目前来说有以下几个方案去防止用户使用内存修改器来对我们游戏数据进行修改
         一, 对我们游戏内的内存数据进行加密处理,使那些使用内存修改器的人搜索不到我们的关键游戏数据.这个方案来说相对比较简单,解决的问题也比较单一.只是可能会增加一些工作量(对关键内存数据进行加密处理).
 
         二, 直接在游戏啟动时做一些处理,防止外掛及内存修改器注入到我们游戏进程,当啟动时检测到注入给出警告然后直接退出游戏.正常来说防止注入操作基本能够屏蔽%90以上的外掛及内存修改器.好处当然是不用再额外对游戏内的数据变量进行加密及相关的一些修改了.除了防止内存修改器以外,还可以防止一些外掛对游戏的网络数据进行修改,因為一般外掛会注入到游戏进程后,对一些关键的系统级别API 进行hook(Hook既是掛鉤,hook有很多种,典型的就是在相关系统API的入口处 添加jmp跳转指令,跳到外掛作者所编写的对应函数),这样就导致我们在调用相关系统API时其实是先调用外掛的API 然后才会返回到实际的系统API,这样外掛就可以对我们的网络数据进行任意的修改.
         那麼如何才能够防止别人注入到我们游戏进程就成了我们的重点问题,也不能说百分百的防止所有外掛及内存修改器,我们只能是针对那些网络上常见的外掛及修改器进行一些特殊的处理操作.
         那我给大家举个例子,比如像腾讯的全民英雄,天天酷跑,天天爱消除 等等,在刚刚出来时都是各种外掛及内存修改器满天飞 (以前的天天酷跑就直接用内存修改器进行内存搜索对跑的分数进行修改等等),那到现在為止我们可以看到腾讯的游戏基本已经屏蔽掉这类外掛了.
         那麼腾讯到底在这一块大概都做了哪些操作?
         据我的一些经验我觉得大概有以下一些操作:
         1, 外掛在啟动时注入到我们进程必须会会PTRACE_ATTACH标誌去调用一个系统API 函数ptrace , ptrace(PTRACE_ATTACH,...) Android系统原本设计他的目的是用於Android操作系统中一个进程对另外一个进程进行调试用的,但现在已经普遍地被外掛作者们用来当作注入的神器.同时操作系统也规定在同一时间一个进程只能被一个进程进行调试,所以如果某个进程正在被另外一个进程调试,我们再去对这个进程进行ptrace(PTRACE_ATTACH,...)的话是没用的,直接会返回操作失败.所以腾讯的游戏也就是利用了这一点,在啟动时他会对自己进行一个ptrace(PTRACE_ATTACH,...)操作,这样别的进程再怎麼调用ptrace(PTRACE_ATTACH,...)都会失败.当然这样也不是百分百有效,因為外掛可以在我们调用ptrace(PTRACE_ATTACH,...)之前他先去
调用ptrace(PTRACE_ATTACH,...).但是现在ptrace调用失败了,我们已经知道游戏被注入了,那接下来的工作也相对比较简单了,比如说强制退出游戏,或者还是让游戏继续跑.
         2, 当外掛对我们游戏进程调用ptrace后,那他就可以对我们游戏进程的一些寄存器,然后在我们进行内执行一些 shellcode,一般常见的就是在shellcode当中去加载一个外掛所指定的so,这样的话这个外掛的SO就会加载到我们的游戏进程空间内,他就能对我们的游戏為所欲為的修改了(包括Hook,内存修改等等).鉴於外掛会在我们的进程中去加载SO,那我们也可以直接开啟一个进程,不定时的检测我们游戏进程中的SO,如果不是我们的那就直接卸载.或者我们可以直接修改系统的linker中的dlopen函数,防止第三方so加载,
       (关於Android linker  http://blog.csdn.net/dinuliang/article/details/5509009)
 
         综上所述,唯一一个可以肯定的就是ptrace,别的进程注入到我们进程时,必定要调用ptrace,而这也是到目前為止Android操作系统中唯一的入口,我觉得保守一点的做法是 如果我们游戏在调用ptrace时失败了就判定為用户使用外掛了,直接强制退出游戏即可.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值