Posted by: moonbaby Jan 28 2004, 08:05 AM QUOTE Homepage : http:// www.SoftCab.com ( load from www.softpile.com ) Production : SoftCab, Inc. (Time Sync Pro v1.3) Copyright by : All copyrights to Time Sync Pro Cracked File : timesync.exe ( unpacked file dumped_.exe Microsoft Visual C++ 6.0 ) Type : Name / Serials Packed : UPX 0.71 - 0.72 -> Markus & Laszlo Crack Tool : OllyDbg 1.09d, ImportREC Unpack Type : Unpack Manual Carried Out : Correct Serial Note : None About Time Sync Pro v1.3 Little program that controls your computer clock. Dùng PEiD ta biết được chương trình được nén bằng UPX 0.71 - 0.72 -> Markus & Laszlo . I - UNPACK : Load chương trình lên bằng Olly. Chọn No ( không Analysis ) . Ta sẽ đến đây : QUOTE 00415000 > $ 60 PUSHAD 00415001 . E8 00000000 CALL timesync.00415006 Kéo màn hình xuống phía dưới cho đến khi gặp dòng lệnh : QUOTE 00415197 > \61 POPAD 00415198 E9 A61EFFFF JMP timesync.00407043 < === Đặt BreakPoint tại đây. 0041519D 55 DB 55 ; CHAR 'U' 0041519E 50 DB 50 ; CHAR 'P' Sau khi đặt BreakPoint ta nhấn F9, chương trình sẽ dừng tại đây. Nhấn F7 ta đến : QUOTE 00407043 55 PUSH EBP < === Dừng tại đây. 00407044 8BEC MOV EBP,ESP Ngay tại đây ta chọn Plugins === > OllyDump === > Dump debugged process . Ghi giá trị tại ô > Modify ( ở đây là 7043 ). Nhấn OK và lưu lại chương trình ở bất cứ tên gì mà bạn thích. Với đuôi là .exe. Giữ nguyên chương trình , dùng chương trình ImportREC v1.6 load timesync.exe, thay giá trị OEP mà ta vừa tìm được ở trên vào (7043 ). Nhấn IAT Auto Search, sau khi hoàn tất nhấn tiếp Get Imports, cuối cùng nhất Fix Dump. Chọn lấy file mà ta đã lưu ở trên. Thế là chương trình đã được UNPACK thành công. Để làm sạch chương trình và giảm thiểu kích thước file sau khi được unpack ta dùng LordPE delux v1.4, chọn Rebuild PE, chọn lấy file đã được unpack. Kiểm tra file cuối cùng bằng PEiD, ta biết chương trình được viết bằng Microsoft Visual C++ 6.0 . II - SERIAL : Chương trình này không có AntiDebug. Chương trình này sau khi tôi UNPACK xong thì chạy bình thường, nhưng khi load lên bằng Olly thì xuất hiện thông báo : Entry Point Alert. Vi thế nên khi dùng Search String không thể tìm thấy gì, đòng thời dùng Win32dsmv10 cũng không thể load lên được. Chính vì thế phải dùng chuột kéo màn hình để tìm. >>>>>>>> Sau khi kéo chuột lên trên một đoạn ta tìm thấy dòng : QUOTE 0040476D 68 78F24000 PUSH dumped_.0040F278 ; ASCII "Thank you for your support!" >>>> Ta chọn đọan code sau để tiến hành phân tích: QUOTE 0040475D E8 DE010000 CALL dumped_.00404940 < === Đặt BreakPoint tại đây 00404762 85C0 TEST EAX,EAX < === Kiểm tra giá trị trả về 00404764 74 0E JE SHORT dumped_.00404774 < == Nếu EAX = 0 thì nhảy đến báo sai 00404766 6A 40 PUSH 40 < === Còn không thì chuyển đến thông báo đúng. 00404768 68 94F24000 PUSH dumped_.0040F294 ; ASCII "Thanks" 0040476D 68 78F24000 PUSH dumped_.0040F278 ; ASCII "Thank you for your support!" 00404772 EB 1A JMP SHORT dumped_.0040478E 00404774 6A 10 PUSH 10 00404776 68 60F14000 PUSH dumped_.0040F160 ; ASCII "Error" 0040477B C605 C80D4100 0>MOV BYTE PTR DS:[410DC8],0 00404782 C605 480E4100 0>MOV BYTE PTR DS:[410E48],0 00404789 68 40F24000 PUSH dumped_.0040F240 ; ASCII "You have entered wrong key or name! Please try again" 0040478E 8BCE MOV ECX,ESI 00404790 E8 ABD5FFFF CALL dumped_.00401D40 Quan sát đoạn code trên ta nhận thấy lệnh CALL ở địa chỉ 0040475D là cốt lõi của quá trình mã hoá. Trace vào trong lệnh này ta đến : QUOTE 00404940 68 C80D4100 PUSH dumped_.00410DC8 ; ASCII "123456789" 00404945 68 480E4100 PUSH dumped_.00410E48 ; ASCII "Moonbaby" 0040494A E8 E1FEFFFF CALL dumped_.00404830 < === Trace thẳng vào trong 0040494F 83C4 08 ADD ESP,8 00404952 33C9 XOR ECX,ECX 00404954 85C0 TEST EAX,EAX < === Kiểm tra giá trị trả về 00404956 0F9FC1 SETG CL < ==== Đúng hay Sai 00404959 8BC1 MOV EAX,ECX 0040495B C3 RETN < == Trở về chương trình chính Cũng thế, ở đoạn code này thì lệnh CALL ở 0040494A là cốt lõi. Sau khi trace vào trong ta đến : QUOTE 00404830 53 PUSH EBX < === Ta đến đây Trace xuống tiếp một đoạn ta đến : QUOTE 0040483E FFD6 CALL ESI < === Chiều dài chuỗi S nhập 00404840 83F8 03 CMP EAX,3 < === Phải lớn hơn 3 ký tự 00404843 /0F8C EA000000 JL dumped_.00404933 < ==== Nếu không nhảy đến báo sai và 0040484E FFD6 CALL ESI < === Chiều dài chuỗi U nhập 00404850 83F8 03 CMP EAX,3 < === Phải lớn hơn 3 ký tự 00404853 0F8C DA000000 JL dumped_.00404933 < ==== Nếu không nhảy đến báo sai Trace tiếp ta đến : QUOTE 004048AD 8A03 MOV AL,BYTE PTR DS:[EBX] < == Đưa từng ký tự U nhập vào AL 004048AF 33C9 XOR ECX,ECX < === ECX = 00 004048B1 84C0 TEST AL,AL < == Kiểm tra đến hết chuỗi chưa hay có khoảng trắng không 004048B3 8BD3 MOV EDX,EBX < === EDX chứa chuỗi U nhập 004048B5 74 33 JE SHORT dumped_.004048EA < === Thoát vòng lặp nếu AL = 0 004048B7 3C 20 CMP AL,20 < === So sánh với 20h 004048B9 74 27 JE SHORT dumped_.004048E2 < == Nhảy nếu bằng 004048BB 3C 0D CMP AL,0D < ==== So sánh với 0Dh 004048BD 74 23 JE SHORT dumped_.004048E2 < == Nhảy nếu bằng 004048BF 3C 0A CMP AL,0A < ==== So sánh với 0Ah 004048C1 74 1F JE SHORT dumped_.004048E2 < == Nhảy nếu bằng 004048C3 3C 09 CMP AL,9 < ====== So sánh với 09h 004048C5 74 1B JE SHORT dumped_.004048E2 < == Nhảy nếu bằng 004048C7 3C 61 CMP AL,61 < ====== So sánh với 61h 004048C9 7C 0C JL SHORT dumped_.004048D7 < == Nhảy nếu nhỏ hơn 004048CB 3C 7A CMP AL,7A < ====== So sánh với 7Ah 004048CD 7F 08 JG SHORT dumped_.004048D7 < == Nhảy nếu lớn hơn 004048CF 0FBEC0 MOVSX EAX,AL < === EAX chứa ký tự của U được lưu ở AL 004048D2 83E8 20 SUB EAX,20 < === EAX = EAX – 20h 004048D5 EB 03 JMP SHORT dumped_.004048DA < ==Nhảy đến địa chỉ 004048D7 0FBEC0 MOVSX EAX,AL < == EAX chứa ký tự của U được lưu ở AL ESI = EAX + EAX * 4 004048DA 8D3480 LEA ESI,DWORD PTR DS:[EAX+EAX*4] ECX = ECX + ESI * 2 004048DD 8D0C71 LEA ECX,DWORD PTR DS:[ECX+ESI*2] 004048E0 03C8 ADD ECX,EAX < == ECX = ECX + EAX 004048E2 8A42 01 MOV AL,BYTE PTR DS:[EDX+1] < == Đưa ký tự kế vào AL 004048E5 42 INC EDX < == EDX ++ 004048E6 84C0 TEST AL,AL < == Kiểm tra đến hết chuỗi chưa hay có khoảng trắng không 004048E8 ^ 75 CD JNZ SHORT dumped_.004048B7 < == Chưa thì tiếp tục vòng lặp Vậy sau khi thoát khỏi vòng lặp thì giá trị sẽ được lưu tại ECX. Trace tiếp ta đến : QUOTE 00404928 3BC6 CMP EAX,ESI < === So sánh S nhập và S thực. ESI : S thực; EAX : S nhập 0040492A 0F94C2 SETE DL < === Đúng hay Sai ( EDX sẽ là giá trị 0 hay 1 ) 0040492D 5F POP EDI 0040492E 5E POP ESI 0040492F 8BC2 MOV EAX,EDX < === Giá trị đúng ( 0 hay 1 ) đuợc lưu ở EAX 00404931 5B POP EBX 00404932 C3 RETN < == Trở về chương trình trước đó. Sau khi đăng ký thành công. Giá trị của U và S được lưu ở file timesync.ini của chương trình. >>>>>>>> Vậy : QUOTE User : Moonbaby Serial : 6589 User : HVA-CrAcKeRtEaM Serial : 11770 . support!" 00 404 772 EB 1A JMP SHORT dumped_ .00 404 78E 00 404 774 6A 10 PUSH 10 00 404 776 68 60F1 400 0 PUSH dumped_ .00 40F1 60 ; ASCII "Error" 00 404 77B C 605 C80D 4 10 0 0& gt;MOV BYTE PTR DS:[ 4 10 DC8] ,0. 00 415 00 0 > $ 60 PUSHAD 00 415 0 01 . E8 00 000 000 CALL timesync .00 415 00 6 Kéo màn hình xuống phía dưới cho đến khi gặp dòng lệnh : QUOTE 00 415 197 > 61 POPAD 00 415 198 E9 A61EFFFF. 00 404 9 40 68 C80D 4 10 0 PUSH dumped_ .00 4 10 DC8 ; ASCII " ;12 3456789" 00 404 945 68 480E 4 10 0 PUSH dumped_ .00 4 10 E48 ; ASCII "Moonbaby" 00 404 94A E8 E1FEFFFF CALL dumped_ .00 404 830