吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 13508|回复: 29
收起左侧

[原创] E盾根据源码逆向分析和VMP实战与疑问

  [复制链接]
我要学外挂 发表于 2020-6-5 22:25
本帖最后由 我要学外挂 于 2020-8-4 21:08 编辑

97.jpg
因为加了VMP之后,很多东西都看不到,所以先通过源码来找出不会被vm的特征码,方便下一步逆向。

E盾有源码,先看下源码分析,有个检测od的子程序,也就是禁止调试。那么也就是第一步要先处理这个检测od
e2.png

E盾分析流程

检测OD -> 登录 -> 合法 -> JS运算 -> 时间

下文中的12
96.png

检测OD

托进od,字符串搜索127.0.0.1,因为根据源码可知,这里上面的子程序就是检测od
1.png

点进去,会发现上面有几个call,那么如何确定那个是检测OD的了,在每个call下断然后F8运行,当运行到一个CALL时候,弹出弹框说检测到非法调试,那就是了。通过这个蠢方法我找到了,也标上注释了。
2.png
在这里断下,运行到这里,F7跟进去,发现非法工具就说明进去到了检测ODCALL内了,那么也有两个call
3.png
1那个call是什么了,看下面的字段。这里和源码这里就很像,如果a!=0,就弹出发现非法工具,跳转也实现了,说明要这个call 返回0就可以了

mov [local.1],eax //将eax赋值给local.1
cmp [local.1],0x0 //将local.1和0比较

e1.png
48.png
F7跟进这个CALL

0041BDD1   $  55            push ebp
0041BDD2   .  8BEC          mov ebp,esp
0041BDD4   .  81EC 04000000 sub esp,0x4

4.png

0041BDD1      B8 00000000   mov eax,0x0
0041BDD6      C9            leave
0041BDD7      C3            retn
0041BDD8      90            nop
0041BDD9      90            nop

5.png
6.png

现在目的达到了。可以正常运行不禁止调试。那么2那个call有什么用了。刚进这个call时候都可以发现,有vmp的代码,就是这句,要找一处可以做特征码的地方,那么即使碰到Vmp时候也可以定位到,因为有时候是不能像刚才那样子通过搜索字符串跟过来的

0041FF8F  |.  56 4D 50 72 6>ascii "VMProtect begin",0

所以跟进2那个call

0040106F   $  5E            pop esi
00401070   >  6A 00         push 0x0
00401072   .  4B            dec ebx
00401073   .^ 75 FB         jnz short 网络验证.00401070
00401075   .  FFE6          jmp esi

7.png
8.png
9.png

另一种情况

如果是直接通过特征码定位过来的话,jmp esi也会跳到这里,处理方法一样

mov eax,0
leave
ret

12.png
13.png
检测OD特征码:

5E 6A 00 4B 75 FB FF E6

登录

正常运行以后,有按钮,所以在OD下按钮事件断点

FF 55 FC 5F 5E

10.png
F7跟进去
49.png
根据源码来分析
50.png
往下拉,有个登录中字符串,那么登录中下面两个call其中一个可能就是处理事件了,为什么这么猜测,因为跟进那俩个call。他是跳到易语言核心支持库那块的。
14.png
一路F8跟下去先分析代码,来到一个关键跳转,注释里写明白了代码分析
16.png
为什么说是关键跳转了,往下拉一点,就可以看到这些字符串,看代码那块就可以知道,这里是验证是否登录成功,如果登录成功就写配置项了。
51.png
在给eax赋值那个call下断跟进去,分析代码
52.png

004015D1   .  E8 BBAC0200   call 网络验证.0042C291
004015D6   .  83C4 10       add esp,0x10
004015D9   .  8945 E8       mov dword ptr ss:[ebp-0x18],eax
004015DC   .  837D E8 01    cmp dword ptr ss:[ebp-0x18],0x1

18.png

004015D6      B8 01000000   mov eax,0x1
004015DB      C9            leave
004015DC      C3            retn
004015DD      90            nop
004015DE      90            nop
004015DF      90            nop

19.png

在这个retn出去以后,就会发现那个跳转没有实现,一路F8走下去看源码就知道,三个写配置项后,就是合法检测


合法

53.png
跟到这里,有三个call,按照刚才的蠢方法,分析那个call会崩溃
54.png
在这个callF7跟进去
22.png

00415930  |.  E8 7A690100   call 网络验证.0042C2AF                       ;  核心支持库
00415935  |.  83C4 10       add esp,0x10
00415938  |.  68 01000000   push 0x1

59.png
57.png
这里,有两处相似的代码段,把上面的那段注释为2,底下那段注释为1

从登陆开始,就会发现,很多处代码都一直在调用到这里,所以我觉得这里一定有很大用处,所以在12的头部都分别下断。

现在跟进来后,断在了2处,一路F8运行出去
58.png

00415930  |.  E8 7A690100   call 网络验证.0042C2AF                       ;  核心支持库
00415935      C9            leave
00415936      C3            retn
00415937      90            nop

23.png

然后点击运行,就会发现,又回到了刚才的核心支持库中,在F8运行出来,会跳到进去之前的下个call,这个call原本是运行不到的,因为当运行到上个call时,就会崩溃,那么来到这里,碰运气,也将他

leave 
ret

24.png
接着在点运行, 发现又回到了核心支持库,又跟出来,按照刚才的处理方法。

25.png
然后运行
26.png

直接就弹出窗口了,显示登陆成功,连后面的运算,补时间都不用,但是明显这样是不行的, 因为后面如果有暗桩,这样子处理的话会闪退。


所以重新运行程序,通过刚才的处理也知道,很多处调用了核心支持库,所以这次直接从核心支持库下手。而且最重要的就是,核心支持库,不担心他被VMP,即使被VMP了,也可以照着样子直接还原。

在核心支持库12的尾部下断,也就是retn的位置

输入了帐号密码后,第一次断下,按照经验这个可能是处理事件,因为刚才分析时候也发现处理事件也会调用到这里,所以再次点运行

60.png
看右下角堆栈窗口,有明文12123就是帐号,这时候F7跟出去
61.png

0040159C   .  E8 F0AC0200   call    0042C291
004015A1      83C4 10       add     esp, 0x10
004015A4      8945 F4       mov     dword ptr [ebp-0xC], eax
004015A7      837D F4 01    cmp     dword ptr [ebp-0xC], 0x1

62.png

004015A1      B8 01000000   mov     eax, 0x1
004015A6      C9            leave
004015A7      C3            retn
004015A8      90            nop
004015A9      90            nop
004015AA      90            nop

63.png

接下来就是合法了,仔细想,刚才处理合法时,他调用核心支持库时,多是调用2的那处,所以这时候运行一下,但是会发现一直都是断在1处,那么把1的断点,先取消,在次运行,就发现,断在了2处,F7跟出去

64.png

这个注释很眼熟把,就是刚才处理合法时候下的。

00415935      C9            leave                                    ;  出来来到了这里,直接leave出去
00415936      C3            retn
00415937      90            nop

65.png
为什么我可以肯定这里就是合法了,因为我用前辈经验总结出来的一个特征码定位过,是同一处地方。

通过特征码搜索

8B 44 24 0C 56 8B 30 56

66.png
然后有得程序会搜出三个,但是在这里只能搜出两个,不论搜出几个,在倒数第二个的头部下断,然后F8一路跟进去

67.png
走到retn以后,会发现,又走到了2这里。继续走出去
68.png
看。同一处地方。
69.png

JS运算

合法处理完后,就该到JS的运算了,为什么要处理,因为如果不处理,直接运行,会一直断在1处,然后就会是一堆机器码啊,不知道什么时间戳还有一堆乱七八糟的东西运算,所以把这里leave retn了防止干扰分析

这时候把核心支持库的俩个断点取消,把按钮事件的断点打开
30.png
31.png
F7跟进
32.png
往下看
33.png
到了这一块代码了
70.png
在易语言函数拼接那个CALL里下断,跟进去,这里我复制了一下二进制码,在vmp时候,好像也存在,所以比较适合做特征码。

头部特征码:
55 8B EC 8B C1 40 C1 E0 02 2B E0 8D 3C 24
尾部特征码:
C6 07 00 58 8B E5 5D C3

34.png
直接运行到retn这里,看右下角堆栈窗口,就有源码处那四个字符串拼接
35.png
这时候启用12的断点,会断在2处,可能就是这个验证_调用远程JS玩意,直接把他跳过。

为什么会在核心支持库处可以看到,因为看源码什么到数值到文本都是易语言独有的,而哪些运算就是验证_调用远程JS这个里面的。现在目的就是把他给跳过,直接进入下一步运算中。
36.png

37.png

0041A391   .  83C4 10       add     esp, 0x10                        ;  字符串拼接后F8出来会断在这里

38.png

一直往下拉,就会看见这个算法JS也就是刚才说的那个函数调用没错了。直接在出来的位置把他跳过。

39.png

0041A391      C9            leave                                    ;  字符串拼接后F8出来会断在这里
0041A392      C3            retn
0041A393      90            nop

40.png


运算

接下来到这一处了,看源码就知道,如果本地结果AAAAAA /252 不等于 服务器运算结果,那就进行死循环。

那么现在,服务器肯定是连接失败了。因为是爆破进去的,所以为0,那么本地结果了,也将他置0就好了,0除以任何数都为0嘛。所以这俩肯定是相等的。
71.png

怎么做了,回到核心支持库,因为刚才跳过了算法JS,所以只要在此点击运行,那就会断在1处,而这个时候开始数,当到11次时候(官方的,就是未经修改的算法),将EAX置0就可以了。

72.png

当运转了11次后,这时候有个特征,就是EAX的值,和堆栈窗口中+8的值很相似。
41.png
将其置0.

42.png

时间

运算也处理完了,这时候就剩下时间了。也是投机取巧发现的方法,这时候只要将1的断点取消,只启用2的断点,很快就会在堆栈窗口中看见-1的字符串
43.png
这时对第一个-1右键,数据窗口中跟随,英文的话就是Follow in Dump
44.png
45.png
然后在数据窗口中,选中-1的值,快捷键 Ctrl+E,或者右键->二进制编辑,将其改为99999
46.png
47.png

按照刚才搞官方的写下流程:

1.处理检测OD

特征码:
5E 6A 00 4B 75 FB FF E6
jmp esi 下断
F7 跟过去 
mov eax,0
leave
ret

2.登录

FF 25
找核心支持库 1 和 2 
在 1 和 2 retn 处下断
输入帐号密码后,第一次出现帐号时候,F8跟出去
mov eax,1
leave
ret

3.合法

两种办法:
FF 25 核心支持库,在1 处理了登录后
取消1的断点,只保留2的断点
然后F8运行出去
leave
ret

2.特征码:
5E 6A 00 4B 75 FB FF E6
处理完登录后,在倒数第二个下断个函数头下断,F8跟出去
leave
ret

4.js运算防止干扰

俩个特征码取其一
头部特征码:
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.运算

处理了js运算后
启用 核心支持库 1 的断点,官方的话,没有进行修改情况下是运行11次
然后观察eax和 堆栈窗口处 +8 的值是否类似
将eax 置0

6.补时间

处理了运算后
取消核心支持库 1 的断点
启用核心支持库 2 的断点
运行几次,观察堆栈窗口,出现字符串 -1时
将其数据窗口中跟随
选中,二进制编辑或快捷键 Ctrl + E 将其 修改为 99999

7.退出

看见网上的方法 
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的
73.png

处理检测OD

通过特征码定位到jmp esi
74.png
其实不定位也行,因为就在下面,F2下断,运行,我试过。这里会断两次。
75.png
这是第一次。按照刚才的处理,将这里返回0

00413910    68 04000080     push    0x80000004                       ; 第一次断下

76.png

00413910    B8 00000000     mov     eax, 0x0                         ; 第一次断下
00413915    C9              leave
00413916    C3              retn

77.png

按照正常的话,这个时候,运行,就可以了。但是这里不行,运行的话就会崩

78.png

所以从第二次断下开始下手

00440E46    68 05000080     push    0x80000005                       ; 第二次断下
00440E4B    6A 00           push    0x0
00440E4D    68 A0D74F00     push    004FD7A0

79.png

00440E46    B8 00000000     mov     eax, 0x0                         ; 第二次断下
00440E4B    C9              leave
00440E4C    C3              retn

80.png

启动完成。
81.png


2.登录

Ctrl+ B 搜索 FF 25 查找到核心支持库,然后在 12中下断。
82.png

83.png
输入帐号密码,点击登录,断下,第一次正常是处理事件,第二次跟出去,这里是被VM后,变成了PUSH。不管他直接修改

00B04C1F    68 BE99BECF     push    0xCFBE99BE                       ; denglu

84.png

00B04C1F    B8 01000000     mov     eax, 0x1                         ; denglu
00B04C24    C9              leave
00B04C25    C3              retn
00B04C26    90              nop
00B04C27    90              nop
00B04C28    90              nop

85.png


3.合法

点击运行,回到1那里,然后取消断点,保留2的断点。
86.png

2断下后,F8跟出来。

006E2237    68 2AB2D07F     push    0x7FD0B22A                       ; 合法

92.png

006E2237    C9              leave                                    ; 合法
006E2238    C3              retn
006E2239    90              nop
006E223A    90              nop
006E223B    90              nop

93.png


4.防止干扰

通过特征码定位

尾部特征码:
C6 07 00 58 8B E5 5D C3

87.png

出现字符串拼接,取消断点,启用2的断点,运行跟过去

88.png

但是这里,不清楚为什么,一运行到2后,堆栈窗口中就出现-1的字符串,也就是时间,这里就顺势修改了。
89.png
90.png

接着运行两次,就出现这个窗口了。
91.png


启动游戏测试效果
94.png

这里不管怎么呼出。都没效果,不知道是还有二次验证还是怎么样。


疑问

为什么会直接跳过了运算,是我漏了什么还是原作者修改后,还是VMP的效果。

为什么处理了时间后没有效果,请问是有二次验证,还是还有什么暗桩。
95.jpg

哇救命,发帖时候又被拦截了,然后一刷新一看,我发了两篇,请问怎么删一篇。。
99.png
100.jpg

软件下载:https://ww.lanzouj.com/i0luqddhr6b 密码:85gg

18.png
19.png
23.png
26.png
46.png
47.png
41.png
42.png
43.png
44.png
45.png

免费评分

参与人数 12威望 +2 吾爱币 +111 热心值 +11 收起 理由
hhjjqq110 + 1 + 1 谢谢@Thanks!
辰星PsychoPrior + 1 + 1 我很赞同!
lsywy520 + 1 + 1 我很赞同!
gaosld + 1 + 1 用心讨论,共获提升!
yixi + 1 + 1 谢谢@Thanks!
Hmily + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
诗木 + 1 + 1 谢谢@Thanks!
woyucheng + 1 + 1 谢谢@Thanks!
yy0400101 + 1 热心回复!
kkkwz + 1 VMP授权锁定,OD脱离调试器,退出,不能直接ret支持库,这的处理
笙若 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
qaz789a4 + 2 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

影风 发表于 2020-6-5 23:26
1.JS按你那么处理显然不行
2.现在的E盾都是加的VMP授权的,所以还得考虑怎么破授权
xieemengxin 发表于 2020-6-6 08:57
是群友吧。。
那个dll里有验证的
运行游戏里面检测了时间 应该是js内容
正常的时间应该是多少天多少分  不是99999这样的
建议搞个正版卡试试  E盾也没有自动封卡 是吧

 楼主| 我要学外挂 发表于 2020-6-5 23:33
影风 发表于 2020-6-5 23:26
1.JS按你那么处理显然不行
2.现在的E盾都是加的VMP授权的,所以还得考虑怎么破授权

所以我来求教了
crack5 发表于 2020-6-5 23:34
初步看是 JS 你是跳过的 有可能别人把游戏数据放在JS上
 楼主| 我要学外挂 发表于 2020-6-5 23:36
crack5 发表于 2020-6-5 23:34
初步看是 JS 你是跳过的 有可能别人把游戏数据放在JS上

那个JS应该是被打乱了,目前我也不知道怎么搞了
crack5 发表于 2020-6-6 02:16
我要学外挂 发表于 2020-6-5 23:36
那个JS应该是被打乱了,目前我也不知道怎么搞了

HookJS 看返回
材鸟 发表于 2020-6-6 07:57
如楼上所讲,或许JS。或许有注入DLL,而DLL里有验证
 楼主| 我要学外挂 发表于 2020-6-6 10:26
xieemengxin 发表于 2020-6-6 08:57
是群友吧。。
那个dll里有验证的
运行游戏里面检测了时间 应该是js内容

他这个好像有自动封卡
kkkwz 发表于 2020-6-6 12:23
影风 发表于 2020-6-5 23:26
1.JS按你那么处理显然不行
2.现在的E盾都是加的VMP授权的,所以还得考虑怎么破授权

VMP授权锁定,基本都有,你去掉了吗?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 12:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表