iamok 发表于 2008-3-19 09:33:21

学习,这个VB程序挺难的。。。。。。。。。。。。。。

yingfeng 发表于 2008-3-21 10:22:36

【文章标题】: 命中双色球本地验证分析
【文章作者】: yingfeng
【作者主页】: bbs.chinapyg.com
【作者QQ号】: 反正不会是123456
【软件名称】: 命中双色球
【下载地址】: 自己搜索下载
【加壳方式】: 无壳
【保护方式】: 本地验证、网络验证、重启验证
【使用工具】: OD
【操作平台】: WinXP sp3
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
因为是VB的程序,可以用VB-Explorer找注册按钮事件

当然你也可根据错误码的对话框提示,下断或其它方法。

00621ADE   > \55            push    ebp                              ;注册按钮事件断下

00621BEA   .E8 1954DEFF   call    <jmp.&MSVBVM60.__vbaFreeVarList>
00621BEF   .83C4 0C       add   esp, 0C
00621BF2   .FF75 E4       push    dword ptr                ; /String
00621BF5   .E8 A652DEFF   call    <jmp.&MSVBVM60.__vbaLenBstr>   ; \__vbaLenBstr
00621BFA   .83F8 0F       cmp   eax, 0F
00621BFD   .0F84 9F000000 je      00621CA2                         ;这里实现假码的长度比较是否为15位,要跳*****
00621C03   .C745 84 04000>mov   dword ptr , 80020004
00621C0A   .C785 7CFFFFFF>mov   dword ptr , 0A
00621C14   .C745 94 04000>mov   dword ptr , 80020004
00621C1B   .C745 8C 0A000>mov   dword ptr , 0A
00621C22   .C785 24FFFFFF>mov   dword ptr , 00435F90   ;ASCII "蚫\O衏:y"
00621C2C   .C785 1CFFFFFF>mov   dword ptr , 8



00621F35   .8D45 8C       lea   eax, dword ptr
00621F38   .50            push    eax
00621F39   .8D45 9C       lea   eax, dword ptr
00621F3C   .50            push    eax
00621F3D   .8D45 AC       lea   eax, dword ptr
00621F40   .50            push    eax
00621F41   .6A 08         push    8
00621F43   .E8 C050DEFF   call    <jmp.&MSVBVM60.__vbaFreeVarList>
00621F48   .83C4 24       add   esp, 24
00621F4B   .0FBF85 B8FEFF>movsx   eax, word ptr
00621F52   .85C0          test    eax, eax
00621F54   .0F84 9F000000 je      00621FF9                         ;这里即是比较所有的字符(机器码跟注册码)是不是特殊的符号

同样要跳过。

00621FFE   > \66:837D E8 0E cmp   word ptr , 0E            ;这里又是进行长度比较是否少于15位,小于就OVER了***********
00622003   .0F8E 89050000 jle   00622592
00622009   .66:C785 A4FEF>mov   word ptr , 0F         ;这里把F入EBP-15C
00622012   .66:C785 A8FEF>mov   word ptr , 1            ;这里把1入EBP-158
0062201B   .66:C745 E8 01>mov   word ptr , 1             ;这里把1入EBP-18
00622021   .EB 15         jmp   short 00622038
00622023   >66:8B45 E8    mov   ax, word ptr
00622027   .66:0385 A8FEF>add   ax, word ptr
0062202E   .0F80 9A060000 jo      006226CE
00622034   .66:8945 E8    mov   word ptr , ax            ;这是AX为计数器,进行循环计算
00622038   >66:8B45 E8    mov   ax, word ptr             ;这里是1入AX,开始都从第1位开始
0062203C   .66:3B85 A4FEF>cmp   ax, word ptr          ;这里比较是否大于F
00622043   .0F8F 57020000 jg      006222A0                         ;大于则跳走
00622049   .C745 B4 01000>mov   dword ptr , 1            ;把1入EBP-4C
00622050   .C745 AC 02000>mov   dword ptr , 2            ;把2入EBP-54
00622057   .C785 34FFFFFF>mov   dword ptr , 0066DA28   ;0066DA28(6740520)
00622061   .C785 2CFFFFFF>mov   dword ptr , 4008
0062206B   .8D45 AC       lea   eax, dword ptr
0062206E   .50            push    eax                              ; /Length8
0062206F   .0FBF45 E8   movsx   eax, word ptr          ; |这里是计数器I
00622073   .50            push    eax                              ; |Start
00622074   .8D85 2CFFFFFF lea   eax, dword ptr           ; |这里是4008
0062207A   .50            push    eax                              ; |dString8
0062207B   .8D45 9C       lea   eax, dword ptr           ; |这里是字符串
0062207E   .50            push    eax                              ; |RetBUFFER
0062207F   .E8 3A4EDEFF   call    <jmp.&MSVBVM60.#632>             ; \rtcMidCharVar
00622084   .8D45 9C       lea   eax, dword ptr
00622087   .50            push    eax                              ; /String8
00622088   .8D45 CC       lea   eax, dword ptr           ; |
0062208B   .50            push    eax                              ; |ARG2
0062208C   .E8 034EDEFF   call    <jmp.&MSVBVM60.__vbaStrVarVal>   ; \__vbaStrVarVal
00622091   .50            push    eax                              ; /String
00622092   .E8 DF4DDEFF   call    <jmp.&MSVBVM60.#516>             ; \rtcAnsiValueBstr
00622097   .66:8945 DC    mov   word ptr , ax            ;这里进行为48即48H
0062209B   .8D4D CC       lea   ecx, dword ptr           ;上面的CALL意思是把机器码的每位ASCII码取出*******
0062209E   .E8 0B4FDEFF   call    <jmp.&MSVBVM60.__vbaFreeStr>
006220A3   .8D45 9C       lea   eax, dword ptr
006220A6   .50            push    eax
006220A7   .8D45 AC       lea   eax, dword ptr
006220AA   .50            push    eax
006220AB   .6A 02         push    2
006220AD   .E8 564FDEFF   call    <jmp.&MSVBVM60.__vbaFreeVarList> ;记为A
006220B2   .83C4 0C       add   esp, 0C
006220B5   .C745 B4 01000>mov   dword ptr , 1
006220BC   .C745 AC 02000>mov   dword ptr , 2
006220C3   .8D45 E4       lea   eax, dword ptr
006220C6   .8985 34FFFFFF mov   dword ptr , eax
006220CC   .C785 2CFFFFFF>mov   dword ptr , 4008
006220D6   .8D45 AC       lea   eax, dword ptr
006220D9   .50            push    eax                              ; /Length8
006220DA   .0FBF45 E8   movsx   eax, word ptr          ; |
006220DE   .50            push    eax                              ; |Start
006220DF   .8D85 2CFFFFFF lea   eax, dword ptr           ; |
006220E5   .50            push    eax                              ; |dString8
006220E6   .8D45 9C       lea   eax, dword ptr           ; |
006220E9   .50            push    eax                              ; |RetBUFFER
006220EA   .E8 CF4DDEFF   call    <jmp.&MSVBVM60.#632>             ; \rtcMidCharVar
006220EF   .8D45 9C       lea   eax, dword ptr
006220F2   .50            push    eax                              ; /String8
006220F3   .8D45 CC       lea   eax, dword ptr           ; |
006220F6   .50            push    eax                              ; |ARG2
006220F7   .E8 984DDEFF   call    <jmp.&MSVBVM60.__vbaStrVarVal>   ; \__vbaStrVarVal
006220FC   .50            push    eax                              ; /String
006220FD   .E8 744DDEFF   call    <jmp.&MSVBVM60.#516>             ; \rtcAnsiValueBstr
00622102   .66:8945 D8    mov   word ptr , ax            ;这上面即是把注册码的每位ASCI码计算出来***********
00622106   .8D4D CC       lea   ecx, dword ptr           ;B
00622109   .E8 A04EDEFF   call    <jmp.&MSVBVM60.__vbaFreeStr>
0062210E   .8D45 9C       lea   eax, dword ptr
00622111   .50            push    eax
00622112   .8D45 AC       lea   eax, dword ptr
00622115   .50            push    eax
00622116   .6A 02         push    2
00622118   .E8 EB4EDEFF   call    <jmp.&MSVBVM60.__vbaFreeVarList>
0062211D   .83C4 0C       add   esp, 0C
00622120   .66:837D DC 30 cmp   word ptr , 30            ;这里比较机器码每位是否为30
00622125   .7C 1B         jl      short 00622142
00622127   .66:837D DC 39 cmp   word ptr , 39            ;这里比较是否为39
0062212C   .7F 14         jg      short 00622142
0062212E   .66:8B45 DC    mov   ax, word ptr             ;如机器码是0-9之间,则机器码的ASCII码-30
00622132   .66:2D 3000    sub   ax, 30
00622136   .0F80 92050000 jo      006226CE
0062213C   .66:8945 DC    mov   word ptr , ax
00622140   .EB 20         jmp   short 00622162
00622142   >66:837D DC 41 cmp   word ptr , 41            ;如机器码不为0-9的数字,则-37
00622147   .7C 19         jl      short 00622162
00622149   .66:837D DC 5A cmp   word ptr , 5A
0062214E   .7F 12         jg      short 00622162
00622150   .66:8B45 DC    mov   ax, word ptr             ;这里为机器码的每一位
00622154   .66:2D 3700    sub   ax, 37                           ;机器码第一位的ASCII码-37
00622158   .0F80 70050000 jo      006226CE
0062215E   .66:8945 DC    mov   word ptr , ax            ;
00622162   >66:837D D8 30 cmp   word ptr , 30            ;这里跟注册码的第一位比较是否为0-9
00622167   .7C 1B         jl      short 00622184
00622169   .66:837D D8 39 cmp   word ptr , 39
0062216E   .7F 14         jg      short 00622184
00622170   .66:8B45 D8    mov   ax, word ptr             ;这里是注册码的每1位的ASCII码
00622174   .66:2D 3000    sub   ax, 30                           ;这里把注册码的每一位-30,
00622178   .0F80 50050000 jo      006226CE
0062217E   .66:8945 D8    mov   word ptr , ax
00622182   .EB 20         jmp   short 006221A4
00622184   >66:837D D8 41 cmp   word ptr , 41
00622189   .7C 19         jl      short 006221A4
0062218B   .66:837D D8 5A cmp   word ptr , 5A
00622190   .7F 12         jg      short 006221A4
00622192   .66:8B45 D8    mov   ax, word ptr
00622196   .66:2D 3700    sub   ax, 37
0062219A   .0F80 2E050000 jo      006226CE
006221A0   .66:8945 D8    mov   word ptr , ax
006221A4   >66:8B45 D8    mov   ax, word ptr             ;这里是上面的结果保存到AX中
006221A8   .66:05 4800    add   ax, 48                           ;
006221AC   .0F80 1C050000 jo      006226CE
006221B2   .66:2B45 E8    sub   ax, word ptr             ;AX=AX-I(I为位)
006221B6   .0F80 12050000 jo      006226CE
006221BC   .66:2B45 DC    sub   ax, word ptr
006221C0   .0F80 08050000 jo      006226CE
006221C6   .66:99         cwd
006221C8   .66:B9 2400    mov   cx, 24                           ;把24放到CX中
006221CC   .66:F7F9       idiv    cx                               ;这里是上面的结果除24
006221CF   .0FBFC2      movsx   eax, dx                        ;把余数保存在EAX中
006221D2   .8945 D0       mov   dword ptr , eax          ;再把入EBP-30中
006221D5   .837D D0 09    cmp   dword ptr , 9            ;比较余数是否少于等于9
006221D9   .7E 61         jle   short 0062223C                   ;如小于则跳向另位处理
006221DB   .8B45 D4       mov   eax, dword ptr
006221DE   .8985 34FFFFFF mov   dword ptr , eax
006221E4   .C785 2CFFFFFF>mov   dword ptr , 8            ;
006221EE   .8B45 D0       mov   eax, dword ptr           ;这里是上次计数的余数
006221F1   .83C0 37       add   eax, 37                        ;余数加上37
006221F4   .0F80 D4040000 jo      006226CE
006221FA   .50            push    eax
006221FB   .8D45 AC       lea   eax, dword ptr
006221FE   .50            push    eax
006221FF   .E8 644EDEFF   call    <jmp.&MSVBVM60.#608>             ;这里是把上面的结果转换成字符
00622204   .8D85 2CFFFFFF lea   eax, dword ptr
0062220A   .50            push    eax
0062220B   .8D45 AC       lea   eax, dword ptr
0062220E   .50            push    eax
0062220F   .8D45 9C       lea   eax, dword ptr
00622212   .50            push    eax
00622213   .E8 AC4CDEFF   call    <jmp.&MSVBVM60.__vbaVarCat>      ;这里是把字符连结起来
00622218   .50            push    eax
00622219   .E8 D64CDEFF   call    <jmp.&MSVBVM60.__vbaStrVarMove>
0062221E   .8BD0          mov   edx, eax
00622220   .8D4D D4       lea   ecx, dword ptr
00622223   .E8 CE4DDEFF   call    <jmp.&MSVBVM60.__vbaStrMove>
00622228   .8D45 9C       lea   eax, dword ptr
0062222B   .50            push    eax
0062222C   .8D45 AC       lea   eax, dword ptr
0062222F   .50            push    eax
00622230   .6A 02         push    2
00622232   .E8 D14DDEFF   call    <jmp.&MSVBVM60.__vbaFreeVarList>
00622237   .83C4 0C       add   esp, 0C
0062223A   .EB 5F         jmp   short 0062229B
0062223C   >8B45 D4       mov   eax, dword ptr           ;这里是上面分支处理,小于9 时
0062223F   .8985 34FFFFFF mov   dword ptr , eax
00622245   .C785 2CFFFFFF>mov   dword ptr , 8
0062224F   .8B45 D0       mov   eax, dword ptr
00622252   .83C0 30       add   eax, 30                        ;+30
00622255   .0F80 73040000 jo      006226CE
0062225B   .50            push    eax
0062225C   .8D45 AC       lea   eax, dword ptr
0062225F   .50            push    eax
00622260   .E8 034EDEFF   call    <jmp.&MSVBVM60.#608>             ;转换成字符
00622265   .8D85 2CFFFFFF lea   eax, dword ptr
0062226B   .50            push    eax
0062226C   .8D45 AC       lea   eax, dword ptr
0062226F   .50            push    eax
00622270   .8D45 9C       lea   eax, dword ptr
00622273   .50            push    eax
00622274   .E8 4B4CDEFF   call    <jmp.&MSVBVM60.__vbaVarCat>      ;字符连接
00622279   .50            push    eax
0062227A   .E8 754CDEFF   call    <jmp.&MSVBVM60.__vbaStrVarMove>
0062227F   .8BD0          mov   edx, eax
00622281   .8D4D D4       lea   ecx, dword ptr
00622284   .E8 6D4DDEFF   call    <jmp.&MSVBVM60.__vbaStrMove>
00622289   .8D45 9C       lea   eax, dword ptr
0062228C   .50            push    eax
0062228D   .8D45 AC       lea   eax, dword ptr
00622290   .50            push    eax
00622291   .6A 02         push    2
00622293   .E8 704DDEFF   call    <jmp.&MSVBVM60.__vbaFreeVarList>
00622298   .83C4 0C       add   esp, 0C
0062229B   >^ E9 83FDFFFF   jmp   00622023
006222A0   >8D45 D4       lea   eax, dword ptr
006222A3   .8985 34FFFFFF mov   dword ptr , eax
006222A9   .C785 2CFFFFFF>mov   dword ptr , 4008
006222B3   .8D85 2CFFFFFF lea   eax, dword ptr
006222B9   .50            push    eax
006222BA   .E8 B34CDEFF   call    <jmp.&MSVBVM60.#561>             ;这个CALL*********,如果上面算出来的结果不是整数
006222BF   .0FBFC0      movsx   eax, ax                                 那么就OVER了
006222C2   .85C0          test    eax, eax                         ;
006222C4   .0F85 9F000000 jnz   00622369****************(这里也要跳走)


00622369   > \FF75 D4       push    dword ptr
0062236C      E8 174BDEFF   call    <jmp.&MSVBVM60.__vbaI4Str>       ;如果上面计算的不溢出,且都是数字,那么这个CALL就正常,否则你会卡死在这
00622371   .A3 64D16600   mov   dword ptr , eax
00622376   .66:C785 9CFEF>mov   word ptr , 0F            则会提出溢出
0062237F   .66:C785 A0FEF>mov   word ptr , 1
00622388   .66:C745 E8 01>mov   word ptr , 1
0062238E   .EB 15         jmp   short 006223A5
00622390   >66:8B45 E8    mov   ax, word ptr
00622394   .66:0385 A0FEF>add   ax, word ptr


然后你就可以配全合F8跟F4很快到
006224DA   .6A 00         push    0
006224DC   .8D45 AC       lea   eax, dword ptr
006224DF   .50            push    eax
006224E0   .E8 514ADEFF   call    <jmp.&MSVBVM60.#595>             ;这里第一步成功对话框
006224E5   .8D85 7CFFFFFF lea   eax, dword ptr
006224EB   .50            push    eax

总结:
机器码为取标准的取硬盘指纹的,如果不足15位,则前面+H0000凑足15位,没有分析(猜的)
把i 作为一个常量
begin
FOR I := 1 to length(注册码长度或机器码长度)
依次取出机器码的每位ASCII码
A:=MID(机器码,I,1)
IF A NOT IN(0-9) THEN
A:=A-37(如果机器码的ASCII码为0-9之间,则减去37)
ELSE
A:=A-30 (反之则减去30)
END
依次取出注册码的每位ASCII码
B:=MID(注册码,I,1)
if b not in(0-9) then(如果不是0-9的数字)
b:=b-37                   -37
else
b:=b-30                     如果是0-9则-30
end
f:=b+48-i                   +48-位置
g:=f-A                     g=注册码计算结果-机器码计算结果
cx:=24                            常量CONST
h:=g mod 24(取余数)               
if h <=9 then(是否少于等于9)
h:=h+30      (分支处理)
else
h:=h+37       (分支处理)
最后把h转换成字符边接输出,结果要不能溢出,且都为数字!


呵呵!!!!!未完,先把本地验证分析了,网络验证没啥讲的,主要是重启验证,抽个时间

也整理下,侍续………………


--------------------------------------------------------------------------------
【版权声明】: 本文原创于PYG技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
                                                       2008年03月21日 2204:25

iamok 发表于 2008-3-21 11:29:34

支持版主,学习知识。。。

chinaren 发表于 2008-3-21 13:33:44

我是在第一次比较注册码位数,直接修改JMP到正确提示(完成本地验证)
00621BFD   .0F84 9F000000 je      00621CA2         ; 比较注册玛是否16位

网络验证是用C32直接找到关键字符,修改了一个跳实现

yingfeng的分析很精彩,膜拜ing...

期待重启验证,我看到文件里有个MzLotto.dat不知道是不是关键..我尝试输入几十位数的注册码长度后,发现这个文件大小也没什么改变,所以放弃这里..

xuewuzhijing 发表于 2008-3-22 10:36:09

更期待精彩的动画教程出笼,让我这种菜鸟学习起来更容易些!

caterpilla 发表于 2008-3-26 15:20:10

这个要好好学习下。。。。。

roking 发表于 2008-3-29 21:23:44

原帖由 chinaren 于 2008-3-21 13:33 发表 https://www.chinapyg.com/images/common/back.gif
。。。。有个MzLotto.dat不知道是不是关键..我尝试输入几十位数的注册码长度后,发现这个文件大小也没什么改变,所以放弃这里

网络验证时,请求了一个文件:
http://www.ledysys.com/SoftReg/MZSSQ/Vail1.txt
如果修改跳转提示网络验证成功并重启验证时,发现好像没有写注册表和其他文件啊,唯一写的就是这个文件MzLotto.dat啊,这个还真值得怀疑!
要不然就是因为虽然提示了验证成功,但由于跳转时机不正确导致实际上并没有记录注册信息。也就导致重启验证无从跟起。

寒轩 发表于 2008-5-23 21:32:31

都是牛人的天堂。。我菜。。学习着学习。。

125472 发表于 2008-5-24 16:55:22

真的是不错,我也要学习一下。最近就是为了语音输入法时就是VB写的,到现在还没有破解

aspirer 发表于 2008-5-25 01:58:29

搞不来。没办法了
页: 1 2 [3] 4
查看完整版本: 这个VB程序捆饶我好久了,请求高人解答