前言:
每天工作都很无聊,总想找点乐子,但是毛乐子都没有。
找个游戏玩吧,挂机的游戏。
找到了,这游戏叫做。。。梦幻西游手游。丁三石的游戏。。。
由于我手机是个功能机,
所以,下载个模拟器来玩吧,
下载了之后,安装了之后,启动游戏之后,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的函数,
不过,估计三石帮客户端有蜜罐功能,很多很多很多年以前,端游封外挂,就是钓鱼执法,然后封的。