我要多开梦幻手游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的函数,

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

posted @ 2016-07-06 14:25  穷到底  阅读(33583)  评论(3编辑  收藏  举报