You are on page 1of 16

Bài lưu trữ về Reverse .NET Software 1.0.0.

2 Rongchaua

Reverse .NET Software VII


Advance Patch, Debug và Fishing Serial

www.reaonline.net

1 Giới thiệu_____________________________________________________________________ 2
2 Tìm hiểu cơ chế bảo mật ____________________________________________________ 3
2.1 Tìm hiểu tổng quan_____________________________________________________________ 3
2.2 Tiến hành remove Nag _________________________________________________________ 4
2.3 Enable nút Check It! ___________________________________________________________ 7
2.4 Tổng kết _______________________________________________________________________ 10
3 Debug và Fishing Serial ____________________________________________________ 11
3.1 Chuẩn bị________________________________________________________________________ 11
3.2 Tiến hành debug_______________________________________________________________ 11
4 Tổng kết_____________________________________________________________________ 16
5 Lời kết _______________________________________________________________________ 16

Trang 1 của 16
Bài lưu trữ về Reverse .NET Software 1.0.0.2 Rongchaua

1 Giới thiệu
• Trong thế hệ ASM, chúng ta đã rất quen thuộc với OllyDbg - một Debugger
nổi tiếng, một công cụ không thể thiếu đối với một reverser. OllyDbg nổi tiếng
vì tính dễ sử dụng, giao diện thân thiện và khả năng mở rộng hoàn hảo.
OllyDbg cho phép chúng ta debug một ứng dụng trong thời gian chạy, theo
dõi sự thay đổi của các giá trị thanh ghi, sử đổi mã nguồn tạm thời,…. và
muôn ngàn tính năng khác. OllyDbg vẫn đang được tiếp tục phát triển lên một
mức mới, hứa hẹn những tính năng mới và hoàn thiện các tính năng sẵn có.
Thế nhưng, đối với .NET, OllyDbg hoàn toàn bất lực. Và thực sự, cho đến hiện
nay vẫn chưa có một Debugger đúng nghĩa cho .NET nếu làm một phép so
sánh với OllyDbg cho ASM.
• Có thể chúng ta đã biết đến PEBrowser, WinDbg nhưng thực sự khi sử dụng
các công cụ này chúng ta gặp rất nhiều khó khăn vì tính khó sử dụng của
chúng. Điển hình như PEBrowser, mặc dù có hỗ trợ .NET nhưng khi Debug mã
code lại là ASM. Điều này thật sự gây khó khăn và bối rối khi phải chuyển đổi
qua lại giữa 2 dạng code IL và ASM.
• Vì vậy, tôi xin giới thiệu DILE. DILE là một Debugger cho .NET. DILE có một
số thế mạnh sau:
o Giao diện thân thiện, dễ sử dụng.
o Debug trên IL.
o Hỗ trợ xem nội dung stack và đối số.
• Tuy nhiên, có một điểm mà chúng ta cần lưu ý ở đây là DILE hoạt động vẫn
chưa được ổn định. Phiên bản hiện tại 0.2.5 không chạy được ở một số máy,
điển hình là máy của tôi.
• Cho nên, trong phần này, tôi sử dụng phiên bản 0.2.4 để giới thiệu về cách
debug một ứng dụng .NET. Ngoài ra, trong phần này tôi cũng xin giới thiệu
một tool mới, khá hay, đó là NetDasm. Xin cảm ơn tvbusy đã giới thiệu phần
mềm này.
• Trước khi tiếp tục tôi đề nghị nên xem lại các phần trước để hiểu rõ cách sử
dụng Reflector và ôn lại các kiến thức căn bản.
• Tool sử dụng trong bài viết
o Reflector: http://www.aisto.com/roeder/dotnet/
o DILE 0.2.4 http://sourceforge.net/projects/dile
o NetDasm http://www.codeproject.com/useritems/NetDasm.asp
o Sample CrackMe coded by rongchaua đã đính kèm

Trang 2 của 16
Bài lưu trữ về Reverse .NET Software 1.0.0.2 Rongchaua

2 Tìm hiểu cơ chế bảo mật

2.1 Tìm hiểu tổng quan


• Như chúng ta đã từng làm quen với Sample Crackme này. Nó bao gồm 3
level: Remove Nag, Enable Button và Fishing Serial.
• Cho nên khi chạy chương trình này ta bắt gặp Nag là level đầu tiên.

• Nhiệm vụ của chúng ta là Remove Nag này đi. Bây giờ dùng Reflector load
Sample Crackme này lên và tìm đoạn gọi Nag này. Ta thấy Nag được gọi ngay
vào đầu chương trình. Vì vậy ta đi đến điểm đầu chương trình bằng cách trong
cửa sổ Reflector, click phải chuột lên Namespace Sample Crackme. Chọn Go
to entry point như hình

• Ta sẽ đến Method Main. Disassemble method này ta thấy

Trang 3 của 16
Bài lưu trữ về Reverse .NET Software 1.0.0.2 Rongchaua

• Như vậy Form1 là Form chính của chương trình. Tại đây, chương trình sẽ bắt
đầu thực thi. Ta click vào link đến Form1 thì thấy tại cửa sổ View Object có
những thông tin sau

• Trong các method ở đây, ta thấy quan trọng nhất là method Form1_Load. Vì
tại đây, chương trình sẽ bắt đầu và có lẽ Form Nag sẽ được gọi tại đây. Source
code của method này như sau.

2.2 Tiến hành remove Nag


• Như vậy, rõ ràng Nag được gọi ngay từ đầu chương trình mà không cần kiểm
tra bất cứ điều gì. Ngoài ra, tại đây, ngoài câu lệnh gọi Nag ra không còn câu
lệnh nào khác. Như vậy, để remove nag chỉ cần làm sao đó để Method
Form1_Load không được thực thi là xong.
• Mở NetDasm lên và Load file Sample Crackme. Ta có như sau

Trang 4 của 16
Bài lưu trữ về Reverse .NET Software 1.0.0.2 Rongchaua

• NetDasm cho chúng ta một cái nhìn khá tổng quan về sơ đồ của một ứng
dụng .NET. Trên cùng là Assembly, trong Assembly có Types, trong Type lại
có các method, cấu trúc top down rất rõ ràng.
• Trở lại vấn đề, như đã phân tích ở trên ta thấy rằng chỉ cần Method
Form1_Load không được thực thi thì Nag sẽ không được gọi. Cho nên chúng
ta chọn Form1, chọn Method Load và Click Remove Method như hình.

Trang 5 của 16
Bài lưu trữ về Reverse .NET Software 1.0.0.2 Rongchaua

• Sau khi remove method, thì NetDasm sẽ update ngay lập tức. Do đó chúng ta
phải thật cẩn thận khi remove toàn bộ một method vì không thể undo việc
remove này lại.
• Tiếp theo, ta chọn Menu Assembly và Save dưới tên SampleCrackMeNag.exe
như hình

Trang 6 của 16
Bài lưu trữ về Reverse .NET Software 1.0.0.2 Rongchaua

• Chạy thử File SampleCrackMeNag ta thấy file chạy mà không có Nag.

• Đến đây chúng ta đã vượt qua được Level đầu tiên là Remove Nag và bước
đầu làm quen với NetDasm - Một tool mới khá hay.
• Tiếp theo chúng ta sẽ vượt qua Level thứ 2 là enable nút Check It!

2.3 Enable nút Check It!


• Ở đây ta thấy nút Check It bị disable. Về phương diện lập trình, có nhiều cách
để disable nút Check It! Nhưng tựu trung có 2 cách chính đó là:
o Disable trong lúc design bằng cách set enable = false
o Diasble trong lúc thực thi thông qua lệnh
• Chúng ta thấy rằng sau khi Method Form1_Load được remove thì nút Check
It! Vẫn bị disable. Điều này có nghĩa rằng, nút này đã bị disable trong lúc
design. Vì để disable trong khi thực thi thì chắc chắn mã lệnh để disable nút

Trang 7 của 16
Bài lưu trữ về Reverse .NET Software 1.0.0.2 Rongchaua

Check It phải nằm trong Method Form1_Load. Cho nên chúng ta tìm đến
Method InitializeComponent của Form1.
• Tại sao lại phải là InitializeComponent? Dĩ nhiên, nếu đã từng lập trình với
Visual Studio, chúng ta đều biết tại Method này, tất cả các tính chất của các
Component sẽ được thiết đặt. Dĩ nhiên, bao gồm cả thuộc tính Enable của nút
Check It!
• Tại cửa sổ NetDasm làm như sau:

• Ta tìm đến nơi thiết đặt thuộc tính cho Button Check It!.
• Có thể dùng Instruction Filter để tìm kiếm. Sau khi lọc xong chúng ta chỉ có 1
list các instruction liên quan và vị trí. Dựa trên vị trí này, chúng ta có thể tìm
đến đoạn mã cần tìm dưới đây.

Trang 8 của 16
Bài lưu trữ về Reverse .NET Software 1.0.0.2 Rongchaua

• Ta thấy tại câu lệnh Select, chương trình sẽ push lên stack giá trị 0 và gọi
hàm set_Enabled. Tức là giá trị của thuộc tính Enabled của nút CheckIt sẽ bị
set là False. Đồng nghĩa là nút sẽ bị Disable, như vậy chúng ta cần thay đổi
giá trị này lại thành 1 là oki.
• Rõ ràng, việc patch trong thế hệ .NET cũng đòi hỏi một kiến thức nhất định về
ngôn ngữ IL như trong ASM vậy.
• Click chọn câu lệnh 141. Nhấn Edit instruction. Sửa lại như hình sau

• Và ta có

Trang 9 của 16
Bài lưu trữ về Reverse .NET Software 1.0.0.2 Rongchaua

• Oki, như vậy chúng ta đã hoàn thành phần Enable nút Check It. Đóng cửa sổ
EditCode và lưu file lại dưới tên SampleCrackMeEnable.exe.
• Thử chạy file vừa patch ta thấy.

• Như vậy button Check It! Đã được enable.

2.4 Tổng kết


• Như vậy đến lúc này, chúng ta đã vượt qua được 2 level của Sample Crackme.
Có thể nói với sự giúp đỡ của NetDasm, chúng ta patch được Crackme hoàn
toàn dễ dàng.
• NetDasm: patcher đầu tiên trong thế hệ .NET.

Trang 10 của 16
Bài lưu trữ về Reverse .NET Software 1.0.0.2 Rongchaua

3 Debug và Fishing Serial

3.1 Chuẩn bị
• Như vậy chúng ta đã vượt qua được 2 level đầu tiên của Sample Crackme.
Nhiệm vụ kế tiếp là chúng ta phải tìm ra được số serial chính xác của chương
trình.
• Không giống như các phần trước hôm nay chúng ta sẽ sử dụng kỹ thuật debug
để fishing serial.
• Trước tiên, chúng ta vẫn sử dụng sự hỗ trợ của Reflector để tìm ra vị trí cần
thiết. Ta tìm thấy hàm check serial tại method btnCheckIt_Click

• Qua phân tích ta thấy rằng số serial được tạo ra sẽ lưu trữ trong biến text.
Chỉ cần thấy được nội dung của biến text là ta đã fishing được serial của
crackme.

3.2 Tiến hành debug


• Chạy DILE 0.2.4. Và tiến hành như sau: Tại cửa sổ bên phải, click phải chuột
vào new project chọn Add assembly

• Browse tới file SampleCrackmeEnable và load file này vào DILE. Sau đó click
phải chuột lên Namespace SampleCrackmeEnable chọn “Set as startup
assembly”

Trang 11 của 16
Bài lưu trữ về Reverse .NET Software 1.0.0.2 Rongchaua

• Browse tới method btnCheckIt_Click và double click vào method này

• Tại cửa sổ Disassemble ta nhấn F9 để set breakpoint ngay tại câu lệnh như
hình.

Trang 12 của 16
Bài lưu trữ về Reverse .NET Software 1.0.0.2 Rongchaua

• Click nút Run trên Toolbar để chạy chương trình.

Trang 13 của 16
Bài lưu trữ về Reverse .NET Software 1.0.0.2 Rongchaua

• Chọn Yes To All để load tất cả các Reference.


• Khi chương trình thực thi sẽ dừng tại đây

• Nhấn F10 để trace đến đoạn

• Tương ứng mã IL code là ở đây

• Trong DILE bật sang cửa sổ Local Variable

Trang 14 của 16
Bài lưu trữ về Reverse .NET Software 1.0.0.2 Rongchaua

• Ta thấy rõ ràng serial tương ứng với name rongchaua là cm9uZ2NoYXVh. Vì


sao? Chúng ta hãy để ý khi vào hàm btnCheckIt_Click ta thấy có 2 local
variable

• Rõ ràng V_0 có kiểu int nên không thể là biến string text được, chỉ còn lại V_1
là kiểu string, lại là local variable nên ta đi đến kết luận rằng text chính là V1.
• Nhập thử serial này để test, ta thấy.

Trang 15 của 16
Bài lưu trữ về Reverse .NET Software 1.0.0.2 Rongchaua

4 Tổng kết
• Như vậy, chúng ta đã tiến hành xong phần debug và advanced patch. Qua
phần này chúng ta tìm hiểu thêm cách sử dụng 2 tool DILE và NetDasm.
• 2 Tool trên vẫn còn được liên tục phát triển và hoàn thiện, chúng ta nên tham
khảo trang chủ thường xuyên để sử dụng bản mới nhất.
• Cho tới hiện tại bản 0.2.5 của DILE vẫn còn bị bug trên máy của tôi nhưng
chạy được trên một số máy khác. Nếu gặp lỗi với bản 0.2.5 các bạn hãy sử
dụng bản 0.2.4 để thay thế.

5 Lời kết
• Tôi viết bài lưu trữ này nhằm lưu lại một chút kiến thức mà tôi có được trong
quá trình reverse phần mềm. Bài lưu trữ này chỉ mang tính tham khảo và tôi
không có ý định viết nó như một tài liệu tham khảo thật sự. Vì vậy trong một
số mục tôi chỉ nêu lên những ý chính thật cần thiết và dĩ nhiên sẽ còn nhiều
thiếu sót. Tôi hi vọng các bạn sẽ thông cảm cho những thiếu sót của tôi.
• Do những suy nghĩ trên mang đầy tính chủ quan vì vậy nếu có những sai sót
xin các bạn vui long liên hệ với tôi để tôi kịp thời sửa chữa.
• Bài lưu trữ này được viết như một tài liệu tham khảo cho các anh, em ở REA vì
vậy tôi xin tặng bài viết này cho anh, em trong REA.
• Bài viết ở trên chỉ mang tính học tập, tôi không chịu trách nhiệm khi các bạn
sử dụng các kiến thức ở trên vào việc của các bạn.

Rongchaua chấp bút


My Email : rongchaua@reaonline.net
My Website : www.rongchaua.net
“46a42a575a3115eff2d2a37e9cf33626”ÅÝ nghĩa của đọan MD5 này là gì?
Nếu tôi có gì sai sót, vui lòng liên hệ email trên để “mắng vốn”.
01.06.2007-3.06.2007

Trang 16 của 16

You might also like