-
-
[旧帖] [转帖]超级拖拉机4.02算法分析 0.00雪花
-
发表于: 2008-3-7 14:56 3812
-
超级拖拉机
超级拖拉机是一个四副牌的拖拉机游戏,在全国范围都有广泛使用。
游戏有多种设定以适应不同地方的规则。游戏支持单人玩,也支网络
多人一起玩。最新版4.02
下载地址: http://yywk.nease.net/
软件限制:在单人游戏中,未注册版本的悔牌次数受限制。在多人游戏中,
未注册版本只能玩一段时间。
【破解工具】:Ollydbg1.09 中文版
【过 程】:
呵呵,我们开工吧!唉!^-^^-^ 我的水平很低,许多地方表达的有问题,烦请各位指教!
用ollydbg加载运行 ,发现是个重起效验型的软件.输入注册码后,软件用用户名和试验码
计算(加密注册信息)得到新的字符串后放到注册表:
[HKEY_LOCAL_MACHINE\SOFTWARE\yywk\超级拖拉机]-reg下
输入试验码:123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJK (一共要46位)
说明:试验码没有46位,程序在用用户名计算的值移动试验码时,就会计算出一些别的字符在
比较的字符串中,引起无法正确跟踪.
开始:
第一部分---注册表中注册信息的处理过程
用0llydbg加载后下 RegQueryvalueExA中断:
|
00423A4E PUSH 超级拖拉.0046D470 ; ASCII "reg"
00423A53 PUSH EAX
00423A54 MOV BYTE PTR SS:[EBP+2E8], 0
00423A5B MOV DWORD PTR SS:[ESP+28], ESI
00423A5F CALL EBX ; //读注册信息
00423A61 MOV EAX, DWORD PTR SS:[ESP+10]
00423A65 CMP EAX, ESI
00423A67 JNB SHORT 超级拖拉.00423A75
00423A69 MOV ECX, DWORD PTR SS:[EBP+530]
; ECX<==SS:[470D98]=01260490. ASCII "q02$%7'yc"k$%&'jhz{m}N/r1z3456uyij@RcGO"
00423A6F MOV BYTE PTR DS:[EAX+ECX], 0
00423A73 JMP SHORT 超级拖拉.00423A7F
|
00423ADD MOV EAX, DWORD PTR SS:[EBP+530] ; EAX<==01260490.
00423AE3 PUSH EAX
00423AE4 CALL 超级拖拉.004051B0
00423AE9 MOV EDI, EAX ; EDI=EAX (长度)
00423AEB XOR ECX, ECX
00423AED ADD ESP, 4
00423AF0 CMP EDI, ECX
00423AF2 MOV DWORD PTR SS:[ESP+1C], ECX
00423AF6 MOV BYTE PTR SS:[ESP+20], 1
00423AFB MOV BYTE PTR SS:[ESP+21], 2
00423B00 MOV BYTE PTR SS:[ESP+22], 40
00423B05 MOV BYTE PTR SS:[ESP+23], 20
00423B0A MOV BYTE PTR SS:[ESP+24], 8
00423B0F MOV BYTE PTR SS:[ESP+25], 10 ; //计算开始
00423B14 JLE SHORT 超级拖拉.00423B55
; SS:[12F498]<== 01 02 40 20 08 10 1A 02 赋值
00423B16 /MOV EAX, ECX
00423B18 |XOR EDX, EDX
00423B1A |DIV DWORD PTR SS:[ESP+18]
00423B1E |MOV ESI, 6 ; ESI=6
00423B23 |MOV DL, BYTE PTR SS:[ESP+EDX+28] ; DL<==4A ('J')
00423B27 |MOV BYTE PTR SS:[ESP+1C], DL
00423B2B |MOV EAX, DWORD PTR SS:[ESP+1C] ; EAX<==4A ('J')
00423B2F |CDQ
00423B30 |IDIV ESI ; EAX= 4A IDIV ESI=6 ==>EAX= 0C EDX=2
00423B32 |MOV EAX, DWORD PTR SS:[EBP+530] ; EAX<==01260490.
00423B38 |LEA ESI, DWORD PTR DS:[ECX+EAX] ; EAX<==01260490. ECX=0
00423B3B |MOV AL, BYTE PTR DS:[ECX+EAX] ; AL<== 77 ('w')
00423B3E |MOV DL, BYTE PTR SS:[ESP+EDX+20] ; DL<==40 ('@')
00423B42 |TEST AL, DL
00423B44 |JNZ SHORT 超级拖拉.00423B4A
00423B46 |OR AL, DL
00423B48 |JMP SHORT 超级拖拉.00423B4E
00423B4A |NOT DL
00423B4C |AND AL, DL
00423B4E |INC ECX
00423B4F |MOV BYTE PTR DS:[ESI], AL
00423B51 |CMP ECX, EDI
00423B53 \JL SHORT 超级拖拉.00423B16
; //这里把注册表中加密的注册信息还原成原来的试验码
; DS:[ESI]=01260490,(ASCII"123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJK")
00423B74 MOV EAX, DWORD PTR SS:[EBP+530]
; EAX<==01260490,(ASCII"123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJK")
00423B7A POP EDI
00423B7B POP ESI
00423B7C MOV DL, BYTE PTR DS:[EAX+20] ; DL=0
00423B7F MOV CL, BYTE PTR DS:[EAX+2] ; CL=DS:[1260492]
00423B82 MOV BYTE PTR DS:[EAX+2], DL
00423B85 MOV EAX, DWORD PTR SS:[EBP+530] ; EAX<==01260490,
00423B8B MOV BYTE PTR DS:[EAX+20], CL ; DS:[EAX+20]=CL
00423B8E MOV EAX, DWORD PTR SS:[EBP+530] ; EAX<==01260490,
00423B94 MOV DL, BYTE PTR DS:[EAX+17] ; DL=DS:[EAX+17]
00423B97 MOV CL, BYTE PTR DS:[EAX+7] ; CL=DS:[EAX+7]
00423B9A MOV BYTE PTR DS:[EAX+7], DL ; DL=
00423B9D MOV EAX, DWORD PTR SS:[EBP+530] ; EAX<==01260490
00423BA3 MOV BYTE PTR DS:[EAX+17], CL
00423BA6 MOV EAX, DWORD PTR SS:[EBP+530] ; EAX<==01260490
00423BAC MOV DL, BYTE PTR DS:[EAX+12]
00423BAF MOV CL, BYTE PTR DS:[EAX+1D]
00423BB2 MOV BYTE PTR DS:[EAX+1D], DL
00423BB5 MOV EAX, DWORD PTR SS:[EBP+530]
00423BBB MOV BYTE PTR DS:[EAX+12], CL
00423BBE MOV EAX, DWORD PTR SS:[EBP+530]
00423BC4 MOV DL, BYTE PTR DS:[EAX+2A]
00423BC7 MOV CL, BYTE PTR DS:[EAX+1F]
00423BCA MOV BYTE PTR DS:[EAX+1F], DL
00423BCD MOV EAX, DWORD PTR SS:[EBP+530]
00423BD3 MOV BYTE PTR DS:[EAX+2A], CL
00423BD6 MOV EAX, DWORD PTR SS:[EBP+530]
00423BDC MOV DL, BYTE PTR DS:[EAX+C]
00423BDF MOV CL, BYTE PTR DS:[EAX+24]
00423BE2 MOV BYTE PTR DS:[EAX+24], DL
00423BE5 MOV EAX, DWORD PTR SS:[EBP+530]
00423BEB MOV BYTE PTR DS:[EAX+C], CL
00423BEE MOV EAX, DWORD PTR SS:[EBP+530]
00423BF4 MOV DL, BYTE PTR DS:[EAX+21]
00423BF7 MOV CL, BYTE PTR DS:[EAX+28]
00423BFA MOV BYTE PTR DS:[EAX+28], DL
00423BFD MOV EAX, DWORD PTR SS:[EBP+530]
00423C03 MOV BYTE PTR DS:[EAX+21], CL
00423C06 MOV EAX, DWORD PTR SS:[EBP+530]
00423C0C MOV DL, BYTE PTR DS:[EAX+F]
00423C0F MOV CL, BYTE PTR DS:[EAX+19]
00423C12 MOV BYTE PTR DS:[EAX+19], DL
00423C15 MOV EAX, DWORD PTR SS:[EBP+530]
00423C1B MOV BYTE PTR DS:[EAX+F], CL
00423C1E MOV EAX, DWORD PTR SS:[EBP+530]
00423C24 MOV DL, BYTE PTR DS:[EAX+14]
00423C27 MOV CL, BYTE PTR DS:[EAX+5]
00423C2A MOV BYTE PTR DS:[EAX+5], DL
00423C2D MOV EAX, DWORD PTR SS:[EBP+530]
00423C33 POP EBP
00423C34 MOV BYTE PTR DS:[EAX+14], CL ; CL=36
00423C37 ADD ESP, 3C ; //EAX=01260490
00423C3A RETN
****************
00423C2D MOV EAX <==12x45l7o9abcBefqhiuklmn8pgrstjvH3FzAdCDEyGwIJK
到这里试验码变成 "12x45l7o9abcBefqhiuklmn8pgrstjvH3FzAdCDEyGwIJK"
; //以上把试验码打散
===============================================================
第二部分--注册码的计算(实际上是把试验码用用户名计算的值做参数重新排列)
004231AD CALL 超级拖拉.004051B0
004231B2 MOV EBX, EAX ; EBX=EAX=6长度
004231B4 ADD ESP, 4
004231B7 TEST EBX, EBX
004231B9 JLE SHORT 超级拖拉.00423215
004231BB MOV EAX, -4F8 ; EAX=-4F8
004231C0 MOV ECX, EDI ; ECX<==00470D60,(ASCII "fxyang")
004231C2 SUB EAX, ESI
004231C4 MOV DWORD PTR SS:[ESP+14], EAX ; EAX=FFB8F2A0
004231C8 XOR EDX, EDX
004231CA MOV EBP, 2C ; EBP=2C
004231CF MOV DL, BYTE PTR DS:[ECX]
; DL<==DS:[470D60]=66 ('f') 用户名的第一位
004231D1 MOV EDI, EDX ; EDI=66
004231D3 XOR EDX, EDX
004231D5 MOV EAX, EDI ; EAX=66
004231D7 DIV EBP ; EAX=66 DIV EBP=2C ==>EAX=02 EDX=0E
004231D9 MOV EAX, EDI ; EAX=66
004231DB MOV EDI, 2C ; EDI=2C
004231E0 NOT EAX ; EAX=FFFFFFF99
004231E2 MOV EBP, EDX ; EBP=EDX=0E
004231E4 XOR EDX, EDX
004231E6 DIV EDI
004231E8 MOV EAX, DWORD PTR DS:[ESI+530]
004231EE INC ECX ; //进一位
004231EF MOV EDI, EDX ; EDI=EDX=21
004231F1 MOV DL, BYTE PTR DS:[EAX+EBP]
004231F4 MOV BYTE PTR SS:[ESP+13], DL
004231F8 MOV DL, BYTE PTR DS:[EAX+EDI]
; DL<==DS:[EAX+EDI]=C1 EAX=01260490 EDI=21
004231FB MOV BYTE PTR DS:[EAX+EBP], DL
004231FE MOV EAX, DWORD PTR DS:[ESI+530]
00423204 MOV DL, BYTE PTR SS:[ESP+13]
00423208 MOV BYTE PTR DS:[EDI+EAX], DL
0042320B MOV EAX, DWORD PTR SS:[ESP+14]
0042320F ADD EAX, ECX
00423211 CMP EAX, EBX ; //计算的次数=6
00423213 JL SHORT 超级拖拉.004231C8
; //用用户名计算的值做指针把试验码重新排列
00423215 DEC EBX
00423216 TEST EBX, EBX
00423218 MOV DWORD PTR SS:[ESP+18], EBX
0042321C JLE SHORT 超级拖拉.00423289
0042321E MOV EAX, -4F9 ; EAX=-4F9
00423223 LEA EDI, DWORD PTR DS:[ESI+4F9]
; EDI<== DS:[ESI+4F9]=00470D61,(ASCII "xyang")
00423229 SUB EAX, ESI
0042322B MOV DWORD PTR SS:[ESP+14], EAX ; EAX=FFB8F29F
0042322F XOR ECX, ECX
00423231 XOR EDX, EDX
00423233 MOV CL, BYTE PTR DS:[EDI-1] ; CL=DS:[470D60]=66 ('f')
00423236 MOV EBX, 29 ; EBX=29
0042323B MOV EBP, ECX ; EBP=66
0042323D XOR ECX, ECX
0042323F MOV CL, BYTE PTR DS:[EDI] ; CL=DS:[470D61]=78 ('x')
00423241 MOV EAX, EBP ; EAX=66
00423243 SHL EAX, 8 ; EAX=00006600
00423246 ADD EAX, ECX ; EAX=6678
00423248 DIV EBX ; EAX=6678 DIV EBX=29 ==>EAX=27F EDX=21
0042324A MOV EAX, EBP ; EAX=66
0042324C NOT EAX ; EAX=FFFFFF99
0042324E SHL EAX, 8 ; EAX=FFFF9900
00423251 NOT ECX ; ECX=FFFFFF87
00423253 ADD EAX, ECX ; EAX=FFFF9987
00423255 MOV ECX, 25 ; ECX=25
0042325A MOV EBX, EDX ; EBX=21
0042325C XOR EDX, EDX
0042325E DIV ECX
; EAX=FFFF9887 DIV ECX=25 ==>EAX=6EB3B79 EDX=0A
00423260 MOV EAX, DWORD PTR DS:[ESI+530]
00423266 INC EDI
00423267 MOV CL, BYTE PTR DS:[EAX+EBX]
; CL=DS:[EAX+EBX]=C1 EAX=01260490 EBX=21
0042326A MOV EBP, EDX ; EBP=EDX=A
0042326C MOV DL, BYTE PTR DS:[EAX+EBP] ; DL=DS:[EAX+EBP]=31 ('1')
0042326F MOV BYTE PTR DS:[EAX+EBX], DL
00423272 MOV EAX, DWORD PTR DS:[ESI+530]
00423278 MOV BYTE PTR DS:[EAX+EBP], CL ; CL=C1
0042327B MOV ECX, DWORD PTR SS:[ESP+14]
0042327F MOV EAX, DWORD PTR SS:[ESP+18]
00423283 ADD ECX, EDI
00423285 CMP ECX, EAX
00423287 JL SHORT 超级拖拉.0042322F
; //用用户名计算的值做指针把试验码重新排列
|
004232EC MOV DWORD PTR DS:[4719B8], EDI
004232F2 MOV ECX, DWORD PTR DS:[ESI+530] ; ECX<==DS:[470D98]=01260490,(ASCII "78")
004232F8 MOV EDX, DWORD PTR DS:[ESI+52C] ; EDX<==DS:[470D94]=01260450
004232FE MOV EAX, DWORD PTR DS:[ECX] ; EAX=DS:[1260490]=34003837
00423300 MOV DWORD PTR DS:[EDX], EAX
00423302 MOV EAX, DWORD PTR DS:[ECX+4]
00423305 MOV DWORD PTR DS:[EDX+4], EAX
00423308 MOV EAX, DWORD PTR DS:[ECX+8] ; EAX=DS:[1260498]=32C17433
0042330B MOV DWORD PTR DS:[EDX+8], EAX
0042330E MOV EAX, DWORD PTR DS:[ECX+C] ; EAX=DS:[ECX+C]=007134C0
00423311 MOV DWORD PTR DS:[EDX+C], EAX
00423314 MOV CX, WORD PTR DS:[ECX+10] ; CX=DS:[ECX+10]=0033
00423318 MOV WORD PTR DS:[EDX+10], CX
0042331C MOV EDX, DWORD PTR DS:[ESI+52C]
00423322 MOV BYTE PTR DS:[EDX+12], 0
00423326 MOV EAX, DWORD PTR DS:[ESI+530]
0042332C MOV ECX, DWORD PTR DS:[ESI+528]
00423332 ADD EAX, 12
00423335 MOV EDX, DWORD PTR DS:[EAX]
00423337 MOV DWORD PTR DS:[ECX], EDX
00423339 MOV EDX, DWORD PTR DS:[EAX+4] ; EDX=DS:[EAX+4]=3A733236
0042333C MOV DWORD PTR DS:[ECX+4], EDX
0042333F MOV EDX, DWORD PTR DS:[EAX+8] ; EDX=DS:[EAX+8]=3275006B
00423342 MOV DWORD PTR DS:[ECX+8], EDX
00423345 MOV EDX, DWORD PTR DS:[EAX+C] ; EDX=DS:[EAX+C]=3139FA76
00423348 MOV DWORD PTR DS:[ECX+C], EDX
0042334B MOV AX, WORD PTR DS:[EAX+10] ; AX=DS:[EAX+10]=3701
0042334F MOV WORD PTR DS:[ECX+10], AX
00423353 MOV ECX, DWORD PTR DS:[ESI+528] ; ECX=01260470
00423359 XOR EAX, EAX
0042335B MOV BYTE PTR DS:[ECX+12], 0
;到这里试验码经过用用户名计算的值做指针重新排列
到这里试验码变成 "12x45f7o9rFcBelqdiuk6mg8pnDstjvH3bzAhCaEyGwIJK"
====================================================
第三部分:注册码最后的计算和比较 (fly的功劳)
如果你悔牌超过29次后,会提示你“未注册".就是说你必须悔牌超过29次后 .才会来到这里:
00423490 SUB ESP, 0C
00423493 PUSH EBX
00423494 MOV EBX, ECX
00423496 PUSH EBP
00423497 XOR ECX, ECX
00423499 PUSH ESI
0042349A MOV ESI, DWORD PTR DS:[EBX+530]
004234A0 PUSH EDI
004234A1 MOV BYTE PTR SS:[ESP+14], CL
004234A5 MOV BYTE PTR SS:[ESP+15], CL
004234A9 MOV BYTE PTR SS:[ESP+16], CL
004234AD MOV BYTE PTR SS:[ESP+17], CL
004234B1 /MOV EAX, 38E38E39
004234B6 |MOV EBP, 47
004234BB |IMUL ECX
004234BD |SAR EDX, 1
004234BF |MOV EAX, EDX
004234C1 |SHR EAX, 1F
004234C4 |ADD EDX, EAX
004234C6 |XOR EAX, EAX
004234C8 |MOV AL, BYTE PTR DS:[ESI+ECX]
004234CB |LEA EDI, DWORD PTR SS:[ESP+EDX+14>
004234CF |CDQ
004234D0 |IDIV EBP
004234D2 |MOV AL, BYTE PTR DS:[EDI]
004234D4 |ADD AL, DL
004234D6 |INC ECX
004234D7 |CMP ECX, 9
004234DA |MOV BYTE PTR DS:[EDI], AL
004234DC \JL SHORT 超级拖拉.004234B1
;以上把试验码重新排列后的字符串的前9位"12x45f7o9"的hex值计算后相加
; AL =B4
004234DE MOV ECX, 9
004234E3 /MOV EAX, 38E38E39
004234E8 |MOV EBP, 1D
004234ED |IMUL ECX
004234EF |SAR EDX, 1
004234F1 |MOV EAX, EDX
004234F3 |SHR EAX, 1F
004234F6 |ADD EDX, EAX
004234F8 |XOR EAX, EAX
004234FA |MOV AL, BYTE PTR DS:[ESI+ECX]
004234FD |LEA EDI, DWORD PTR SS:[ESP+EDX+14>
00423501 |CDQ
00423502 |IDIV EBP
00423504 |MOV AL, BYTE PTR DS:[EDI]
00423506 |ADD AL, DL
00423508 |INC ECX
00423509 |CMP ECX, 12
0042350C |MOV BYTE PTR DS:[EDI], AL ; EAX=8B
0042350E \JL SHORT 超级拖拉.004234E3
;以上把试验码重新排列后的字符串的第10-18位"rFcBelqdi"的hex值计算后相加
; AL =8B
00423510 MOV ECX, 12
00423515 /MOV EAX, 38E38E39
0042351A |MOV EBP, 2F
0042351F |IMUL ECX
00423521 |SAR EDX, 1
00423523 |MOV EAX, EDX
00423525 |SHR EAX, 1F
00423528 |ADD EDX, EAX
0042352A |XOR EAX, EAX
0042352C |MOV AL, BYTE PTR DS:[ESI+ECX]
0042352F |LEA EDI, DWORD PTR SS:[ESP+EDX+14>
00423533 |CDQ
00423534 |IDIV EBP
00423536 |MOV AL, BYTE PTR DS:[EDI]
00423538 |ADD AL, DL
0042353A |INC ECX
0042353B |CMP ECX, 1B
0042353E |MOV BYTE PTR DS:[EDI], AL
00423540 \JL SHORT 超级拖拉.00423515 ; EAX=95
;以上把试验码重新排列后的字符串的第19-27位"uk6mg8pnD"的hex值计算后相加
; AL =95
00423542 MOV ECX, 1B
00423547 /MOV EAX, 38E38E39
0042354C |MOV EBP, 11
00423551 |IMUL ECX
00423553 |SAR EDX, 1
00423555 |MOV EAX, EDX
00423557 |SHR EAX, 1F
0042355A |ADD EDX, EAX
0042355C |XOR EAX, EAX
0042355E |MOV AL, BYTE PTR DS:[ESI+ECX]
00423561 |LEA EDI, DWORD PTR SS:[ESP+EDX+14>
00423565 |CDQ
00423566 |IDIV EBP
00423568 |MOV AL, BYTE PTR DS:[EDI]
0042356A |ADD AL, DL
0042356C |INC ECX
0042356D |CMP ECX, 24
00423570 |MOV BYTE PTR DS:[EDI], AL
00423572 \JL SHORT 超级拖拉.00423547 ; EAX=45
;以上把试验码重新排列后的字符串的第28-36位"stjvH3bzA"的hex值计算后相加
; AL =45
00423574 MOV EDX, DWORD PTR SS:[ESP+14] ; EDX=518397B4
00423578 LEA ECX, DWORD PTR SS:[ESP+12] ; ECX=0012EEA6
0042357C PUSH ECX
0042357D PUSH EDX
0042357E CALL 超级拖拉.00422FF0 ; 用上面ECX值计算二组值
00423583 MOV EAX, DWORD PTR DS:[EBX+530] ; EAX<==DS:[EBX+530]=01260490,
00423589 MOV CX, WORD PTR SS:[ESP+1A] ; CX<== SS:[12EEA6]=4234
0042358E ADD ESP, 8
00423591 CMP CL, BYTE PTR DS:[EAX+24] ; 第37位=CL
00423594 JNZ 超级拖拉.0042361E
0042359A CMP CH, BYTE PTR DS:[EAX+25] ; 第38位=CH
0042359D JNZ SHORT 超级拖拉.0042361E
0042359F MOV ECX, DWORD PTR SS:[ESP+15] ; ECX=9A518397
004235A3 LEA EAX, DWORD PTR SS:[ESP+12]
004235A7 PUSH EAX
004235A8 PUSH ECX
004235A9 CALL 超级拖拉.00422FF0 ; 用上面ECX值计算二组值
004235AE MOV EAX, DWORD PTR DS:[EBX+530]
004235B4 MOV CX, WORD PTR SS:[ESP+1A] ; CX=3937
004235B9 ADD ESP, 8
004235BC CMP CL, BYTE PTR DS:[EAX+26] ; 第39位=CL
004235BF JNZ SHORT 超级拖拉.0042361E
004235C1 CMP CH, BYTE PTR DS:[EAX+27] ; 第40位=CH
004235C4 JNZ SHORT 超级拖拉.0042361E
004235C6 MOV EAX, DWORD PTR SS:[ESP+16] ; EAX=029A5183
004235CA LEA EDX, DWORD PTR SS:[ESP+12]
004235CE PUSH EDX
004235CF PUSH EAX
004235D0 CALL 超级拖拉.00422FF0 ; 用上面EAX值计算二组值
004235D5 MOV EAX, DWORD PTR DS:[EBX+530]
004235DB MOV CX, WORD PTR SS:[ESP+1A] ; CX=3833
004235E0 ADD ESP, 8
004235E3 CMP CL, BYTE PTR DS:[EAX+28] ; 第41位=CL
004235E6 JNZ SHORT 超级拖拉.0042361E
004235E8 CMP CH, BYTE PTR DS:[EAX+29] ; 第42位=CH
004235EB JNZ SHORT 超级拖拉.0042361E
004235ED MOV EDX, DWORD PTR SS:[ESP+17] ; EDX=45029A51
004235F1 LEA ECX, DWORD PTR SS:[ESP+12]
004235F5 PUSH ECX
004235F6 PUSH EDX
004235F7 CALL 超级拖拉.00422FF0 ; 用上面EDX值计算二组值
004235FC MOV EAX, DWORD PTR DS:[EBX+530]
00423602 MOV CX, WORD PTR SS:[ESP+1A] ; CX=3531
00423607 ADD ESP, 8
0042360A CMP CL, BYTE PTR DS:[EAX+2A] ; 第43位=CL
0042360D JNZ SHORT 超级拖拉.0042361E
0042360F CMP CH, BYTE PTR DS:[EAX+2B] ; 第44位=CH
00423612 JNZ SHORT 超级拖拉.0042361E
00423614 POP EDI
00423615 POP ESI
00423616 POP EBP
00423617 MOV AL, 1 <==赋注册成功标记
00423619 POP EBX
0042361A ADD ESP, 0C
0042361D RETN
0042361E POP EDI
0042361F POP ESI
00423620 POP EBP
00423621 XOR AL, AL <==赋注册失败标记
00423623 POP EBX
00423624 ADD ESP, 0C
00423627 RETN
===============================
总结: 条件注册码必须有46位长
1. 把注册码按照软件固定的顺序重新排列
2. 用用户名计算的值做易位的指针再次排列
3. 把排列后的字符串前36位计算出一组八位的值
然后用这个值计算出第37-44位的正确值
一组可用的注册码
用户名: fxyang
注册码: 1234567897bcdefg4ijklmnopqrstuv1x3zABBD9F8H5JK
超级拖拉机是一个四副牌的拖拉机游戏,在全国范围都有广泛使用。
游戏有多种设定以适应不同地方的规则。游戏支持单人玩,也支网络
多人一起玩。最新版4.02
下载地址: http://yywk.nease.net/
软件限制:在单人游戏中,未注册版本的悔牌次数受限制。在多人游戏中,
未注册版本只能玩一段时间。
【破解工具】:Ollydbg1.09 中文版
【过 程】:
呵呵,我们开工吧!唉!^-^^-^ 我的水平很低,许多地方表达的有问题,烦请各位指教!
用ollydbg加载运行 ,发现是个重起效验型的软件.输入注册码后,软件用用户名和试验码
计算(加密注册信息)得到新的字符串后放到注册表:
[HKEY_LOCAL_MACHINE\SOFTWARE\yywk\超级拖拉机]-reg下
输入试验码:123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJK (一共要46位)
说明:试验码没有46位,程序在用用户名计算的值移动试验码时,就会计算出一些别的字符在
比较的字符串中,引起无法正确跟踪.
开始:
第一部分---注册表中注册信息的处理过程
用0llydbg加载后下 RegQueryvalueExA中断:
|
00423A4E PUSH 超级拖拉.0046D470 ; ASCII "reg"
00423A53 PUSH EAX
00423A54 MOV BYTE PTR SS:[EBP+2E8], 0
00423A5B MOV DWORD PTR SS:[ESP+28], ESI
00423A5F CALL EBX ; //读注册信息
00423A61 MOV EAX, DWORD PTR SS:[ESP+10]
00423A65 CMP EAX, ESI
00423A67 JNB SHORT 超级拖拉.00423A75
00423A69 MOV ECX, DWORD PTR SS:[EBP+530]
; ECX<==SS:[470D98]=01260490. ASCII "q02$%7'yc"k$%&'jhz{m}N/r1z3456uyij@RcGO"
00423A6F MOV BYTE PTR DS:[EAX+ECX], 0
00423A73 JMP SHORT 超级拖拉.00423A7F
|
00423ADD MOV EAX, DWORD PTR SS:[EBP+530] ; EAX<==01260490.
00423AE3 PUSH EAX
00423AE4 CALL 超级拖拉.004051B0
00423AE9 MOV EDI, EAX ; EDI=EAX (长度)
00423AEB XOR ECX, ECX
00423AED ADD ESP, 4
00423AF0 CMP EDI, ECX
00423AF2 MOV DWORD PTR SS:[ESP+1C], ECX
00423AF6 MOV BYTE PTR SS:[ESP+20], 1
00423AFB MOV BYTE PTR SS:[ESP+21], 2
00423B00 MOV BYTE PTR SS:[ESP+22], 40
00423B05 MOV BYTE PTR SS:[ESP+23], 20
00423B0A MOV BYTE PTR SS:[ESP+24], 8
00423B0F MOV BYTE PTR SS:[ESP+25], 10 ; //计算开始
00423B14 JLE SHORT 超级拖拉.00423B55
; SS:[12F498]<== 01 02 40 20 08 10 1A 02 赋值
00423B16 /MOV EAX, ECX
00423B18 |XOR EDX, EDX
00423B1A |DIV DWORD PTR SS:[ESP+18]
00423B1E |MOV ESI, 6 ; ESI=6
00423B23 |MOV DL, BYTE PTR SS:[ESP+EDX+28] ; DL<==4A ('J')
00423B27 |MOV BYTE PTR SS:[ESP+1C], DL
00423B2B |MOV EAX, DWORD PTR SS:[ESP+1C] ; EAX<==4A ('J')
00423B2F |CDQ
00423B30 |IDIV ESI ; EAX= 4A IDIV ESI=6 ==>EAX= 0C EDX=2
00423B32 |MOV EAX, DWORD PTR SS:[EBP+530] ; EAX<==01260490.
00423B38 |LEA ESI, DWORD PTR DS:[ECX+EAX] ; EAX<==01260490. ECX=0
00423B3B |MOV AL, BYTE PTR DS:[ECX+EAX] ; AL<== 77 ('w')
00423B3E |MOV DL, BYTE PTR SS:[ESP+EDX+20] ; DL<==40 ('@')
00423B42 |TEST AL, DL
00423B44 |JNZ SHORT 超级拖拉.00423B4A
00423B46 |OR AL, DL
00423B48 |JMP SHORT 超级拖拉.00423B4E
00423B4A |NOT DL
00423B4C |AND AL, DL
00423B4E |INC ECX
00423B4F |MOV BYTE PTR DS:[ESI], AL
00423B51 |CMP ECX, EDI
00423B53 \JL SHORT 超级拖拉.00423B16
; //这里把注册表中加密的注册信息还原成原来的试验码
; DS:[ESI]=01260490,(ASCII"123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJK")
00423B74 MOV EAX, DWORD PTR SS:[EBP+530]
; EAX<==01260490,(ASCII"123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJK")
00423B7A POP EDI
00423B7B POP ESI
00423B7C MOV DL, BYTE PTR DS:[EAX+20] ; DL=0
00423B7F MOV CL, BYTE PTR DS:[EAX+2] ; CL=DS:[1260492]
00423B82 MOV BYTE PTR DS:[EAX+2], DL
00423B85 MOV EAX, DWORD PTR SS:[EBP+530] ; EAX<==01260490,
00423B8B MOV BYTE PTR DS:[EAX+20], CL ; DS:[EAX+20]=CL
00423B8E MOV EAX, DWORD PTR SS:[EBP+530] ; EAX<==01260490,
00423B94 MOV DL, BYTE PTR DS:[EAX+17] ; DL=DS:[EAX+17]
00423B97 MOV CL, BYTE PTR DS:[EAX+7] ; CL=DS:[EAX+7]
00423B9A MOV BYTE PTR DS:[EAX+7], DL ; DL=
00423B9D MOV EAX, DWORD PTR SS:[EBP+530] ; EAX<==01260490
00423BA3 MOV BYTE PTR DS:[EAX+17], CL
00423BA6 MOV EAX, DWORD PTR SS:[EBP+530] ; EAX<==01260490
00423BAC MOV DL, BYTE PTR DS:[EAX+12]
00423BAF MOV CL, BYTE PTR DS:[EAX+1D]
00423BB2 MOV BYTE PTR DS:[EAX+1D], DL
00423BB5 MOV EAX, DWORD PTR SS:[EBP+530]
00423BBB MOV BYTE PTR DS:[EAX+12], CL
00423BBE MOV EAX, DWORD PTR SS:[EBP+530]
00423BC4 MOV DL, BYTE PTR DS:[EAX+2A]
00423BC7 MOV CL, BYTE PTR DS:[EAX+1F]
00423BCA MOV BYTE PTR DS:[EAX+1F], DL
00423BCD MOV EAX, DWORD PTR SS:[EBP+530]
00423BD3 MOV BYTE PTR DS:[EAX+2A], CL
00423BD6 MOV EAX, DWORD PTR SS:[EBP+530]
00423BDC MOV DL, BYTE PTR DS:[EAX+C]
00423BDF MOV CL, BYTE PTR DS:[EAX+24]
00423BE2 MOV BYTE PTR DS:[EAX+24], DL
00423BE5 MOV EAX, DWORD PTR SS:[EBP+530]
00423BEB MOV BYTE PTR DS:[EAX+C], CL
00423BEE MOV EAX, DWORD PTR SS:[EBP+530]
00423BF4 MOV DL, BYTE PTR DS:[EAX+21]
00423BF7 MOV CL, BYTE PTR DS:[EAX+28]
00423BFA MOV BYTE PTR DS:[EAX+28], DL
00423BFD MOV EAX, DWORD PTR SS:[EBP+530]
00423C03 MOV BYTE PTR DS:[EAX+21], CL
00423C06 MOV EAX, DWORD PTR SS:[EBP+530]
00423C0C MOV DL, BYTE PTR DS:[EAX+F]
00423C0F MOV CL, BYTE PTR DS:[EAX+19]
00423C12 MOV BYTE PTR DS:[EAX+19], DL
00423C15 MOV EAX, DWORD PTR SS:[EBP+530]
00423C1B MOV BYTE PTR DS:[EAX+F], CL
00423C1E MOV EAX, DWORD PTR SS:[EBP+530]
00423C24 MOV DL, BYTE PTR DS:[EAX+14]
00423C27 MOV CL, BYTE PTR DS:[EAX+5]
00423C2A MOV BYTE PTR DS:[EAX+5], DL
00423C2D MOV EAX, DWORD PTR SS:[EBP+530]
00423C33 POP EBP
00423C34 MOV BYTE PTR DS:[EAX+14], CL ; CL=36
00423C37 ADD ESP, 3C ; //EAX=01260490
00423C3A RETN
****************
00423C2D MOV EAX <==12x45l7o9abcBefqhiuklmn8pgrstjvH3FzAdCDEyGwIJK
到这里试验码变成 "12x45l7o9abcBefqhiuklmn8pgrstjvH3FzAdCDEyGwIJK"
; //以上把试验码打散
===============================================================
第二部分--注册码的计算(实际上是把试验码用用户名计算的值做参数重新排列)
004231AD CALL 超级拖拉.004051B0
004231B2 MOV EBX, EAX ; EBX=EAX=6长度
004231B4 ADD ESP, 4
004231B7 TEST EBX, EBX
004231B9 JLE SHORT 超级拖拉.00423215
004231BB MOV EAX, -4F8 ; EAX=-4F8
004231C0 MOV ECX, EDI ; ECX<==00470D60,(ASCII "fxyang")
004231C2 SUB EAX, ESI
004231C4 MOV DWORD PTR SS:[ESP+14], EAX ; EAX=FFB8F2A0
004231C8 XOR EDX, EDX
004231CA MOV EBP, 2C ; EBP=2C
004231CF MOV DL, BYTE PTR DS:[ECX]
; DL<==DS:[470D60]=66 ('f') 用户名的第一位
004231D1 MOV EDI, EDX ; EDI=66
004231D3 XOR EDX, EDX
004231D5 MOV EAX, EDI ; EAX=66
004231D7 DIV EBP ; EAX=66 DIV EBP=2C ==>EAX=02 EDX=0E
004231D9 MOV EAX, EDI ; EAX=66
004231DB MOV EDI, 2C ; EDI=2C
004231E0 NOT EAX ; EAX=FFFFFFF99
004231E2 MOV EBP, EDX ; EBP=EDX=0E
004231E4 XOR EDX, EDX
004231E6 DIV EDI
004231E8 MOV EAX, DWORD PTR DS:[ESI+530]
004231EE INC ECX ; //进一位
004231EF MOV EDI, EDX ; EDI=EDX=21
004231F1 MOV DL, BYTE PTR DS:[EAX+EBP]
004231F4 MOV BYTE PTR SS:[ESP+13], DL
004231F8 MOV DL, BYTE PTR DS:[EAX+EDI]
; DL<==DS:[EAX+EDI]=C1 EAX=01260490 EDI=21
004231FB MOV BYTE PTR DS:[EAX+EBP], DL
004231FE MOV EAX, DWORD PTR DS:[ESI+530]
00423204 MOV DL, BYTE PTR SS:[ESP+13]
00423208 MOV BYTE PTR DS:[EDI+EAX], DL
0042320B MOV EAX, DWORD PTR SS:[ESP+14]
0042320F ADD EAX, ECX
00423211 CMP EAX, EBX ; //计算的次数=6
00423213 JL SHORT 超级拖拉.004231C8
; //用用户名计算的值做指针把试验码重新排列
00423215 DEC EBX
00423216 TEST EBX, EBX
00423218 MOV DWORD PTR SS:[ESP+18], EBX
0042321C JLE SHORT 超级拖拉.00423289
0042321E MOV EAX, -4F9 ; EAX=-4F9
00423223 LEA EDI, DWORD PTR DS:[ESI+4F9]
; EDI<== DS:[ESI+4F9]=00470D61,(ASCII "xyang")
00423229 SUB EAX, ESI
0042322B MOV DWORD PTR SS:[ESP+14], EAX ; EAX=FFB8F29F
0042322F XOR ECX, ECX
00423231 XOR EDX, EDX
00423233 MOV CL, BYTE PTR DS:[EDI-1] ; CL=DS:[470D60]=66 ('f')
00423236 MOV EBX, 29 ; EBX=29
0042323B MOV EBP, ECX ; EBP=66
0042323D XOR ECX, ECX
0042323F MOV CL, BYTE PTR DS:[EDI] ; CL=DS:[470D61]=78 ('x')
00423241 MOV EAX, EBP ; EAX=66
00423243 SHL EAX, 8 ; EAX=00006600
00423246 ADD EAX, ECX ; EAX=6678
00423248 DIV EBX ; EAX=6678 DIV EBX=29 ==>EAX=27F EDX=21
0042324A MOV EAX, EBP ; EAX=66
0042324C NOT EAX ; EAX=FFFFFF99
0042324E SHL EAX, 8 ; EAX=FFFF9900
00423251 NOT ECX ; ECX=FFFFFF87
00423253 ADD EAX, ECX ; EAX=FFFF9987
00423255 MOV ECX, 25 ; ECX=25
0042325A MOV EBX, EDX ; EBX=21
0042325C XOR EDX, EDX
0042325E DIV ECX
; EAX=FFFF9887 DIV ECX=25 ==>EAX=6EB3B79 EDX=0A
00423260 MOV EAX, DWORD PTR DS:[ESI+530]
00423266 INC EDI
00423267 MOV CL, BYTE PTR DS:[EAX+EBX]
; CL=DS:[EAX+EBX]=C1 EAX=01260490 EBX=21
0042326A MOV EBP, EDX ; EBP=EDX=A
0042326C MOV DL, BYTE PTR DS:[EAX+EBP] ; DL=DS:[EAX+EBP]=31 ('1')
0042326F MOV BYTE PTR DS:[EAX+EBX], DL
00423272 MOV EAX, DWORD PTR DS:[ESI+530]
00423278 MOV BYTE PTR DS:[EAX+EBP], CL ; CL=C1
0042327B MOV ECX, DWORD PTR SS:[ESP+14]
0042327F MOV EAX, DWORD PTR SS:[ESP+18]
00423283 ADD ECX, EDI
00423285 CMP ECX, EAX
00423287 JL SHORT 超级拖拉.0042322F
; //用用户名计算的值做指针把试验码重新排列
|
004232EC MOV DWORD PTR DS:[4719B8], EDI
004232F2 MOV ECX, DWORD PTR DS:[ESI+530] ; ECX<==DS:[470D98]=01260490,(ASCII "78")
004232F8 MOV EDX, DWORD PTR DS:[ESI+52C] ; EDX<==DS:[470D94]=01260450
004232FE MOV EAX, DWORD PTR DS:[ECX] ; EAX=DS:[1260490]=34003837
00423300 MOV DWORD PTR DS:[EDX], EAX
00423302 MOV EAX, DWORD PTR DS:[ECX+4]
00423305 MOV DWORD PTR DS:[EDX+4], EAX
00423308 MOV EAX, DWORD PTR DS:[ECX+8] ; EAX=DS:[1260498]=32C17433
0042330B MOV DWORD PTR DS:[EDX+8], EAX
0042330E MOV EAX, DWORD PTR DS:[ECX+C] ; EAX=DS:[ECX+C]=007134C0
00423311 MOV DWORD PTR DS:[EDX+C], EAX
00423314 MOV CX, WORD PTR DS:[ECX+10] ; CX=DS:[ECX+10]=0033
00423318 MOV WORD PTR DS:[EDX+10], CX
0042331C MOV EDX, DWORD PTR DS:[ESI+52C]
00423322 MOV BYTE PTR DS:[EDX+12], 0
00423326 MOV EAX, DWORD PTR DS:[ESI+530]
0042332C MOV ECX, DWORD PTR DS:[ESI+528]
00423332 ADD EAX, 12
00423335 MOV EDX, DWORD PTR DS:[EAX]
00423337 MOV DWORD PTR DS:[ECX], EDX
00423339 MOV EDX, DWORD PTR DS:[EAX+4] ; EDX=DS:[EAX+4]=3A733236
0042333C MOV DWORD PTR DS:[ECX+4], EDX
0042333F MOV EDX, DWORD PTR DS:[EAX+8] ; EDX=DS:[EAX+8]=3275006B
00423342 MOV DWORD PTR DS:[ECX+8], EDX
00423345 MOV EDX, DWORD PTR DS:[EAX+C] ; EDX=DS:[EAX+C]=3139FA76
00423348 MOV DWORD PTR DS:[ECX+C], EDX
0042334B MOV AX, WORD PTR DS:[EAX+10] ; AX=DS:[EAX+10]=3701
0042334F MOV WORD PTR DS:[ECX+10], AX
00423353 MOV ECX, DWORD PTR DS:[ESI+528] ; ECX=01260470
00423359 XOR EAX, EAX
0042335B MOV BYTE PTR DS:[ECX+12], 0
;到这里试验码经过用用户名计算的值做指针重新排列
到这里试验码变成 "12x45f7o9rFcBelqdiuk6mg8pnDstjvH3bzAhCaEyGwIJK"
====================================================
第三部分:注册码最后的计算和比较 (fly的功劳)
如果你悔牌超过29次后,会提示你“未注册".就是说你必须悔牌超过29次后 .才会来到这里:
00423490 SUB ESP, 0C
00423493 PUSH EBX
00423494 MOV EBX, ECX
00423496 PUSH EBP
00423497 XOR ECX, ECX
00423499 PUSH ESI
0042349A MOV ESI, DWORD PTR DS:[EBX+530]
004234A0 PUSH EDI
004234A1 MOV BYTE PTR SS:[ESP+14], CL
004234A5 MOV BYTE PTR SS:[ESP+15], CL
004234A9 MOV BYTE PTR SS:[ESP+16], CL
004234AD MOV BYTE PTR SS:[ESP+17], CL
004234B1 /MOV EAX, 38E38E39
004234B6 |MOV EBP, 47
004234BB |IMUL ECX
004234BD |SAR EDX, 1
004234BF |MOV EAX, EDX
004234C1 |SHR EAX, 1F
004234C4 |ADD EDX, EAX
004234C6 |XOR EAX, EAX
004234C8 |MOV AL, BYTE PTR DS:[ESI+ECX]
004234CB |LEA EDI, DWORD PTR SS:[ESP+EDX+14>
004234CF |CDQ
004234D0 |IDIV EBP
004234D2 |MOV AL, BYTE PTR DS:[EDI]
004234D4 |ADD AL, DL
004234D6 |INC ECX
004234D7 |CMP ECX, 9
004234DA |MOV BYTE PTR DS:[EDI], AL
004234DC \JL SHORT 超级拖拉.004234B1
;以上把试验码重新排列后的字符串的前9位"12x45f7o9"的hex值计算后相加
; AL =B4
004234DE MOV ECX, 9
004234E3 /MOV EAX, 38E38E39
004234E8 |MOV EBP, 1D
004234ED |IMUL ECX
004234EF |SAR EDX, 1
004234F1 |MOV EAX, EDX
004234F3 |SHR EAX, 1F
004234F6 |ADD EDX, EAX
004234F8 |XOR EAX, EAX
004234FA |MOV AL, BYTE PTR DS:[ESI+ECX]
004234FD |LEA EDI, DWORD PTR SS:[ESP+EDX+14>
00423501 |CDQ
00423502 |IDIV EBP
00423504 |MOV AL, BYTE PTR DS:[EDI]
00423506 |ADD AL, DL
00423508 |INC ECX
00423509 |CMP ECX, 12
0042350C |MOV BYTE PTR DS:[EDI], AL ; EAX=8B
0042350E \JL SHORT 超级拖拉.004234E3
;以上把试验码重新排列后的字符串的第10-18位"rFcBelqdi"的hex值计算后相加
; AL =8B
00423510 MOV ECX, 12
00423515 /MOV EAX, 38E38E39
0042351A |MOV EBP, 2F
0042351F |IMUL ECX
00423521 |SAR EDX, 1
00423523 |MOV EAX, EDX
00423525 |SHR EAX, 1F
00423528 |ADD EDX, EAX
0042352A |XOR EAX, EAX
0042352C |MOV AL, BYTE PTR DS:[ESI+ECX]
0042352F |LEA EDI, DWORD PTR SS:[ESP+EDX+14>
00423533 |CDQ
00423534 |IDIV EBP
00423536 |MOV AL, BYTE PTR DS:[EDI]
00423538 |ADD AL, DL
0042353A |INC ECX
0042353B |CMP ECX, 1B
0042353E |MOV BYTE PTR DS:[EDI], AL
00423540 \JL SHORT 超级拖拉.00423515 ; EAX=95
;以上把试验码重新排列后的字符串的第19-27位"uk6mg8pnD"的hex值计算后相加
; AL =95
00423542 MOV ECX, 1B
00423547 /MOV EAX, 38E38E39
0042354C |MOV EBP, 11
00423551 |IMUL ECX
00423553 |SAR EDX, 1
00423555 |MOV EAX, EDX
00423557 |SHR EAX, 1F
0042355A |ADD EDX, EAX
0042355C |XOR EAX, EAX
0042355E |MOV AL, BYTE PTR DS:[ESI+ECX]
00423561 |LEA EDI, DWORD PTR SS:[ESP+EDX+14>
00423565 |CDQ
00423566 |IDIV EBP
00423568 |MOV AL, BYTE PTR DS:[EDI]
0042356A |ADD AL, DL
0042356C |INC ECX
0042356D |CMP ECX, 24
00423570 |MOV BYTE PTR DS:[EDI], AL
00423572 \JL SHORT 超级拖拉.00423547 ; EAX=45
;以上把试验码重新排列后的字符串的第28-36位"stjvH3bzA"的hex值计算后相加
; AL =45
00423574 MOV EDX, DWORD PTR SS:[ESP+14] ; EDX=518397B4
00423578 LEA ECX, DWORD PTR SS:[ESP+12] ; ECX=0012EEA6
0042357C PUSH ECX
0042357D PUSH EDX
0042357E CALL 超级拖拉.00422FF0 ; 用上面ECX值计算二组值
00423583 MOV EAX, DWORD PTR DS:[EBX+530] ; EAX<==DS:[EBX+530]=01260490,
00423589 MOV CX, WORD PTR SS:[ESP+1A] ; CX<== SS:[12EEA6]=4234
0042358E ADD ESP, 8
00423591 CMP CL, BYTE PTR DS:[EAX+24] ; 第37位=CL
00423594 JNZ 超级拖拉.0042361E
0042359A CMP CH, BYTE PTR DS:[EAX+25] ; 第38位=CH
0042359D JNZ SHORT 超级拖拉.0042361E
0042359F MOV ECX, DWORD PTR SS:[ESP+15] ; ECX=9A518397
004235A3 LEA EAX, DWORD PTR SS:[ESP+12]
004235A7 PUSH EAX
004235A8 PUSH ECX
004235A9 CALL 超级拖拉.00422FF0 ; 用上面ECX值计算二组值
004235AE MOV EAX, DWORD PTR DS:[EBX+530]
004235B4 MOV CX, WORD PTR SS:[ESP+1A] ; CX=3937
004235B9 ADD ESP, 8
004235BC CMP CL, BYTE PTR DS:[EAX+26] ; 第39位=CL
004235BF JNZ SHORT 超级拖拉.0042361E
004235C1 CMP CH, BYTE PTR DS:[EAX+27] ; 第40位=CH
004235C4 JNZ SHORT 超级拖拉.0042361E
004235C6 MOV EAX, DWORD PTR SS:[ESP+16] ; EAX=029A5183
004235CA LEA EDX, DWORD PTR SS:[ESP+12]
004235CE PUSH EDX
004235CF PUSH EAX
004235D0 CALL 超级拖拉.00422FF0 ; 用上面EAX值计算二组值
004235D5 MOV EAX, DWORD PTR DS:[EBX+530]
004235DB MOV CX, WORD PTR SS:[ESP+1A] ; CX=3833
004235E0 ADD ESP, 8
004235E3 CMP CL, BYTE PTR DS:[EAX+28] ; 第41位=CL
004235E6 JNZ SHORT 超级拖拉.0042361E
004235E8 CMP CH, BYTE PTR DS:[EAX+29] ; 第42位=CH
004235EB JNZ SHORT 超级拖拉.0042361E
004235ED MOV EDX, DWORD PTR SS:[ESP+17] ; EDX=45029A51
004235F1 LEA ECX, DWORD PTR SS:[ESP+12]
004235F5 PUSH ECX
004235F6 PUSH EDX
004235F7 CALL 超级拖拉.00422FF0 ; 用上面EDX值计算二组值
004235FC MOV EAX, DWORD PTR DS:[EBX+530]
00423602 MOV CX, WORD PTR SS:[ESP+1A] ; CX=3531
00423607 ADD ESP, 8
0042360A CMP CL, BYTE PTR DS:[EAX+2A] ; 第43位=CL
0042360D JNZ SHORT 超级拖拉.0042361E
0042360F CMP CH, BYTE PTR DS:[EAX+2B] ; 第44位=CH
00423612 JNZ SHORT 超级拖拉.0042361E
00423614 POP EDI
00423615 POP ESI
00423616 POP EBP
00423617 MOV AL, 1 <==赋注册成功标记
00423619 POP EBX
0042361A ADD ESP, 0C
0042361D RETN
0042361E POP EDI
0042361F POP ESI
00423620 POP EBP
00423621 XOR AL, AL <==赋注册失败标记
00423623 POP EBX
00423624 ADD ESP, 0C
00423627 RETN
===============================
总结: 条件注册码必须有46位长
1. 把注册码按照软件固定的顺序重新排列
2. 用用户名计算的值做易位的指针再次排列
3. 把排列后的字符串前36位计算出一组八位的值
然后用这个值计算出第37-44位的正确值
一组可用的注册码
用户名: fxyang
注册码: 1234567897bcdefg4ijklmnopqrstuv1x3zABBD9F8H5JK
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
- [分享]防止U盘拷贝我的数据 3801
- [转帖]寻找 Ultra RM Converter 3.5.0411 注册码 8923
- [转帖]超级拖拉机4.02算法分析 3813
- [原创]轻松手动脱壳ASPack 2.12 6548
看原图
赞赏
雪币:
留言: