• 反反外挂驱动的驱动 - 给网游写一个挂吧(一)
    时间:2012-06-17   作者:Killmyday   出处:cnblogs.com/killmyda

    去年做了一些研究,研究做外挂的一些相关技术,打算放出来跟大家分享,分享一下我们做挂的一些思路,挂的原理,希望抛砖引玉。

    外挂说白了就是用程序代替人去操纵游戏,模拟人向游戏程序发送键盘、鼠标消息。一般的流程就是:

    1、 通过Windows系统的OpenProcess API打开目标进程 – 也就是游戏,以便能读写目标内存的数据,甚至是调用目标进程的函数,比如某些世界级的游戏里的Lua函数,或者游戏本身的C/C++函数。
    2、 通过ReadVirtualMemory和WriteVirtualMemory来 读取和修改一些关键信息,比如说人物的生命值,人物的坐标,游戏里地图上各个元素等等。
    3、 接着

        a)要么就是调用游戏里的一些函数,绕过游戏客户端的一些约束,调用角色里的一些非常强大的功能,从而快速杀怪。但这种方法的缺点很明显,服务器会做很多的检查判定你是挂从而封杀你。
        b)要么就是直接向游戏进程发送键盘、鼠标等消息,通过判定地图上的障碍物、怪物之类的东西过地图,当然杀怪也是通过模拟按键来完成。
     
    然而随着外挂对游戏的破坏性影响,反外挂和外挂的反反外挂技术都已经在内核层缠斗了,比如:

    1、 为了防止外挂调用Windows系统的一系列关键API(例如OpenProcess、Read/WriteVirtualMemory等),网游程序一般都会在游戏启动时在Windows操作系统上加载一个驱动程序,这个驱动程序的目的就是修改一系列关键API的代码,有时也会将游戏进程在系统中隐藏掉,从而使用户态的外挂和调试器无法访问游戏进程。
    2、 为了防止外挂制作者通过内核调试技术来分析游戏对系统关键API的代码修改,反外挂驱动启动后一般都会禁用内核调试(反调试技术、反调试技术二)。
    3、 另外游戏程序也会屏蔽Windows系统用来向游戏进程发送键盘、鼠标等消息的函数。
    4、 为了防止游戏里的关键数据被轻易修改,一般生命值这些东西游戏程序都会将其加密,使用一个加密函数去读写。
    5、 另外为了防止外挂杀怪太强从而影响游戏的平衡,一般来说从游戏服务器端,一张地图里的怪物坐标、类型等数据,是一点点传到客户端的。
    6、 还有很多……(我自己经验也不够,一时半会也枚举不完)。
     
    那么做外挂的第一步,就是破解这个反外挂驱动,否则不仅没办法操控游戏进程,也没有办法使用调试器逆向分析游戏里的一些关键数据,于是通常的做法是:

    1、 首先破解反外挂驱动的禁用内核调试的手段,一般都是通过Windbg和虚拟机用内核调试技术来完成的。
    2、 然后找出反外挂驱动对系统API的更改。
    3、 然后再写一个驱动程序,绕过反外挂驱动对系统API的更改。
     
    但上面的方法有点累,因为破解禁用内核调试的手段就需要进行一些逆向了,而且还要对反外挂驱动逆向,比较麻烦。但是它并没有禁用本地内核调试功能和内存文件生成的功能,因此我们可以使用这种方式调试和开发驱动,简便程度比双机内核调试差一点点。

    1、 使用本地内核调试:

    windbg -kl

    2、 生成内存(dump)文件:

    修改\HKLM\SYSTEM\CurrentControlSet\Control\CrashControl里的:
    AutoReboot
    CrashDumpEnabled
             1 – 代表完全保存物理内存内容
             2 – ?
             3 – minidump
     
    如果修改为1,BSOD(蓝屏)之后,完全内存保存在%windir%\memory.dmp
    如果修改为3,BSOD(蓝屏)之后,minidump保存在%windir%\minidump\文件夹下面。
     
    还有一个比较简单的方法,就是你在自己的破解驱动里,故意往SSDT写一些垃圾数据,然后导致系统BSOD(蓝屏),重启机器后用windbg打开dump打开memory.dmp文件,执行!analyze –v命令会自动给你显示所有被hook的函数和hook的地址、代码等等信息,这样可以直接做完第1和第2步。
     
    最后剩下的编码就比较简单了,具体的代码请参看以前的博客:破解XXX游戏驱动保护过程总结、另外有个朋友的破解过程写的很详细,也建议大家看看:过 DNF TP驱动保护(一)
     
    最后如果大家对调试技术感兴趣的话,可以考虑购买我的新书: 应用程序调试技术,这套视频除了讲解调试的技巧外,还尽量完整地讲解了周边用到的技术,这是因为调试技术要好的话,需要基础功和背景知识扎实才行。
     
     谢谢大家,未完待续……

    网友留言/评论

    我要留言/评论

    相关文章

    为什么离开的都是好员工?:很多公司有这样的现象,好多有能力的员工得不到赏 识,最后一一作出选择离开,等到后面原公司老板知道离开的员工待遇比自己给出的待遇要好得多,而且在与属下谈话,了解离开员工的工作表现和人品,却在属下 口中发现该离开员工作表现和人品都是非常不错的,作为老板和经理人怎么样才能用自己胸怀去接纳重用这些有能之士,用自己的眼光去识别这些人才为我所用不让 其离开?
    苹果公司的11个面试问题:又是一年毕业季,走出大学校园的你一定期待一份好工作。面试则是一个必经的过程,除非你是空降兵。下面让我们看看苹果公司的11个面试问题,你们能回答几个?
    用户访谈心得总结:最近做了一些项目的用户访谈,总结出些许经验心得,这里先就一些访谈过程的关键点作为一个开头,后续再来补充其他技巧等方面,大家也可以共同补充,同时欢迎大家拍砖。
    开发移动应用的 7 个致命错误:“幸福的家庭总是相似的,不幸的家庭各有各的不幸”,这个准则同样适用于移动应用开发者,最好的移动应用一般具备以下几个特点:美观,简单,实用,耐看。而对于不好的应用,有些常见的缺点是可以避免的,下面我们列举出开发移动应用时7个致命错误
    如何撰写网站文案:Sofa是我个人特别喜欢的一家公司,他们的产品,从软件本身到网站界面,均优雅精美,网页上的文案写的也好,总能敏锐的找到那句最直指人心的话来俘获潜在用户,本文即是负责为他们写作网站文案的专业作者的经验之谈,我读后感觉颇具可操作性。
    小设计有大学问:为什么滚动条在右边?:为什么大家每天使用的浏览器、word文档的滚动条都在右边呢?很多设计师认为把滚动条放在左边才是更好的设计,但是事实是自从施乐推出Star(第一台使用图形界面的计算机)以来,每种图形交互界面都将滚动条放在右边。 除开打字之外,拖动滚动条也许是图形交互界面中最常用的操作之一。想想你一般什么时候会使用滚动条。比如你在一个文档或者表单里找某个东西,你把滚动条一点一点往下拖动,与此同时你在文字中不断扫描直到找到你想要的东西。
    尽可能的不要一个人编程:我在宾夕法尼亚州匹兹堡地区一个有相当规模的制造公司里工作。我是那里唯一的一个 ruby 程序员。公司里还有个程序员,但我们的工作通常不相交,他不懂 ruby。来到这个公司后,我最终被分配的任务是开发 web 应用程序。之前,我学的是软件工程师,我花了大量的时间学习了底层编程,C/C++,甚至汇编。这里,我以为学习 web 开发是件很快乐的事,所以我买了一些书,开始研究。
    时间管理方法 - 管理人员必备:掌控:让你不必总是神经紧绷,也不会总是精神松懈,这就叫做掌控。平衡是一种最理想的状态。
    网站分析:系统邮件体验设计:每天我的邮箱都会收到很多系统邮件。有些是网购订单的状态通知,有些是网站活动宣传,有些是社交网站消息提醒。相信大家也都有和我一样的烦恼:怎么老是这么多垃圾邮件!淹没掉我重要的邮件啦!烦死啦!!你们有没有为我们着想啊!!其实从交互的交互来看这些邮件,还是有很多的学习地方的,俗话说:三人行,必有我师焉。择其善者而从之,其不善者而改之。所以今天我们来一起从分析下这些邮件。
    从排队等待谈进度条设计:排队等待是一种日常中常见的现象,例如新年领开工利是、去排队购买首发的苹果产品、每天中午去食堂排队购买午餐。排队等待在我们的生活中无处不在且看似是一个简单的现象。即使是种简单的存在,但也有其复杂的一面,当存在着很多条队列时,确定每条队列是做什么的就变得困难了;在加入队列后,人们会产生:大概要等多久?为什么队伍很久没有往前移动?等诸多疑问。无法解释的等待是令人烦躁的,不公平的等待则可能引发人们的怒火。