好友
阅读权限10
听众
最后登录1970-1-1
|
调试环境:虚拟机(Windows XP)+ 飘零网络验证V4.0多线程版(无壳无VM)
只是感兴趣,没有其他用意
飘零多数被用为易语言的网络验证,因此,我们就要利用易语言PUSH窗口的特性。
何为PUSH窗口?
易语言会为每一个窗口分配一个ID,在载入窗口时,就会PUSH 对应的窗口ID。因此,我们可以直接跳过登录窗口,减少了爆破带来的麻烦~
如何PUSH窗口?
首先使用OD载入程序,跳转到00401000这个位置,如图
这时,我们按“Ctrl+B”,会弹出一个窗口,然后输入特征码:68 ?? ?? ?? 52,如图
然后点击确定,接着不断地重复“Ctrl + L”,会一个一个向下查找。
我们需要记录下其中出现过的PUSH的值:
0x52010001
0x52010201
接着,我们再次回到00401000,然后二进制搜索:FF25
我们就会看到这样的代码片段
- 00417C20 |. E8 C0E7FFFF CALL 飘零网络.004163E5
- 00417C25 |. E8 F6FCFFFF CALL 飘零网络.00417920
- 00417C2A 68 01000152 PUSH 0x52010001
- 00417C2F |. E8 11000000 CALL 飘零网络.00417C45
- 00417C34 |. 83C4 04 ADD ESP, 0x4
- 00417C37 |. E8 03000000 CALL 飘零网络.00417C3F
- 00417C3C |. 33C0 XOR EAX, EAX
- 00417C3E \. C3 RETN
- 00417C3F [ DISCUZ_CODE_391 ]nbsp; FF25 BCF34900 JMP NEAR DWORD PTR DS:[0x49F3BC] ; 飘零网络.0043B090
- 00417C45 [ DISCUZ_CODE_391 ]nbsp; FF25 C0F34900 JMP NEAR DWORD PTR DS:[0x49F3C0] ; 飘零网络.0043B0C0
- 00417C4B [ DISCUZ_CODE_391 ]nbsp; FF25 C4F34900 JMP NEAR DWORD PTR DS:[0x49F3C4] ; 飘零网络.0043AC70
- 00417C51 [ DISCUZ_CODE_391 ]nbsp; FF25 B4F34900 JMP NEAR DWORD PTR DS:[0x49F3B4] ; 飘零网络.0043B230
- 00417C57 [ DISCUZ_CODE_391 ]nbsp; FF25 A0F34900 JMP NEAR DWORD PTR DS:[0x49F3A0] ; 飘零网络.0043ACF0
- 00417C5D [ DISCUZ_CODE_391 ]nbsp; FF25 ACF34900 JMP NEAR DWORD PTR DS:[0x49F3AC] ; 飘零网络.0043B100
- 00417C63 [ DISCUZ_CODE_391 ]nbsp; FF25 A8F34900 JMP NEAR DWORD PTR DS:[0x49F3A8] ; 飘零网络.0043B060
- 00417C69 [ DISCUZ_CODE_391 ]nbsp; FF25 A4F34900 JMP NEAR DWORD PTR DS:[0x49F3A4] ; 飘零网络.0043B040
- 00417C6F [ DISCUZ_CODE_391 ]nbsp; FF25 B8F34900 JMP NEAR DWORD PTR DS:[0x49F3B8] ; 飘零网络.0043B150
复制代码注意这行代码:
- 00417C2A 68 01000152 PUSH 0x52010001
[color=rgb(51, 102, 153) !important]复制代码
是不是感觉很脸熟,没错,这就是易语言启动窗口的ID。
我们把窗口ID改为0x52010201
就像这样:
- 00417C2A 68 01000152 PUSH 0x52010201
[color=rgb(51, 102, 153) !important]复制代码
这样修改之后,在程序启动时,就会载入窗口ID为0x52010201的窗口
######################分割一下############################
当然,飘零作者早就为我们想到了易语言本身的缺陷~早就给我们准备好校验了。
我们来看一下源码:
- .版本 2
- .子程序 _窗口1_创建完毕
- 置入代码 ({ 235, 16, 86, 77, 80, 114, 111, 116, 101, 99, 116, 32, 98, 101, 103, 105, 110, 0 }) ' VMP过程加密开始
- 飘零关闭驱动句柄 (防OD线程驱动句柄)
- 标签_到期时间.标题 = “到期时间为:” + 到文本 (到期时间)
- 登陆检测时钟.时钟周期 = 1000 × 60 × 2
- 时钟_验证动态.时钟周期 = 1000 × 60 × 5
- ' 飘零写通讯数据 (“piaolook”, 静态数据) ' 在DLL用 飘零读通讯数据 (“piaolook”) 取到该防破数据或基址
- ' 调试输出 (静态数据)
- 置入代码 ({ 235, 14, 86, 77, 80, 114, 111, 116, 101, 99, 116, 32, 101, 110, 100, 0 }) ' VMP过程加密结束
[color=rgb(51, 102, 153) !important]复制代码
可以看到,在载入窗口后,设置了两个时钟,我们再来看一看这两个时钟:- .版本 2
- .支持库 EThread
- .子程序 _登陆检测时钟_周期事件
- 置入代码 ({ 235, 16, 86, 77, 80, 114, 111, 116, 101, 99, 116, 32, 98, 101, 103, 105, 110, 0 }) ' VMP过程加密开始
- 启动线程 (&登陆检测线程, , )
- 置入代码 ({ 235, 14, 86, 77, 80, 114, 111, 116, 101, 99, 116, 32, 101, 110, 100, 0 }) ' VMP过程加密结束
- .子程序 登陆检测线程
- 置入代码 ({ 235, 16, 86, 77, 80, 114, 111, 116, 101, 99, 116, 32, 98, 101, 103, 105, 110, 0 }) ' VMP过程加密开始
- .判断开始 (飘零商业效验引擎 (登陆账号) = 1)
- 登陆检测时钟.时钟周期 = 0
- .默认
- 结束 ()
- 置入代码 ({ 204 })
- .判断结束
- 置入代码 ({ 235, 14, 86, 77, 80, 114, 111, 116, 101, 99, 116, 32, 101, 110, 100, 0 }) ' VMP过程加密结束
- .版本 2
- .子程序 _时钟_验证动态_周期事件
- .局部变量 防止重复, 逻辑型, 静态
- 置入代码 ({ 235, 16, 86, 77, 80, 114, 111, 116, 101, 99, 116, 32, 98, 101, 103, 105, 110, 0 }) ' VMP过程加密开始
- .如果真 (防止重复 = 真)
- 返回 ()
- .如果真结束
- .如果真 (飘零是否与互联网连接 () = 假)
- 可视 = 假
- 载入 (窗口_重新连接, , 真)
- .如果真结束
- 防止重复 = 假
- 置入代码 ({ 235, 14, 86, 77, 80, 114, 111, 116, 101, 99, 116, 32, 101, 110, 100, 0 }) ' VMP过程加密结束
[color=rgb(51, 102, 153) !important]复制代码
这里一堆代码就是检测你的账号有没有登录,现在还好,没登录就给你关闭,以前的版本直接蓝屏了。 说一下我以前是怎样破的,以前的版本很单纯,检测到了就给你蓝屏,那就只需要把蓝屏CALL给和谐掉。
但是现在,虽然没有蓝屏了,感觉还要比以前难搞
想了下,决定修改时钟时间。
我们看这段代码- 标签_到期时间.标题 = “到期时间为:” + 到文本 (到期时间)
- 登陆检测时钟.时钟周期 = 1000 × 60 × 2
- 时钟_验证动态.时钟周期 = 1000 × 60 × 5
[color=rgb(51, 102, 153) !important]复制代码
如何定位这段代码呢?玩过免杀的朋友肯定首先想到用MAP文件,但是易语言没有MAP文件。
这行代码可以给我们提示
- 标签_到期时间.标题 = “到期时间为:” + 到文本 (到期时间)
[color=rgb(51, 102, 153) !important]复制代码
也就是说,我们只需要找到“到期时间为”这个字符串,就可以找到设置时钟的代码。 找到的汇编代码:
- 004177D0 |. FF75 FC PUSH [LOCAL.1]
- 004177D3 |. 68 99FB4B00 PUSH 飘零网络.004BFB99 ; 到期时间为:
- 004177D8 |. B9 02000000 MOV ECX, 0x2
- 004177DD |. E8 B49CFEFF CALL 飘零网络.00401496
- 004177E2 |. 83C4 08 ADD ESP, 0x8
- 004177E5 |. 8945 F8 MOV [LOCAL.2], EAX
- 004177E8 |. 8B5D FC MOV EBX, [LOCAL.1]
- 004177EB |. 85DB TEST EBX, EBX
- 004177ED |. 74 09 JE SHORT 飘零网络.004177F8
- 004177EF |. 53 PUSH EBX
- 004177F0 |. E8 5C040000 CALL 飘零网络.00417C51
- 004177F5 |. 83C4 04 ADD ESP, 0x4
- 004177F8 |> 6A 00 PUSH 0x0
- 004177FA |. FF75 F8 PUSH [LOCAL.2]
- 004177FD |. 6A FF PUSH -0x1
- 004177FF |. 6A 08 PUSH 0x8
- 00417801 |. 68 72AA0116 PUSH 0x1601AA72
- 00417806 |. 68 01020152 PUSH 0x52010201
- 0041780B |. E8 53040000 CALL 飘零网络.00417C63
- 00417810 |. 83C4 18 ADD ESP, 0x18
- 00417813 |. 8B5D F8 MOV EBX, [LOCAL.2]
- 00417816 |. 85DB TEST EBX, EBX
- 00417818 |. 74 09 JE SHORT 飘零网络.00417823
- 0041781A |. 53 PUSH EBX
- 0041781B |. E8 31040000 CALL 飘零网络.00417C51
- 00417820 |. 83C4 04 ADD ESP, 0x4
- 00417823 |> 6A 00 PUSH 0x0
- 00417825 68 C0D40100 PUSH 0x1D4C0
- 0041782A |. 6A FF PUSH -0x1
- 0041782C |. 6A 08 PUSH 0x8
- 0041782E |. 68 837A0116 PUSH 0x16017A83
- 00417833 |. 68 01020152 PUSH 0x52010201
- 00417838 |. E8 26040000 CALL 飘零网络.00417C63
- 0041783D |. 83C4 18 ADD ESP, 0x18
- 00417840 |. 6A 00 PUSH 0x0
- 00417842 68 E0930400 PUSH 0x493E0
- 00417847 |. 6A FF PUSH -0x1
- 00417849 |. 6A 08 PUSH 0x8
- 0041784B |. 68 25B80116 PUSH 0x1601B825
- 00417850 |. 68 01020152 PUSH 0x52010201
- 00417855 |. E8 09040000 CALL 飘零网络.00417C63
- 0041785A |. 83C4 18 ADD ESP, 0x18
- 0041785D |. EB 0E JMP SHORT 飘零网络.0041786D
- 0041785F |. 56 4D 50 72 6>ASCII "VMProtect end",0
[color=rgb(51, 102, 153) !important]复制代码
注意这两句:- 00417825 68 C0D40100 PUSH 0x1D4C0
[color=rgb(51, 102, 153) !important]复制代码
- 00417842 68 E0930400 PUSH 0x493E0
[color=rgb(51, 102, 153) !important]复制代码
将0x1D4C0和0x493E0由十六进制转变为十进制,就会发现刚好与1000 × 60 × 2、1000 × 60 × 5这俩个式子的值相同
然后就只需要把他替换为0了,像这样:
- 00417825 68 C0D40100 PUSH 0x0
- 00417842 68 E0930400 PUSH 0x0
[color=rgb(51, 102, 153) !important]复制代码
这时,我们就算搞定了校验,运行看看:
|
|