论坛: 编程破解 标题: [转帖]水晶排课3.80简单分析 复制本贴地址    
作者: yongmin [yongmin]    论坛用户   登录
作者:Nisy (梦醒时分)
水晶排课 3.80
软件大小:7704KB
软件类别:国产软件/教育管理 
下载次数:8853
软件授权:免费版 (这里的免费指的是免费下载)
软件语言:简体中文
运行环境:Win9x/Me/NT/2000/XP/2003
更新时间:2007-7-2 9:56:42
华军下载:
http://www.onlinedown.net/soft/48706.htm
破解工具: LoadPE IR DiE 野猪
破解声明: 只是感兴趣,无他.
[Copy to clipboard]

[ - ]
CODE:
―――――――――――――――――――――――――――――――
―――――――――――――――――――――――――――――――
0059B082 >  60              PUSHAD
0059B083    E8 00000000    CALL 水晶排课.0059B088                      ; 这里ESP定律
―――――――――――――――――――――――――――――――
―――――――――――――――――――――――――――――――
0059B36B    61              POPAD
0059B36C  - FFE0            JMP EAX                                      ; 来到这里 我们F8单步一次
―――――――――――――――――――――――――――――――
―――――――――――――――――――――――――――――――
005926E0    60              PUSHAD                                      ; 又看到PUSHAD
005926E1    BE 00504F00    MOV ESI,水晶排课.004F5000                    ; 这里继续ESP定律
005926E6    8DBE 00C0F0FF  LEA EDI,DWORD PTR DS:[ESI+FFF0C000]
005926EC    57              PUSH EDI
005926ED    83CD FF        OR EBP,FFFFFFFF
005926F0    EB 10          JMP SHORT 水晶排课.00592702
―――――――――――――――――――――――――――――――
―――――――――――――――――――――――――――――――
00592850    61              POPAD
00592851  - E9 9AE9E6FF    JMP 水晶排课.004011F0                        ; 第二次ESP定律后来到这里  F8单步一次
―――――――――――――――――――――――――――――――
―――――――――――――――――――――――――――――――
004011F0    68 BC724000    PUSH 水晶排课.004072BC                      ; 来到OEP 原来是VB程序
004011F5    E8 F0FFFFFF    CALL 水晶排课.004011EA                      ; JMP 到 MSVBVM60.ThunRTMain
―――――――――――――――――――――――――――――――
―――――――――――――――――――――――――――――――
LoadPE Dump, IR修复。 修复后,DiE查看一下,P-CODE编译的,对P-CODE不了解,先注册看看,实在不行在Vbdebug搞它。

运行修复文件,可以运行,那就省去修复了。软件重启动验证,我们随意输入KEY重启看看。VB呢,有个比较函数,如果软件使用了这个函数来比较真假注册码,即便是P-CODE,也是徒劳。因为VB对比数据的时候大多在堆栈中进行,导致了明码比较存在的这个致命伤。
一般OD还不行,那我们就野猪对付。下_vbsStrComp (我初下断点的时候还下了个_vbsStrCmp,但是这个没什么用)。
QUOTE:
通过调试,我们发现软件是如何检测被调试的:
0012E8B4  6601B0C3  返回到 msvbvm60.6601B0C3 来自 msvbvm60.__vbaStrComp
0012E8B8  00000000
0012E8BC  0042AA10  UNICODE "explorer.exe"
0012E8C0  00151964  UNICODE "avp.exe"
0012E8C4  660FD4B0  返回到 msvbvm60.660FD4B0 来自 msvbvm60.6601B0A9
0012E8C8  00000000
0012E8CC  0042AA10  UNICODE "explorer.exe"
0012E8D0  00151964  UNICODE "avp.exe"
他会对比我们系统中运行的每一个进程,来判断是否被调试。
[Copy to clipboard]

[ - ]
CODE:
我们一路F9,直到在堆栈中看到我们的机器码:
0012E8B4  6601B0C3  返回到 msvbvm60.6601B0C3 来自 msvbvm60.__vbaStrComp
0012E8B8  00000000
0012E8BC  0042093C  unpack_.0042093C
0012E8C0  00150EB4  UNICODE "L420VACG"
0012E8C4  660FD4B0  返回到 msvbvm60.660FD4B0 来自 msvbvm60.6601B0A9
0012E8C8  00000000
0012E8CC  0042093C  unpack_.0042093C
0012E8D0  00150EB4  UNICODE "L420VACG"
这个时候F9的速度就要放慢了,大概四五次之后,我们在堆栈中看到连续的两处存放机器码:
0012E8B4  6601B0C3  返回到 msvbvm60.6601B0C3 来自 msvbvm60.__vbaStrComp
0012E8B8  00000000
0012E8BC  00151AC4  UNICODE "L420VACG"
0012E8C0  00151B5C  UNICODE "L420VACG"
0012E8C4  660FD4B0  返回到 msvbvm60.660FD4B0 来自 msvbvm60.6601B0A9
0012E8C8  00000000
0012E8CC  00151AC4  UNICODE "L420VACG"
0012E8D0  00151B5C  UNICODE "L420VACG"
这个时候我们F9一次,就可以在堆栈中找到真码了:
0012E8B4  6601B0C3  返回到 msvbvm60.6601B0C3 来自 msvbvm60.__vbaStrComp
0012E8B8  00000000
0012E8BC  00151F04  UNICODE "F195F0C76DF012EEB1F828D209CC2CE6"
0012E8C0  00151E84  UNICODE "F195F0C76DF012EEB1F828D209CC2CE6"
0012E8C4  660FD4B0  返回到 msvbvm60.660FD4B0 来自 msvbvm60.6601B0A9
0012E8C8  00000000
0012E8CC  00151F04  UNICODE "F195F0C76DF012EEB1F828D209CC2CE6"
0012E8D0  00151E84  UNICODE "F195F0C76DF012EEB1F828D209CC2CE6"
0012E8D4  00000000
0012E8D8  004F0000  unpack_.004F0000
0012E8DC  0014E750
0012E8E0  00151AC4  UNICODE "519DC0E27C"
0012E8E4  0012FAEC
0012E8E8  00000000
0012E8EC  00000000
0012E8F0  00151B04  UNICODE "519DC0E27C"
0012E8F4  00000000
0012E8F8  00530008  unpack_.00530008
0012E8FC  00000008
0012E900  00151964  UNICODE "0E27C"
0012E904  00151A84  UNICODE "519DC"
0012E908  00000008
0012E90C  00000000
0012E910  00151E1C  UNICODE "519DCEBFACA3B79E937C67D72CD0E27C"
0012E914  00000000
0012E918  00000000
0012E91C  00000000
0012E920  00000000
0012E924  00000000
0012E928  00000000
0012E92C  00000000
0012E930  00000000
0012E934  00151F04  UNICODE "F195F0C76DF012EEB1F828D209CC2CE6"
0012E938  00140000
0012E93C  004FD140  unpack_.004FD140
0012E940  00151A5C  UNICODE "L420VACG"
0012E944  00000000
0012E948  00151E84  UNICODE "F195F0C76DF012EEB1F828D209CC2CE6"
0012E94C  00151AC4  UNICODE "519DC0E27C"
0012E950  00151B04  UNICODE "519DC0E27C"
0012E954  00151A5C  UNICODE "L420VACG"
QUOTE:
我们看这里:“519DC0E27C”就是真码:
而真码是如何进行计算呢?我们看一下这里就可以明白:
0012E900  00151964  UNICODE "0E27C"
0012E904  00151A84  UNICODE "519DC"
0012E908  00000008
0012E90C  00000000
0012E910  00151E1C  UNICODE "519DCEBFACA3B79E937C67D72CD0E27C"
计算某个数值的MD5,取该数值MD5的前5位和后5位,连接后即是真码,也是就说真码是10位。
我们来检测一下机器码的MD5:
JQM:L420VACG
MD5: A4077FF2497477C6CDCF01F769B97BFC

看来这里用的不是常规的MD5,从32位这个数值来看,可以大致来推出是MD的运算,我们用KANAL查看一下,确实是MD5。

那就有两种可能,一是把四个常数替换了,还有一个就是先对机器码做了一个运算,然后MD5。第二种可能性更大些。明码比较,由于本人P-CODE不熟悉,所以分析就到此为止了,有兴趣的朋友自己跟一下吧。
总结下:
软件作者有了一定的加密意识,双壳+反调试+P-CODE编译。但总体来看,作者对解密了解不多。想要提高加密, 还要从了解解密入手。



地主 发表时间: 07-07-07 10:14

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号