上一篇,多开方法,适用于一年前的版本

http://www.cnblogs.com/suanguade/p/5646776.html

前言:

一转眼一年过去了,日子越来越无聊了,于是,准备再玩一玩梦幻手游,

有了去年的经验,那就直接来试试看呗,安装了梦幻手游单机版之后,更新了之后,用去年的工具运行一下。

我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)(二)-LMLPHP

竟然给我搞挂掉了,看样子这玩艺是又有什么新的动作阿,

准备开工,开始分析。

正文:

其实有了前一个文章,这块也没什么难度,

直入主题,

直接找到这里,看看情况

我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)(二)-LMLPHP

代码还是那块代码,但是样式突然有了变化,加了乱七八糟一堆参数,

站在我个人的角度上来说,其实我是没有兴趣一个一个扒它参数的,

但是实际上有几个东西也是可以看出来个大概的,

中间4个变量是窗口信息,然后还有DUI信息等等,还是乱七八糟的,

然后参数2的值也变了,变成了 0x1003D0,和我没什么关系,

不考虑这里了,

原因1:抓参数信息很费事,

原因2:即便抓住参数信息,参数里面如果哪些有变化了,怎么办,还要分析,费事,

原因3:就算这些信息抓全了,如果DLL和Shell之间有交互,或者Shell有使用DLL的内存或者DLL有使用Shell的内存,这就又要想更多的办法来解决

    最后很可能为了解决一个小问题,慢慢地变成解决一堆大问题。

所以,我决定从前面入手,看看是否有办法解决,

去年的帖子里面说了,这个游戏判断多进程,

实际上就是创建了个Mutex,然后判断,

然后枚举进程,还是那么老的套路,

不过,其实这玩艺不怪它,它本身也没什么高级的模块在里面,

而且一个非安全软件公司,常规方法也就可以了,

好吧,再次进入主题,

我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)(二)-LMLPHP

入口点直接进来,VS编译出来的,一眼就能看出来这是入口点

里面是一堆环境判断、资源判断等等,都是有明文字符串的,真体贴。

我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)(二)-LMLPHP

资源完整性校验。

我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)(二)-LMLPHP

现在都允许双开了,而且是个格式化字符串,那就是说以后是不是可能允许三开四开。

我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)(二)-LMLPHP

看这字符串名字,估计是数字签名校验,

再往后就是加载资源,创建窗口了,也就是说,到这块的时候该校验的就都差不多了,

突然有了一种回到了十年前的感觉,一点新意都没有,还是那老三样,

到这里就有眉目了,老一套的办法,一个jmp解决全部问题,

但是这个jmp怎么加呢,在哪加,

当然是在关键跳的地方,哪是关键跳呢,

最简单的办法就是看这里,

我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)(二)-LMLPHP

判断了多开之后,立刻就走了,走哪去了,LABEL_83,肯定就是要退出的地方呗,

让我们的代码,不要跳到那边,不就好了?

由于前面都没有异常极端分支,所以,可以清楚地看到,到了上图中,输出客户端个数之后,

立刻就跳走了,那就是说,只要不让它进入这个if,多开问题就解决了,对不?

当然是对的,因为其他判断多开的地方,都在输出之前阿,哈哈哈哈。

具体怎么不让它进入if,那就只能让条件不满足了,

直接说结果吧,没啥技术含量,

关键还在,

我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)(二)-LMLPHP

这个函数里面,

进去之后观察,这函数,不是返回1,就是返回0,很符合要求,那怎么办呢,

N个办法,

1:让它永远返回1

2:外面越过这个函数调用

3:………………

其实这些多少都有点局限性,比如

1在这里出现的问题,实际上是,如果永远都让它返回1,我这里测试的时候,没有起到效果,很可能是我测试的方法比较SB,但是确实没有起到应有的效果

2如果外面越过这个函数调用,需要修改的字节太多了,我不想那么玩,万一我什么时候想改回去,岂不是又要费事,况且扣ShellCode也麻烦

最后我想的办法是

我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)(二)-LMLPHP

修改这条汇编代码,

因为首先可以确定的是上一个函数的返回值只有0和1,两种,

那么为了让jnz满足,我只要操作一下寄存器,让zf = 0,比如 inc eax,0+1=1,1+1=?,不就满足了,甚至后面都不用改,

而这里只有2字节,改内存保护属性阿什么的,改机器码,都方便,一个 InterlockedXXXXXXX 还很安全,

这里改了之后,就要想想其他地方了,往前看两句,就会发现

我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)(二)-LMLPHP

亲,前面还有个不稳定的跳转,可能会导致不会走到我们的那个位置,

我这人就喜欢给工作打上双保险,所以,直接把这里的jge 给干掉,变成两个 0x90,OK,不管什么情况,都会走到我们的inc 和jnz,

两处补丁结束之后,为了更加保险,我还打了第三处补丁,

其实第三处补丁实际上就是个兜底操作,我在

我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)(二)-LMLPHP

这个位置,只改2字节,让这句话如果出了问题,直接跳到下面去,

下面的 byte_4ADD82 判断,会返回到程序开头的地方,重新来跑一圈,

如果万里有一失败了,我也不用再重新打开程序玩一次,直接点一下MessageBox就行了,(纯粹是我懒)。

到此为止,三个点全部都patch了之后,就可以支持多开了,

但是这时出现了一个问题,我到底怎么patch呢,

最简单的办法是直接冷patch,但是这样的话,其实后面还有签名校验呢,即便后面的签名校验过了,万一哪个DLL里面再来个二次校验呢,

甚至对等校验,三次校验,反正这种事情我们是干得出来的,

所以冷patch肯定是不靠谱的,那怎么办呢,

当然就是热patch了,

热patch有几种下法,

1

2

3

4

好了,本次分析结束。。。

总结:

其实吧,和去年相比这游戏的保护手段是高了一些,但是怎么说呢,

毕竟也就这个程度吧,

整套分析流程,我没有上调试,就看汇编,写代码验证,

大概一共就用了不到1小时。

强度挺低的。

最后来个6开的图吧。

我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)(二)-LMLPHP

05-15 16:52