0048DBC6 |. C645 F0 00 MOV BYTE PTR SS:[EBP-10],0 0048DBCA |. 8D53 10 LEA EDX,DWORD PTR DS:[EBX+10] 0048DBCD |. 8D45 DC LEA EAX,[LOCAL.9] 0048DBD0 |. B9 08000000 MOV ECX,8 ; <== 8 charts 0048DBD5 |. E8 ECFCFFFF CALL DUMeter.0048D8C6 ; <== SecIII 0048DBDA |. C645 E4 00 MOV BYTE PTR SS:[EBP-1C],0 0048DBDE |. 8D45 C8 LEA EAX,[LOCAL.14] 0048DBE1 |. B9 10000000 MOV ECX,10 ; <== 16 charts 0048DBE6 |. 8BD3 MOV EDX,EBX 0048DBE8 |. E8 D9FCFFFF CALL DUMeter.0048D8C6 ; <== SecIV - Đầu tiên chương trình sẽ mã hoá chuỗi U nhập . Tuy nhiên, trước khi tiến hành quá trình mã hoá chương trình sẽ chuyển đổi các ký tự của chuỗi U nhập sang dạng UpperCase và loại bỏ các ký tự đặc biệt : 0048DBFF |. E8 81FDFFFF CALL DUMeter.0048D985 ; <== Encrypt U : ValueU === Encrypt U === 0048D98C |> /C1E2 04 /SHL EDX,4 ; <== ValueU = ValueU * 0x10 0048D98F |. |0FBE08 |MOVSX ECX,BYTE PTR DS:[EAX] ; <== U[i] 0048D992 |. |03D1 |ADD EDX,ECX ; <== ValueU = ValueU + U[i] 0048D994 |. |8BCA |MOV ECX,EDX ; <== Temp = ValueU 0048D996 |. |81E1 000000F0 |AND ECX,F0000000 ; <== Temp = Temp and 0xF0000000 0048D99C |. |85C9 |TEST ECX,ECX ; <== if ( ECX != 0x0 ) 0048D99E |. |74 0B |JE SHORT DUMeter.0048D9AB ; <== then 0048D9A0 |. |C1E9 18 |SHR ECX,18 ; <== Temp = Temp / 0x1000000 0048D9A3 |. |33D1 |XOR EDX,ECX ; <== Value = Value xor Temp 0048D9A5 |. |81E2 FFFFFF0F |AND EDX,0FFFFFFF ; <== ValueU = ValueU & 0xFFFFFFF 0048D9AB |> |40 |INC EAX ; <== i++ 0048D9AC |> |8038 00 CMP BYTE PTR DS:[EAX],0 ; <== while ( i < LenU ) 0048D9AF |.^\75 DB \JNZ SHORT DUMeter.0048D98C ; <== continue Loop === Encrypt U === - Kế đó là mã hoá SecI . Đoạn mã hoá này cho ta biết được rằng các ký tự của SecI phải là một trong các ký tự của chuỗi mặc định "ABCDEFGHIJKLMNOPQRSTUVWXYZ987654" : 0048DC06 |. 8D45 F4 LEA EAX,[LOCAL.3] ; <== SecI 0048DC09 |. E8 01FEFFFF CALL DUMeter.0048DA0F ; <== Encrypt SecI : ValueI === Encrypt SecI === 0048DA19 |. E8 7EFEFFFF CALL DUMeter.0048D89C ; <== LenSecI 0048DA1E |. 83F8 03 CMP EAX,3 ; <== Must be 3 charts 0048DA21 |. 73 04 JNB SHORT DUMeter.0048DA27 0048DA23 |. 33C0 XOR EAX,EAX 0048DA25 |. EB 39 JMP SHORT DUMeter.0048DA60 0048DA27 |> BA 0C174F00 MOV EDX,DUMeter.004F170C ; ASCII "ABCDEFGHIJKLMNOPQRSTUVWXYZ987654" 0048DA2C |. 8A03 MOV AL,BYTE PTR DS:[EBX] ; <== SecI[0] 0048DA2E |. E8 82FFFFFF CALL DUMeter.0048D9B5 ; <== Location in DefaultString 0048DA33 |. 8BF0 MOV ESI,EAX ; <== LocI 0048DA35 |. 4E DEC ESI ; <== LocI- - 0048DA36 |. BA 0C174F00 MOV EDX,DUMeter.004F170C ; ASCII "ABCDEFGHIJKLMNOPQRSTUVWXYZ987654" 0048DA3B |. 8A43 01 MOV AL,BYTE PTR DS:[EBX+1] ; <== SecI[1] 0048DA3E |. E8 72FFFFFF CALL DUMeter.0048D9B5 ; <== Location in DefaultString 0048DA43 |. 8BF8 MOV EDI,EAX ; <== LocII 0048DA45 |. 4F DEC EDI ; <== LocII 0048DA46 |. BA 0C174F00 MOV EDX,DUMeter.004F170C ; ASCII "ABCDEFGHIJKLMNOPQRSTUVWXYZ987654" 0048DA4B |. 8A43 02 MOV AL,BYTE PTR DS:[EBX+2] ; <== SecI[2] 0048DA4E |. E8 62FFFFFF CALL DUMeter.0048D9B5 ; <== Location in DefaultString 0048DA53 |. 48 DEC EAX ; <== LocIII 0048DA54 |. C1E7 05 SHL EDI,5 ; <== ValueI = LocII * 0x20 0048DA57 |. 0BF7 OR ESI,EDI ; <== Value = Value or LocI 0048DA59 |. C1E0 0A SHL EAX,0A ; <== LocIII = LocIII * 0x400 0048DA5C |. 0BF0 OR ESI,EAX ; <== Value = Value or LocIII 0048DA5E |. 8BC6 MOV EAX,ESI ; <== Value === Encrypt SecI === - Tiếp đến là quá trình chuyển đổi SecII từ chuỗi sang dạng HEX Value tương ứng ( Ví dụ SecII : “123AB” được chuyển sang thành giá trị ValueII = 0x123AB ) . Như vậy, các ký tự của SecII phải nằm trong khoảng các ký tự sau “123456789ABCDEF” : 0048DC10 |. 8D45 E8 LEA EAX,[LOCAL.6] ; <== SecII 0048DC13 |. E8 7CFEFFFF CALL DUMeter.0048DA94 ; <== Convert to HEX value : ValueII - Tiếp đó là quá trình kiểm tra đầu tiên : 0048DC1A |. 3BF3 CMP ESI,EBX ; <== if ( ValueU == ValueII ) 0048DC1C 74 04 JE SHORT DUMeter.0048DC22 ; <== Continue check - Tương tự như quá trình mã hoá SecII, SecIII cũng giống như vậy : 0048DC22 |> \8D45 DC LEA EAX,[LOCAL.9] ; <== SecIII 0048DC25 |. E8 6AFEFFFF CALL DUMeter.0048DA94 ; <== Convert to HEX value : ValueIII - Qúa trình mã hoá SecIV dựa trên thuật toán CRC32 : 0048DC2C |. 8D45 C8 LEA EAX,[LOCAL.14] ; <== SecIV 0048DC2F |. E8 1EFDFFFF CALL DUMeter.0048D952 ; <== CRC32 Encrypt === CRC32 Encrypt === 0048D95F |. 83CE FF OR ESI,FFFFFFFF ; <== CRC32Value 0048D962 |. 33DB XOR EBX,EBX ; <== i = 0x0 0048D964 |. EB 0D JMP SHORT DUMeter.0048D973 0048D966 |> 8A041F /MOV AL,BYTE PTR DS:[EDI+EBX] ; <== SecIV[i] 0048D969 |. 8BD6 |MOV EDX,ESI ; <== CRC32Value === CRC32 === 0048D93B |. 32C2 XOR AL,DL ; <== Temp = CRC32Value xor SecIV[i] 0048D93D |. 25 FF000000 AND EAX,0FF ; <== Temp = Temp and 0xFF 0048D942 |. 8B0C85 B0504F>MOV ECX,DWORD PTR DS:[EAX*4+4F50B0] ; <== Value = CRC32Table[Temp] 0048D949 |. C1EA 08 SHR EDX,8 ; <== CRC32Value = CRC32Value / 0x100 0048D94C |. 33CA XOR ECX,EDX ; <== Value = Value xor CRC32Value 0048D94E |. 8BC1 MOV EAX,ECX ; <== Value === CRC32 === 0048D970 |. 8BF0 |MOV ESI,EAX ; <== CRC32Value = Value 0048D972 |. 43 |INC EBX ; <== i++; 0048D973 |> 8BC7 MOV EAX,EDI ; <== SecIV 0048D975 |. E8 22FFFFFF |CALL DUMeter.0048D89C ; <== LenSecIV 0048D97A |. 3BD8 |CMP EBX,EAX ; <== while ( i < LenSecIV ) 0048D97C |.^ 72 E8 \JB SHORT DUMeter.0048D966 ; <== Continue Loop 0048D97E |. 8BC6 MOV EAX,ESI ; <== CRC32Value === CRC32 Encrypt === 0048DC34 |. 33C3 XOR EAX,EBX ; <== CRC32Value = CRC32Value xor ValueU - Quá trình kiểm tra thứ hai diễn ra như sau : 0048DC36 |. 3BC6 CMP EAX,ESI ; <== if ( CRC32Value == ValueIII ) 0048DC38 75 04 JNZ SHORT DUMeter.0048DC3E ; <== Congrat !!!! /*/*/*/ - SERIAL tương ứng : User : REA-cRaCkErTeAm Serial : D3-JD5-06FFE94D-6348F8BD Serial : N/A III – End of Tut : - Finished – September 13, 2004 - Thank to my family, Computer_Angel, Zombie_Deathman, Littleboy all REA‘s members, HacNho, RongChauA, Deux, Infinity, all my friend, and YOU. REVERSE ENGINEERING ASSOCIATION http://www.reaonline.net Reverse Engineering Association SoftWare Homepage : http://www.freshdevices.com Production : Freshdevices Corp. SoftWare : FreshDiagnose 6.70 Copyright by : Copyright © 2001-2004 Freshdevices Corp. All Rights Reserved. Type : Name / Serial Packed : ASPack 2.12 -> Alexey Solodovnikov Language : Borland Delphi 6.0 - 7.0 Crack Tool : OllyDbg 1.09d, PEiD 0.92, kWdsm 10 Unpack : Manual Request : Correct Serial FreshDiagnose 6.70 FRESH DIAGNOSE is an utility designed to analyze and benchmark your computer system. It can analyze and benchmark many kinds of hardware, such as CPU performance, hard disk performance, video system information, mainboard information, and many more! I – Information : - Dùng PEiD kiểm tra biết chương trình bị PACK bằng ASPack 2.12 -> Alexey Solodovnikov . UnPACK và kiểm tra lại biết chương trình được viết bằng Borland Delphi 6.0 - 7.0 - Chạy thử chương trình với User và Fake Serial ta không nhận được thông báo gì . Tuy nhiên trong quá trình tìm kiếm chuỗi ta tìm được thông báo : 00561F2F > \B8 74215600 MOV EAX,unpack.00562174 ; ASCII "FreshDiagnose has been registered successfully." - Dò ngược lên trên và đặt BreakPoint tại lệnh CALL đầu tiên của FUNCTION này : 00561EB2 . E8 1176F0FF CALL unpack.004694C8 ; <== Set BreakPoint here II – Cracking : - Load chương trình lên, chạy chương trình với User và Fake Serial, chương trình dừng lại tại điểm đặt BP . Trace xuống chút : 00561EF2 . E8 A5FDFFFF CALL unpack.00561C9C ; <== Trace Into === Trace Into === - Chuỗi Serial đầu tiên là chuỗi Serial không hợp lệ . Chỉ có 1 chuỗi Serial duy nhất : 00561D34 |> /8D4D F0 /LEA ECX,[LOCAL.4] 00561D37 |. |0FBFD6 |MOVSX EDX,SI 00561D3A |. |8B45 FC |MOV EAX,[LOCAL.1] 00561D3D |. |8B80 34030000 |MOV EAX,DWORD PTR DS:[EAX+334] 00561D43 |. |8B80 20020000 |MOV EAX,DWORD PTR DS:[EAX+220] 00561D49 |. |8B38 |MOV EDI,DWORD PTR DS:[EAX] 00561D4B |. |FF57 0C |CALL DWORD PTR DS:[EDI+C] ; <== Licence of Old Version 00561D4E |. |8B55 F0 |MOV EDX,[LOCAL.4] ; <== RealSerial 00561D51 |. |A1 A4115800 |MOV EAX,DWORD PTR DS:[5811A4] ; <== Fake Serial 00561D56 |. |E8 5D34EAFF |CALL unpack.004051B8 ; <== Compare 00561D5B |. |75 0A |JNZ SHORT unpack.00561D67 00561D5D |. |C705 98115800>|MOV DWORD PTR DS:[581198],-1 . /8D4D F0 /LEA ECX,[LOCAL.4] 00 561D37 |. |0FBFD6 |MOVSX EDX,SI 00 561D3A |. |8B45 FC |MOV EAX,[LOCAL .1] 00 561D3D |. |8B 80 3 403 000 0 |MOV EAX,DWORD PTR DS:[EAX+334] 00 561D43 |. |8B 80 200 200 00 |MOV. 00 48DBD5 |. E8 ECFCFFFF CALL DUMeter .00 48D8C6 ; <== SecIII 00 48DBDA |. C645 E4 00 MOV BYTE PTR SS:[EBP-1C] ,0 00 48DBDE |. 8D45 C8 LEA EAX,[LOCAL .14 ] 00 48DBE1 |. B9 10 000 000 MOV ECX , 10 . 00 48DBC6 |. C645 F0 00 MOV BYTE PTR SS:[EBP - 10 ] ,0 00 48DBCA |. 8D53 10 LEA EDX,DWORD PTR DS:[EBX + 10 ] 00 48DBCD |. 8D45 DC LEA EAX,[LOCAL.9] 00 48DBD0 |. B9 08 000 000 MOV ECX,8 ;