zoukankan      html  css  js  c++  java
  • 我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)

    前言:

    每天工作都很无聊,总想找点乐子,但是毛乐子都没有。

    找个游戏玩吧,挂机的游戏。

    找到了,这游戏叫做。。。梦幻西游手游。丁三石的游戏。。。

    由于我手机是个功能机,

    所以,下载个模拟器来玩吧,

    下载了之后,安装了之后,启动游戏之后,CPU巨卡,可能我得电脑有点老。

    怎么办,看到手游官网上竟然写着有个PC端。

    OK,弄下来玩玩。

    PC端就是不一样,截面很细腻,也超级不卡,感觉不错,

    但是我有2个号阿,怎么办,

    再开一个客户端,

    SB了,告诉我已经有了,问我怎么办,要不要杀了那个。

    当然不能杀,不然还叫双开么,

    OK,本文开始了。

    正文:

    墨迹了半天,终于开始了。

    (我的目的不是干掉它,只是为了多开游戏,所以这里只作简单分析,我只需要一个IDA)

    直接两次打开客户端,会提示这么个情况,

    有提示,不错,先去找提示相关的字符串,然后再找字符串调用的位置。。。

    但是察看了字符串资源之后,发现,字符串都不是ANSI的,IDA年老体衰,精力不足,查不到字符串,放弃

    MessageBox,简单办法解决,直接去找MessageBox的调用就行了,多简单

    一共就这么几处,玉皇大帝怜悯我啊。。。

    前面两个,调用处,看起来就不像,到第三处调用的时候,就挺像的了

    看一下参数2的字符串

    第四处调用的字符串,是这样的,找到了,对吧。

    好了,我们常规的解决办法就是,梳理分支,然后往里面写jnz jz 相关的跳转,避过这种类似的错误提示了吧,

    但是,我不想直接修改游戏文件这么干,

    我所担心的:

    1:程序有签名,直接改程序,会破坏签名。

    2:如果这个程序有自身的完整性校验,这不是白折腾么。

    3:其他我可能意识不到的问题。

    我想怎么干,那。。。当然是找到源头,看它是怎么工作的,然后想办法避过去。。。

    继续分析,

    其实,到这个弹窗这块,就已经注定是被检测出来已经多开了,

    所以,慢慢往回找代码,还好这个游戏客户端是x86的,而IDA对x86的F5支持很好,

    往前找源头,不远处会找到

    这样一处位置,双击进入函数可以看到,

    这,应该就是单实例判断,

    第一个函数,是用一种古老的方法,创建进程列表快照的方法遍历进程,然后判断进程路径名字,如果找到指定的,就不调第二个函数了。。。

    第二个函数,更奇葩,用枚举进程的方法,来遍历进程,判断路径名字。。。

    只要安全越过这里的获取,再越过后面的判断,就可以实现多开了,真容易。。。

    慢慢往后看,

    有这么一块代码,这是在做什么,

    看到这个字符串“NetEase(Hangzhou) Network Co. Ltd.”,我猜,就是在验证证书,

    进入前面的那个函数里面,往深了查阿找啊,

    会看到 CertFindCertificateInStore 这种相关的函数,OK,证书相关,

    我得目的不是干掉它,所以我不关心这里,

    继续往后看,

    走到大函数的尽头,

    这里就是真正启动游戏之前的步骤了

    进入函数,激动人心的时刻到了

    挺好笑的,

    LoadLibrary GetProcAddress 然后 call

    只是转接了一下参数,

    原来这东西,这么低级阿。

    从头到尾,分析结束。

    最终结论,

    可行的最简单的多开方法:

    直接模拟exe 的功能,直接加载DLL,然后调用函数,直接可以解决问题。

    后续处理:

    其实,前面几步就完了?

    确实完了,能用了,但是能保证不出问题么,这个真的不好说,

    后续需要加几步处理,

    怎么加处理呢,

    根据观察,可以看到目标DLL的接口固定,并且参数极少,而且传递的信息几乎为无用信息,

    所以可以想象,DLL有极低可能直接根据内存来判断当前进程为可信进程,

    所以,如果DLL真的这么做了,那么很有可能是通过进程对应的本地文件来判断,

    如何欺骗DLL呢,这里我们需要保证原有的exe文件存在,并且证书有效,

    然后我们以某些方法进入目标exe,夺取控制权,

    简单的方法有3种。

    1,直接DLL劫持,进入目标进程,镜像替换或者给代码打热补丁。

    2,断点注入,镜像替换或者给代码打热补丁。

    3,调试注入,镜像替换或者给代码打热补丁。

    其实,从start函数开始看的话,看得出来  sub_40A830  这个函数就是WinMain函数,

    因为它的调用处是这样的

    而 v7 是什么,

    v7 就是 

    命令行参数

    WinMain的原型是什么样的。

    int WINAPI WinMain( HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
    );

    就是这样的

    好了,工作结束。

    实际上分析这个东西,加上写出代码测试,大致用了我两个小时,毕竟我不算成手,而且我的代码是C的,

    估计成手分析这个的话,也就半个来小时就完事了。

    附记:

    其实,如果有现成的工具,可以隐藏掉已经启动的进程的话,应该也行,

    在中间,

    这里,实际上还有一处mutex判断,但是它不影响是否可以多开,

    它只会影响调用DLL的时候传的参数。

    最简单的方法还是什么都不管,直接写代码调用DLL的函数,

    不过,估计三石帮客户端有蜜罐功能,很多很多很多年以前,端游封外挂,就是钓鱼执法,然后封的。

  • 相关阅读:
    Git使用方法
    设计模式之原型模式
    php基础查找算法
    php基础排序算法
    设计模式之工厂模式
    设计模式之代理模式
    设计模式之装饰者模式
    设计模式之六大原则
    设计模式之策略模式
    设计模式之简单工厂模式
  • 原文地址:https://www.cnblogs.com/suanguade/p/5646776.html
Copyright © 2011-2022 走看看