Posted by: moonbaby Dec 22 2003, 11:03 AM QUOTE Homepage : URL http://www.wma-mp3-converter.com Production : 4U Computing, Inc. ( 4U WMA MP3 Converter 2.2.3 ) Copyright by : 4U Computing, Inc. Cracked File : WMAMP3Converter.exe ( Borland Delphi 6.0 - 7.0 ) Type : Name/Serials Packed : ASPack 2.12 -> Alexey Solodovnikov Crack Tool : OllyDbg 1.09d, W32dsmv10 Unpack Tool : ASPackDie v1.41 Carried Out : Get Correct Serials Note : None About 4U WMA MP3 Converter 2.2.3 4U WMA MP3 Converter is a powerful Audio Converter. It is very simple and easy to use. Just right click a file and convert it using your predefined settings. >>>>>>>> Chương trình này có thể tiến hành theo hai cách, Patch hoặc tìm ra số Serial thực. >>>> Dùng PeiD kiểm tra, biết chương trình này được pack bằng ASPack 2.12 -> Alexey Solodovnikov, dùng ASPackDie v1.41, ta có được file unpack. Lại dùng PeiD kiểm tra, ta biết được chương trình này được viết bằng Borland Delphi 6.0 - 7.0 >>>> Dùng W32dsm89, để tìm chuỗi thông báo khi nhập sai. Ta tìm được địa chỉ đó là 0048DE76 |. 68 20DF4800 PUSH UNPACKED.0048DF20 ; |Text = "Invalid Registration Code! Please enter an available Registration Code." >>>> Trace lên một chút nữa ta lại gặp : 0048DE45 |. 68 ECDE4800 PUSH UNPACKED.0048DEEC ; |Text = "Registration success, Thanks for your registration." >>>>>>>> Cách thứ nhất : Patch Trace lên tiếm ta đến đoạn mã: 0048DE12 |. E8 85ACF7FF CALL UNPACKED.00408A9C 0048DE17 |. 85C0 TEST EAX,EAX 0048DE19 |. 75 41 JNZ SHORT UNPACKED.0048DE5C < == Patch ở đây Nếu ta muốn Patch thì ở đây ta thay JNZ thành JE. ============== > Quá trình Patch đã tiến hành xong. >>>>>>>> Cách hai : tìm Serial thực. >>>> Trace lên thêm chútta thấy đoạn mã này : đoạn này có nghĩa là đây là danh sách đen, bất kỳ U nhập vào giống như thế đều bị loại không cho đăng ký, dù S có đúng đi chẳng nữa. 0048DDE3 |. BA C0DE4800 MOV EDX,UNPACKED.0048DEC0 ; ASCII "Megido,share.homedns.org,www.appzplanet.com" >>>> Trace xuống tí chút và ta dặt BreakPoint ở đây. 0048DE07 |. E8 60010000 CALL UNPACKED.0048DF6C >>>> Nếu ta chỉ muốn tìm S thực tương ứng với tên nhập vào thì ta chỉ cần trace qua lệnh CALL trên, và tại hai lệnh sau sẽ xuất hiện S thực và S ta nhập vào : 0048DE0C |. 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C] < === S thực tương ứng U nhập 0048DE0F |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] < === S nhập vào >>>> Nếu muốn tìm quá trình mã hoá chuỗi thì ta trace vào trong lệnh này để đi đến một tập lệnh. Ở đây ta chỉ quan tâm đến các lệnh CALL, vì khi trace vào trong các lệnh này, quá trình xử lý chuỗi mới được xuất hiện. Tổng cộng quá trình mã hoá chuỗi U nhập vào bao gồm 4 giai đoạn. >>>> Đoạn mã lệnh chính mà ta cần quan tâm và đi vào bên trong : >>>> Giai đoạn thứ nhất : Ghép chuỗi có sẵn vào chuỗi U nhập vào ban đầu 0048DFA3 |. BA 18E14800 MOV EDX,UNPACKED.0048E118 ; ASCII "4mc804u88" 0048DFA8 |. E8 F369F7FF CALL UNPACKED.004049A0 Đoạn mã này giả thích quá trình tạp thành chuỗi MagicStringU 0048DFE9 |. E8 026CF7FF CALL UNPACKED.00404BF0 < === quá trình chia đôi chuỗi 0048DFEE |. 8B55 EC MOV EDX,DWORD PTR SS:[EBP-14] 0048DFF1 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4] 0048DFF4 |. 59 POP ECX 0048DFF5 |. E8 EA69F7FF CALL UNPACKED.004049E4 < == Quá trình tạo thành MagicStringU Ta giải thích dễ hiểu hơn : 1- Chuỗi U ta nhập vào được kết hợp với chuỗi "4mc804u88" tạo thành một chuỗi mới. 2- Tính chều dài chuỗi mới và chia đôi. 3- Chuỗi thứ nhất có chiều dài là phần chia nguyên. Chuỗi thứ hai là phần còn lại. 4- Đảo ngược chuỗi thứ hai lên thứ nhất và kết hợp lại. 5- Ví dụ chuỗi nhập vào có 5 ký tự, chuỗi mặc định có 9 ký tự. Tổng là 14, vậy hai chuỗi có chiều dài là 7 và 7, đảo ngược tạo thành MagicStringU. Nếu chuỗi nhập vào có 4 ký tự, chuỗi mặc định có 9 ký tự. Tổng là 13, phần nguyên chia 3 là 6. Vậy chuỗi thứ nhất có 6 ký tự, chuỗi thứ hai có 7 ký tự, đảo ngược tạo thành MagicStringU. Đến đây thì chuỗi đã chuyển thành chuỗi mới. Ta gọi đó MagicStringU . >>>> Giai đoạn thứ hai : >> Khi trace vào trong lệnh CALL này, ta sẽ thấy quá trình cắt chuỗi MagicString bên trên thành hai đọan. Với phương pháp như sau : 1- Chuỗi U-1 : Lấu từ ký tự thứ 6 trở đi cho đến cuối . Và giá trị chiều dài của chuỗi này sẽ là giá trị ban đầu trong chuỗi số S thực. 2- Chuỗi U-2 : Lấy 10 ký tự đầu tiên . Chuỗi này là chuỗi chính dùng để mã hoá. Chuỗi này bao giờ cũng là 10 ký tự ( vì chuỗi mặc định là 9 ký tự, phải có ít nhất 1 ký tự được nhập vào ). 0048E026 |. E8 C56BF7FF CALL UNPACKED.00404BF0 < === Giai đoạn thứ 2 >>>> Giai đoạn thứ ba : 0048E04A |. E8 21F0FFFF CALL UNPACKED.0048D070 < ==== Giai đoạn thứ 3 >> Trace vào bên trong lệnh CALL này, sẽ đưa ta đến đoạn mã xử lý quá trình mã hoá chuỗi. Bỏ qua một số đọan mã đầu, ta trace đến đây : >> Chuỗi U-2 được đưa vàdo EAX 0048D101 |> /8B45 FC /MOV EAX,DWORD PTR SS:[EBP-4] >> EDX được xem là biến đếm 0048D104 |. |8B55 EC |MOV EDX,DWORD PTR SS:[EBP-14] >> Xét từng ký tự đang nằm trong EAX 0048D107 |. |0FB64410 FF |MOVZX EAX,BYTE PTR DS:[EAX+EDX- 1] >> EAX = EAX + EBX === > với EBX ban đầu được gán bằng 100h === > kết quả lưu ở EAX 0048D10C |. |03C3 |ADD EAX,EBX >> Gán ECX = 0FFh 0048D10E |. |B9 FF000000 |MOV ECX,0FF >> Biến đổi từ kép 2 thành kép 4 0048D113 |. |99 |CDQ < === vòng lặp đầu chưa thấy thay đổi gì, chỉ là dọn sạch EDX >> IDV : Khi toán hạng là một từ thì nội dung của DX:AX – Trong đó DX là từ có giá trị cao hơn – được chia cho từ. Phần nguyên của kết quả không tính đến dấu được đặt ở AX, còn phần dư không tính đến dấu đuợc đặt ở DX. === > dễ hiểu : thực hiện phép chia EAX cho ECX, phần nguyên không lấy dầu cho vào lưu ở EAX, phần dư không lấy dấu cho vào lưu ở EDX. 0048D114 |. |F7F9 |IDIV ECX >> Chuyển EDX vào EBX === > cả hai có cùng một giá trị 0048D116 |. |8BDA |MOV EBX,EDX >> So sánh ESI với giá trị ở địa chỉ này (giá trị này là chiều dài của chuỗi U-1.) Để cho biết một điều là, nếu chuỗi này hết mà vòng lặp vẫn còn thì quay trở lại từ đầu chuỗi, bằng cách gán ESI = 01h. 0048D118 |. |3B75 F4 |CMP ESI,DWORD PTR SS:[EBP-C] 0048D11B |. |7D 03 |JGE SHORT UNPACKED.0048D120 0048D11D |. |46 |INC ESI 0048D11E |. |EB 05 |JMP SHORT UNPACKED.0048D125 0048D120 |> |BE 01000000 |MOV ESI,1 >> Đưa chuỗi U-1 vào EAX 0048D125 |> |8B45 F8 |MOV EAX,DWORD PTR SS:[EBP-8] >> Đưa từng ký tự vào lại EAX ( của chuỗi U-1 ) 0048D128 |. |0FB64430 FF |MOVZX EAX,BYTE PTR DS:[EAX+ESI-1] >> EBX xor EAX (lúc này EBX là giá trị phép chia dư bên trên do lệnh chuyển dời từ EDX vào EBX) 0048D12D |. |33D8 |XOR EBX,EAX >> Trace tiếp ta đến đây. Lệnh CALL này có ý nghĩa gắn giá trị được tạo thành bên trên vào với nhau ( lưu ý : ký tự đầu tiên của chuỗi tạo thành là chiều dài của chuỗi U-2 ) 0048D14F |. |E8 4C78F7FF |CALL UNPACKED.004049A0 < === gắn các giá trị vào với nhau thành chuỗi là lưu ở 0072E9D4 00C58A80 >> Đoạn này kiểm tra xem đã hết chiều dài của chuỗi U-2 chưa, nếu chưa thì tiếp tục vòng lặp. 0048D157 |. |4F |DEC EDI < ==== chiều dài chủa chuỗi mã hoá 0048D158 |.^\75 A7 \JNZ SHORT UNPACKED.0048D101 >> Khi đi hết vòng lặp thì giá trị của quá trình này được lưu ở :0072E9D4 00C589F0 . Và theo lệnh RETURN ta trở về trước đó. Và ta gọi chuỗi nà là chuỗi MagicStringU >>>> Giai đoạn thứ tư : >> Quá trình cắt chuỗi đầu tiên : 0048E055 |. B9 05000000 MOV ECX,5 < === Lấy 5 ký tự 0048E05A |. BA 01000000 MOV EDX,1 < === Bắt đầu từ ký tự thứ 1 0048E05F |. E8 8C6BF7FF CALL UNPACKED.00404BF0 < === Tiến hành cắt chuỗi >> Quá trình cắt chuỗi thứ hai : 0048E072 |. B9 05000000 MOV ECX,5 < === Lấy 5 ký tự 0048E077 |. BA 06000000 MOV EDX,6 < === Bắt đầu từ ký tự thứ 6 0048E07C |. E8 6F6BF7FF CALL UNPACKED.00404BF0 < === Tiến hành cắt chuỗi >> Quá trình cắt chuỗi thứ ba : 0048E08F |. B9 05000000 MOV ECX,5 < === Lấy 5 ký tự 0048E094 |. BA 0B000000 MOV EDX,0B < === Bắt đầu từ ký tự thứ 0Bh = 11 0048E099 |. E8 526BF7FF CALL UNPACKED.00404BF0 < === Tiến hành cắt chuỗi. >> Quá trình cắt chuỗi thứ tư : 0048E0AC |. B9 05000000 MOV ECX,5 < === Lấy 5 ký tự 0048E0B1 |. BA 0F000000 MOV EDX,0F < === Bắt đầu từ ký tự thứ 0Fh = 15 0048E0B6 |. E8 356BF7FF CALL UNPACKED.00404BF0 < === Tiến hành cắt chuỗi >> Quá trình cắt chuỗi thứ năm : 0048E0C9 |. B9 05000000 MOV ECX,5 < === Lấy 5 ký tự 0048E0CE |. BA 03000000 MOV EDX,3 < === Bắt đầu từ ký tự thứ 3. 0048E0D3 |. E8 186BF7FF CALL UNPACKED.00404BF0 < === Tiến hành cắt chuỗi >> >> >> >> >> Sau khi được tạo thành, các chuỗi con được nỗi với nhau bằng dấu “ – “. >>>>>>>> Vậy ta đã hiểu quá trình tạo chuỗi của chương trình này : User : Moonbaby Serial : 0C011-B4646-3B001-1A3C1-011B4 User : HVA-CrAcKeRtEaM Serial : 1325B-E3C44-C4107-70E84-25BE3 . |7D 03 |JGE SHORT UNPACKED .00 48D1 20 00 48D11D |. |46 |INC ESI 00 48D11E |. |EB 05 |JMP SHORT UNPACKED .00 48D125 00 48D1 20 |> |BE 01 0 00 000 |MOV ESI ,1 >> Đưa chuỗi U -1 vào EAX 00 48D125. thứ ba : 00 48E08F |. B9 05 000 000 MOV ECX,5 < === Lấy 5 ký tự 00 48E094 |. BA 0B 000 000 MOV EDX,0B < === Bắt đầu từ ký tự thứ 0Bh = 11 00 48E099 |. E8 526BF7FF CALL UNPACKED .00 404 BF0 <. thứ tư : 00 48E0AC |. B9 05 000 000 MOV ECX,5 < === Lấy 5 ký tự 00 48E0B1 |. BA 0F 000 000 MOV EDX,0F < === Bắt đầu từ ký tự thứ 0Fh = 15 00 48E0B6 |. E8 356BF7FF CALL UNPACKED .00 404 BF0 <