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ì origi
Trang 10041D0DE | 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 :
Trang 2Chọ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
Trang 3++ ==[ 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;
Trang 4WORD 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
Trang 5KERNEL32.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)
Trang 6
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]