文章作者: dthexin 
下载地址: http://yncnc.onlinedown.net/soft/863.htm
使用工具: ODbyDYK v1.10[05.09],peid,W32dsm8.93


文章简介

中华灯谜 XP 2005 Build 01.20
是目前国产最好的灯谜软件,软件中的灯谜类别
齐全,灯谜条数可能是一个足以令你目瞪口呆的
数字。软件受近十家刊物多次推荐,支持模糊搜
索、排序、添加、删除等,使用简单,功能强大
,可喜的是软件还集成了〖中华灯谜宝典〗,
该宝典资料浩瀚,是所有猜谜高手案头必备的
猜谜资料,软件随时升级。

破解过程
 
程序没有加壳,
输入:定单号:821201
     注册码:9898
错误提示:注册码错误,请重新输入。
W32dsm8.93分析,断在这里,ODbyDYK载入:
005245EE |. >call ; \GetSystemDirectoryA
005245F3 |. >lea eax,dword ptr ss:[ebp-4]
005245F6 |. >lea edx,dword ptr ss:[ebp-85]
005245FC |. >mov ecx,81
00524601 |. >call zhdm.00404B64
00524606 |. >lea edx,dword ptr ss:[ebp-8C]
0052460C |. >mov eax,dword ptr ds:[ebx+3F8]
00524612 |. >call zhdm.00445E14 ;             取注册码
00524617 |. >cmp dword ptr ss:[ebp-8C],0 ;    注册码是否为空
0052461E |. >je short zhdm.0052463A ;         为空则跳over
00524620 |. >lea edx,dword ptr ss:[ebp-90]
00524626 |. >mov eax,dword ptr ds:[ebx+3F4]
0052462C |. >call zhdm.00445E14 ;             取定单号长度
00524631 |. >cmp dword ptr ss:[ebp-90],0 ;    定单号是否为空
00524638 |. >jnz short zhdm.00524649 ;        定单号长度为空则跳over
0052463A |> >mov eax,zhdm.00524828
0052463F |. >call zhdm.0043F008
00524644 |. >jmp zhdm.0052479A
00524649 |> >lea edx,dword ptr ss:[ebp-94]
0052464F |. >mov eax,dword ptr ds:[ebx+3F8]
00524655 |. >call zhdm.00445E14 ;             反回注册码长度4
0052465A |. >mov eax,dword ptr ss:[ebp-94] ;  eax=9898
00524660 |. >push eax ; 入栈
00524661 |. >lea edx,dword ptr ss:[ebp-9C]
00524667 |. >mov eax,dword ptr ds:[ebx+3F4]
0052466D |. >call zhdm.00445E14 ;             反回定单号长度6
00524672 |. >mov eax,dword ptr ss:[ebp-9C] ;  定单号存入eax,eax=821201
00524678 |. >call zhdm.004095F4 ;             转为16进制数
0052467D |. >mov ecx,309 ;                    ecx=309十六进制
00524682 |. >cdq ;                            不知道是什么指令
00524683 |. >idiv ecx ;                     C87D1/309=420就是    用                                            821201/777
00524685 |. >mov eax,edx
00524687 |. >lea edx,dword ptr ss:[ebp-98]
0052468D |. >call zhdm.00409590
00524692 |. >lea eax,dword ptr ss:[ebp-98]
00524698 |. >push eax
00524699 |. >lea edx,dword ptr ss:[ebp-A8]
0052469F |. >mov eax,dword ptr ds:[ebx+3F4]
005246A5 |. >call zhdm.00445E14 ;            定单号长度6
005246AA |. >mov eax,dword ptr ss:[ebp-A8] ; eax=821201
005246B0 |. >call zhdm.004095F4 ;           将定单号转为16进制 数"C87D1"
005246B5 |. >lea edx,dword ptr ss:[ebp-A4]
005246BB |. >call zhdm.00522204 ;           对定单号进行第一次计算
005246C0 |. >mov eax,dword ptr ss:[ebp-A4] ; edx=50025656
005246C6 |. >call zhdm.004095F4 ;            转为16进制数"02FB54B8"
005246CB |. >lea edx,dword ptr ss:[ebp-A0] ; "02FB54B8"=50025656
005246D1 |. >call zhdm.005222E4 ;            进行第二次计算
005246D6 |. >mov edx,dword ptr ss:[ebp-A0] ; EDX="37l4v132{g7935"
005246DC |. >pop eax
005246DD <>|. >call zhdm.00404BBC ;           进行第三次计算,字串前面加上689成为注册码
005246E2 |. >mov edx,dword ptr ss:[ebp-98] ; EDX=“68937l4v132{g7935"连接字符串
005246E8 |. >pop eax
005246E9 |. >call zhdm.00404CF8 ;           真假注册码按位进行比较
005246EE |. >jnz zhdm.00524783 ;            不相等则注册失败
005246F4 |. >mov eax,zhdm.00524848
005246F9 |. >call zhdm.0043F008
005246FE |. >mov edx,zhdm.0052486C
00524703 |. >mov eax,dword ptr ds:[ebx+3D8]
00524709 |. >call zhdm.00445E44
0052470E |. >lea eax,dword ptr ss:[ebp-AC]
00524714 |. >mov ecx,zhdm.00524884 ; ASCII "\CoIn_o.dll"

***********005246BB |. >call zhdm.00522204 *********************************************

00522204 /$ >push ebp
00522205 |. >mov ebp,esp
00522207 |. >xor ecx,ecx
00522209 |. >push ecx
0052220A |. >push ecx
0052220B |. >push ecx
0052220C |. >push ecx
0052220D |. >push ebx
0052220E |. >push esi
0052220F |. >mov esi,edx
00522211 |. >mov ebx,eax ;                  EBX=定单号“C87D1“
00522213 |. >xor eax,eax
00522215 |. >push ebp
00522216 |. >push zhdm.005222D4
0052221B |. >push dword ptr fs:[eax]
0052221E |. >mov dword ptr fs:[eax],esp
00522221 |. >xor ebx,0B25F1 ;             EBX xor 0B25F1 为 注册码第一次运算
00522227 |. >mov eax,ebx ;                EAX=7A220,(500256)
00522229 |. >xor edx,edx
0052222B |. >push edx ; /Arg2 => 00000000
0052222C |. >push eax ; |Arg1
0052222D |. >lea eax,dword ptr ss:[ebp-4] ; |
00522230 |. >call zhdm.004095C0 ; \zhdm.004095C0
00522235 |. >mov eax,dword ptr ss:[ebp-4] ;  eax=500256
00522238 |. >movzx eax,byte ptr ds:[eax] ;    取第一个字符“5”(35)
0052223B |. >mov edx,dword ptr ss:[ebp-4] ;   edx=500256
0052223E |. >movzx edx,byte ptr ds:[edx+1] ;   取第二个字符“0”
00522242 |. >add eax,edx ; eax=eax+edx"35+30
00522244 |. >mov ecx,5 ; ecx=5
00522249 |. >cdq ; ?
0052224A |. >idiv ecx ;                        eax/ecx结果放在EAX中,余数在EDX中
0052224C |. >add dl,34 ;                      dl=34+刚才的余数1=35
0052224F |. >mov byte ptr ss:[ebp-8],dl ;     存入数组
00522252 |. >mov eax,dword ptr ss:[ebp-4] ;    eax=500256
00522255 |. >movzx eax,byte ptr ds:[eax+2] ;    取第三位0
00522259 |. >mov edx,dword ptr ss:[ebp-4]
0052225C |. >movzx edx,byte ptr ds:[edx+3] ;    取第四位2
00522260 |. >add eax,edx ; eax+edx=32+30
00522262 |. >mov ecx,5 ; ecx=5
00522267 |. >cdq
00522268 |. >idiv ecx
0052226A |. >mov ebx,edx
0052226C |. >add bl,33 ;                       余数加上33存入数组
0052226F |. >mov byte ptr ss:[ebp-7],bl
00522272 |. >lea eax,dword ptr ss:[ebp-C]
00522275 |. >mov dl,byte ptr ss:[ebp-8] ;      好像是取刚才存入数组的第一位5
00522278 |. >call zhdm.00404ADC
0052227D |. >mov eax,dword ptr ss:[ebp-C]
00522280 |. >lea edx,dword ptr ss:[ebp-4]
00522283 |. >mov ecx,1B
00522288 |. >call zhdm.00404E94
0052228D |. >lea eax,dword ptr ss:[ebp-10]
00522290 |. >mov edx,ebx
00522292 |. >call zhdm.00404ADC
00522297 |. >mov eax,dword ptr ss:[ebp-10]
0052229A |. >lea edx,dword ptr ss:[ebp-4]
0052229D |. >mov ecx,19
005222A2 |. >call zhdm.00404E94 ;             好像是将刚才的两个字符接在500256的
后面成为新的字串50025656
005222A7 |. >mov eax,esi
005222A9 |. >mov edx,dword ptr ss:[ebp-4] ;   EDX=50025656
005222AC |. >call zhdm.00404950
005222B1 |. >xor eax,eax
005222B3 |. >pop edx
005222B4 |. >pop ecx
005222B5 |. >pop ecx

************005246D1 |. >call zhdm.005222E4 ********************************
005222E4 /$ >push ebp
005222E5 |. >mov ebp,esp
005222E7 |. >xor ecx,ecx
005222E9 |. >push ecx
005222EA |. >push ecx
005222EB |. >push ecx
005222EC |. >push ecx
005222ED |. >push ecx
005222EE |. >push ecx
005222EF |. >push ebx
005222F0 |. >push esi
005222F1 |. >mov esi,edx
005222F3 |. >mov ebx,eax
005222F5 |. >xor eax,eax
005222F7 |. >push ebp
005222F8 |. >push zhdm.00522430
005222FD |. >push dword ptr fs:[eax]
00522300 |. >mov dword ptr fs:[eax],esp
00522303 |. >xor ebx,DDFB7687 ;               EBX xor DDFB7687 为新有字符串
00522309 |. >mov eax,ebx ; EAX=DF00223F
0052230B |. >xor edx,edx
0052230D |. >push edx ; /Arg2 => 00000000
0052230E |. >push eax ; |Arg1
0052230F |. >lea eax,dword ptr ss:[ebp-4] ; |
00522312 |. >call zhdm.004095C0 ; \zhdm.004095C0
00522317 |. >mov eax,dword ptr ss:[ebp-4] ;    eax=3741327935
0052231A |. >movzx eax,byte ptr ds:[eax] ;      取第一个字符3
0052231D |. >mov edx,dword ptr ss:[ebp-4]
00522320 |. >movzx edx,byte ptr ds:[edx+1] ;     取第二个字符
00522324 |. >add eax,edx ;                        第一个字符加上第二个字符
00522326 |. >mov ecx,5
0052232B |. >cdq
0052232C |. >idiv ecx ;                          再除以5
0052232E |. >add dl,66 ;                          余数加上66
00522331 |. >mov byte ptr ss:[ebp-8],dl ;        将字符存入数组
00522334 |. >mov eax,dword ptr ss:[ebp-4]
00522337 |. >movzx eax,byte ptr ds:[eax+2] ;    取第三个字符4
0052233B |. >mov edx,dword ptr ss:[ebp-4]
0052233E |. >movzx edx,byte ptr ds:[edx+3] ;     取第四个字符1
00522342 |. >add eax,edx ;                        第三个字符加上第四个字符
00522344 |. >mov ecx,5
00522349 |. >cdq
0052234A |. >idiv ecx ;                       再除以5,余数加上75做为字符
0052234C |. >add dl,75
0052234F |. >mov byte ptr ss:[ebp-7],dl ;     再存入数组
00522352 |. >mov eax,dword ptr ss:[ebp-4]
00522355 |. >movzx eax,byte ptr ds:[eax+4] ; 取第五个字符3
00522359 |. >mov edx,dword ptr ss:[ebp-4]
0052235C |. >movzx edx,byte ptr ds:[edx+5] ; 取第六个字符2
00522360 |. >add eax,edx ;                   第五个字符加上第六个字符
00522362 |. >mov ecx,5
00522367 |. >cdq
00522368 |. >idiv ecx ;                       之和再除以5,余数加上7A
0052236A |. >add dl,7A
0052236D |. >mov byte ptr ss:[ebp-6],dl ;     存入数组
00522370 |. >mov eax,dword ptr ss:[ebp-4]
00522373 |. >movzx eax,byte ptr ds:[eax+6] ; 取第七个字符7
00522377 |. >mov edx,dword ptr ss:[ebp-4]
0052237A |. >movzx edx,byte ptr ds:[edx+7] ; 取第八个字符9
0052237E |. >add eax,edx ;                   第七个字符加上第八个字符
00522380 |. >mov edx,dword ptr ss:[ebp-4]
00522383 |. >movzx edx,byte ptr ds:[edx+8] ; 取第九个字符3
00522387 |. >add eax,edx ;                    第七、八、九个字符相加
00522389 |. >mov ecx,5
0052238E |. >cdq
0052238F |. >idiv ecx ;                       然后再除以5余数加上69
00522391 |. >add dl,69
00522394 |. >mov byte ptr ss:[ebp-5],dl ;    存入数组
00522397 |. >lea eax,dword ptr ss:[ebp-C]
0052239A |. >mov dl,byte ptr ss:[ebp-8] ;    dl=67字符“g“存入的第一个字符
0052239D |. >call zhdm.00404ADC
005223A2 |. >mov eax,dword ptr ss:[ebp-C]
005223A5 |. >lea edx,dword ptr ss:[ebp-4]
005223A8 |. >mov ecx,7
005223AD |. >call zhdm.00404E94 ; 1          //应该是将前面计算的字符
放入字串中的一个位置,里面的CALL太多,我没有跟进去,这是猜的.
005223B2 |. >lea eax,dword ptr ss:[ebp-10] ; EAX=g7935
005223B5 |. >mov dl,byte ptr ss:[ebp-5]
005223B8 |. >call zhdm.00404ADC ; 2
005223BD |. >mov eax,dword ptr ss:[ebp-10]
005223C0 |. >lea edx,dword ptr ss:[ebp-4]
005223C3 |. >mov ecx,3
005223C8 |. >call zhdm.00404E94 ; 3
005223CD |. >lea eax,dword ptr ss:[ebp-14]
005223D0 |. >mov dl,byte ptr ss:[ebp-7]
005223D3 |. >call zhdm.00404ADC
005223D8 |. >mov eax,dword ptr ss:[ebp-14]
005223DB |. >lea edx,dword ptr ss:[ebp-4]
005223DE |. >mov ecx,5
005223E3 |. >call zhdm.00404E94 ; 4
005223E8 |. >lea eax,dword ptr ss:[ebp-18]
005223EB |. >mov dl,byte ptr ss:[ebp-6]
005223EE |. >call zhdm.00404ADC
005223F3 |. >mov eax,dword ptr ss:[ebp-18]
005223F6 |. >lea edx,dword ptr ss:[ebp-4]
005223F9 |. >mov ecx,9
005223FE |. >call zhdm.00404E94 ; 5
00522403 |. >mov eax,esi
00522405 |. >mov edx,dword ptr ss:[ebp-4] ; 字符串连接完毕“37l4v132{g7935“
00522408 |. >call zhdm.00404950
0052240D |. >xor eax,eax
0052240F |. >pop edx
00522410 |. >pop ecx

 

总结
 

 

1、定单号的十六进制数 xor 0B25F1 作为第一次运算,记为SN_1 .
2、将SN_1转成十进制数,第一位与第二位相加之和,再除以5,余数加上34作为新的字符存入数组。
第三位与第四位相加之和,再除以5,余数加上33作为新的字符串存入数组
将新计算的两个字符接在SN_1的后面,记为SN_2。
3、将SN_2转为十六进制数 xor DDFB7687 ,记为SN_3。
4、将SN_3的第一位与第二位相加之和,除以5,余数加上66成为新的字符存入数组ss
将SN_3的第三位与第四位相加之和,除以5,余数加上75成为新的字符存入数组ss
将SN_3的第五位与第六位相加之和,除以5,余数加上7A成为新的字符存入数组ss
将SN_3的第七、八、九位相加之和,除以5,余数加上69成为新的字符存入数组ss
将SN_3的前六位与后四位分开,记为SN4和SN5
将ss[1]接在SN5的前面。
将ss[2]放在SN4的第四位与第五位之间。
将ss[3]放在SN4的后面。
将ss[4]放在SN4的第三位与第四位之间。
完成后记为SN_4
5、在SN_4的前面接上字符串“689”,就是序列号



定单号:821201

注册码:68937l4v132{g7935