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
搞不来。没办法了