浩哥霸天下 发表于 2015-3-7 17:26

白盒分析+破解 飘零网络验证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

复制代码
   这时,我们就算搞定了校验,运行看看:







零点 发表于 2015-3-7 17:32

大牛 前排 我徒弟是B牛

yinn456 发表于 2015-3-7 17:47

都是高手啊,让我们菜鸟情何以堪。

浩哥霸天下 发表于 2015-3-7 19:12

月光下の魔术师 发表于 2015-3-7 19:09
提示lz:易语言可以有map文件的,方法是在link.ini中加上extra_args=/FIXED:NO /MAP

恩的。的确!

月光下の魔术师 发表于 2015-3-7 19:09

提示lz:易语言可以有map文件的,方法是在link.ini中加上extra_args=/FIXED:NO /MAP

青稚 发表于 2015-3-7 19:52

菜鸟看看就好。。

hzh491944995 发表于 2015-3-16 17:03

不错 支持

xmp12345 发表于 2015-3-18 19:56

今天又长见识了,楼主辛苦了
页: [1]
查看完整版本: 白盒分析+破解 飘零网络验证V4.0多线程版