E盾根据源码逆向分析和VMP实战与疑问
本帖最后由 我要学外挂 于 2020-8-4 21:08 编辑因为加了VMP之后,很多东西都看不到,所以先通过源码来找出不会被`vm`的特征码,方便下一步逆向。
E盾有源码,先看下源码分析,有个`检测od`的子程序,也就是禁止调试。那么也就是第一步要先处理这个`检测od`
## **E盾分析流程**
**检测OD -> 登录 -> 合法 -> JS运算 -> 时间**
下文中的`1`和`2`
### 检测OD
托进od,字符串搜索`127.0.0.1`,因为根据源码可知,这里上面的子程序就是`检测od`
点进去,会发现上面有几个call,那么如何确定那个是`检测OD`的了,在每个call下断然后`F8`运行,当运行到一个`CALL`时候,弹出弹框说检测到非法调试,那就是了。通过这个蠢方法我找到了,也标上注释了。
在这里断下,运行到这里,`F7`跟进去,`发现非法工具`就说明进去到了`检测OD`CALL内了,那么也有两个call
`1`那个call是什么了,看下面的字段。这里和源码这里就很像,如果`a!=0`,就弹出发现非法工具,跳转也实现了,说明要这个**call** 返回**0**就可以了
```assembly
mov ,eax //将eax赋值给local.1
cmp ,0x0 //将local.1和0比较
```
F7跟进这个CALL
```assembly
0041BDD1 $55 push ebp
0041BDD2 .8BEC mov ebp,esp
0041BDD4 .81EC 04000000 sub esp,0x4
```
```assembly
0041BDD1 B8 00000000 mov eax,0x0
0041BDD6 C9 leave
0041BDD7 C3 retn
0041BDD8 90 nop
0041BDD9 90 nop
```
现在目的达到了。可以正常运行不禁止调试。那么**2**那个call有什么用了。刚进这个call时候都可以发现,有`vmp`的代码,就是这句,要找一处可以做特征码的地方,那么即使碰到`Vmp`时候也可以定位到,因为有时候是不能像刚才那样子通过搜索字符串跟过来的
```assembly
0041FF8F|.56 4D 50 72 6>ascii "VMProtect begin",0
```
所以跟进**2**那个call
```assembly
0040106F $5E pop esi
00401070 >6A 00 push 0x0
00401072 .4B dec ebx
00401073 .^ 75 FB jnz short 网络验证.00401070
00401075 .FFE6 jmp esi
```
### 另一种情况
如果是直接通过特征码定位过来的话,`jmp esi`也会跳到这里,处理方法一样
```assembly
mov eax,0
leave
ret
```
**`检测OD`特征码:**
```assembly
5E 6A 00 4B 75 FB FF E6
```
---
### 登录
正常运行以后,有按钮,所以在OD下按钮事件断点
```assembly
FF 55 FC 5F 5E
```
`F7`跟进去
根据源码来分析
往下拉,有个**登录中**字符串,那么登录中下面两个call其中一个可能就是`处理事件`了,为什么这么猜测,因为跟进那俩个call。他是跳到易语言核心支持库那块的。
一路F8跟下去先分析代码,来到一个关键跳转,注释里写明白了代码分析
为什么说是关键跳转了,往下拉一点,就可以看到这些字符串,看代码那块就可以知道,这里是验证是否登录成功,如果登录成功就写配置项了。
在给**eax**赋值那个call下断跟进去,分析代码
```assembly
004015D1 .E8 BBAC0200 call 网络验证.0042C291
004015D6 .83C4 10 add esp,0x10
004015D9 .8945 E8 mov dword ptr ss:,eax
004015DC .837D E8 01 cmp dword ptr ss:,0x1
```
```assembly
004015D6 B8 01000000 mov eax,0x1
004015DB C9 leave
004015DC C3 retn
004015DD 90 nop
004015DE 90 nop
004015DF 90 nop
```
在这个`retn`出去以后,就会发现那个跳转没有实现,一路**F8**走下去看源码就知道,三个写配置项后,就是`合法检测`
---
### 合法
跟到这里,有三个call,按照刚才的蠢方法,分析那个call会崩溃
在这个`call`F7跟进去
```assembly
00415930|.E8 7A690100 call 网络验证.0042C2AF ;核心支持库
00415935|.83C4 10 add esp,0x10
00415938|.68 01000000 push 0x1
```
这里,有两处相似的代码段,把上面的那段注释为`2`,底下那段注释为`1`。
从登陆开始,就会发现,很多处代码都一直在调用到这里,所以我觉得这里一定有很大用处,所以在`1`和`2`的头部都分别下断。
现在跟进来后,断在了`2`处,一路F8运行出去
```assembly
00415930|.E8 7A690100 call 网络验证.0042C2AF ;核心支持库
00415935 C9 leave
00415936 C3 retn
00415937 90 nop
```
然后点击运行,就会发现,又回到了刚才的核心支持库中,在F8运行出来,会跳到进去之前的下个`call`,这个call原本是运行不到的,因为当运行到上个call时,就会崩溃,那么来到这里,碰运气,也将他
```assembly
leave
ret
```
接着在点运行, 发现又回到了核心支持库,又跟出来,按照刚才的处理方法。
然后运行
直接就弹出窗口了,显示登陆成功,连后面的运算,补时间都不用,但是明显这样是不行的, 因为后面如果有暗桩,这样子处理的话会闪退。
---
所以重新运行程序,通过刚才的处理也知道,很多处调用了核心支持库,所以这次直接从核心支持库下手。而且最重要的就是,核心支持库,不担心他被`VMP`,即使被`VMP`了,也可以照着样子直接还原。
在核心支持库`1`和 `2`的尾部下断,也就是`retn`的位置
输入了帐号密码后,第一次断下,按照经验这个可能是`处理事件`,因为刚才分析时候也发现`处理事件`也会调用到这里,所以再次点运行
看右下角堆栈窗口,有明文`12123`就是帐号,这时候`F7`跟出去
```assembly
0040159C .E8 F0AC0200 call 0042C291
004015A1 83C4 10 add esp, 0x10
004015A4 8945 F4 mov dword ptr , eax
004015A7 837D F4 01 cmp dword ptr , 0x1
```
```assembly
004015A1 B8 01000000 mov eax, 0x1
004015A6 C9 leave
004015A7 C3 retn
004015A8 90 nop
004015A9 90 nop
004015AA 90 nop
```
接下来就是合法了,仔细想,刚才处理合法时,他调用核心支持库时,多是调用`2`的那处,所以这时候运行一下,但是会发现一直都是断在`1`处,那么把`1`的断点,先取消,在次运行,就发现,断在了`2`处,F7跟出去
这个注释很眼熟把,就是刚才处理合法时候下的。
```assembly
00415935 C9 leave ;出来来到了这里,直接leave出去
00415936 C3 retn
00415937 90 nop
```
为什么我可以肯定这里就是合法了,因为我用前辈经验总结出来的一个特征码定位过,是同一处地方。
通过特征码搜索
```assembly
8B 44 24 0C 56 8B 30 56
```
然后有得程序会搜出三个,但是在这里只能搜出两个,不论搜出几个,在倒数第二个的头部下断,然后F8一路跟进去
走到`retn`以后,会发现,又走到了`2`这里。继续走出去
看。同一处地方。
---
### JS运算
合法处理完后,就该到JS的运算了,为什么要处理,因为如果不处理,直接运行,会一直断在`1`处,然后就会是一堆机器码啊,不知道什么时间戳还有一堆乱七八糟的东西运算,所以把这里` leave retn`了防止干扰分析
这时候把核心支持库的俩个断点取消,把按钮事件的断点打开
F7跟进
往下看
到了这一块代码了
在易语言函数拼接那个`CALL`里下断,跟进去,这里我复制了一下二进制码,在`vmp`时候,好像也存在,所以比较适合做特征码。
```assembly
头部特征码:
55 8B EC 8B C1 40 C1 E0 02 2B E0 8D 3C 24
尾部特征码:
C6 07 00 58 8B E5 5D C3
```
直接运行到`retn`这里,看右下角堆栈窗口,就有源码处那四个字符串拼接
这时候启用`1`和`2`的断点,会断在`2`处,可能就是这个`验证_调用远程JS`玩意,直接把他跳过。
为什么会在核心支持库处可以看到,因为看源码什么`到数值`,`到文本`都是易语言独有的,而哪些运算就是`验证_调用远程JS`这个里面的。现在目的就是把他给跳过,直接进入下一步运算中。
```assembly
0041A391 .83C4 10 add esp, 0x10 ;字符串拼接后F8出来会断在这里
```
一直往下拉,就会看见这个`算法JS`也就是刚才说的那个函数调用没错了。直接在出来的位置把他跳过。
```assembly
0041A391 C9 leave ;字符串拼接后F8出来会断在这里
0041A392 C3 retn
0041A393 90 nop
```
---
### 运算
接下来到这一处了,看源码就知道,如果本地结果AAAAAA /252 不等于 服务器运算结果,那就进行死循环。
那么现在,服务器肯定是连接失败了。因为是爆破进去的,所以为0,那么本地结果了,也将他置0就好了,0除以任何数都为0嘛。所以这俩肯定是相等的。
怎么做了,回到核心支持库,因为刚才跳过了`算法JS`,所以只要在此点击运行,那就会断在`1`处,而这个时候开始数,当到11次时候(官方的,就是未经修改的算法),将EAX置0就可以了。
当运转了11次后,这时候有个特征,就是`EAX`的值,和堆栈窗口中`+8`的值很相似。
将其置0.
---
### 时间
运算也处理完了,这时候就剩下时间了。也是投机取巧发现的方法,这时候只要将`1`的断点取消,只启用`2`的断点,很快就会在堆栈窗口中看见`-1`的字符串
这时对第一个`-1`右键,数据窗口中跟随,英文的话就是`Follow in Dump`
然后在数据窗口中,选中-1的值,快捷键 `Ctrl+E`,或者右键->二进制编辑,将其改为99999
### 按照刚才搞官方的写下流程:
**1.处理检测OD**
```assembly
特征码:
5E 6A 00 4B 75 FB FF E6
jmp esi 下断
F7 跟过去
mov eax,0
leave
ret
```
**2.登录**
```assembly
FF 25
找核心支持库 1 和 2
在 1 和 2 retn 处下断
输入帐号密码后,第一次出现帐号时候,F8跟出去
mov eax,1
leave
ret
```
**3.合法**
```assembly
两种办法:
FF 25 核心支持库,在1 处理了登录后
取消1的断点,只保留2的断点
然后F8运行出去
leave
ret
2.特征码:
5E 6A 00 4B 75 FB FF E6
处理完登录后,在倒数第二个下断个函数头下断,F8跟出去
leave
ret
```
**4.js运算防止干扰**
```assembly
俩个特征码取其一
头部特征码:
55 8B EC 8B C1 40 C1 E0 02 2B E0 8D 3C 24
尾部特征码:
C6 07 00 58 8B E5 5D C3
在retn 下断,运行到retn,看见字符串拼接,取消断点,启用 核心支持库 中 2的断点,F8跟出去
leave
ret
```
**5.运算**
```assembly
处理了js运算后
启用 核心支持库 1 的断点,官方的话,没有进行修改情况下是运行11次
然后观察eax和 堆栈窗口处 +8 的值是否类似
将eax 置0
```
**6.补时间**
```assembly
处理了运算后
取消核心支持库 1 的断点
启用核心支持库 2 的断点
运行几次,观察堆栈窗口,出现字符串 -1时
将其数据窗口中跟随
选中,二进制编辑或快捷键 Ctrl + E 将其 修改为 99999
```
**7.退出**
```assembly
看见网上的方法
push 60
函数头改ret。不过我测试中没用到过。
蓝屏 55 8B EC 81 EC 2C 00 00 00 C7 45 FC 00 00 00 00 68 0C 00 00 00)(崩溃 55 8B EC 81 EC 2C 00 00 00)
```
---
## VMP实战
查壳,VMP的
#### 处理检测OD
通过特征码定位到`jmp esi`
其实不定位也行,因为就在下面,`F2`下断,运行,我试过。这里会断两次。
这是第一次。按照刚才的处理,将这里返回0
```assembly
00413910 68 04000080 push 0x80000004 ; 第一次断下
```
```assembly
00413910 B8 00000000 mov eax, 0x0 ; 第一次断下
00413915 C9 leave
00413916 C3 retn
```
按照正常的话,这个时候,运行,就可以了。但是这里不行,运行的话就会崩
所以从第二次断下开始下手
```assembly
00440E46 68 05000080 push 0x80000005 ; 第二次断下
00440E4B 6A 00 push 0x0
00440E4D 68 A0D74F00 push 004FD7A0
```
```assembly
00440E46 B8 00000000 mov eax, 0x0 ; 第二次断下
00440E4B C9 leave
00440E4C C3 retn
```
启动完成。
---
#### 2.登录
Ctrl+ B 搜索 `FF 25` 查找到核心支持库,然后在 `1`和`2`中下断。
输入帐号密码,点击登录,断下,第一次正常是处理事件,第二次跟出去,这里是被VM后,变成了PUSH。不管他直接修改
```assembly
00B04C1F 68 BE99BECF push 0xCFBE99BE ; denglu
```
```assembly
00B04C1F B8 01000000 mov eax, 0x1 ; denglu
00B04C24 C9 leave
00B04C25 C3 retn
00B04C26 90 nop
00B04C27 90 nop
00B04C28 90 nop
```
---
#### 3.合法
点击运行,回到`1`那里,然后取消断点,保留`2`的断点。
在`2`断下后,`F8`跟出来。
```assembly
006E2237 68 2AB2D07F push 0x7FD0B22A ; 合法
```
```assembly
006E2237 C9 leave ; 合法
006E2238 C3 retn
006E2239 90 nop
006E223A 90 nop
006E223B 90 nop
```
---
#### 4.防止干扰
通过特征码定位
```assembly
尾部特征码:
C6 07 00 58 8B E5 5D C3
```
出现字符串拼接,取消断点,启用`2`的断点,运行跟过去
但是这里,不清楚为什么,一运行到`2`后,堆栈窗口中就出现`-1`的字符串,也就是时间,这里就顺势修改了。
接着运行两次,就出现这个窗口了。
---
启动游戏测试效果
这里不管怎么呼出。都没效果,不知道是还有二次验证还是怎么样。
---
## 疑问
为什么会直接跳过了运算,是我漏了什么还是原作者修改后,还是VMP的效果。
为什么处理了时间后没有效果,请问是有二次验证,还是还有什么暗桩。
哇救命,发帖时候又被拦截了,然后一刷新一看,我发了两篇,请问怎么删一篇。。
软件下载:https://ww.lanzouj.com/i0luqddhr6b 密码:85gg
1.JS按你那么处理显然不行
2.现在的E盾都是加的VMP授权的,所以还得考虑怎么破授权 是群友吧。。
那个dll里有验证的
运行游戏里面检测了时间 应该是js内容
正常的时间应该是多少天多少分不是99999这样的
建议搞个正版卡试试E盾也没有自动封卡 是吧
影风 发表于 2020-6-5 23:26
1.JS按你那么处理显然不行
2.现在的E盾都是加的VMP授权的,所以还得考虑怎么破授权
所以我来求教了{:1_904:} 初步看是 JS 你是跳过的 有可能别人把游戏数据放在JS上 crack5 发表于 2020-6-5 23:34
初步看是 JS 你是跳过的 有可能别人把游戏数据放在JS上
那个JS应该是被打乱了,目前我也不知道怎么搞了{:301_977:} 我要学外挂 发表于 2020-6-5 23:36
那个JS应该是被打乱了,目前我也不知道怎么搞了
HookJS 看返回 如楼上所讲,或许JS。或许有注入DLL,而DLL里有验证 xieemengxin 发表于 2020-6-6 08:57
是群友吧。。
那个dll里有验证的
运行游戏里面检测了时间 应该是js内容
他这个好像有自动封卡 影风 发表于 2020-6-5 23:26
1.JS按你那么处理显然不行
2.现在的E盾都是加的VMP授权的,所以还得考虑怎么破授权
VMP授权锁定,基本都有,你去掉了吗?