• 标 题:<<黄河英语通>>2.25注册算法分析
  • 作 者:lordor
  • 时 间:2003/06/06 11:37am
  • 链 接:http://bbs.pediy.com

作者:lordor[BCG]
Mail:lordor@sina.com
目的:属技术交流,无其它目的,请不要任意散布或用用商业用途。初学破解,如有不对的地方欢迎批评指出。
工具:softice,w32Dasm,ollydbg

试炼码:
识别号:HHID558109930
注册号:654321

写教程真的写上瘾,再来篇。

004ABCAC  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
004ABCAF  |.  8D55 F8       LEA EDX,DWORD PTR SS:[EBP-8]
004ABCB2  |.  8B83 00030000 MOV EAX,DWORD PTR DS:[EBX+300]
004ABCB8  |.  E8 636BF9FF   CALL unpacked.00442820                   ;  取注册号unpa
004ABCBD  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]             ;  注册号入eaxDWOR
004ABCC0  |.  8D55 FC       LEA EDX,DWORD PTR SS:[EBP-4]
004ABCC3  |.  E8 3CD4F5FF   CALL unpacked.00409104                   ;  复制注册号到edx的地址.00409104
004ABCC8  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]             ;  注册号入eaxDWOR
004ABCCB  |.  50            PUSH EAX
004ABCCC  |.  8D55 F0       LEA EDX,DWORD PTR SS:[EBP-10]
004ABCCF  |.  8B83 F8020000 MOV EAX,DWORD PTR DS:[EBX+2F8]
004ABCD5  |.  E8 466BF9FF   CALL unpacked.00442820                   ;  取识别号unpa
004ABCDA  |.  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]            ;  识别号入eaxDWOR
004ABCDD  |.  8D55 F4       LEA EDX,DWORD PTR SS:[EBP-C]
004ABCE0  |.  E8 9BF9FFFF   CALL unpacked.004AB680                   ;  产生注册真码,进入
004ABCE5  |.  8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]             ;  真码入edx,DW
004ABCE8  |.  58            POP EAX                                  ;  出输入注册号到eax
004ABCE9  |.  E8 8690F5FF   CALL unpacked.00404D74                   ;  关键比较unpa
004ABCEE  |.  0F85 F4000000 JNZ unpacked.004ABDE8                    ;  不等则跳到出错cked.00
004ABCF4  |.  6A 40         PUSH 40                                  ; /style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
004ABCF6  |.  68 50BE4A00   PUSH unpacked.004ABE50                   ; |Title = "黄河英语通"4ABE5
004ABCFB  |.  68 5CBE4A00   PUSH unpacked.004ABE5C                   ; |Text = "注册成功!"04ABE
004ABD00  |.  A1 70F44E00   MOV EAX,DWORD PTR DS:[4EF470]            ; |
004ABD05  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]               ; |
004ABD07  |.  8B40 30       MOV EAX,DWORD PTR DS:[EAX+30]            ; |
004ABD0A  |.  50            PUSH EAX                                 ; |hOwner
004ABD0B  |.  E8 80BDF5FF   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
004ABD10  |.  8D55 E8       LEA EDX,DWORD PTR SS:[EBP-18]
004ABD13  |.  8B83 00030000 MOV EAX,DWORD PTR DS:[EBX+300]

--------------------------------
产生真码call

004AB6A3  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
004AB6A6  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
004AB6A9  |.  8BC7          MOV EAX,EDI
004AB6AB  |.  E8 B892F5FF   CALL unpacked.00404968
004AB6B0  |.  8D45 FC       LEA EAX,DWORD PTR SS:[EBP-4]
004AB6B3  |.  BA 9CB74A00   MOV EDX,unpacked.004AB79C
004AB6B8  |.  E8 7B95F5FF   CALL unpacked.00404C38                   ;  把识别号保存到地址中
004AB6BD  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]             ;  识别号所在地址
004AB6C0  |.  0FB630        MOVZX ESI,BYTE PTR DS:[EAX]              ;  识别号第一位十六进制值入esi
004AB6C3  |.  66:6BC6 64    IMUL AX,SI,64                            ;  ax=si*64
004AB6C7  |.  66:8945 F8    MOV WORD PTR SS:[EBP-8],AX               ;  保存ax到[ebp-8]
004AB6CB  |.  8BC6          MOV EAX,ESI                              ;  eax=esi
004AB6CD  |.  C1E0 09       SHL EAX,9                                ;  左移9位
004AB6D0  |.  66:8945 F6    MOV WORD PTR SS:[EBP-A],AX               ;  ax保存[ebp-a]
004AB6D4  |.  B3 01         MOV BL,1                                 ;  计数器初始化为1
004AB6D6  |>  8B45 FC       /MOV EAX,DWORD PTR SS:[EBP-4]            ;  识别号所在地址,入eax
004AB6D9  |.  E8 5295F5FF   |CALL unpacked.00404C30                  ;  取长度
004AB6DE  |.  50            |PUSH EAX
004AB6DF  |.  33C0          |XOR EAX,EAX
004AB6E1  |.  8AC3          |MOV AL,BL                               ;   计数器入al
004AB6E3  |.  5A            |POP EDX
004AB6E4  |.  8BCA          |MOV ECX,EDX                             ;  识别号长度入ecx
004AB6E6  |.  99            |CDQ
004AB6E7  |.  F7F9          |IDIV ECX                                ;  此即为计数器取识别号长度的模数
004AB6E9  |.  8B45 FC       |MOV EAX,DWORD PTR SS:[EBP-4]            ;  识别号所在地址,入eax
004AB6EC  |.  8A0410        |MOV AL,BYTE PTR DS:[EAX+EDX]            ;  取第bl(经过上面模数运算)位识别号。
004AB6EF  |.  0FB7D6        |MOVZX EDX,SI                            ;  edx=si
004AB6F2  |.  C1EA 08       |SHR EDX,8                               ;  edx 右移8位
004AB6F5  |.  32C2          |XOR AL,DL                               ;  al与dl 异或
004AB6F7  |.  33D2          |XOR EDX,EDX
004AB6F9  |.  8AD3          |MOV DL,BL                               ;  计数器入dl
004AB6FB  |.  B9 A8B74A00   |MOV ECX,unpacked.004AB7A8               ;  ASCII "Qwert yuiop asdfg hjkl zxcvbnm"
004AB700  |.  324411 FF     |XOR AL,BYTE PTR DS:[ECX+EDX-1]          ;  取第bl位字符串
004AB704  |.  50            |PUSH EAX
004AB705  |.  8B45 FC       |MOV EAX,DWORD PTR SS:[EBP-4]
004AB708  |.  E8 2395F5FF   |CALL unpacked.00404C30                  ;  取识别号长度
004AB70D  |.  5A            |POP EDX                                 ;  异或值入edx
004AB70E  |.  02D0          |ADD DL,AL                               ;  与位数相加
004AB710  |.  8855 FB       |MOV BYTE PTR SS:[EBP-5],DL              ;  保存到[ebp-5]
004AB713  |.  33C0          |XOR EAX,EAX
004AB715  |.  8A45 FB       |MOV AL,BYTE PTR SS:[EBP-5]
004AB718  |.  B9 23000000   |MOV ECX,23                              ;  23入ecx
004AB71D  |.  99            |CDQ
004AB71E  |.  F7F9          |IDIV ECX
004AB720  |.  42            |INC EDX                                 ;  余数加1
004AB721  |.  8855 FB       |MOV BYTE PTR SS:[EBP-5],DL              ;  保存到[ebp-5]
004AB724  |.  8D45 F0       |LEA EAX,DWORD PTR SS:[EBP-10]
004AB727  |.  33D2          |XOR EDX,EDX
004AB729  |.  8A55 FB       |MOV DL,BYTE PTR SS:[EBP-5]
004AB72C  |.  B9 D0B74A00   |MOV ECX,unpacked.004AB7D0               ;  ASCII "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"
004AB731  |.  8A5411 FF     |MOV DL,BYTE PTR DS:[ECX+EDX-1]          ;  查密码表,取第dl位
004AB735  |.  E8 0E94F5FF   |CALL unpacked.00404B48                  ;  清空密码表
004AB73A  |.  8B55 F0       |MOV EDX,DWORD PTR SS:[EBP-10]           ;  取得的一位十六进制值入edx
004AB73D  |.  8BC7          |MOV EAX,EDI
004AB73F  |.  E8 F494F5FF   |CALL unpacked.00404C38                  ;  保存
004AB744  |.  33C0          |XOR EAX,EAX
004AB746  |.  8AC3          |MOV AL,BL
004AB748  |.  8B17          |MOV EDX,DWORD PTR DS:[EDI]
004AB74A  |.  0FB64402 FF   |MOVZX EAX,BYTE PTR DS:[EDX+EAX-1]       ;  取得的一位十六进制入eax
004AB74F  |.  66:03F0       |ADD SI,AX                               ;  与识别号第bl位相加
004AB752  |.  66:0FAF75 F8  |IMUL SI,WORD PTR SS:[EBP-8]             ;  再乘以[ebp-8]处的值 
004AB757  |.  66:0375 F6    |ADD SI,WORD PTR SS:[EBP-A]              ;  再加上[ebp-a]处值
004AB75B  |.  43            |INC EBX                                 ;  ebx加1
004AB75C  |.  80FB 1F       |CMP BL,1F                               ;  与31是否相等
004AB75F  |.^ 0F85 71FFFFFF \JNZ unpacked.004AB6D6
004AB765  |.  33C0          XOR EAX,EAX
004AB767  |.  5A            POP EDX
004AB768  |.  59            POP ECX
004AB769  |.  59            POP ECX
004AB76A  |.  64:8910       MOV DWORD PTR FS:[EAX],EDX
004AB76D  |.  68 8AB74A00   PUSH unpacked.004AB78A
004AB772  |>  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
004AB775  |.  E8 EE91F5FF   CALL unpacked.00404968


------------------------------------

总结:


字符串s1=Qwert yuiop asdfg hjkl zxcvbnm
字符串s2=ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789
取第1位识别号十六进制48(H),乘64(H)得数A=1c20(H),左移9位得数B=9000(H)。然后开始进行31次循环,得到30位注册号:

int Y=第1位识别号十六进制48(H);
for(int i=1;i<31;i++)
{
取识别号的长度len;
求i%len的模数X;
取第X位的识别号十六进制值;
Y右移8位得数C;
第X位的识别号十六进制值与C异或得数D;
取字符串s1第i位十六进制值与第X位的识别号十六进制值异或,得E值;
E值与识别号的长度len相加,得数F;
求F%35模数,模数加1,得数G;
取字符串s2第G位十六进制值,此即为第i位注册号;
Y=Y+字符串s2第G位十六进制值;
Y=Y*数A;
Y=Y+B;
}

识别号:HHID558109930
注册号:E5W799BWESP8CFFF7GKDH4B6JW3L8L

cracked by lordor[BCG]
03.06.05