Hacker - Newbiez ices Softs with SoftIce

Newbiez ices Softs with SoftIce
(Một số Khái niệm cần biết khi dùng SoftICE để Cracking.)

Trước khi đi tiếp các tut sau chúng ta cần một số hiểu biết sử dụng SoftICE để cracking ,đây là điều mà các newbie cần nhất đây.
Trong tut 2A, ta đã dạo chơi sơ sơ trong SoftICE rồi . Bây giờ ta sẽ dạo chơi tiếp , nhưng chủ yếu là y tưởng để crack. Không đi chuyên sâu về cách sử dụng nhe.


Bắt đầu hé, bạn leo lên xe đi , tui sẽ “chở “ bạn dạo chơi quanh phố SoftICE một lát….

I/ Đề - ba nhe.

Go..go
A ha ..
Bạn có khái niệm về softICE làm gì chưa. Tui biết chắc bạn sẽ trả lời là debug (gở rối) chứ gì. Uhm ,đúng thế. Nhưng để biết nó debug như thế nào…hihi ,quan trọng đây….chắc phải tìm tut dạy debug bằng SoftICE để học rồi . Các tut viết về cách sử dụng SoftIce thì nhiều nhưng để ít tốn công sức của bạn tui viết tut này hướng dẫn từ chưa biết gì đến biết biết đôi chút về SoftICE .Mong rằng khi bạn đọc xong tut này ….hổng hiểu ….thì thôi .....chứ cũng đừng trách benina nhé.Vì…trình độ có hạn….nhưng tài năng thì …vô hạn… híhí

Như bạn biết, SoftICE để gở rối (debug). Mục đích là thế. Nhưng nó gỡ rối như thế nào?....Tui lấy ví dụ sau để cho bạn dễ hiểu.
Ví dụ như: Khi bạn lập trình , chương trình của bạn bị sai tại 1 đọan mã nào đó, nhưng bạn ko biết sai ở đâu. Nếu ta dò từ đầu đọan mã đến cuối để xem nó tính tóan sai chổ nào thì …Hởi ơi ,Lạy Chúa, con sẽ ko học lập trình nữa điêu….(nhiều khi pó tay luôn ,ko dò ra nó nằm đâu). Tức là…. rất vất vã để làm chuyện ấy .Vì vậy người ta mới đẻ ra SoftICE. Nhưng nó giúp ta như thế nào?. Đơn giản thôi bạn ạ. Khi bạn nghi ngờ đọan mã nào sai thì bạn cho SoftICE ngắt chương trình trước đọan mã ấy. Sau đó bạn dùng SoftICE để dò (trace) từng dòng lệnh (routine) xem chương trình của ta bị sai ở chổ nào.[ Ở trên tui dùng 2 từ tiếng Anh là trace và routine để bạn có khái niệm ngay từ đầu và để sau này tui dể diễn đạt cho các bạn (vất vả lém em mới hiểu 2 từ trên đó ! hihi vốn là em bị stupid mà…)].
Típ nhe: Khi biết sai chổ nào rồi thì ta sẽ sửa chửa ,thay đọan mã ấy.Thế là xong debug.Cũng vất vã nhưng đỡ hơn nhiều phải ko các bạn.

Ha ha, mấy ông cracker nhà ta đã dựa vào chức năng trên của SoftICE mà crack các chương trình đó bạn. Mấy ổng làm như sau:
Như các bạn đã biết trong TUT 1A, dùng W32Dam dò từ điểm đuôi của đọan mã Password generator lên trên (mò lên) để tìm tử nguyệt của nó (thường là các lệnh jumps- nhảy khi ta nhập sai password), rồi patch (vá viếu) nó bằng HIEW. Đến đây coi như là crack xong.
Vậy mấu chốt của vấn đề crack = cách trên là tìm cho ra điểm đuôi của đọan mã Password generator và tử nguyệt của chương trình. Nếu ko tìm ra điểm đuôi đó thì coi như pó tay…. Muốn tìm ra điểm đuôi, ta dựa vào các từ khóa hay những câu tiếng Anh mà chương trình hiển thị trong “hành vi” bắt ta register. Sau đó dùng W32Dasm để đến đuôi đọan mã Password generator mà MÒ LÊN để tìm ra tử nguyệt (Cách crack này tui gọi nôm na là CÁCH MÒ LÊN). Nếu chương trình che dấu các strings , mà W32Dasm ko tìm ra thì coi như …phụ sản…..y’ lộn…phá sản. hihi.
Vì vậy khi gặp trường hợp này, các cracker dùng SoftICE để “xử” nó.

“Họ đã làm diều đó như thế nào?????????????????”.Mời bạn “ôm tui “ chặc một chút, chúng ta qua “ổ gà” nhe. Típ tục :

Họ cho chương trình chạy đến đọan mã BẮT ĐẦU ĐĂNG KÝ REGISTRATION thì nhờ SoftICE ngắt chương trình tại đó, sau đó dùng SoftICE trace (dò) từng routine (dòng lệnh) để xem chương trình làm cái gì với thông tin đã nhập vào (như name và serial number.).Thường thì chương trình sẽ so sánh serial number do ta nhập vào với 1 number mà chương trình tạo ra dựa trên name hay các thông tin khác mà ta nhập trước đó-đây chính là số serial number correct tức là số serial chính xác ứng với tên name hay các thông tin khác mà ta đã nhập .Nếu đúng thì cho đăng ky’, sai thì out chứ sao…hihi.

II/ Vậy công việc crack ở đây là……tui tóm nó lại như sau:


- Bước 1 : Tại hộp thọai REGISTRATION ta nhập name và fake serial number (số serial giả định nào đó).
- Bước 2 : Trước khi nhấn OK ta bật chương trình SoftICE lên (Ctrl-D) , đặt 1 điểm ngắt cho SoftICE (dùng lệnh đặt breakpoint : bpx hmemcpy, bpx getwindowtexta …) mục đích để nhảy vào đọan mã chương trình sau khi ta bấm OK để xem chúng xử l‎y thông tin của ta nhập vào như thế nào.Bướ này ta gọi là bước đặt bẩy (trap)
- Bước 3 : Sau đó thóat khỏi SI (SoftICE) = cách press (CTRL-D). Lúc này ta đang ở tại hộp thọai REGISTRATION .Và bây giờ bạn nhấn button OK để SI ngừng chương trình tại điểm ngắt breakpoint mà ta đặt ở trên.
- Bước 4 : Sau khi nhấn nút OK, SI sẽ ngắt chương trình và nhảy sổ ra màn hình. Bây giờ đến nhiệm vụ của chúng ta là xử ly’ những gì SI hiển thị trên màn hình. Đầu tiên là quan sát cửa sổ code (code window) xem như thế nào. Các bạn chú y’, phía dưới cửa sổ code là tên file của code đang nằm trong cái code window. Thường thì ko phải tên file của chương trình mà ta cần crack mà là :ví dụ KERNEL32…., hay USER32…..Vậy là chúng ta đang đứng giữa cái hàm API mà ta đã đặt điểm ngắt. Trong cửa sổ code đang hiển thị code của hàm API không phải code của chương trình. Chúng ta bắt SI đi dến vùng code của chương trình bằng cách nhấn F12.
Đến đây tui nói một chút về F12. Các bạn phải có 1 quan niệm quan trọng sau: SOFTICE KHÔNG BAO GIỜ ĐI DỰT CÀ LUI. Tức là không bao giờ bắt chương chạy ngược lại đọan mã của nó.Nó chỉ có tiến, tiến và tiến xuống đọan mã chương trình mà thôi. Vì vậy khi dùng SI để crack là dùng phương pháp MÒ XUỐNG đó bạn . hihi (mò xuống “phê” hơn mò lên…nhưng xong rồi lại đã điếu lém…khàkhà). Vậy chức năng của F12 chính là cho chương trình chạy tiếp đến cuối lệnh CALL thì ngừng .( Một số tut nói dùng F12 để “quay về” đọan mã chương trình ,làm cho các Newbie rất là mong lung. Không biết “đầu đuôi, đuôi đích” như thế nào, cứ tưởng là softICE chạy ngược được).
Lại nói thêm về các hàm API: các hàm API khi thực hiện có khi lại gọi 1 hàm khác cũng là hàm API để làm tiếp công việc của nó. Rồi hàm vừa gọi lại gọi tiếp 1 hàm khác …hàm khác lại gọi 1 hàm khác nũa…chúng gọi nhau í ới. Vì vậy để đến đọan mã của chương trình cần crack, chúng ta có khi phải nhấn rất nhiều lần phím F12 để cho SI chạy đến cuối của rất nhiều hàm CALL và đến khi đến cuối hàm CALL trong đọan mã chương trình cần crack (hàm này gọi hàm API mà ta đặt điểm ngắt breakpoint).Khi đó phía dưới màn hình code window sẽ hiển thị tên file chương trình cần crack. Nhớ điều này nhe bạn.

Đến đây bạn hiểu gì hông?. Tui thì ….mệt muốn đứt hơi luôn rồi. Xuống xe đi bạn , tui “chở’ bạn đi hết nỗi nữa rồi. Cho tui nghĩ một lát, rồi sẽ “chở” bạn dạo chơi quanh SI tiếp nữa nhe……hừ hừ hừ. Mệt quá má ơi
------------------------------
Benina 27/07/2004



Chúng ta đã nghĩ mệt lâu quá rồi ( gần nửa tháng nay), hôm nay tui sẽ “cỏng “ bạn đi tiếp phần còn lại của tut “Newbiez ices softs with SoftICE”.
Nào , tiếp tục.
Phần đầu chúng ta đi đến đâu rồi nhỉ?. À, chúng ta đã biết cách dùng phím F12 trong SI rồi . Bây giờ chúng ta tìm hiểu về phím F11, có chức năng giông giống như phím F12 mà có một số tut về SI cũng có nói đến.Thường thì chúng ta lẫn lộn giửa 2 phím này , ko biết khi nào thì dùng F11 và khi nào thì dùng F12.
Trong SI thực chất các phím F12 và F11 có chức năng như sau:
F12=”^p ret;”
F11=”^G @SS:ESP;”

Như chúng ta biết, lệnh “^p” trong SI là lệnh cho thực hiện từng dòng lệnh .Vậy F12=”^p ret;” là lệnh thực hiện từng dòng lệnh cho đến khi gặp lệnh RET (lệnh trở về của hàm) thì ngừng.

Muốn hiểu được chức năng của phím F11 , bạn phải hiểu STACK (Ngăn xếp) và địa chỉ trở về của hàm.
Tui xin lấy ví dụ thật hay của PERTER NORTON - tác giả của AntiVirut làm ví dụ ở đây để giải thích về STACK và địa chỉ trở về:

Chỉ thị Call trong chương trình cần lưu trữ lại địa chỉ trở về ở một nơi nào đó, để bộ xử l‎y’ biết đường trở về sau khi gặp lệnh RET. Chúng ta dùng 1 phần bộ nhớ, gọi là STACK , để lưu trử địa chỉ trở về . Tóm lại Stack là 1 phần của bộ nhớ , một chức năng của nó là chứa địa chỉ trở về của lệnh Call. Nó có cấu tạo giống như hộp dựng banh tennis, khi bạn bỏ trái banh nào vào đầu tiên thì bạn phải lấy ra sau cùng ,vì bỏ vào trước thì trái banh sẽ nằm ở phía dưới đáy hộp.Như vậy trái banh sau cùng bỏ vào thì sẽ được lấy ra đầu tiên. Do đó 1 tên khác của STACK là LIFO (Last In,Fist Out : đến sau cùng, ra trước tiên)
Để dò tìm trong STACK , bộ xử l‎ dùng 2 thanh ghi là ESP (Stack pointer: con trỏ ngăn xếp ) trỏ đến đỉnh STACK và SS (Stack segment) giữ lại địa chỉ đọan . Đến đây bạn ko hiểu cũng ko sao, bạn chỉ nhớ cặp thanh ghi SS:ESP dùng để lấy “trái banh tenis” ở đỉnh hộp ra.
Với cách lưu trữ như trên chúng ta mới có thể lấy đúng các địa chỉ trở về khi các hàm gọi (Call) nhau “í ới” như ví dụ sau:
Quote:
5136:0100 CALL 0200
5136:0103 INT 20



5136:0200 CALL 0200
5136:0203 RET



5136:0300 CALL 0400
5136:0303 RET



5136:0400 RET
Ở đây tại địa chỉ 100h gọi chỉ thị 200h, bộ vi xử ly’ sẽ nạp địa chỉ trở về 103h vào Stack để biết đường trở về, sau đó nhảy đến địa chỉ 200h để thực hiện lệnh ở đó. Lúc này trong Stack sẽ là:
Quote:
STACK : 103h
Đến địa chỉ 200h nó gặp lệnh gọi chỉ thị tại địa chỉ 300h. Trước khi đi đến địa chỉ 300h, nó phải lưu địa chỉ trở về là 203h vào Stack. Lúc này trong stack là:
Quote:
STACK : 103h 203h
Đến địa chỉ 300h lại gặp lệnh gọi 400h, lại phải nạp địa chỉ trở về là 303h vào Stack:
Quote:
STACK : 103h 203h 303h
Bây giờ đến 400h gặp lệnh RET trở về , nó vào Stack dùng SS:ESP lấy địa chỉ ở đỉnh Stack là 303h để quay về. Đến đây trong Stack chỉ còn :
Quote:
STACK : 103h 203h
Đến 303h gặp RET, nó lại vào Stack dùng SS:ESP lấy địa chỉ ở đỉnh stack hiện giờ là 203h để quay về.

Tương tự như vậy khi quay về tại 103h gặp chỉ thị INT 20 thì kết thúc chương trình.

Những điều tui mô tả ở trên hơi khó hiểu và chán nhưng hiểu được Stack thì sẽ giúp bạn rất nhiều sau này. Chắc các bạn cũng đã từng thấy trong forum có các bài viết nói về crack theo phương pháp dùng Stack, bây giờ thì các bạn đã hiểu được phần nào về nó.

Trở lại SI, ta nói về F11 nhé.

Như các bạn biết F11=”^G @SS:ESP;”

Đến đây thì bạn đã hiểu được chức năng của nó rồi. F11 sẻ bắt SI “go” từ vị trí địa chỉ hiện tại “trôi qua” các chỉ thị lệnh rồi đến địa chỉ mà cặp thanh ghi SS:ESP trỏ đến (tức là địa chỉ ở đến đỉnh stack).
Giả sử tui đang đứng tại vị trí 200h trong ví dụ trên, nếu dùng lệnh F12 thì chương trình chạy đến đâu gặp lệnh RET đầu tiên thì ngừng, vậy đến địa chỉ 400h thì SI ngừng. Còn nếu dùng lệnh F11 thì chương trình sẽ chạy dến địa chỉ ở đỉnh Stack lúc này là 103h thì ngừng .

Vậy là hiểu F11 và F12 rồi hé.

Nói chung dùng F11 hay F12 gì cũng được, miễn sao đến chương trình cần crack nhanh nhất là được . Thường thì F11 nhanh hơn, nhưng nếu các bạn đến đích không được thì dùng F12. Còn nếu các bạn “sáng kiến” kết hợp dùng F11 rồi F12 tá lã thì coi chừng “die” luôn vì khi dùng F12 trước khi đến lệnh RET mà nó gặp lệnh push hay pop làm thay đổi stack thì khi dùng F11 máy tính của ta điên luôn. ( hí tui cũng đã thử rồi)
Theo như benina thì dùng lệnh F12 chắc ăn hơn . Vậy chúng ta nên thống nhất dùng F12 đi nhé.


Các bạn thấy tui lãng xẹt không, giải thích F11 cho đã rồi kêu dùng F12. híhíhí . Ở đây benina chỉ muốn giới thiệu các bạn khái niệm về Stack mà thôi. Hiểu nó thì dễ dàng cho chúng ta sau này.

Bây giờ còn phải giải thích về F10, F8 và F5 nữa .Đúng là làm newbie mệt thiệt.
Hình như tui đi lạc đề rồi, chúng ta đang nói về công việc crack trong SI mà.
Uhm, vậy chúng ta trở lại vấn đề chính nhe.
Đến đây là chúng ta chúng ta đã vào được đọan mã của chương trình cần crack bằng cách nhấn F12.

- Bước 5 : Bước kế tiếp là chúng ta phải biết được chúng ta đang đứng đâu trong chương trình để bắt đầu dò tìm tử nguyệt của nó.Trước tiên tui xin giới thiệu về 2 hàm thường dùng để đặt breakpoint trong SI là hmemcpy và GetDlgItemTextA để từ đó chúng ta hiểu được hiện dữ liệu trong chương trình đang chứa gì , và chúng ta đang đứng đâu trong nó.

a) Hàm hmemcpy có ‎ nghĩa như sau:
Quote:
Hàm Hmemcpy là 1 hàm API dùng để đọc, thao tác, so sánh, và đặt string vào vùng nhớ RAM. Hàm này lấy thông tin của bạn nhập vào và đặt nó vào vùng nhớ. Sau đó thao tác trên chúng như so sánh , di chuyển (Ví dụ như so sánh số serial đúng và fake serial mà ta nhậo vào). Có rất nhiều chương trình sử dụng hàm này, nên thường khi crack ta đặt breakpoint tại hàm này.
b) Hàm GetDlgItemTextA như sau:
Quote:
UINT GetDlgItemText(
HWND hDlg, // handle of dialog box (handle của hộp dialog)
int nIDDlgItem, // identifier of control (nhận dạng của điều khiển)
LPTSTR lpString, // address of buffer for text (địa chỉ buffer của đọan text mà ta đã nhận được)
int nMaxCount // maximum size of string (Kích thước qui định lớn nhất của chuổi string mà ta đã nhận được, nếu lớn hơn thì sẽ bị cắt phần dư)
);
(tìm đọc phần 2 của tut HowtobecomeCracker để có khái niệm về hDlg và nIDDlgItem)

Return Values (Giá trị trở về của hàm):

Nếu hàm tiến hành thực thi , thì giá trị trở về của hàm là số k‎y’ tự được copy vào buffer (chúng ta sẽ tìm hiểu buffer là gì sao, các bạn chỉ hiểu nôm na đó là 1 địa chỉ tạm thời trong bộ nhớ),không bao gồm k‎y' tự null báo cho máy tính biết là điểm kết thúc của chuổi ký tự.

Nếu hàm thực thi sai, giá trị trở về là zero

Tóm lại: Hàm GetDlgItemTextA cho ta biết bao nhiêu k‎y’ tự đã nhập vào. Ví dụ ta nhập :
name: benina ; thì hàm GetDlgItemTextA sẽ cho giá trị trở về là 6 chứa trong thanh ghi EAX. Vì vậy sau hàm GetDlgItemTextA thường là các "tiết mục" xử l‎y’ thanh ghi EAX
------------------------------------------------------------------------------------------------

Đến đây là phần quan trọng mà tui muốn nói đây:

Giả sử chương trình yêu cầu bạn nhập :

Name : benina
Password : 123456789

Bạn đặt breakpoint trong SI là bpx getdlgitemtexta
Thóat SI và cho chương trình chạy tiếp (bấm OK trong hộp registeration)
SI sẽ ngắt chương trình tại hàm getdlgitemtexta đầu tiên xử l‎y’ chuổi name, vậy muốn chương trình chạy đến đọan mã xử lý chuổi password thì ta bấm F5. SI sẽ thóat ,rồi chạy tiếp chương trình ,khi gặp hàm getdlgitemtexta xử l‎y’ chuổi password thì ngắt (break).
Đến đây chúng ta lại biết thêm 1 chức năng nữa của SI là phím F5.
F5=”^x”
F5 chỉ là lệnh thóat khỏi SI , trong trường hợp này thay vì bấm F5 ta bấm CTRL+D cũng được. Vậy CTRL+D khác F5 như thế nào?
Thưa bạn CTRL+D gọi hay thóat khỏi SI đều được. Còn F5 ko gọi được SI mà chỉ thóat khỏi SI mà thôi.
Vậy khi viết tut sau này, ví dụ tui nói bạn bấm 2 lần F5 là bạn hiểu như thế nào rồi nhé.
Đối với hàm hmemcpy ta cũng làm tương tự như trên, để đến đọan mã xử ly’ password ta bấm F5 như trên.

Phải công nhận để newbie hiểu thì phải viết dài dòng lê thê có nhiều khi đến Xomali luôn nà cũng chưa muốn dừng.

- Bước 6 :Đến đây tui xin mô tả 1 ‎y' tưởng crack ứng dụng những kiến thức ở tut 2A:
Như các bạn biết , sau khi sử dụng F5 , chúng ta hiện đứng tại đọan mã bắt đầu xử lý chuổi password. Vậy password của chúng ta đang nằm đâu đó trong bộ nhớ , ‎y’ tưởng crack ở đây là đặt breakpoint tại địa chỉ của password trong bộ nhớ. Bất cứ khi nào chương trình “đụng” đến nó như read, write thì SI sẽ ngắt và báo cho chúng ta biết để dễ dàng tìm ra tử nguyệt (ví dụ như khi so sánh pass nhập vào và serial đúng, thì chương trình phải read password trong bộ bộ nhớ khi ấy SI sẽ bào cho ta biết …hehe). Muốn vậy ta làm như sau:
Như tut 2A đã nói , đầu tiên ta xem pass của chúng ta nằm đâu trong bộ nhớ, dùng lệnh:

s 0 l ffffffff ‘chuổi pass đã nhập’

ví dụ : s 0 l ffffffff ‘123456789’
SI sẽ cho ta biết địa chỉ pass đang nằm trong bộ nhớ : ví dụ là 015f:0063f580
Sau đó đặt breakpoint tại địa chỉ này :
BPM 015f:0063f580
Hay
BPR 015f:0063f580 015f:0063f580+9 rw (+9 ở đây là chiều dài chuổi pass của chúng ta)

Sau đó bấm CTRL+D để thóat SI cho chương trình chạy xem sao.
Từ trước đến giờ chưa bao giờ benina thực hiện đặt breakpoint kiểu này thành công . Máy của benina chưa bao giờ snap (bắt dính) được điều này. Benina có đọc 1 tut của nước ngòai nói về điều này là do SI dùng trong bộ xử l‎y’ pentium nên ko thể thực hiện được như những gì đã nói ở trên (ko biết có đúng ko). Nhưng dù sao đi nữa tui cũng muốn bạn nên thử xem sao.

- Bước 7 : Nếu chúng ta chưa tìm ra tử nguyệt theo cách trên thì chúng ta buộc phải dò tìm từng dòng lệnh thôi.
Muốn thi hành từng lệnh 1 ta dùng F10 hoặc F8. Tui xin trích dẫn lời giải thích của Cracker Hacnho về F10 và F8 như sau:

“Bạn có thể cho SoftICE thi hành từng lệnh một bằng cách dùng lệnh P (hay nhấn F10) hoặc lệnh T (hay nhấn F8).
Sự khác nhau giữa 2 lệnh này là ở chổ lệnh P xem 1 lời gọi hàm Call xxxx như 1 lệnh đơn lẻ và cho thi hành toàn bộ thủ tục xxxx được gọi bởi lệnh Call này, sau đó dừng lại ở lệnh kế tiếp ngay sau lệnh Call xxxx, còn lệnh T sẽ nhảy đến dòng lệnh đầu tiên của thủ tục xxxx và dừng lại.
Lệnh T tất nhiên sâu sắc hơn lệnh P nhưng lúc nào cũng dùng nó thay thế cho lệnh P thì không phải là 1 ý hay, bạn rất dễ bị lệnh này dẫn đến 1 thủ tục không đâu và "quên cả đường về". Điều quan trọng là phải biết lúc nào cần dùng T và lúc nào cần dùng P. Thời gian sẽ dạy cho bạn điều đó.

Tui xin lấy ví dụ sau để mô tả :
Ta có đọan mã sau:
Quote:
* Reference To: USER32.GetDlgItemTextA, Ord:0102h
|
:004010DB E852010000 Call 00401232
:004010E0 0BC0 or eax, eax
:004010E2 7405 je 004010E9
:004010E4 83F804 cmp eax, 00000004
:004010E7 7315 jnb 004010FE
Ví dụ con trỏ SI đang đứng tại

:004010DB E852010000 Call 00401232

Nếu ta nhấn F10 thì con trỏ sẽ đến địa chỉ kế tiếp là :

:004010E0 0BC0 or eax, eax

Còn nếu ta nhấn F8 thì con trỏ sẽ nhảy vào trong hàm call tại địa chỉ

:00401232 FF2520204000 Jmp dword ptr [00402020]

F10 thì phớt tỉnh Ăng-lê với hàm call. Còn F8 thì quá “soi mói đời tư” của hàm call

Vậy là các bạn biết dùng F10 và F8 rồi nhé.

-Đến đây tui chỉ bạn 1 cách patch “ngu si” nhưng đôi khi hiệu quả cho các newbie. Cách patch này còn gọi là cách patch thử nghiệm chương trình đang load trong bộ nhớ chứ ko phải trên file.Khi ta patch thử nghiệm thành công thì ta sẽ dùng HIEW patch chương trình trên file để dùng mãi mãi. Phương pháp ‘ngu si’ này như sau:
Trong quá trình trace từng dòng lệnh bằng F10 hoặc F8 , Khi ta gặp bất cứ lệnh jump có điều kiện nào , ta đều đặt breakpoint tại lệnh jump đó. Cách đặt breakpoint này gọi là đặt breakpoint dạng one-shot . Lại phải nhờ đến Hacnho giải thích :

“Trong Code Window, bạn cũng có thể dùng chuột kích vào 1 dòng mã bên dưới dòng mã hiện đang thực thi để dời con trỏ đến đây, sau đó nhấn F7 (lệnh HERE), khi mã thi hành đến vị trí con trỏ (nếu thực sự mã có thể thi hành đến đúng vị trí con trỏ), SoftICE sẽ dừng lại cho bạn. Đây chính là cách đặt Breakpoint dạng one-shot.

Ở địa chỉ cần đặt breakpoint bạn bấm Double Click chuột vào dòng lệnh đó cũng được.


(Nếu SI của bạn ko sử dụng được chuột thì bạn vào setting SI trong menu Start để điều chỉnh setting SI.)

Sau khi bạn trace qua 1 lần chương trình và đã đặt breakpoint tại các hàm jump có điều kiện. Bây giờ bạn chạy lại chương trình , nó sẽ ngắt tại các lệnh nhảy đó. Sau đó ta sẽ cho chương trình nhảy ngược ,nhảy xuôi gì đó theo ‎y’ ta để tìm ra lệnh jump nào là tử nguyệt .
Vậy làm sao cho nó nhảy theo ‎ ta?
Như tut 2A tui đã nói,có một em flag rất dễ thương là flag Z (zero). Khi gặp các lệnh JZ/JNZ/JE/JNE thì chúng ta nhì em Z này chúng ta biết chương trình sắp nhảy đến đâu. Nếu chúng ta dùng lệnh :
r fl z
Để thay đổi flag Z thì các lệnh jump trên sẽ nhảy ngược lại.
Nếu chúng ta gặp hàm jump “nhỏ hơn hay lớn hơn 1 số thì nhảy” , đó là các hàm JG,JL,JGE,JLE. Thì chúng ta dùng lệnh “ a “ . Trong tut 3 sắp đến sẽ chỉ bạn dùng lệnh ‘a’ này trong SI
Tạo sao tui gọi đây là cách patch ‘ngu si’ vì chúng ta ko cần biết chương trình làm gì , chúng ta chỉ cho các lệnh jump nhảy tới nhảy lui sao cho hiện ra cái thông báo đã registered (đăng k‎y’)….hìhì

- Bước 8 : Cuối cùng là nhiều khi ta tìm ra tử nguyệt và biết được số serial đúng nằm ở đâu trong bộ nhớ. Lúc đó ta dùng lệnh d (dump), ? để dump ra chuổi serial đúng của chương trình.

Đến đây là đã hết tut 2B.

Theo tui thì tut này cực kỳ quan trọng cho những ai chưa xài SI lần nào. Đây chính là 1 bức tranh tổng quát cho chúng ta để patch 1 chương trình bằng SI.


In bài này
Copyright © 2012-2015 VNCongnghe
Đặt làm trang chủ Đặt làm trang chủ

Trang chủ | Quảng cáo | Liên hệ | RSS | Sitemap | Lên đầu trang