我其实刚玩这个游戏,觉得可以挂机挺不错的,本身平时就没时间玩游戏.
但是手机一直挂着就不能用了,于是想着就用模拟器开它个十个八个的一直挂着,等十年八年后我再回来玩.
结果一试发现竟然还不让用模拟器!?
这就很有意思了啊,本来没想那么多,但是,我作为一个程序员,这种事情在我看来那就是一种挑衅啊!
网上一搜,发现它竟然还有个手游电脑版.于是下载下来看了一下.
安装好后之后,竟然是一个什么战盟...我还要在战盟里下载这个游戏..好吧,真麻烦. 我忍了.
终于下载完毕之后,点击开始游戏...游戏启动,恩,不错.诶?,怎么不让开第二个了?这果断不能忍啊!
于是观察了一下游戏的目录结构,手动运行了一下[神武3手游.exe],然后我已经运行的游戏界面跳了出来,然后就没有然后了(唔,果然没那么简单么),那就是时候展现真正的技术了!
我脑子里一下子就跳出来几个思路:
1、第一种,虽然觉得不太可能,但还是要尝试一下的嘛。写个小程序改一下游戏窗口名字、把游戏目录换到其他地方、更改进程名字等等等等简单的思路都尝试了一下。发现不可行,唔,我的同行们果然不傻。。。。
2、在更改进程名字的时候发现,它的主进程名字很可能是sw3sy.dll,于是用od分析了一下[神武3手游.exe],在启动进程的系统接口上断点,发现其主要的启动流程大概是:[神武3手游.exe]启动战盟下的[DuoyiLauncher.exe],由[DuoyiLauncher.exe]启动[ZMMain.exe],然后再由[ZMMain.exe]启动神武3手游中core目录下[sw3sy.dll]。
恩,大概是这个样子,好吧,复杂到我也记不太清了。。。我说你这是搞啥呢。那么麻烦,我不如直接写个程序启动[sw3sy.dll]得了。
还别说,我自己把[sw3sy.dll]拉起来,游戏一切正常。于是我拉第2个起来,这时候不再是弹出第一个游戏的界面,而是弹了个丑不拉几的提示框,大致是说我已经开了个游戏了,是不是最小化了我没发现?
靠!这果断是在嘲讽我啊,连提示框的皮肤你们都懒的做,早就料到这个提示框不会被正常使用的用户发现的对吧?这怎么能忍?
于是,接着用od分析[sw3sy.dll],再所有创建互斥量、事件、文件映射的系统接口中都断了点。。。
最后基本确定了其防多开是利用的内存映射文件。通过把程序实例信息放到跨进程的内存映射文件中(其名字为m2sw300),防止游戏多开。
解决思路:
拦截该函数(拦截创建内存映射文件的系统接口),当它想要创建名字为m2sw300的内存映射文件时,我将它改名为一个随机的名字。这样每次游戏启动的时候,这个文件一定不存在,它就每次都会以为我是第一个启动的游戏。从而实现多开。
下载地址:
链接: 摆渡网盘前缀/s/1bpRrTRh
(盘.摆渡.抗木)
密码: rq8g
说明:
上面也说了原理,因为需要拦截系统api(windows 接口),需要进行hook(钩子)。360等安全软件应该会提示危险行为。添加信任或放行即可,或者暂时关闭安全软件
另外,我只在自己的windows7上使用可以,其他系统没测试过。
但是手机一直挂着就不能用了,于是想着就用模拟器开它个十个八个的一直挂着,等十年八年后我再回来玩.
结果一试发现竟然还不让用模拟器!?
这就很有意思了啊,本来没想那么多,但是,我作为一个程序员,这种事情在我看来那就是一种挑衅啊!
网上一搜,发现它竟然还有个手游电脑版.于是下载下来看了一下.
安装好后之后,竟然是一个什么战盟...我还要在战盟里下载这个游戏..好吧,真麻烦. 我忍了.
终于下载完毕之后,点击开始游戏...游戏启动,恩,不错.诶?,怎么不让开第二个了?这果断不能忍啊!
于是观察了一下游戏的目录结构,手动运行了一下[神武3手游.exe],然后我已经运行的游戏界面跳了出来,然后就没有然后了(唔,果然没那么简单么),那就是时候展现真正的技术了!
我脑子里一下子就跳出来几个思路:
1、第一种,虽然觉得不太可能,但还是要尝试一下的嘛。写个小程序改一下游戏窗口名字、把游戏目录换到其他地方、更改进程名字等等等等简单的思路都尝试了一下。发现不可行,唔,我的同行们果然不傻。。。。
2、在更改进程名字的时候发现,它的主进程名字很可能是sw3sy.dll,于是用od分析了一下[神武3手游.exe],在启动进程的系统接口上断点,发现其主要的启动流程大概是:[神武3手游.exe]启动战盟下的[DuoyiLauncher.exe],由[DuoyiLauncher.exe]启动[ZMMain.exe],然后再由[ZMMain.exe]启动神武3手游中core目录下[sw3sy.dll]。
恩,大概是这个样子,好吧,复杂到我也记不太清了。。。我说你这是搞啥呢。那么麻烦,我不如直接写个程序启动[sw3sy.dll]得了。
还别说,我自己把[sw3sy.dll]拉起来,游戏一切正常。于是我拉第2个起来,这时候不再是弹出第一个游戏的界面,而是弹了个丑不拉几的提示框,大致是说我已经开了个游戏了,是不是最小化了我没发现?
靠!这果断是在嘲讽我啊,连提示框的皮肤你们都懒的做,早就料到这个提示框不会被正常使用的用户发现的对吧?这怎么能忍?
于是,接着用od分析[sw3sy.dll],再所有创建互斥量、事件、文件映射的系统接口中都断了点。。。
最后基本确定了其防多开是利用的内存映射文件。通过把程序实例信息放到跨进程的内存映射文件中(其名字为m2sw300),防止游戏多开。
解决思路:
拦截该函数(拦截创建内存映射文件的系统接口),当它想要创建名字为m2sw300的内存映射文件时,我将它改名为一个随机的名字。这样每次游戏启动的时候,这个文件一定不存在,它就每次都会以为我是第一个启动的游戏。从而实现多开。
下载地址:
链接: 摆渡网盘前缀/s/1bpRrTRh
(盘.摆渡.抗木)
密码: rq8g
说明:
上面也说了原理,因为需要拦截系统api(windows 接口),需要进行hook(钩子)。360等安全软件应该会提示危险行为。添加信任或放行即可,或者暂时关闭安全软件
另外,我只在自己的windows7上使用可以,其他系统没测试过。