0041D0DE |. 81C4 A0000000 ADD ESP,0A0 0041D0E4 \. C3 RETN Theo như trên tôi phân tích thì chỉ cần patch tại một địa chỉ duy nhất, đó là tại địa chỉ 0041CFD0, ta sẽ patch từ JE #1_VIDEO.0041D05C thành JMP #1_VIDEO.0041D05C. Cách patch và save ra file mới chúng ta tiến hành tương tự như phần trình bày ở trên, giả sử ta được file Patch_2.exe. Bạn chạy thử file này xem, bạn thấy thế nào. Bây giờ chúng ta sẽ tạo file patcher bằng công cụ Dup (đã giới thiệu ở mục Tools), việc làm này sẽ giúp chúng ta khi chạy prog trên một máy khác, chỉ cần ta chạy file patcher này thì origin file sẽ được crack, và ta có thể đăng ký cho chương trình với bất kỳ Name và Serial nào. Vậy chúng ta tiếp tục nào. III. Tạo patcher Ở đây tôi sẽ không giới thiệu về Diablos2oo2 Universal Patcher (DUP), các bạn có thể tìm được công cụ này và những bài viết kỹ hơn về nó trong forum, mong các bạn hãy chịu khó. Mở Dup lên, sau khi điền những thông tin về soft và cách dùng patcher ta sẽ nhấn vào tab Offset Patch, xem hình sau đây : Chọn file Origin, chọn file đã được patch. Chọn chế độ so sánh “Normal File”, nhấn vào nút “Compare” ta sẽ thấy bảng so sánh sự khác nhau giữa 2 file. Cuối cùng nhấn nút “Create Patch” ta sẽ có được file patcher. Vậy là công việc của chúng ta đã xong, các bạn có thể đem sản phẩm của mình đi test trên các máy khác nhau, hệ điều hành khác nhau xem, chắc chắn kết quả sẽ làm các bạn rất vui cho mà xem hihi ;-) Chào các bạn, hẹn gặp các bạn trong các tut khác, thân ! -=[End Tut]=- 25/06/2005 ++ ==[ Greatz Thanks To ]== ++ - Thank to my family, Computer_Angel, Moonbaby , Zombie_Deathman, Littleboy, Benina, Kienmanowar, QHQCrker, the_Lighthouse, Hoadongnoi, Nini all REA‘s members, HacNho,RongChauA,Deux, tlandn, dqtln , ARTEAM all my friend, and YOU. Dzunglt(REA) Patching time trial Tác giả : Detten Biên dịch : the_lighthouse Giới thiệu : Chào các bác, lần này chúng ta sẽ học cách remove time trial. Down timetrial : hxxp://biw.rult.at/crackmes/timetrial.zip Crackme này sẽ cho bác 3 ngày kể từ lúc các bác mở nó và sẽ die sau đó, hoặc nếu các bác mở nó quá 9 lần thì nó cũng sẽ tự động die luôn. Nhiệm vụ của chúng ta là phải làm sao cho nó không được die khi chưa được chúng ta cho phép. Tool need : WDASM 10, hacker view 6.40 Sơ lược về các hàm API dùng trong chương trình : Để biết được chương trình đã tồn tại bao lâu trong máy của các bác, chương trình cần phải biết giờ của hệ thống, và thực tế thì có rất nhiều cách khác nhau để thực hiện điều đó. Các bác hãy nhìn như sau : Nhiều hàm API có thể "gửi" cho chương trình ngày giờ của hệ thống, và đây là các hàm tiêu biểu: GetLocalTime GetSystemTime GetSystemTimeAsFileTime Những thông tin được các hàm trên mang về được lưu giữ trong 1 cấu trúc. Đối với 2 hàm đầu tiên thì là SYSTEMTIME, còn hàm cuối là FILETIME (thường được dùng cho file). Và đây là cấu trúc của SYSTEMTIME : Code: typedef struct _SYSTEMTIME { // st WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME; Cấu trúc SYSTEMTIME cho biết ngày và giờ sử dụng riêng lẻ cho tháng, ngày, năm, thứ ngày, giờ, phút, giây, và cả 1 phần 1000 giây. Còn đây là cấu trúc của FILETIME : Code: typedef struct _FILETIME { // ft DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME; Cấu trúc FILETIME là 1 giá trị 64bit cho biết số nanosecond (1 phần tỉ giây) khoảng từ ngày 1 tháng 1 năm 1601 Tiếp theo là những hàm API dùng để so sánh ngày hoặc thay đổi vào những cấu trúc : CompareFileTime FileTimeToSystemTime Và hãy luôn luôn nhớ rằng trước khi crack 1 chương trình, các bác nên tìm hiểu những thông tin về các hàm API được dùng trong chương trình để hiểu rõ hơn về cách thức hoạt động của chúng. Tổng quát chung lại ta có : GetTime so sánh giá trị ngày được lưu giữ (chính là ngày hoặc giờ mà bạn sử dụng chương trình lần đầu tiên) , hoặc làm giảm số ngày đã trôi qua, hoặc 1 vài thứ khác tương tự. Làm việc với WDASM : Okey, phần tìm hiểu về crackme đã xong. Bây giờ chúng ta mở Wdasm10 lên, load crackme vào. Sau khi load xong, chúng ta vào Functions\Import (hoặc nhấn cái nút thứ 13 ở bar) để xem các API dùng trong chương trình. Nhìn trong list hiện ra ta thấy như sau : Code: KERNEL32.CreateFileA KERNEL32.ExitProcess KERNEL32.GetModuleHandleA KERNEL32.GetSystemTime <== double click vào đây KERNEL32.ReadFile KERNEL32.SetFilePointer KERNEL32.WriteFile USER32.DestroyWindow USER32.DialogBoxParamA USER32.MessageBoxA USER32.SetDlgItemInt Chúng ta thấy có API GetSystemTime có liên quan đến thời gian =>double click vào ==> chúng ta sẽ đến đoạn code sau : Code: 0040100C 6A00 push 00000000 0040100E 6880000000 push 00000080 00401013 6A03 push 00000003 ; Chỉ mở file hiện đang có 00401015 6A00 push 00000000 ; Không thuộc tính bảo vệ 00401017 6A00 push 00000000 ; Không sharing 00401019 68000000C0 push C0000000 ; Mở để đọc và viết * Possible StringData Ref from Data Obj ->"DATA.DET" 0040101E 68A2304000 push 004030A2 ; Push DATA.DET * Reference To: KERNEL32.CreateFileA, Ord:0032h 00401023 E8DE010000 Call 00401206 ; Mở file 00401028 83F8FF cmp eax, FFFFFFFF ; Sai handle? 0040102B 7407 je 00401034 ; Nhảy đến BADGUY nếu không thể mở file 0040102D A314314000 mov dword ptr [00403114], eax ; Lưu handle 00401032 EB18 jmp 0040104C ; Nhảy * Referenced by a (U)nconditional or (C)onditional Jump at Address:0040102B(C) 00401034 6A30 push 00000030 ;Badguy - Missing File message * Possible StringData Ref from Data Obj ->"I don't like this !" 00401036 6838304000 push 00403038 * Possible StringData Ref from Data Obj ->"Where is my DATA.DET file?" 0040103B 6802304000 push 00403002 00401040 6A00 push 00000000 * Reference To: USER32.MessageBoxA, Ord:01BBh 00401042 E8B3010000 Call 004011FA 00401047 E922010000 jmp 0040116E ; nhảy đến đoạn cuối * Referenced by a (U)nconditional or (C)onditional Jump at Address:00401032(U) 0040104C 6A00 push 00000000 0040104E 68E0304000 push 004030E0 ; Lưu những byte khác ở đây 00401053 6A32 push 00000032 ; Đọc tối đa là 50 byte 00401055 68AB304000 push 004030AB ; Buffer để lưu dữ liệu 0040105A FF3514314000 push dword ptr [00403114] ; Đặt file handle * Reference To: KERNEL32.ReadFile, Ord:01FDh 00401060 E8B9010000 Call 0040121E 00401065 833DE03040000B cmp dword ptr [004030E0],0Bh ; Kiểm tra 11 bytes đã được đọc? 0040106C 0F85E9000000 jne 0040115B ; Nếu chưa, nhảy đến BAd-GUY 00401072 BBAB304000 mov ebx, 004030AB ; chuyển buffer pointer vào EBX 00401077 68E4304000 push 004030E4 ; Đặt pointer vào cấu trúc SYSTEMTIME * Reference To: KERNEL32.GetSystemTime, Ord:0148h 0040107C E897010000 Call 00401218 <== chúng ta đang ở đây 00401081 803B00 cmp byte ptr [ebx], 00 ; Kiểm tra xem có cái gì đã được lưu chưa? 00401084 7522 jne 004010A8 ; Nếu chưa, nhảy đến 004010A8 00401086 51 push ecx ; lưu ngày/giờ hiện tại 00401087 33C9 xor ecx, ecx ; thêm cấu trúc SYSTEMTIME vào buffer 00401089 EB15 jmp 004010A0 ; cộng * Referenced by a (U)nconditional or (C)onditional Jump at Address:004010A3(C) 0040108B 668B81E4304000 mov ax, word ptr [ecx+004030E4] . Code: 00 4 01 0 0C 6A 00 push 00 000 000 00 4 01 0 0E 68 800 000 00 push 00 000 0 80 00 4 01 0 13 6A03 push 00 000 003 ; Chỉ mở file hiện đang có 00 4 01 0 15 6A 00 push 00 000 000 ; Không thuộc tính bảo vệ 00 4 01 0 17 6A 00. 00 4 01 0 4C 6A 00 push 00 000 000 00 4 01 0 4E 68E0 304 000 push 00 403 0E0 ; Lưu những byte khác ở đây 00 4 01 0 53 6A32 push 00 000 032 ; Đọc tối đa là 50 byte 00 4 01 0 55 68AB 304 000 push 00 403 0AB ; Buffer để. 00 4 01 0 5A FF3 514 314 00 0 push dword ptr [00 40 311 4] ; Đặt file handle * Reference To: KERNEL32.ReadFile, Ord :01 FDh 00 4 01 0 60 E8B9 01 0 00 0 Call 00 4 01 2 1E 00 4 01 0 65 833DE0 304 000 0B cmp dword ptr [00 403 0E0],0Bh