白盒分析+破解 飘零网络验证V4.0多线程版
调试环境:虚拟机(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: ;飘零网络.0043B090
[*]00417C45 [ DISCUZ_CODE_391 ]nbsp; FF25 C0F34900 JMP NEAR DWORD PTR DS: ;飘零网络.0043B0C0
[*]00417C4B [ DISCUZ_CODE_391 ]nbsp; FF25 C4F34900 JMP NEAR DWORD PTR DS: ;飘零网络.0043AC70
[*]00417C51 [ DISCUZ_CODE_391 ]nbsp; FF25 B4F34900 JMP NEAR DWORD PTR DS: ;飘零网络.0043B230
[*]00417C57 [ DISCUZ_CODE_391 ]nbsp; FF25 A0F34900 JMP NEAR DWORD PTR DS: ;飘零网络.0043ACF0
[*]00417C5D [ DISCUZ_CODE_391 ]nbsp; FF25 ACF34900 JMP NEAR DWORD PTR DS: ;飘零网络.0043B100
[*]00417C63 [ DISCUZ_CODE_391 ]nbsp; FF25 A8F34900 JMP NEAR DWORD PTR DS: ;飘零网络.0043B060
[*]00417C69 [ DISCUZ_CODE_391 ]nbsp; FF25 A4F34900 JMP NEAR DWORD PTR DS: ;飘零网络.0043B040
[*]00417C6F [ DISCUZ_CODE_391 ]nbsp; FF25 B8F34900 JMP NEAR DWORD PTR DS: ;飘零网络.0043B150
复制代码注意这行代码:
[*]00417C2A 68 01000152 PUSH 0x52010001
复制代码
是不是感觉很脸熟,没错,这就是易语言启动窗口的ID。
我们把窗口ID改为0x52010201
就像这样:
[*]00417C2A 68 01000152 PUSH 0x52010201
复制代码
这样修改之后,在程序启动时,就会载入窗口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过程加密结束
复制代码
可以看到,在载入窗口后,设置了两个时钟,我们再来看一看这两个时钟:
[*].版本 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过程加密结束
复制代码
这里一堆代码就是检测你的账号有没有登录,现在还好,没登录就给你关闭,以前的版本直接蓝屏了。 说一下我以前是怎样破的,以前的版本很单纯,检测到了就给你蓝屏,那就只需要把蓝屏CALL给和谐掉。
但是现在,虽然没有蓝屏了,感觉还要比以前难搞
想了下,决定修改时钟时间。
我们看这段代码
[*]标签_到期时间.标题 = “到期时间为:” + 到文本 (到期时间)
[*]登陆检测时钟.时钟周期 = 1000 × 60 × 2
[*]时钟_验证动态.时钟周期 = 1000 × 60 × 5
复制代码
如何定位这段代码呢?玩过免杀的朋友肯定首先想到用MAP文件,但是易语言没有MAP文件。
这行代码可以给我们提示
[*]标签_到期时间.标题 = “到期时间为:” + 到文本 (到期时间)
复制代码
也就是说,我们只需要找到“到期时间为”这个字符串,就可以找到设置时钟的代码。 找到的汇编代码:
[*]004177D0|.FF75 FC PUSH
[*]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 , EAX
[*]004177E8|.8B5D FC MOV EBX,
[*]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
[*]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,
[*]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
复制代码
注意这两句:
[*]00417825 68 C0D40100 PUSH 0x1D4C0
复制代码
[*]00417842 68 E0930400 PUSH 0x493E0
复制代码
将0x1D4C0和0x493E0由十六进制转变为十进制,就会发现刚好与1000 × 60 × 2、1000 × 60 × 5这俩个式子的值相同
然后就只需要把他替换为0了,像这样:
[*]00417825 68 C0D40100 PUSH 0x0
[*]00417842 68 E0930400 PUSH 0x0
复制代码
这时,我们就算搞定了校验,运行看看:
大牛 前排 我徒弟是B牛 都是高手啊,让我们菜鸟情何以堪。 月光下の魔术师 发表于 2015-3-7 19:09
提示lz:易语言可以有map文件的,方法是在link.ini中加上extra_args=/FIXED:NO /MAP
恩的。的确! 提示lz:易语言可以有map文件的,方法是在link.ini中加上extra_args=/FIXED:NO /MAP 菜鸟看看就好。。 不错 支持 今天又长见识了,楼主辛苦了
页:
[1]