Cracking for Newbiez
Tất nhiên Zombie không thể viết hết hoàn toàn về programming vì như thế rất lan mang và bản thân Zombie cũng hông biết viết sao. ?*̉ đây chỉ là cách suy luận logic bình thường trong programming thôi.
Giải thuật: Hướng giải quyết một vấn đề hay hiểu theo ý đơn giản là các trình tự chi tiết để xử lý một công việc nào đó.
Ví dụ: Lấy một bài toán giải phương trình bậc 2 thời phổ thông.
Để giải bài toán này ta qua các bước sau:
- Tính Delta (công thức tính...Zombie quên gòi :D)
- Xử lý 3 trường hợp Delta:
+ Delta < 0: Vô nghiệm
+ Delta = 0: Nghiệm kép
-->> Tính nghiệm kép là ... hình như là (-b + sqrt(Delta)) / 2*a
+ Delta > 0: 2 nghiệm phân biệt.
-->> -b + & -b – sqrt(Delta) / 2*a
Khi lập trình cũng vậy...Bạn vạch ra cho máy các hướng giải quyết cụ thể, tính toán trước các việc xảy ra nhằm có cách giải quyết... Đó là bạn đang tìm giải thuật. Tuy nhiên ở đây nên rõ điều này...Giải thuật có được là quá trình chi tiết cách xử lý vấn đề...Còn sau đó từ giải thuật đó code lại để máy thực thi lại là chuyện khác.
Ví dụ. Để xây dựng lại khái quát cách máy xử lý bài toán phương trình bậc 2 kia ta làm sau
Nhập các thông số a,b,c cho phương trình.
Delta = sqr(b) – 4 * a * c
If Delta < 0 Then
Msgbox(“Vô nghiệm”)
Else ‘ Ngược lại Delta không nhỏ hơn 0 (tức > or =)
If Delta = 0 Then
Giải tính nghiệm kép
Else ‘ Tức Delta không = 0. Giờ chỉ còn trường hợp là > 0
Giải tính 2 nghiệm phân biệt
End If
End If
Cũng đơn giản đúng không ! Chỉ là bạn vi tính hóa các suy luận, các bước giải quyết vấn đề thơi.
Trong lập trình, các lệnh được tạo ra nhằm giải quyết hết mọi việc trong thực tế. Như
If ... Then ... : Nếu <điều kiện> đúng (Then) thì làm....
If ... Then...Else: Tương tự..Nhưng nếu không đúng (Else) thì làm tiếp việc được chỉ ra cho phần Else
Hay các khối lệnh lập
For ... To ... Do: Lập từ giá trị a đến n....
Repeat ... Until: Lập đến khi thỏa điều kiện
....
Tóm lại khi ứng dụng vào việc Crack thì các khối lập & lệnh điều kiện là thường xuyên gặp như:
Nếu Serials = 123456 thì Báo Ok
Else (nếu không)
Báo Sai
API: Một số khái niệm về Windows APIs
- APIs ( Applipcation Programming Interface ) với các newbie có thể xem đây như là các hàm được code sẵn, khi sử dụng chỉ việc khai báo và gọi lại ( có rất nhiều hàm vô cùng hữu ích trong các file dll của Windows không thể thiếu trong lập trình hệ thống ).
- Các hàm thường được đóng gói vào file .dll cho. Khi sử dụng sẽ gọi hàm cần dùng từ file dll tương ứng chứa nó.
- Điểm thuận tiện chính ở đây là khi sử dụng hàm API bạn có thể linh động trong việc upgrade chương trình. Nếu code luôn các hàm cần thiết vào chương trình chính thì khi upgrade và phát tán ra phải complie lại toàn bộ chương trình
… Còn rất nhiều rất nhiều điểm mạnh nữa.
Tuy nhiên khi sử dụng bạn phải có sẵn thông tin về việc khai báo hàm ( không phải lúc nào cũng sẵn có ).Khai báo APIs
Khai báo các hàm APIs
Để sử dụng được các hàm APIs cần phải làm: Khai báo hàm, gọi hàm.
1. Khai báo hàm:
Cú pháp khai báo tổng quát:
Quote:
[Public | Private] Declare Sub | Function Name Lib “libname” [Alias “aliasname”] [(args)] [As Type]
|
Quote:
- Khai báo Public | Private tương ứng việc khai vùng hoạt động của hàm. Với Public hàm có thể gọi từ ngoài module khai báo nó ( trong cả chương trình ), ngược lại Private chỉ cho phép sử dụng trong module khai báo nó. Mặc định của Visual Basic khi không khai báo Public/Private là Public. Ở đây có thể sử dụng kĩ thuật “wrapper”. Với kĩ thuật này bạn khai báo hàm APIs trong module với Private. Sau đó code một hàm gọi nó rồi khai Public cho hàm này. - Declare Sub | Function: Tương ứng khai báo hàm này là Function or Sub. - Name: Tên của hàm sẽ được dùng để gọi. - Lib “libname”: Tên thư viện DLL chứa hàm cần gọi. - Alias: Tên hàm được export ra trong thư viện DLL. Lưu ý phải đúng chính xác tên hàm được export. - args: Các đối số của hàm. Đây cũng là phần quyết định quan trọng. Phải khai báo tuyệt đối chính xác (ByVal/ByRef, Data type,v..v.). Trong trường hợp khai báo sai có khả năng làm crash Windows bằng lỗi GPF ( General Protect Fault ). - As Type: Kiểu giá trị trả về khi sử dụng hàm là Function
|
Examples: ( Code by Visual Basic 6.0 )
1. Hàm FindWindow: Trả về Handle của một Window khi biết một/cả hai đối số.
Khai báo (code trong module mdlAPIs.mdl)
1. Hàm FindWindow: Trả về Handle của một Window khi biết một/cả hai đối số.
Khai báo (code trong module mdlAPIs.mdl)
Quote:
Private Declare Function Lib “user32” Alias “FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
|
Quote:
--> Hàm khai báo với tên FindWindow được export từ thư viện user32.dll (với các thư viện dll chuẩn của Windows không cần khai FullName ) với tên FindWindowA.
--> Các đối số của hàm là lpClassName As String và lpWindowName. Cả hai đều là ByVal. --> Trả về giá trị là kiểu Long. --> Về việc sử dụng hàm: Có thể thấy ở đây hàm này nhận 2 args truyền vào. Tuy nhiên ở đây bạn có thể truyền vào giá trị 1 trong 2 hàm là đủ (có thể truyền luôn cả 2 nếu muốn). Các đối số ở đây là tên Class hoặc Caption của Windows cần lấy Handle Với arg không dùng đến thì đưa giá trị vbNullString hoặc 1 giá trị Null (lưu ý: Giá trị Null hiểu theo ngôn ngữ C, không phải là vbNull). |
Quote:
Public Function wrpFindWindow (Optional ClsName As String = “”, Optional Caption As String = ”” ) As Long wrpFindWindow = FindWindow(ClsName, Caption) End Function
|
Quote:
--> “Wrapp” lại bằng Function wrpFindWindow *****Có thể sử dụng API Viewer của Visual Basic 6.0 để lấy các Declare sẳn có và paste vào chương trình… Tuy nhiên như vậy bạn sẽ phụ thuộc vào API Viewer, trong khi không ít hàm hoàn toàn không có trong đây. Bạn chí được thông tin trong MSDN. Do đó cần biết cách tự khai báo. Để khai báo cần nắm rõ chút về cách định nghĩa khai báo theo kiểu Hungarian
|
Quote:
Sơ lược về định nghĩa Hungarian: ( Sử dụng nguyên văn tài liệu ) API mong đợi một trong hai điều ở các đối số của nó: Một giá trị hoặc địa chỉ của một biến chứa một giá trị. Chìa khóa để biết API mong đợi một giá trị hay một địa chỉ nằm ở định nghĩa Hungarian của tên thông số trong prototype của hàm liệt kê trong SDK. Nếu tên thông số có tiếp đầu ngữ “lp”, có nghĩa là API mong đợi một địa chỉ. Trong định nghĩa C Hungarian, “lp” viết tắt cho một Long Pointer – Một địa chỉ bộ nhớ. Thường gặp nhất là “lpsz”, tức một con trỏ long đến một chuỗi kết thúc bằng Null ( một khai báo ByVal As String trong Visual Basic ), nhưng bạn cũng có thể đưa một “lp” cho API với tất cả các kiểu ( trừ một string ), dùng ByRef để gửi địa chỉ biến của bạn cho API. Trong thực tế bạn có thể sử dụng các chương trình khai báo sẵn APIs và chỉ việc copy & paste vào chương trình. Tuy nhiên nên biết sơ về cách khai báo.
|
Một số APIs các bạn thường gặp trong quá trình Cracking là:
Quote:
Int GetWindowText(HWND hWnd, LPTSTR lpString, int nMaxCount);
|
Quote:
Hàm này nhận 3 đối số là:
- Handle Control chứa nội dung cần Get - Biến đệm chứa nội dung sẽ được lấy và trả về - Max Chars sẽ lấy, nếu vượt quá số max này sẽ ..truncate đi Thường thì hàm này dùng với Alias GetWindowTextA |
Tương tự GetWindowText là GetDlgItemText (được sử dụng cho việc lấy Text từ control trong Dialog)
Quote:
UINT GetDlgItemText(HWND hDlg, int nIDDlgItem, LPTSTR lpString, int nMaxCount );
|
các APIs khác
Quote:
int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType );
BOOL MessageBeep(UINT uType ); |
Các khá hữu dụng để lần ra chỗ cần bp và từ đó trace ngược về Module Protect
In bài này