-
-
[原创]MathMagic Pro v3.1 算法分析!
-
发表于: 2005-10-17 18:11 4101
-
软件简介:MathMagic是一个卓越的数学方程式编辑软件,能够编辑各种方程式和数学符号。它为您提供了一个简单易用的界面和非常强大的功能,利用它可以轻松的编写各种数学方程式而不再需要别的软件。
破解平台:Microsoft Windows 2003 SP1
Name:随意(字符数大于3,小于等于63)!
C#:760I10-WU4-201X343
S#:11UK-111G-1111
破解过程:
1.用PEiD检测MathMagic Pro v3.1.exe文件是否加壳,检测结果为无!
2.运行MathMagic Pro v3.1.exe,不输入用户名(User Name)、客户号(Customer #)、序列号(Serial #),点击“授权(Authorization)”,依次出现“Please enter your User Name Correctly.”、“The Customer Number is incorrect. Please enter it again.”、“The Serial Number is incorrect. Please enter it again.”提示。
3.用W32Dasm反汇编MathMagic Pro v3.1.exe文件。
(1)查找字符串“Please enter your User Name Correctly.”,通过对代码的分析,得知在“004C8DA0”处设断!
(2)查找字符串“The Customer Number is incorrect. Please enter it again.”,通过对代码的分析,得知在“004C9250”处设断!
(3)查找字符串“The Serial Number is incorrect. Please enter it again.”,通过对代码的分析,得知在“004C93F6”处设断!
4.用OllyDbg载入程序,运行,并在“004C8DA0”、“004C9250”、“004C93F6”处设断!
(1)返回程序随意输入用户名(Blade)客户号(ABCD)和序列号(EFGH),点击“Authorization”。程序中断在“004C8DA0”处!通过单步跟踪分析得知:
004C8DA0 8B442404 mov eax,dword ptr ss:[esp+4]
004C8DA4 8B08 mov ecx,dword ptr ds:[eax]
004C8DA6 8B41F8 mov eax,dword ptr ds:[ecx-8] ;ECX="Blade"(用户名)!
004C8DA9 83F803 cmp eax,3 ;用户名长度是否“≥3”!
004C8DAC 7D11 jge short MathMagi.004C8DBF ;否,不转移,注册出错!
004C8DAE 6A00 push 0
004C8DB0 6A00 push 0
004C8DB2 6842E10000 push 0E142
004C8DB7 E836EC0800 call <jmp.&MFC42.#1199> ;过此处,提示“Please enter your User Name Correctly.”!
004C8DBC 32C0 xor al,al
004C8DBE C3 retn
004C8DBF 83F83F cmp eax,3F ;用户名长度是否“≤63”!
004C8DC2 7E11 jle short MathMagi.004C8DD5 ;否,不转移,注册出错!
004C8DC4 6A00 push 0
004C8DC6 6A00 push 0
004C8DC8 683C785C00 push MathMagi.005C783C
004C8DCD E822EA0800 call <jmp.&MFC42.#1200> ;过此处,提示“long name”!
(2)当程序中断在“004C9250”处时,通过单步跟踪分析得知:
004C9250 8B442404 mov eax,dword ptr ss:[esp+4] ;ECX="Blade"(用户名)!
004C9254 56 push esi
004C9255 8B30 mov esi,dword ptr ds:[eax] ;ESI="ABCD"(客户号)!
004C9257 837EF812 cmp dword ptr ds:[esi-8],12 ;客户号是否是18位!
004C925B 0F85870000 jnz MathMagi.004C92E8 ;否,转移,注册出错(提示“The Customer Number ...”)!
004C9261 8A4607 mov al,byte ptr ds:[esi+7] ;将客户号第8位存入AL!
004C9264 3C57 cmp al,57 ;客户号第8位是否是“W”!
004C9266 7404 je short MathMagi.004C926C ;是,转移!
004C9268 3C58 cmp al,58 ;客户号第8位是否是“X”!
004C926A 757C jnz short MathMagi.004C92E8 ;否,转移,注册出错!
004C926C 807E0855 cmp byte ptr ds:[esi+8],55 ;客户号第9位是否是“U”!
004C9270 7576 jnz short MathMagi.004C92E8 ;否,转移,注册出错!
004C9272 33C9 xor ecx,ecx
004C9274 8A0E mov cl,byte ptr ds:[esi]
004C9276 8D0431 lea eax,dword ptr ds:[ecx+esi]
004C9279 8A0C31 mov cl,byte ptr ds:[ecx+esi]
004C927C 80F93F cmp cl,3F
004C927F 7467 je short MathMagi.004C92E8
004C9281 8078FF3F cmp byte ptr ds:[eax-1],3F
004C9285 7461 je short MathMagi.004C92E8
004C9287 8A4E06 mov cl,byte ptr ds:[esi+6] ;将客户号第7位存入CL!
004C928A B02D mov al,2D ;将ASCII码“-”存入AL!
004C928C 3AC8 cmp cl,al ;客户号第7位是否是“-”!
004C928E 7558 jnz short MathMagi.004C92E8 ;否,转移,注册出错!
004C9290 38460A cmp byte ptr ds:[esi+A],al ;客户号第11位是否是“-”!
004C9293 7553 jnz short MathMagi.004C92E8 ;否,转移,注册出错!
004C9295 807E0349 cmp byte ptr ds:[esi+3],49 ;客户号第4位是否是“I”!
004C9299 754D jnz short MathMagi.004C92E8 ;否,转移,注册出错!
//重新输客户号(123I56-WU0-1234567),跟踪分析!!!
004C929B 56 push esi
004C929C E85F000000 call MathMagi.004C9300 ;客户号的算法,跟进!
……………… ………………
004C92B7 0FBE4C2418 movsx ecx,byte ptr ss:[esp+18] ;ECX=34('4')!
004C92BC 33C0 xor eax,eax ;EAX=0!
004C92BE 83C410 add esp,10
004C92C1 8A460F mov al,byte ptr ds:[esi+F] ;将客户号第16位存入AL!
004C92C4 3BC1 cmp eax,ecx ;客户号第16位是否是“4”!
004C92C6 7520 jnz short MathMagi.004C92E8 ;否,转移,注册出错!
004C92C8 0FBE442409 movsx eax,byte ptr ss:[esp+9] ;EAX=32('2')!
004C92CD 33D2 xor edx,edx
004C92CF 8A5610 mov dl,byte ptr ds:[esi+10] ;将客户号第17位存入DL!
004C92D2 3BD0 cmp edx,eax ;客户号第17位是否是“2”!
004C92D4 7512 jnz short MathMagi.004C92E8 ;否,转移,注册出错!
004C92D6 0FBE54240A movsx edx,byte ptr ss:[esp+A] ;EAX=41('A')!
004C92DB 33C9 xor ecx,ecx
004C92DD 8A4E11 mov cl,byte ptr ds:[esi+11] ;将客户号第18位存入CL!
004C92E0 3BCA cmp ecx,edx ;客户号第18位是否是“A”!
004C92E2 7504 jnz short MathMagi.004C92E8 ;否转移,注册出错!
//至此可得到正确的客户号:123I56-WU0-123442A!!!
(3)步入“004C9300”(客户号的算法),通过单步跟踪分析得知:
004C9300 8B4C2404 mov ecx,dword ptr ss:[esp+4] ;ECX="123I56-WU0-1234567"(客户号)!
……………… ………………
004C9313 8A510B mov dl,byte ptr ds:[ecx+B] ;DL=31H('1',客户号第12位)!
004C9316 8A4107 mov al,byte ptr ds:[ecx+7] ;AL=57H('W',客户号第8位)!
004C9319 88542404 mov byte ptr ss:[esp+4],dl ;SS:[ESP+4]=31H('1',客户号第12位)!
004C931D 8A510E mov dl,byte ptr ds:[ecx+E] ;DL=34H('4',客户号第15位)!
004C9320 88442410 mov byte ptr ss:[esp+10],al ;SS:[ESP+10]=57H('W',客户号第8位)!
004C9324 8A410D mov al,byte ptr ds:[ecx+D] ;AL=33H('3',客户号第14位)!
004C9327 88542408 mov byte ptr ss:[esp+8],dl ;SS:[ESP+8]=34H('4',客户号第15位)!
004C932B 8A5103 mov dl,byte ptr ds:[ecx+3] ;DL=49H('I',客户号第4位)!
004C932E 02D0 add dl,al ;DL=7CH(49H+33H,客户号4位+14位)!
004C9330 88442403 mov byte ptr ss:[esp+3],al ;SS:[ESP+3]=33H('3',客户号第14位)!
004C9334 8A442404 mov al,byte ptr ss:[esp+4] ;AL=31H('1',客户号第12位)!
004C9338 53 push ebx
004C9339 8A590C mov bl,byte ptr ds:[ecx+C] ;BL=32H('2',客户号第13位)!
004C933C 02D0 add dl,al ;DL=0ADH(7CH+31H,客户号4位+14位+12位)!
004C933E 56 push esi ;ESI="123I56-WU0-1234567"(客户号)!
004C933F 8AC3 mov al,bl ;AL=32H('2',客户号第13位)!
004C9341 0FB6F2 movzx si,dl ;SI=0ADH;ESI=3600ADH!
004C9345 8A5108 mov dl,byte ptr ds:[ecx+8] ;DL=55H('U',客户号第9位)!
004C9348 57 push edi
004C9349 02C2 add al,dl ;AL=87H(32H+55H,客户号13位+9位)!
004C934B 8A54241C mov dl,byte ptr ss:[esp+1C] ;DL=57H('W',客户号第8位)!
004C934F 02C2 add al,dl ;AL=0DEH(87H+57H,客户号13位+9位+8位)!
004C9351 33D2 xor dx,dx ;DX=0000H;EDX=120000H!
004C9354 8AD0 mov dl,al ;DL=0DEH(87H+57H,客户号13位+9位+8位)!
004C9356 33C0 xor eax,eax ;EAX=0!
004C9358 8A01 mov al,byte ptr ds:[ecx] ;AL=31H('1',客户号第1位)!
004C935A 0FAFF2 imul esi,edx ;ESI=1200DEH*3600ADH=3AFE9606H(3CC3AFE9606H)!
004C935D 8B542414 mov edx,dword ptr ;ss:[esp+14] ;EDX=34H('4',客户号第15位)!
004C9361 BF0A000000 mov edi,0A ;EDI=0AH(10D)!
004C9366 81E2FF0000 and edx,0FF ;EDX=34H!
004C936C 03C2 add eax,edx ;EAX=65H(31H+34H,客户号第1位+15位)!
004C936E 8B542410 mov edx,dword ptr ss:[esp+10] ;EDX=31H('1',客户号第12位)!
004C9372 81E2FF0000 and edx,0FF ;EDX=31H!
004C9378 03C2 add eax,edx ;EAX=96H(65H+31H,客户号第1位+15位+12位)!
004C937A 99 cdq
004C937B F7FF idiv edi ;EAX/EDI(96H/0AH),商存入EAX(0FH),余数存入EDX(0)!
004C937D 33C0 xor ax,ax ;EAX=0!
004C9380 5F pop edi
004C9381 8AC2 mov al,dl ;AL=0!
004C9383 8A54240B mov dl,byte ptr ss:[esp+B] ;DL=33H('3',客户号第14位)!
004C9387 03F0 add esi,eax
004C9389 8A4108 mov al,byte ptr ds:[ecx+8] ;AL=55H('U',客户号第9位)!
004C938C 02D0 add dl,al ;DL=88H(33H+55H,客户号第9位+14位)!
004C938E 8A4102 mov al,byte ptr ds:[ecx+2] ;AL=33H('3',客户号第3位)!
004C9391 02D0 add dl,al ;DL=0BBH(88H+33H,客户号第9位+14位+3位)!
004C9393 0FB6D2 movzx dx,dl
004C9397 0FAFF2 imul esi,edx ;ESI=3AFE9606H*0BBH=2B17F79662H(17F79662H)!
004C939A 8A5105 mov dl,byte ptr ds:[ecx+5] ;DL=36H('6',客户号第6位)!
004C939D 8A4C2410 mov cl,byte ptr ss:[esp+10] ;CL=34H('4',客户号第15位)!
004C93A1 2AD1 sub dl,cl ;DL=2H(36H-34H,客户号第6位-15位)!
004C93A3 2AD9 sub bl,cl ;BL=0FEH(32H-34H,客户号第13位-15位)!
004C93A5 02542418 add dl,byte ptr ss:[esp+18] ;DL=59H(2H+57H,客户号第6位-15位+8位)!
004C93A9 02D8 add bl,al ;BL=31H(0FEH+33H,客户号第13位+3位-15位)!
004C93AB 33C0 xor ax,ax ;EAX=0!
004C93AE 0FB6D2 movzx dx,dl
004C93B2 8AC3 mov al,bl ;AL=31H(0FEH+33H,客户号第13位+3位-15位)!
004C93B4 0FAFD0 imul edx,eax ;EDX=59H*31H=1109H!
004C93B7 33C0 xor ax,ax ;EAX=0!
004C93BA 03F2 add esi,edx ;ESI=17F7A76BH(17F79662H+1109H)!
004C93BC 0FB65424 movzx dx,byte ptr ss:[esp+B] ;DX=33H('3',客户号第14位)!
004C93C2 8AC1 mov al,cl ;EAX=34H('4',客户号第15位)!
004C93C4 8D0C40 lea ecx,dword ptr ds:[eax+eax*2] ;ECX=9CH(34H*3,客户号第15位*3)!
004C93C7 03F1 add esi,ecx ;ESI=17F7A807H(17F7A807H+9CH)!
004C93C9 B9D0070000 mov ecx,7D0 ;ECX=07D0H!
004C93CE 03F2 add esi,edx ;ESI=17F7A83AH(17F7A807H+客户号第15位*3+14位)!
004C93D0 81E6FFFF00 and esi,0FFFF ;ESI=0A83AH(“与”操作)!
004C93D6 8BC6 mov eax,esi ;EAX=0A83AH!
004C93D8 5E pop esi
004C93D9 99 cdq
004C93DA F7F9 idiv ecx ;EAX/ECX(0A83AH/07D0H),余数存入EDX(42AH)!
……………… ………………
004C93E3 C3 retn
(4)当程序中断在“004C93F6”处时,通过单步跟踪分析得知:
004C93F6 6AFF push -1
……………… ………………
004C940E 8BBC24A801 mov edi,dword ptr ss:[esp+1A8]
004C9415 8B07 mov eax,dword ptr ds:[edi] ;EAX="EFGH"(序列号)!
004C9417 8A08 mov cl,byte ptr ds:[eax] ;将序列号第1位存入CL!
004C9419 80F90A cmp cl,0A ;序列号第1位的十六进制值是否大于0AH!
004C941C 7315 jnb short MathMagi.004C9433 ;否,注册出错!
……………… ………………
004C9427 E8C6E50800 call <jmp.&MFC42.#1199> ;过此处,提示“The Serial Number is incorrect. ...”!
004C942C 32C0 xor al,al
004C942E E981010000 jmp MathMagi.004C95B4
004C9433 0FB6C9 movzx cx,cl ;将序列号第1位存入CX!
004C9437 33F6 xor esi,esi
004C9439 83F901 cmp cx,1 ;序列号第1位的十六进制值是否小于1H!
004C943D 7CDF jl short MathMagi.004C941E ;是,转移,注册出错!
004C943F 8D5001 lea edx,dword ptr ds:[eax+1]
004C9442 0FBFC9 movsx ecx,cx
004C9445 803A2D cmp byte ptr ds:[edx],2D ;“*”!
004C9448 7501 jnz short MathMagi.004C944B
004C944A 46 inc esi ;ESI=ESI+1!
004C944B 42 inc edx ;EDX=EDX+1!
004C944C 49 dec ecx ;ECX=ECX-1!
004C944D 75F6 jnz short MathMagi.004C9445 ;与“*”处构成循环,对序列号字符逐一检查,是否包含“-”!
004C944F 83FE02 cmp si,2 ;序列号中是否有两处包含“-”!
004C9453 75C9 jnz short MathMagi.004C941E ;否,转移,注册出错!
004C9455 8A08 mov cl,byte ptr ds:[eax] ;将序列号第1位存入CL!
004C9457 8A5001 mov dl,byte ptr ds:[eax+1] ;将序列号第2位存入DL!
004C945A 8A5802 mov bl,byte ptr ds:[eax+2] ;将序列号第3位存入BL!
004C945D 8B3580EE56 mov esi,dword ptr ds:[<&MSVCRT.spr>
004C9463 0FBE4003 movsx eax,byte ptr ds:[eax+3] ;将序列号第4位存入EAX!
004C9467 50 push eax
004C9468 0FBEC3 movsx eax,bl ;将序列号第3位存入EAX!
004C946B 50 push eax
004C946C 0FBED2 movsx edx,dl ;将序列号第2位存入EDX!
004C946F 0FBEC1 movsx eax,cl ;将序列号第1位存入EAX!
……………… ………………
004C9480 8B07 mov eax,dword ptr ds:[edi] ;EAX="EFGH"(序列号)!
004C9482 8A4805 mov cl,byte ptr ds:[eax+5] ;将序列号第6位存入CL!
004C9485 8A5006 mov dl,byte ptr ds:[eax+6] ;将序列号第7位存入DL!
004C9488 8A5807 mov bl,byte ptr ds:[eax+7] ;将序列号第8位存入BL!
004C948B 0FBE4008 movsx eax,byte ptr ds:[eax+8] ;将序列号第9位存入EAX!
004C948F 50 push eax
004C9490 0FBEC3 movsx eax,bl ;将序列号第8位存入EAX!
004C9493 50 push eax
004C9494 0FBED2 movsx edx,dl ;将序列号第7位存入EDX!
004C9497 0FBEC1 movsx eax,cl ;将序列号第6位存入EAX!
……………… ………………
004C94AB 8B07 mov eax,dword ptr ds:[edi] ;EAX="EFGH"(序列号)!
004C94AD 8A480A mov cl,byte ptr ds:[eax+A] ;将序列号第11位存入CL!
004C94B0 8A500B mov dl,byte ptr ds:[eax+B] ;将序列号第12位存入DL!
004C94B3 8A580C mov bl,byte ptr ds:[eax+C] ;将序列号第13位存入BL!
004C94B6 0FBE400D movsx eax,byte ptr ds:[eax+D] ;将序列号第14位存入EAX!(可知序列号长14位!)
//重新输入序列号(1234-5678-90AB),跟踪分析!!!
004C94BA 50 push eax
004C94BB 0FBEC3 movsx eax,bl ;EAX=41H('A',序列号第13位)!
004C94BE 50 push eax
004C94BF 0FBED2 movsx edx,dl ;EDX=30H('0',序列号第12位)!
004C94C2 0FBEC1 movsx eax,cl ;EAX=39H('9',序列号第11位)!
……………… ………………
004C94D9 8D94249C00 lea edx,dword ptr ss:[esp+9C] ;ss:[esp+9C]="90AB"(序列号后4位)!
004C94E0 8BCC mov ecx,esp ;EDX="90AB"(序列号后4位)!
……………… ………………
004C94ED 8D84242001 lea eax,dword ptr ss:[esp+120] ;ss:[esp+120]="5678"(序列号6-9位)!
004C94F4 8BCC mov ecx,esp ;EAX="5678"(序列号6-9位)!
……………… ………………
004C950C 8D542424 lea edx,dword ptr ss:[esp+24] ;ss:[esp+24]="1234"(序列号前4位)!
004C9510 8BCC mov ecx,esp ;EDX="1234"(序列号前4位)!
……………… ………………
004C952E E89D000000 call MathMagi.004C95D0 ;跟进!
004C9533 83C40C add esp,0C
004C9536 84C0 test al,al ;“与”操作!
004C9538 0F84E0FEFF je MathMagi.004C941E ;ZF=1,转移,注册出错!
(5)步入“004C95D0”,通过单步跟踪分析得知:
004C95D0 6AFF push -1
……………… ………………
004C95EA C74424240 mov dword ptr ss:[esp+24],0
004C95F2 8B44242C mov eax,dword ptr ss:[esp+2C] ;EAX="1234"(序列号前4位)!
004C95F6 8B48F8 mov ecx,dword ptr ds:[eax-8] ;ECX="1234"(序列号前4位)!
004C95F9 85C9 test ecx,ecx ;ECX按位“与”操作!
004C95FB 0F84670100 je MathMagi.004C9768 ;ZF=1,转移,注册出错!
004C9601 8B7C2430 mov edi,dword ptr ss:[esp+30] ;EDI="5678"(序列号第6-9位)!
004C9605 8B4FF8 mov ecx,dword ptr ds:[edi-8] ;ECX="5678"(序列号第6-9位)!
004C9608 85C9 test ecx,ecx ;ECX按位“与”操作!
004C960A 0F84580100 je MathMagi.004C9768 ;ZF=1,转移,注册出错!
004C9610 8B742434 mov esi,dword ptr ss:[esp+34] ;ESI="90AB"(序列号后4位)!
004C9614 8B4EF8 mov ecx,dword ptr ds:[esi-8] ;ECX="90AB"(序列号后4位)!
004C9617 85C9 test ecx,ecx ;ECX按位“与”操作!
004C9619 0F84490100 je MathMagi.004C9768 ;ZF=1,转移,注册出错!
004C961F 8A08 mov cl,byte ptr ds:[eax] ;CL=31H('1',序列号第1位)!
004C9621 8A5001 mov dl,byte ptr ds:[eax+1] ;DL=32H('2',序列号第2位)!
004C9624 884C2418 mov byte ptr ss:[esp+18],cl ;ss:[esp+18]=31H('1',序列号第1位)!
004C9628 8A4802 mov cl,byte ptr ds:[eax+2] ;CL=33H('3',序列号第3位)!
004C962B 8854240A mov byte ptr ss:[esp+A],dl ;ss:[esp+A]=32H('2',序列号第2位)!
004C962F 8A5003 mov dl,byte ptr ds:[eax+3] ;DL=34H('4',序列号第4位)!
004C9632 8A4702 mov al,byte ptr ds:[edi+2] ;AL=37H('7',序列号第8位)!
004C9635 8854240C mov byte ptr ss:[esp+C],dl ;ss:[esp+C]=34H('4',序列号第4位)!
004C9639 8A5602 mov dl,byte ptr ds:[esi+2] ;DL=31H('1',序列号第13位)!
004C963C 88442414 mov byte ptr ss:[esp+14],al ;ss:[esp+14]=37H('7',序列号第8位)!
004C9640 8A4603 mov al,byte ptr ds:[esi+3] ;AL=32H('2',序列号第14位)!
004C9643 88542410 mov byte ptr ss:[esp+10],dl ;ss:[esp+10]=41H('A',序列号第13位)!
004C9647 8B542414 mov edx,dword ptr ss:[esp+14] ;EDX=37H('7',序列号第8位)!
004C964B 8844240B mov byte ptr ss:[esp+B],al ;ss:[esp+B]=42H('B',序列号第14位)!
004C964F 8B442410 mov eax,dword ptr ss:[esp+10] ;EAX=41H('A',序列号第13位)!
004C9653 81E2FF0000 and edx,0FF ;EDX=37H('7',序列号第8位)!
004C9659 25FF000000 and eax,0FF ;EAX=41H('A',序列号第13位)!
004C965E 53 push ebx
004C965F 8A5E01 mov bl,byte ptr ds:[esi+1] ;BL=30H('0',序列号第12位)!
004C9662 03C2 add eax,edx ;EAX=78H(41H+37H,序列号第13位+8位)!
004C9664 8B54241C mov edx,dword ptr ss:[esp+1C]
004C9668 884C2411 mov byte ptr ss:[esp+11],cl ;ss:[esp+1C]=33H('3',序列号第3位)!
004C966C 8A0E mov cl,byte ptr ds:[esi] ;CL=39H('9',序列号第11位)!
004C966E 81E2FF0000 and edx,0FF ;EDX=31H('1',序列号第1位)!
004C9674 03C2 add eax,edx ;EAX=0A9H(78H+31H,序列号第13位+8位+1位)!
004C9676 BE0A000000 mov esi,0A ;将0AH存入ESI!
004C967B 99 cdq
004C967C F7FE idiv esi ;EAX/ESI,商存入EAX(10H),余数A存入EDX(9H)!
004C967E 8AC1 mov al,cl ;AL=39H('9',序列号第11位)!
004C9680 C64424280 mov byte ptr ss:[esp+28],1 ;ss:[esp+28]=1H!
004C9685 88542413 mov byte ptr ss:[esp+13],dl ;ss:[esp+13]=9H(余数A)!
004C9689 8A17 mov dl,byte ptr ds:[edi] ;DL=35H('5',序列号第6位)!
004C968B 02C2 add al,dl ;AL=6EH(39H+35H,序列号第11位+6位)!
004C968D 8A542411 mov dl,byte ptr ss:[esp+11] ;DL=33H('3',序列号第3位)!
004C9691 02C2 add al,dl ;AL=0A1H(6EH+33H,序列号第11位+6位+3位)!
004C9693 8A5701 mov dl,byte ptr ds:[edi+1] ;DL=36H('6',序列号第7位)!
004C9696 88442412 mov byte ptr ss:[esp+12],al ;SS:[ESP+1]=0A1H(6EH+33H,序列号第11位+6位+3位)!
004C969A 8A44240F mov al,byte ptr ss:[esp+F] ;AL=42H(序列号第14位)!
004C969E 2AC2 sub al,dl ;AL=0CH(42H-36H,序列号第14位-7位)!
004C96A0 8A54240E mov dl,byte ptr ss:[esp+E] ;DL=32H('2',序列号第2位)!
004C96A4 02C2 add al,dl ;AL=3EH(0CH+32H,序列号第14位-7位+2位)!
004C96A6 8A542414 mov dl,byte ptr ss:[esp+14] ;DL=41H('A',序列号第13位)!
004C96AA 88442411 mov byte ptr ss:[esp+11],al ;SS:[ESP+11]=3EH(0CH+32H,序列号第14位-7位+2位)!
004C96AE 8A442410 mov al,byte ptr ss:[esp+10] ;AL=34H('4',序列号第4位)!
004C96B2 02D3 add dl,bl ;DL=71H(41H+30H,序列号第13位+12位)!
004C96B4 02D0 add dl,al ;DL=A5H(71H+34H,序列号第13位+12位+4位)!
004C96B6 8A44240F mov al,byte ptr ss:[esp+F] ;AL=42H('B',序列号第14位)!
004C96BA 2AC8 sub cl,al ;CL=0F7H(39H-42H,序列号第11位-14位)!
004C96BC 8A44240E mov al,byte ptr ss:[esp+E] ;AL=32H('2',序列号第2位)!
004C96C0 02C8 add cl,al ;CL=29H(0F7H-32H,序列号第11位-14位+2位)!
004C96C2 8A442410 mov al,byte ptr ss:[esp+10] ;AL=34H('4',序列号第4位)!
004C96C6 02D8 add bl,al ;BL=64H(30H+34H,序列号第12位+4位)!
004C96C8 33C0 xor ax,ax ;AX=0!
004C96CB 0FB6D2 movzx dx,dl
004C96CF 8AC3 mov al,bl ;AL=64H(30H+34H,序列号第12位+4位)!
004C96D1 5B pop ebx
004C96D2 0FAFC2 imul eax,edx ;EAX=*64H*0A5H=4074H((第12位+4位)*(第13位+12位+4位))!
004C96D5 0FB65424 movzx dx,byte ptr ss:[esp+D] ;DX=3EH(0CH+32H,序列号第14位-7位+2位)!
004C96DB 0FB6C9 movzx cx,cl
004C96DF 0FAFCA imul ecx,edx ;ECX=9EEH((第11位-14位+2位)*(第14位-7位+2位))!
004C96E2 0FB65424 movzx dx,byte ptr ss:[esp+F] ;DX=09H(余数A)!
004C96E8 03C1 add eax,ecx
;EAX=4074H+9EEH=4A62H((第12位+4位)*(第13位+12位+4位)+(第11位-14位+2位)*(第14位-7位+2位))!
004C96EA 0FB64C24 movzx cx,byte ptr ss:[esp+E] ;CX=0A1H(6EH+33H,序列号第11位+6位+3位)!
004C96F0 0FAFCA imul ecx,edx ;ECX=5A9H((序列号第11位+6位+3位)*余数A)!
004C96F3 0FB65424 movzx dx,byte ptr ss:[esp+10] ;DX=41H('A',序列号第13位)!
004C96F9 03C1 add eax,ecx
;EAX=500BH((第12位+4位)*(第13位+12位+4位)+(第11位-14位+2位)*(第14位-7位+2位)+(第11位+6位+3位)*余数A)!
004C96FB 0FB64C24 movzx cx,byte ptr ss:[esp+A] ;CX=32H('2',序列号第2位)!
004C9701 8D0C49 lea ecx,dword ptr ds:[ecx+ecx*2] ;ECX=96H(序列号第2位*3)!
004C9704 03C1 add eax,ecx
;EAX=50A1H((12位+4位)*(13位+12位+4位)+(11位-14位+2位)*(14位-7位+2位)+(11位+6位+3位)*余数A+(2位*3))!
004C9706 B91A000000 mov ecx,1A ;ECX=1AH!
004C970B 03C2 add eax,edx
;EAX=((12位+4位)*(13位+12位+4位)+(11位-14位+2位)*(14位-7位+2位)+(11位+6位+3位)*余数A+(2位*3)+13位)!
004C970D 25FFFF0000 and eax,0FFFF ;EAX与0FFFFH作“与”运算!
004C9712 99 cdq
004C9713 F7F9 idiv ecx ;EAX/ECX,商存入EAX(31CH),余数B存入EDX(A)!
004C9715 8D4C242C lea ecx,dword ptr ss:[esp+2C] ;
004C9719 80C241 add dl,41 ;DL=0AH+41H=4BH(余数B+41H)!
004C971C 88542418 mov byte ptr ss:[esp+18],dl ;SS:[ESP+18]=4BH(余数B+41H)!
004C9720 0FBE5703 movsx edx,byte ptr ds:[edi+3] ;EDX=38H('8',序列号第9位)!
004C9724 8B442418 mov eax,dword ptr ss:[esp+18]
004C9728 25FF000000 and eax,0FF ;EAX=4BH(余数+41H)!
004C972D 3BC2 cmp eax,edx ;EAX是否等于EDX(序列号第9位十六进制值)!
004C972F 7540 jnz short MathMagi.004C9771 ;否,转移,注册出错!
//得到输入序列号“1234-567K-90AB”!!!
……………… ………………
004C9767 C3 retn
5.重新输入用户名(Blade)、客户号(123I56-WU0-123442A)、序列号(1234-567K-90AB)运行程序,出现“The Serial # is not matched to the Customer # ...”提示,经分析在“004C953E”设断!用OllyDbg载入程序,运行,并在“004C953E”处设断!
(1)返回程序随意输入用户名(Blade)客户号(123I56-WU0-123442A)和序列号(1234-567K-90AB),点击“Authorization”。程序中断在“004C953E”处!通过单步跟踪分析得知:
004C953E 51 push ecx
……………… ………………
004C9575 E836020000 call MathMagi.004C97B0 ;跟进!
004C957A 83C4 08 add esp,8
004C957D 84C0 test al,al ;“与”操作!
004C957F 75 12 jnz short MathMagi.004C9593 ;ZF=1,不转移,注册出错!
(2)步入“004C97B0”,通过单步跟踪分析得知:
004C97B0 A100000 mov eax,dword ptr fs:[0]
……………… ………………
004C97CF 8B442420 mov eax,dword ptr ss:[esp+20] ;EAX="123I56-WU0-123442A"(客户号)!
004C97D3 33FF xor edi,edi ;EDI=0!
004C97D5 3958F8 cmp dword ptr ds:[eax-8],ebx ;客户号是否为空!
004C97D8 0F84210100 je MathMagi.004C98FF ;转移,注册出错!
004C97DE 8B6C2424 mov ebp,dword ptr ss:[esp+24] ;EBP="1234"(序列号前4位)!
004C97E2 395DF8 cmp dword ptr ss:[ebp-8],ebx ;序列号是否为空!
004C97E5 0F84140100 je MathMagi.004C98FF ;是,转移,注册出错!
004C97EB 0FB608 movzx cx,byte ptr ds:[eax] ;CX=31H('1',客户号第1位)!
004C97EF 0FBFC9 movsx ecx,cx ;CX=360000H+31H('1',客户号第1位)!
004C97F2 BA01000000 mov edx,1 ;EDX=1H!
004C97F7 8D71FF lea esi,dword ptr ds:[ecx-1]
004C97FA 3BF2 cmp esi,edx
004C97FC 7E10 jle short MathMagi.004C980E
004C97FE 8BCA mov ecx,edx ;ECX=1H!
……………… ………………
004C980E 8A4807 mov cl,byte ptr ds:[eax+7] ;CL=57H('W',客户号第8位)!
004C9811 80F94D cmp cl,4D ;客户号第8位是否是“M”!
004C9814 0FBE4808 movsx ecx,byte ptr ds:[eax+8] ;ECX=55H('U',客户号第9位)!
004C9818 751D jnz short MathMagi.004C9837 ;否,转移!
……………… ………………
004C9837 83E94A sub ecx,4A ;ECX=0BH(客户号第9位-4AH)!
004C983A 7414 je short MathMagi.004C9850
004C983C 49 dec ecx ;ECX=ECX-1H=0AH!
004C983D 740D je short MathMagi.004C984C
004C983F 83E90A sub ecx,0A ;ECX=0!
004C9842 7404 je short MathMagi.004C9848 ;转移!
004C9844 B254 mov dl,54
004C9846 EB0A jmp short MathMagi.004C9852
004C9848 B255 mov dl,55 ;DL=55H!
004C984A EB06 jmp short MathMagi.004C9852 ;转移!
004C984C B253 mov dl,53
004C984E EB02 jmp short MathMagi.004C9852
004C9850 B252 mov dl,52
004C9852 8A4803 mov cl,byte ptr ds:[eax+3] ;CL=49H('I',客户号第3位)!
004C9855 80F958 cmp cl,58 ;客户号第3位是否是“X”!
004C9858 7523 jnz short MathMagi.004C987D ;否,转移!
……………… ………………
004C987D 0FBE4004 movsx eax,byte ptr ds:[eax+4] ;EAX=35H('5',客户号第5位)!
004C9881 80F949 cmp cl,49 ;客户号第3位是否是“I”!
004C9884 751F jnz short MathMagi.004C98A5 ;是,不转移!
004C9886 83E841 sub eax,41 ;EAX=0FFFFFFF4H(客户号第5位-41H)!
004C9889 7416 je short MathMagi.004C98A1
004C988B 83E802 sub eax,2 ;EAX=0FFFFFFF2H(客户号第5位-41H-2H)!
004C988E 740D je short MathMagi.004C989D
004C9890 83E80B sub eax,0B ;EAX=0FFFFFFE7H(客户号第5位-41H-2H-0BH)!
004C9893 7404 je short MathMagi.004C9899
004C9895 B04B mov al,4B ;AL=4BH(EAX=FFFFFF4BH)!
004C9897 EB29 jmp short MathMagi.004C98C2 ;转移!
……………… ………………
004C98C2 3A5502 cmp dl,byte ptr ss:[ebp+2] ;DL是否等于序列号第3位!
004C98C5 7538 jnz short MathMagi.004C98FF ;否,转移,注册出错!
004C98C7 3A4503 cmp al,byte ptr ss:[ebp+3] ;AL是否等于序列号第4位!
004C98CA 7533 jnz short MathMagi.004C98FF ;否,转移,注册出错!
……………… ………………
破解平台:Microsoft Windows 2003 SP1
Name:随意(字符数大于3,小于等于63)!
C#:760I10-WU4-201X343
S#:11UK-111G-1111
破解过程:
1.用PEiD检测MathMagic Pro v3.1.exe文件是否加壳,检测结果为无!
2.运行MathMagic Pro v3.1.exe,不输入用户名(User Name)、客户号(Customer #)、序列号(Serial #),点击“授权(Authorization)”,依次出现“Please enter your User Name Correctly.”、“The Customer Number is incorrect. Please enter it again.”、“The Serial Number is incorrect. Please enter it again.”提示。
3.用W32Dasm反汇编MathMagic Pro v3.1.exe文件。
(1)查找字符串“Please enter your User Name Correctly.”,通过对代码的分析,得知在“004C8DA0”处设断!
(2)查找字符串“The Customer Number is incorrect. Please enter it again.”,通过对代码的分析,得知在“004C9250”处设断!
(3)查找字符串“The Serial Number is incorrect. Please enter it again.”,通过对代码的分析,得知在“004C93F6”处设断!
4.用OllyDbg载入程序,运行,并在“004C8DA0”、“004C9250”、“004C93F6”处设断!
(1)返回程序随意输入用户名(Blade)客户号(ABCD)和序列号(EFGH),点击“Authorization”。程序中断在“004C8DA0”处!通过单步跟踪分析得知:
004C8DA0 8B442404 mov eax,dword ptr ss:[esp+4]
004C8DA4 8B08 mov ecx,dword ptr ds:[eax]
004C8DA6 8B41F8 mov eax,dword ptr ds:[ecx-8] ;ECX="Blade"(用户名)!
004C8DA9 83F803 cmp eax,3 ;用户名长度是否“≥3”!
004C8DAC 7D11 jge short MathMagi.004C8DBF ;否,不转移,注册出错!
004C8DAE 6A00 push 0
004C8DB0 6A00 push 0
004C8DB2 6842E10000 push 0E142
004C8DB7 E836EC0800 call <jmp.&MFC42.#1199> ;过此处,提示“Please enter your User Name Correctly.”!
004C8DBC 32C0 xor al,al
004C8DBE C3 retn
004C8DBF 83F83F cmp eax,3F ;用户名长度是否“≤63”!
004C8DC2 7E11 jle short MathMagi.004C8DD5 ;否,不转移,注册出错!
004C8DC4 6A00 push 0
004C8DC6 6A00 push 0
004C8DC8 683C785C00 push MathMagi.005C783C
004C8DCD E822EA0800 call <jmp.&MFC42.#1200> ;过此处,提示“long name”!
(2)当程序中断在“004C9250”处时,通过单步跟踪分析得知:
004C9250 8B442404 mov eax,dword ptr ss:[esp+4] ;ECX="Blade"(用户名)!
004C9254 56 push esi
004C9255 8B30 mov esi,dword ptr ds:[eax] ;ESI="ABCD"(客户号)!
004C9257 837EF812 cmp dword ptr ds:[esi-8],12 ;客户号是否是18位!
004C925B 0F85870000 jnz MathMagi.004C92E8 ;否,转移,注册出错(提示“The Customer Number ...”)!
004C9261 8A4607 mov al,byte ptr ds:[esi+7] ;将客户号第8位存入AL!
004C9264 3C57 cmp al,57 ;客户号第8位是否是“W”!
004C9266 7404 je short MathMagi.004C926C ;是,转移!
004C9268 3C58 cmp al,58 ;客户号第8位是否是“X”!
004C926A 757C jnz short MathMagi.004C92E8 ;否,转移,注册出错!
004C926C 807E0855 cmp byte ptr ds:[esi+8],55 ;客户号第9位是否是“U”!
004C9270 7576 jnz short MathMagi.004C92E8 ;否,转移,注册出错!
004C9272 33C9 xor ecx,ecx
004C9274 8A0E mov cl,byte ptr ds:[esi]
004C9276 8D0431 lea eax,dword ptr ds:[ecx+esi]
004C9279 8A0C31 mov cl,byte ptr ds:[ecx+esi]
004C927C 80F93F cmp cl,3F
004C927F 7467 je short MathMagi.004C92E8
004C9281 8078FF3F cmp byte ptr ds:[eax-1],3F
004C9285 7461 je short MathMagi.004C92E8
004C9287 8A4E06 mov cl,byte ptr ds:[esi+6] ;将客户号第7位存入CL!
004C928A B02D mov al,2D ;将ASCII码“-”存入AL!
004C928C 3AC8 cmp cl,al ;客户号第7位是否是“-”!
004C928E 7558 jnz short MathMagi.004C92E8 ;否,转移,注册出错!
004C9290 38460A cmp byte ptr ds:[esi+A],al ;客户号第11位是否是“-”!
004C9293 7553 jnz short MathMagi.004C92E8 ;否,转移,注册出错!
004C9295 807E0349 cmp byte ptr ds:[esi+3],49 ;客户号第4位是否是“I”!
004C9299 754D jnz short MathMagi.004C92E8 ;否,转移,注册出错!
//重新输客户号(123I56-WU0-1234567),跟踪分析!!!
004C929B 56 push esi
004C929C E85F000000 call MathMagi.004C9300 ;客户号的算法,跟进!
……………… ………………
004C92B7 0FBE4C2418 movsx ecx,byte ptr ss:[esp+18] ;ECX=34('4')!
004C92BC 33C0 xor eax,eax ;EAX=0!
004C92BE 83C410 add esp,10
004C92C1 8A460F mov al,byte ptr ds:[esi+F] ;将客户号第16位存入AL!
004C92C4 3BC1 cmp eax,ecx ;客户号第16位是否是“4”!
004C92C6 7520 jnz short MathMagi.004C92E8 ;否,转移,注册出错!
004C92C8 0FBE442409 movsx eax,byte ptr ss:[esp+9] ;EAX=32('2')!
004C92CD 33D2 xor edx,edx
004C92CF 8A5610 mov dl,byte ptr ds:[esi+10] ;将客户号第17位存入DL!
004C92D2 3BD0 cmp edx,eax ;客户号第17位是否是“2”!
004C92D4 7512 jnz short MathMagi.004C92E8 ;否,转移,注册出错!
004C92D6 0FBE54240A movsx edx,byte ptr ss:[esp+A] ;EAX=41('A')!
004C92DB 33C9 xor ecx,ecx
004C92DD 8A4E11 mov cl,byte ptr ds:[esi+11] ;将客户号第18位存入CL!
004C92E0 3BCA cmp ecx,edx ;客户号第18位是否是“A”!
004C92E2 7504 jnz short MathMagi.004C92E8 ;否转移,注册出错!
//至此可得到正确的客户号:123I56-WU0-123442A!!!
(3)步入“004C9300”(客户号的算法),通过单步跟踪分析得知:
004C9300 8B4C2404 mov ecx,dword ptr ss:[esp+4] ;ECX="123I56-WU0-1234567"(客户号)!
……………… ………………
004C9313 8A510B mov dl,byte ptr ds:[ecx+B] ;DL=31H('1',客户号第12位)!
004C9316 8A4107 mov al,byte ptr ds:[ecx+7] ;AL=57H('W',客户号第8位)!
004C9319 88542404 mov byte ptr ss:[esp+4],dl ;SS:[ESP+4]=31H('1',客户号第12位)!
004C931D 8A510E mov dl,byte ptr ds:[ecx+E] ;DL=34H('4',客户号第15位)!
004C9320 88442410 mov byte ptr ss:[esp+10],al ;SS:[ESP+10]=57H('W',客户号第8位)!
004C9324 8A410D mov al,byte ptr ds:[ecx+D] ;AL=33H('3',客户号第14位)!
004C9327 88542408 mov byte ptr ss:[esp+8],dl ;SS:[ESP+8]=34H('4',客户号第15位)!
004C932B 8A5103 mov dl,byte ptr ds:[ecx+3] ;DL=49H('I',客户号第4位)!
004C932E 02D0 add dl,al ;DL=7CH(49H+33H,客户号4位+14位)!
004C9330 88442403 mov byte ptr ss:[esp+3],al ;SS:[ESP+3]=33H('3',客户号第14位)!
004C9334 8A442404 mov al,byte ptr ss:[esp+4] ;AL=31H('1',客户号第12位)!
004C9338 53 push ebx
004C9339 8A590C mov bl,byte ptr ds:[ecx+C] ;BL=32H('2',客户号第13位)!
004C933C 02D0 add dl,al ;DL=0ADH(7CH+31H,客户号4位+14位+12位)!
004C933E 56 push esi ;ESI="123I56-WU0-1234567"(客户号)!
004C933F 8AC3 mov al,bl ;AL=32H('2',客户号第13位)!
004C9341 0FB6F2 movzx si,dl ;SI=0ADH;ESI=3600ADH!
004C9345 8A5108 mov dl,byte ptr ds:[ecx+8] ;DL=55H('U',客户号第9位)!
004C9348 57 push edi
004C9349 02C2 add al,dl ;AL=87H(32H+55H,客户号13位+9位)!
004C934B 8A54241C mov dl,byte ptr ss:[esp+1C] ;DL=57H('W',客户号第8位)!
004C934F 02C2 add al,dl ;AL=0DEH(87H+57H,客户号13位+9位+8位)!
004C9351 33D2 xor dx,dx ;DX=0000H;EDX=120000H!
004C9354 8AD0 mov dl,al ;DL=0DEH(87H+57H,客户号13位+9位+8位)!
004C9356 33C0 xor eax,eax ;EAX=0!
004C9358 8A01 mov al,byte ptr ds:[ecx] ;AL=31H('1',客户号第1位)!
004C935A 0FAFF2 imul esi,edx ;ESI=1200DEH*3600ADH=3AFE9606H(3CC3AFE9606H)!
004C935D 8B542414 mov edx,dword ptr ;ss:[esp+14] ;EDX=34H('4',客户号第15位)!
004C9361 BF0A000000 mov edi,0A ;EDI=0AH(10D)!
004C9366 81E2FF0000 and edx,0FF ;EDX=34H!
004C936C 03C2 add eax,edx ;EAX=65H(31H+34H,客户号第1位+15位)!
004C936E 8B542410 mov edx,dword ptr ss:[esp+10] ;EDX=31H('1',客户号第12位)!
004C9372 81E2FF0000 and edx,0FF ;EDX=31H!
004C9378 03C2 add eax,edx ;EAX=96H(65H+31H,客户号第1位+15位+12位)!
004C937A 99 cdq
004C937B F7FF idiv edi ;EAX/EDI(96H/0AH),商存入EAX(0FH),余数存入EDX(0)!
004C937D 33C0 xor ax,ax ;EAX=0!
004C9380 5F pop edi
004C9381 8AC2 mov al,dl ;AL=0!
004C9383 8A54240B mov dl,byte ptr ss:[esp+B] ;DL=33H('3',客户号第14位)!
004C9387 03F0 add esi,eax
004C9389 8A4108 mov al,byte ptr ds:[ecx+8] ;AL=55H('U',客户号第9位)!
004C938C 02D0 add dl,al ;DL=88H(33H+55H,客户号第9位+14位)!
004C938E 8A4102 mov al,byte ptr ds:[ecx+2] ;AL=33H('3',客户号第3位)!
004C9391 02D0 add dl,al ;DL=0BBH(88H+33H,客户号第9位+14位+3位)!
004C9393 0FB6D2 movzx dx,dl
004C9397 0FAFF2 imul esi,edx ;ESI=3AFE9606H*0BBH=2B17F79662H(17F79662H)!
004C939A 8A5105 mov dl,byte ptr ds:[ecx+5] ;DL=36H('6',客户号第6位)!
004C939D 8A4C2410 mov cl,byte ptr ss:[esp+10] ;CL=34H('4',客户号第15位)!
004C93A1 2AD1 sub dl,cl ;DL=2H(36H-34H,客户号第6位-15位)!
004C93A3 2AD9 sub bl,cl ;BL=0FEH(32H-34H,客户号第13位-15位)!
004C93A5 02542418 add dl,byte ptr ss:[esp+18] ;DL=59H(2H+57H,客户号第6位-15位+8位)!
004C93A9 02D8 add bl,al ;BL=31H(0FEH+33H,客户号第13位+3位-15位)!
004C93AB 33C0 xor ax,ax ;EAX=0!
004C93AE 0FB6D2 movzx dx,dl
004C93B2 8AC3 mov al,bl ;AL=31H(0FEH+33H,客户号第13位+3位-15位)!
004C93B4 0FAFD0 imul edx,eax ;EDX=59H*31H=1109H!
004C93B7 33C0 xor ax,ax ;EAX=0!
004C93BA 03F2 add esi,edx ;ESI=17F7A76BH(17F79662H+1109H)!
004C93BC 0FB65424 movzx dx,byte ptr ss:[esp+B] ;DX=33H('3',客户号第14位)!
004C93C2 8AC1 mov al,cl ;EAX=34H('4',客户号第15位)!
004C93C4 8D0C40 lea ecx,dword ptr ds:[eax+eax*2] ;ECX=9CH(34H*3,客户号第15位*3)!
004C93C7 03F1 add esi,ecx ;ESI=17F7A807H(17F7A807H+9CH)!
004C93C9 B9D0070000 mov ecx,7D0 ;ECX=07D0H!
004C93CE 03F2 add esi,edx ;ESI=17F7A83AH(17F7A807H+客户号第15位*3+14位)!
004C93D0 81E6FFFF00 and esi,0FFFF ;ESI=0A83AH(“与”操作)!
004C93D6 8BC6 mov eax,esi ;EAX=0A83AH!
004C93D8 5E pop esi
004C93D9 99 cdq
004C93DA F7F9 idiv ecx ;EAX/ECX(0A83AH/07D0H),余数存入EDX(42AH)!
……………… ………………
004C93E3 C3 retn
(4)当程序中断在“004C93F6”处时,通过单步跟踪分析得知:
004C93F6 6AFF push -1
……………… ………………
004C940E 8BBC24A801 mov edi,dword ptr ss:[esp+1A8]
004C9415 8B07 mov eax,dword ptr ds:[edi] ;EAX="EFGH"(序列号)!
004C9417 8A08 mov cl,byte ptr ds:[eax] ;将序列号第1位存入CL!
004C9419 80F90A cmp cl,0A ;序列号第1位的十六进制值是否大于0AH!
004C941C 7315 jnb short MathMagi.004C9433 ;否,注册出错!
……………… ………………
004C9427 E8C6E50800 call <jmp.&MFC42.#1199> ;过此处,提示“The Serial Number is incorrect. ...”!
004C942C 32C0 xor al,al
004C942E E981010000 jmp MathMagi.004C95B4
004C9433 0FB6C9 movzx cx,cl ;将序列号第1位存入CX!
004C9437 33F6 xor esi,esi
004C9439 83F901 cmp cx,1 ;序列号第1位的十六进制值是否小于1H!
004C943D 7CDF jl short MathMagi.004C941E ;是,转移,注册出错!
004C943F 8D5001 lea edx,dword ptr ds:[eax+1]
004C9442 0FBFC9 movsx ecx,cx
004C9445 803A2D cmp byte ptr ds:[edx],2D ;“*”!
004C9448 7501 jnz short MathMagi.004C944B
004C944A 46 inc esi ;ESI=ESI+1!
004C944B 42 inc edx ;EDX=EDX+1!
004C944C 49 dec ecx ;ECX=ECX-1!
004C944D 75F6 jnz short MathMagi.004C9445 ;与“*”处构成循环,对序列号字符逐一检查,是否包含“-”!
004C944F 83FE02 cmp si,2 ;序列号中是否有两处包含“-”!
004C9453 75C9 jnz short MathMagi.004C941E ;否,转移,注册出错!
004C9455 8A08 mov cl,byte ptr ds:[eax] ;将序列号第1位存入CL!
004C9457 8A5001 mov dl,byte ptr ds:[eax+1] ;将序列号第2位存入DL!
004C945A 8A5802 mov bl,byte ptr ds:[eax+2] ;将序列号第3位存入BL!
004C945D 8B3580EE56 mov esi,dword ptr ds:[<&MSVCRT.spr>
004C9463 0FBE4003 movsx eax,byte ptr ds:[eax+3] ;将序列号第4位存入EAX!
004C9467 50 push eax
004C9468 0FBEC3 movsx eax,bl ;将序列号第3位存入EAX!
004C946B 50 push eax
004C946C 0FBED2 movsx edx,dl ;将序列号第2位存入EDX!
004C946F 0FBEC1 movsx eax,cl ;将序列号第1位存入EAX!
……………… ………………
004C9480 8B07 mov eax,dword ptr ds:[edi] ;EAX="EFGH"(序列号)!
004C9482 8A4805 mov cl,byte ptr ds:[eax+5] ;将序列号第6位存入CL!
004C9485 8A5006 mov dl,byte ptr ds:[eax+6] ;将序列号第7位存入DL!
004C9488 8A5807 mov bl,byte ptr ds:[eax+7] ;将序列号第8位存入BL!
004C948B 0FBE4008 movsx eax,byte ptr ds:[eax+8] ;将序列号第9位存入EAX!
004C948F 50 push eax
004C9490 0FBEC3 movsx eax,bl ;将序列号第8位存入EAX!
004C9493 50 push eax
004C9494 0FBED2 movsx edx,dl ;将序列号第7位存入EDX!
004C9497 0FBEC1 movsx eax,cl ;将序列号第6位存入EAX!
……………… ………………
004C94AB 8B07 mov eax,dword ptr ds:[edi] ;EAX="EFGH"(序列号)!
004C94AD 8A480A mov cl,byte ptr ds:[eax+A] ;将序列号第11位存入CL!
004C94B0 8A500B mov dl,byte ptr ds:[eax+B] ;将序列号第12位存入DL!
004C94B3 8A580C mov bl,byte ptr ds:[eax+C] ;将序列号第13位存入BL!
004C94B6 0FBE400D movsx eax,byte ptr ds:[eax+D] ;将序列号第14位存入EAX!(可知序列号长14位!)
//重新输入序列号(1234-5678-90AB),跟踪分析!!!
004C94BA 50 push eax
004C94BB 0FBEC3 movsx eax,bl ;EAX=41H('A',序列号第13位)!
004C94BE 50 push eax
004C94BF 0FBED2 movsx edx,dl ;EDX=30H('0',序列号第12位)!
004C94C2 0FBEC1 movsx eax,cl ;EAX=39H('9',序列号第11位)!
……………… ………………
004C94D9 8D94249C00 lea edx,dword ptr ss:[esp+9C] ;ss:[esp+9C]="90AB"(序列号后4位)!
004C94E0 8BCC mov ecx,esp ;EDX="90AB"(序列号后4位)!
……………… ………………
004C94ED 8D84242001 lea eax,dword ptr ss:[esp+120] ;ss:[esp+120]="5678"(序列号6-9位)!
004C94F4 8BCC mov ecx,esp ;EAX="5678"(序列号6-9位)!
……………… ………………
004C950C 8D542424 lea edx,dword ptr ss:[esp+24] ;ss:[esp+24]="1234"(序列号前4位)!
004C9510 8BCC mov ecx,esp ;EDX="1234"(序列号前4位)!
……………… ………………
004C952E E89D000000 call MathMagi.004C95D0 ;跟进!
004C9533 83C40C add esp,0C
004C9536 84C0 test al,al ;“与”操作!
004C9538 0F84E0FEFF je MathMagi.004C941E ;ZF=1,转移,注册出错!
(5)步入“004C95D0”,通过单步跟踪分析得知:
004C95D0 6AFF push -1
……………… ………………
004C95EA C74424240 mov dword ptr ss:[esp+24],0
004C95F2 8B44242C mov eax,dword ptr ss:[esp+2C] ;EAX="1234"(序列号前4位)!
004C95F6 8B48F8 mov ecx,dword ptr ds:[eax-8] ;ECX="1234"(序列号前4位)!
004C95F9 85C9 test ecx,ecx ;ECX按位“与”操作!
004C95FB 0F84670100 je MathMagi.004C9768 ;ZF=1,转移,注册出错!
004C9601 8B7C2430 mov edi,dword ptr ss:[esp+30] ;EDI="5678"(序列号第6-9位)!
004C9605 8B4FF8 mov ecx,dword ptr ds:[edi-8] ;ECX="5678"(序列号第6-9位)!
004C9608 85C9 test ecx,ecx ;ECX按位“与”操作!
004C960A 0F84580100 je MathMagi.004C9768 ;ZF=1,转移,注册出错!
004C9610 8B742434 mov esi,dword ptr ss:[esp+34] ;ESI="90AB"(序列号后4位)!
004C9614 8B4EF8 mov ecx,dword ptr ds:[esi-8] ;ECX="90AB"(序列号后4位)!
004C9617 85C9 test ecx,ecx ;ECX按位“与”操作!
004C9619 0F84490100 je MathMagi.004C9768 ;ZF=1,转移,注册出错!
004C961F 8A08 mov cl,byte ptr ds:[eax] ;CL=31H('1',序列号第1位)!
004C9621 8A5001 mov dl,byte ptr ds:[eax+1] ;DL=32H('2',序列号第2位)!
004C9624 884C2418 mov byte ptr ss:[esp+18],cl ;ss:[esp+18]=31H('1',序列号第1位)!
004C9628 8A4802 mov cl,byte ptr ds:[eax+2] ;CL=33H('3',序列号第3位)!
004C962B 8854240A mov byte ptr ss:[esp+A],dl ;ss:[esp+A]=32H('2',序列号第2位)!
004C962F 8A5003 mov dl,byte ptr ds:[eax+3] ;DL=34H('4',序列号第4位)!
004C9632 8A4702 mov al,byte ptr ds:[edi+2] ;AL=37H('7',序列号第8位)!
004C9635 8854240C mov byte ptr ss:[esp+C],dl ;ss:[esp+C]=34H('4',序列号第4位)!
004C9639 8A5602 mov dl,byte ptr ds:[esi+2] ;DL=31H('1',序列号第13位)!
004C963C 88442414 mov byte ptr ss:[esp+14],al ;ss:[esp+14]=37H('7',序列号第8位)!
004C9640 8A4603 mov al,byte ptr ds:[esi+3] ;AL=32H('2',序列号第14位)!
004C9643 88542410 mov byte ptr ss:[esp+10],dl ;ss:[esp+10]=41H('A',序列号第13位)!
004C9647 8B542414 mov edx,dword ptr ss:[esp+14] ;EDX=37H('7',序列号第8位)!
004C964B 8844240B mov byte ptr ss:[esp+B],al ;ss:[esp+B]=42H('B',序列号第14位)!
004C964F 8B442410 mov eax,dword ptr ss:[esp+10] ;EAX=41H('A',序列号第13位)!
004C9653 81E2FF0000 and edx,0FF ;EDX=37H('7',序列号第8位)!
004C9659 25FF000000 and eax,0FF ;EAX=41H('A',序列号第13位)!
004C965E 53 push ebx
004C965F 8A5E01 mov bl,byte ptr ds:[esi+1] ;BL=30H('0',序列号第12位)!
004C9662 03C2 add eax,edx ;EAX=78H(41H+37H,序列号第13位+8位)!
004C9664 8B54241C mov edx,dword ptr ss:[esp+1C]
004C9668 884C2411 mov byte ptr ss:[esp+11],cl ;ss:[esp+1C]=33H('3',序列号第3位)!
004C966C 8A0E mov cl,byte ptr ds:[esi] ;CL=39H('9',序列号第11位)!
004C966E 81E2FF0000 and edx,0FF ;EDX=31H('1',序列号第1位)!
004C9674 03C2 add eax,edx ;EAX=0A9H(78H+31H,序列号第13位+8位+1位)!
004C9676 BE0A000000 mov esi,0A ;将0AH存入ESI!
004C967B 99 cdq
004C967C F7FE idiv esi ;EAX/ESI,商存入EAX(10H),余数A存入EDX(9H)!
004C967E 8AC1 mov al,cl ;AL=39H('9',序列号第11位)!
004C9680 C64424280 mov byte ptr ss:[esp+28],1 ;ss:[esp+28]=1H!
004C9685 88542413 mov byte ptr ss:[esp+13],dl ;ss:[esp+13]=9H(余数A)!
004C9689 8A17 mov dl,byte ptr ds:[edi] ;DL=35H('5',序列号第6位)!
004C968B 02C2 add al,dl ;AL=6EH(39H+35H,序列号第11位+6位)!
004C968D 8A542411 mov dl,byte ptr ss:[esp+11] ;DL=33H('3',序列号第3位)!
004C9691 02C2 add al,dl ;AL=0A1H(6EH+33H,序列号第11位+6位+3位)!
004C9693 8A5701 mov dl,byte ptr ds:[edi+1] ;DL=36H('6',序列号第7位)!
004C9696 88442412 mov byte ptr ss:[esp+12],al ;SS:[ESP+1]=0A1H(6EH+33H,序列号第11位+6位+3位)!
004C969A 8A44240F mov al,byte ptr ss:[esp+F] ;AL=42H(序列号第14位)!
004C969E 2AC2 sub al,dl ;AL=0CH(42H-36H,序列号第14位-7位)!
004C96A0 8A54240E mov dl,byte ptr ss:[esp+E] ;DL=32H('2',序列号第2位)!
004C96A4 02C2 add al,dl ;AL=3EH(0CH+32H,序列号第14位-7位+2位)!
004C96A6 8A542414 mov dl,byte ptr ss:[esp+14] ;DL=41H('A',序列号第13位)!
004C96AA 88442411 mov byte ptr ss:[esp+11],al ;SS:[ESP+11]=3EH(0CH+32H,序列号第14位-7位+2位)!
004C96AE 8A442410 mov al,byte ptr ss:[esp+10] ;AL=34H('4',序列号第4位)!
004C96B2 02D3 add dl,bl ;DL=71H(41H+30H,序列号第13位+12位)!
004C96B4 02D0 add dl,al ;DL=A5H(71H+34H,序列号第13位+12位+4位)!
004C96B6 8A44240F mov al,byte ptr ss:[esp+F] ;AL=42H('B',序列号第14位)!
004C96BA 2AC8 sub cl,al ;CL=0F7H(39H-42H,序列号第11位-14位)!
004C96BC 8A44240E mov al,byte ptr ss:[esp+E] ;AL=32H('2',序列号第2位)!
004C96C0 02C8 add cl,al ;CL=29H(0F7H-32H,序列号第11位-14位+2位)!
004C96C2 8A442410 mov al,byte ptr ss:[esp+10] ;AL=34H('4',序列号第4位)!
004C96C6 02D8 add bl,al ;BL=64H(30H+34H,序列号第12位+4位)!
004C96C8 33C0 xor ax,ax ;AX=0!
004C96CB 0FB6D2 movzx dx,dl
004C96CF 8AC3 mov al,bl ;AL=64H(30H+34H,序列号第12位+4位)!
004C96D1 5B pop ebx
004C96D2 0FAFC2 imul eax,edx ;EAX=*64H*0A5H=4074H((第12位+4位)*(第13位+12位+4位))!
004C96D5 0FB65424 movzx dx,byte ptr ss:[esp+D] ;DX=3EH(0CH+32H,序列号第14位-7位+2位)!
004C96DB 0FB6C9 movzx cx,cl
004C96DF 0FAFCA imul ecx,edx ;ECX=9EEH((第11位-14位+2位)*(第14位-7位+2位))!
004C96E2 0FB65424 movzx dx,byte ptr ss:[esp+F] ;DX=09H(余数A)!
004C96E8 03C1 add eax,ecx
;EAX=4074H+9EEH=4A62H((第12位+4位)*(第13位+12位+4位)+(第11位-14位+2位)*(第14位-7位+2位))!
004C96EA 0FB64C24 movzx cx,byte ptr ss:[esp+E] ;CX=0A1H(6EH+33H,序列号第11位+6位+3位)!
004C96F0 0FAFCA imul ecx,edx ;ECX=5A9H((序列号第11位+6位+3位)*余数A)!
004C96F3 0FB65424 movzx dx,byte ptr ss:[esp+10] ;DX=41H('A',序列号第13位)!
004C96F9 03C1 add eax,ecx
;EAX=500BH((第12位+4位)*(第13位+12位+4位)+(第11位-14位+2位)*(第14位-7位+2位)+(第11位+6位+3位)*余数A)!
004C96FB 0FB64C24 movzx cx,byte ptr ss:[esp+A] ;CX=32H('2',序列号第2位)!
004C9701 8D0C49 lea ecx,dword ptr ds:[ecx+ecx*2] ;ECX=96H(序列号第2位*3)!
004C9704 03C1 add eax,ecx
;EAX=50A1H((12位+4位)*(13位+12位+4位)+(11位-14位+2位)*(14位-7位+2位)+(11位+6位+3位)*余数A+(2位*3))!
004C9706 B91A000000 mov ecx,1A ;ECX=1AH!
004C970B 03C2 add eax,edx
;EAX=((12位+4位)*(13位+12位+4位)+(11位-14位+2位)*(14位-7位+2位)+(11位+6位+3位)*余数A+(2位*3)+13位)!
004C970D 25FFFF0000 and eax,0FFFF ;EAX与0FFFFH作“与”运算!
004C9712 99 cdq
004C9713 F7F9 idiv ecx ;EAX/ECX,商存入EAX(31CH),余数B存入EDX(A)!
004C9715 8D4C242C lea ecx,dword ptr ss:[esp+2C] ;
004C9719 80C241 add dl,41 ;DL=0AH+41H=4BH(余数B+41H)!
004C971C 88542418 mov byte ptr ss:[esp+18],dl ;SS:[ESP+18]=4BH(余数B+41H)!
004C9720 0FBE5703 movsx edx,byte ptr ds:[edi+3] ;EDX=38H('8',序列号第9位)!
004C9724 8B442418 mov eax,dword ptr ss:[esp+18]
004C9728 25FF000000 and eax,0FF ;EAX=4BH(余数+41H)!
004C972D 3BC2 cmp eax,edx ;EAX是否等于EDX(序列号第9位十六进制值)!
004C972F 7540 jnz short MathMagi.004C9771 ;否,转移,注册出错!
//得到输入序列号“1234-567K-90AB”!!!
……………… ………………
004C9767 C3 retn
5.重新输入用户名(Blade)、客户号(123I56-WU0-123442A)、序列号(1234-567K-90AB)运行程序,出现“The Serial # is not matched to the Customer # ...”提示,经分析在“004C953E”设断!用OllyDbg载入程序,运行,并在“004C953E”处设断!
(1)返回程序随意输入用户名(Blade)客户号(123I56-WU0-123442A)和序列号(1234-567K-90AB),点击“Authorization”。程序中断在“004C953E”处!通过单步跟踪分析得知:
004C953E 51 push ecx
……………… ………………
004C9575 E836020000 call MathMagi.004C97B0 ;跟进!
004C957A 83C4 08 add esp,8
004C957D 84C0 test al,al ;“与”操作!
004C957F 75 12 jnz short MathMagi.004C9593 ;ZF=1,不转移,注册出错!
(2)步入“004C97B0”,通过单步跟踪分析得知:
004C97B0 A100000 mov eax,dword ptr fs:[0]
……………… ………………
004C97CF 8B442420 mov eax,dword ptr ss:[esp+20] ;EAX="123I56-WU0-123442A"(客户号)!
004C97D3 33FF xor edi,edi ;EDI=0!
004C97D5 3958F8 cmp dword ptr ds:[eax-8],ebx ;客户号是否为空!
004C97D8 0F84210100 je MathMagi.004C98FF ;转移,注册出错!
004C97DE 8B6C2424 mov ebp,dword ptr ss:[esp+24] ;EBP="1234"(序列号前4位)!
004C97E2 395DF8 cmp dword ptr ss:[ebp-8],ebx ;序列号是否为空!
004C97E5 0F84140100 je MathMagi.004C98FF ;是,转移,注册出错!
004C97EB 0FB608 movzx cx,byte ptr ds:[eax] ;CX=31H('1',客户号第1位)!
004C97EF 0FBFC9 movsx ecx,cx ;CX=360000H+31H('1',客户号第1位)!
004C97F2 BA01000000 mov edx,1 ;EDX=1H!
004C97F7 8D71FF lea esi,dword ptr ds:[ecx-1]
004C97FA 3BF2 cmp esi,edx
004C97FC 7E10 jle short MathMagi.004C980E
004C97FE 8BCA mov ecx,edx ;ECX=1H!
……………… ………………
004C980E 8A4807 mov cl,byte ptr ds:[eax+7] ;CL=57H('W',客户号第8位)!
004C9811 80F94D cmp cl,4D ;客户号第8位是否是“M”!
004C9814 0FBE4808 movsx ecx,byte ptr ds:[eax+8] ;ECX=55H('U',客户号第9位)!
004C9818 751D jnz short MathMagi.004C9837 ;否,转移!
……………… ………………
004C9837 83E94A sub ecx,4A ;ECX=0BH(客户号第9位-4AH)!
004C983A 7414 je short MathMagi.004C9850
004C983C 49 dec ecx ;ECX=ECX-1H=0AH!
004C983D 740D je short MathMagi.004C984C
004C983F 83E90A sub ecx,0A ;ECX=0!
004C9842 7404 je short MathMagi.004C9848 ;转移!
004C9844 B254 mov dl,54
004C9846 EB0A jmp short MathMagi.004C9852
004C9848 B255 mov dl,55 ;DL=55H!
004C984A EB06 jmp short MathMagi.004C9852 ;转移!
004C984C B253 mov dl,53
004C984E EB02 jmp short MathMagi.004C9852
004C9850 B252 mov dl,52
004C9852 8A4803 mov cl,byte ptr ds:[eax+3] ;CL=49H('I',客户号第3位)!
004C9855 80F958 cmp cl,58 ;客户号第3位是否是“X”!
004C9858 7523 jnz short MathMagi.004C987D ;否,转移!
……………… ………………
004C987D 0FBE4004 movsx eax,byte ptr ds:[eax+4] ;EAX=35H('5',客户号第5位)!
004C9881 80F949 cmp cl,49 ;客户号第3位是否是“I”!
004C9884 751F jnz short MathMagi.004C98A5 ;是,不转移!
004C9886 83E841 sub eax,41 ;EAX=0FFFFFFF4H(客户号第5位-41H)!
004C9889 7416 je short MathMagi.004C98A1
004C988B 83E802 sub eax,2 ;EAX=0FFFFFFF2H(客户号第5位-41H-2H)!
004C988E 740D je short MathMagi.004C989D
004C9890 83E80B sub eax,0B ;EAX=0FFFFFFE7H(客户号第5位-41H-2H-0BH)!
004C9893 7404 je short MathMagi.004C9899
004C9895 B04B mov al,4B ;AL=4BH(EAX=FFFFFF4BH)!
004C9897 EB29 jmp short MathMagi.004C98C2 ;转移!
……………… ………………
004C98C2 3A5502 cmp dl,byte ptr ss:[ebp+2] ;DL是否等于序列号第3位!
004C98C5 7538 jnz short MathMagi.004C98FF ;否,转移,注册出错!
004C98C7 3A4503 cmp al,byte ptr ss:[ebp+3] ;AL是否等于序列号第4位!
004C98CA 7533 jnz short MathMagi.004C98FF ;否,转移,注册出错!
……………… ………………
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
看原图
赞赏
雪币:
留言: