SlideShare a Scribd company logo
Trang 1
Các thuật ngữ thường gặp trong .NET Reverse Engineering
Tác giả: Levis Nickaster (http://ltops9.wordpress.com )
.NET Reverse Engineering là 1 nhánh nhỏ của Reverse Engineering, và hiện tại đang phát triển khá mạnh và khá nhanh. Đối
tượng nghiên cứu của .NET Reverse Engineering là các ứng dụng được viết dựa trên .NET Framework và bản thân chính .NET
Framework.
Các thuật ngữ tôi viết dưới đây có thể là không được đầy đủ, và tôi viết theo ý hiểu và kinh nghiệm của tôi, cho nên sẽ không
tránh khỏi những sai sót về mặt chuyên môn, vì vậy, tôi sẽ rất cảm kích nếu các bạn giúp tôi sửa những lỗi đó và góp phần
giúp cho bài viết được tốt hơn.
Thuật ngữ trong .NET Reversing tập trung chủ yếu ở các kiến thức và khái niệm nằm trong lập trình .NET, bởi vì khi thực hiện
Reverse Engineering .NET thì chúng ta có thể tiếp xúc với các code gần code gốc của chương trình , vì vậy kiến thức về lập
trình .NET rất hữu ích trong quá trình Reverse Engineering .NET để đọc và hiểu được hoạt động của code, biết càng nhiều thì
càng khiến việc Reverse Engineering .NET trở nên dễ dàng hơn
Bên cạnh các thuật ngữ thường thấy trong Reverse Engineering PE file cổ điển, Reverse Engineering .Net còn có thêm một
vài thuật ngữ mới sau:
Assembly: Hay có tên đầy đủ là .NET Assembly, đây không phải là tên ngôn ngữ bậc thấp (Assembly). Assembly trong .NET
để chỉ một thực thể (1 file nào đó) được viết bằng .NET đã được biên dịch, và hoạt động dựa trên .NET Framework
‘Assembly” dịch nôm na là “lắp ghép, kết hợp”, thì 1 file trong .NET cũng là tập hợp của các method, class và các phần
resource cũng như references + các thông tin kèm theo. Khi nhắc đến Assembly trong .NET thì có nghĩa là người viết đang
muốn nói đến file .NET đó
IL; viết tắt của Intermediate language, là 1 loại ngôn ngữ làm nhiệm vụ trung gian giao tiếp của code .NET và jit compiler (sẽ
nói đến khái niệm này sau). Các chương trình .NET sau khi được biên dịch, sẽ không chứa mã máy giống như các chương
trình viết bằng ngôn ngữ bậc cao khác mà sẽ chứa các bytecode của IL code.
Dạng biểu diễn của IL code
MSIL: Microsoft intermediate language, tên khác của IL
CIL: Common Intermediate Language, cũng giống như MSIL và IL
Trang 2
Native Application: Native có nghĩa là “tự nhiên, nguyên thủy”, Thuật ngữ này dùng để chỉ các chương trình không viết
bằng .NET - không dựa trên .NET. Các chương trình được viết bằng C/C++, Delphi, vb, asm,… được gọi là những Native
Application, để phân biệt với các .NET Application
Bênh cạnh Native Application còn có thêm 2 thuật ngữ khác, đó là:
- Managed: Các chương trình viết bằng .NET và khi chạy, được quản lý (managed) bởi .NET Framework và CLR (Sẽ
nói đến sau). Vì vậy, khi nhìn thấy “managed application” cũng có nghĩa là chương trình .NET
- Unmanaged: Tên gọi khác của native Application, bởi vì chúng không được quản lý bởi .NET framework và CLR. Vì
vậy khi nhìn thấy “unmanaged application” cũng có nghĩa là đang nói đến các native Application.
Các thuật ngữ “Managed” và “Unmanaged” được tạo nên chủ yếu dựa vào hoạt động quản lý và cấp phát bộ nhớ của
chương trình (memory management). Trong khi các chương trình .NET được quản lý bộ nhớ bỏi 1 Garbage collector, thì
các native application thường không sử dụng garbage collector của CLR đó.
Mixed mode: Đây là thuật ngữ được sử dụng khi nói đến 1 chương trình có sử dụng các kĩ thuật code của .NET và cả
code của các ngôn ngữ khác không dựa trên .NET
Decompile/ Disassemble; Quá trình dịch ngược một chương trình .NET, lấy các bytecode có trong chương trình,
chuyển chúng về IL code (dạng có thể đọc được) và các loại ngôn ngữ bậc cao khác.
Sử dụng IDA để decompile một chương trình .NET về dạng IL code
Obfuscate/obfuscator : là “làm rối”, thuật ngữ này dùng để chỉ phương pháp được sử dụng để làm rối toàn bộ mã
nguồn của chương trình, khiến cho việc dịch ngược và hiểu được code trở nên khó khăn hơn. Obfuscator là thuật ngữ để chỉ
chung các chương trình giúp người dùng làm rối code. Obfuscate giúp bảo vệ chương trình, che giấu code thật. Tên của một
vài Obfuscator: SmartAssembly, ILProtector, .NET Reactor, Confuser, Dotfuscator, Rummage, Xenocode, CodeVeil,…
Trang 3
Giao diện của Confuser – 1 Obfuscator phổ biến
Code khi decompile của 1 chương trình bị obfuscate
Trang 4
Deobfuscate/Deobfuscator: Thêm “De-“ ở đằng trước mang ý nghĩa ngược lại. Vậy nên debofuscate là thuật ngữ
dùng để chỉ các phương pháp được sử dụng để loại bỏ quá trình obfuscate đã được sử dụng lên chương trình cần nghiên
cứu, giúp chuyển code về code gốc, hoặc một kiểu code mà người ta có thể đọc hiểu dễ dàng hơn. Deobfuscator là thuật
ngữ để chỉ chung các chương trình giúp người dùng làm việc đó.
Pack/Packer/Unpack/Unpacker: “Pack” là phương pháp sử dụng các thuật toán để nén một chương trình (hay 1
thư viện, dữ liệu…) lại. Trong .NET thì pack được sử dụng như một phương pháp bảo vệ chương trình để tránh bị dịch ngược
và xem mã nguồn. Chương trình gốc thường thường sẽ được nén lại (có thể kèm theo mã hóa) và được cất trong code của 1
chương trình do các packer (các chương trình thực viện việc pack) tạo ra gọi là 1 loader. Khi chạy, loader sẽ tiến hành load,
giải nén (hoặc giải mã nếu bị mã hóa) chương trình gốc ra trên memory và thực thi chương trình gốc ngay trên đó. Unpack là
quá trình sử dụng các phương pháp để loại bỏ việc pack và tìm lại chương trình gốc để có thể dịch ngược và xem code.
Unpacker là các chương trình được viết ra để thực hiện việc unpack tự động. Một vài packer phổ biến trong .NET thường
gặp là : .NETZ, BoxedApp (có thể pack cả native app), MPRESS (có thể pack cả native app), rpx, ExePack.NET,…
Giao diện dòng lệnh của .NETZ Packer khi đang chạy
CLR: Viết tắt của Common Language Runtime, là môi trường để quản lý việc vận hành các ứng dụng viết bằng .NET, bắt đầu
từ việc khởi chạy chương trình, biên dịch tức thời (JIT) , quản lý bộ nhớ, kiểm soát exception và type safety. Các chương
trình .NET khi hoạt động đều được đặt trong sự quản lý của CLR.
JIT Compiler: JIT viết tắt của Just-in-time (vừa kịp lúc). Đây là chương trình có tính năng tiếp nhận các IL code có trong
chương trình .NET và biên dịch chúng thành mã máy, sau đó giao cho CPU thực thi. Như đã nói ở trên, các chương trình viết
bằng .NET không được biên dịch ngay ra mã máy mà sẽ được chuyển thành IL code, vậy nên JIT Compiler rất quan trọng vì
nó đảm bảo các chương trình .NET được biên dịch thành mã máy, như thé mới có thể chạy được. Nếu không có jIT Compiler,
các chương trình .NET không thể hoạt động. Có thể nhìn ảnh sau để hiểu cách 1 chương trình .NET hoạt động như thế nào:
Sơ đồ cơ chế hoạt động của 1 chương trình .NET
Trang 5
Scanner/Detector: Các chương trình làm nhiệm vụ phân tích tổng quan chương trình để cho biết được chương trình có
được bảo vệ hay không, và bảo vệ bằng obfuscator nào. Các chương trình kiểu này rất quan trọng, cho biết những thông tin
hữu ích khi phải phân tích các chương trình bị obfuscate. Biết được cơ chế bảo vệ rồi thì mới có phương pháp để vượt qua.
Giao diện của 1 Scanner/Detector tên là ExeinfoPE đang scan 1 chương trình .NET
Metadata: dịch theo nghĩa đen là “siêu dữ liệu”. Thuật ngữ này được dùng để chỉ về phần dữ liệu có tổ chức và cấu trúc
cao nằm trong 1 chương trình .NET sau khi được biên dịch từ mã nguồn. Trong metadata lưu trữ rất nhiều thứ: Thông số,
cấu hình của chương trình, cấu trúc và thuộc tính của các thành phần có trong chương trình, IL Code và các resource của
chương trình cũng được lưu ở đây, và những thông tin khác nữa. Đọc thêm bài viết về cấu trúc của file .NET để hiểu về
metadata và cách tổ chức, lưu trữ dữ liệu của nó.
Metadata nhìn từ trong CFF Explorer
Trang 6
Token: Tên đầy đủ là Metadata token, là một giá trị có kích thước 4byte, để chỉ đến phần dữ liệu tương ứng được lưu trữ
trong metadata. Đọc thêm bài viết về cấu trúc file .NET.
Metadata token hiển thị trong 1 decompiler
.NET Reflector: Tên của một trình dịch ngược rất rổi tiếng dảnh riêng cho các chương trình .NET. Có thể đọc thêm về
chương trình này tại loạt bài viết “Các công cụ cần thiết cho quá trình Reverse Engineering .NET” đăng trên blog cá nhân của
tôi.
Giao diện của .NET Reflector
Trang 7
Reflexil: Một plugin quan trọng của .NET Reflector dùng để xem, chỉnh sửa IL code ngay bên trong .NET Reflector và có thể
lưu lại những chỉnh sửa này. Đây là một plugin rất quan trọng và vô cùng cần thiết khi sử dụng .NET Reflector.
Khung hiển thị của Reflexil bên trong .NET Reflector
ILSpy: Một decompiler mã nguồn mở. Có thể đọc thêm thông tin từ loạt bài viết “Các công cụ cần thiết cho quá trình
Reverse Engineering .NET” được đăng trên blog cá nhân của tôi.
Giao diện của ILSpy
Trang 8
De4dot: Tên của 1 chương trình deobfuscator rất nổi tiếng dảnh riêng cho .NET. Có thể đọc thêm về chương trình này tại
loạt bài viêt “Các công cụ cần thiết cho quá trình Reverse Engineering .NET” đăng trên blog cá nhân của tôi.
Giao diện dòng lệnh của de4dot
Mono.Cecil: Mono.Cecil là một thư viện mã nguồn mở, cung cấp các phương pháp để thao tác với các chương trình viết
bằng .NET. Với Mono.Cecil, chúng ta có thể thao tác, chỉnh sửa mọi thông tin lưu trữ trong 1 chương trình .NET (từ các thuộc
tính, đến cấu trúc chương trình và cả IL code). Vì đây chỉ là một thư viện, cho nên cần phải có kiến thức lập trình để xây dựng
chương trình mới có thể sử dụng các tính năng được cung cấp bởi thư viện này.
Dnlib: Một bộ thư viên tương tự với Mono.Cecil, được 0xd4d, tác giả của de4dot phát triển độc lập với Mono.Cecil, nhằm
khắc phục các yếu điểm của Mono.Cecil. Các obfuscator/protector trước đây thường nhằm vào các yếu điểm của Mono.Cecil
để tạo ra các phương pháp chống lại các chương trình dịch ngược có sử dụng Mono.Cecil. dnlib ra đời nhằm mục đích để
vượt qua các cơ chế bảo vệ đó, được sử dụng đầu tiên trong chính de4dot, và hiện tại thư viện này đang được sử dụng rộng
rãi hơn trong giới Reverser.
DnSpy – Một decompiler biến thể của ILSpy, sử dụng dnlib thay vì Mono.Cecil
Trang 9
CFF Explorer: Một chương trình hex editor, nhưng có khả năng đọc và chỉnh sửa thông tin của các chương trình viết bằng
.NET. Có thể đọc thêm về chương trình này tại loạt bài viết “Các công cụ cần thiết cho quá trình Reverse Engineering .NET”
đăng trên blog cá nhân của tôi.
SAE: Tên viết tắt của SmartAssemblyExplorer, một chương trình decompiler cho .NET. Có thể tìm thêm thông tin về chương
trình này trong loạt bài viêt “Các công cụ cần thiết cho quá trình Reverse Engineering .NET” đăng trên blog cá nhân của tôi.
Trang 10
Khung hiển thị code của SAE khi đang dịch ngược 1 chương trình .NET
(Bài viết đang trong giai đoạn hoàn thiện, nếu bạn cần nhiều thêm định nghĩa, khái niệm về các thuật ngữ khác, háy liên lác với tôi :
levintaeyeon@live.com để cùng đóng góp và xây dựng tài liệu này trở nên đầy đủ hơn)

More Related Content

PDF
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
PDF
Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch
PDF
Hacking de4dot for fun - Bài dịch
PDF
Phân tích mã độc cơ bản - báo cáo thực tập
PDF
Tùy biến Confuser
DOCX
Báo cáo môn đảm bảo chất lượng phần mềm
DOCX
Đồ án kiểm thử phần mềm
PDF
Hệ điều hành (chương 1)
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch
Hacking de4dot for fun - Bài dịch
Phân tích mã độc cơ bản - báo cáo thực tập
Tùy biến Confuser
Báo cáo môn đảm bảo chất lượng phần mềm
Đồ án kiểm thử phần mềm
Hệ điều hành (chương 1)

What's hot (20)

PDF
Đồ án trang web bán văn phòng phẩm
PDF
các khái niệm cơ bản dự án phần mềm
PDF
Quy tắc thiết kế giao diện và viết code C#
PDF
Giáo trình Lập trình C căn bản - Aptech
PDF
Quản lý dự án
DOCX
BTL phân tích thiết kế hệ thống- Đề tài quản lý nhập hàng thực phẩm khô tại s...
PDF
Giáo Trình CCNA Full Tiếng Việt
DOCX
Thực tập kiểm thử phần mềm
PPTX
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
PDF
Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)
PDF
Giáo trình Quản trị mạng
DOC
Php cơ bản của trung tâm hocweb.com.vn
PPT
DOCX
Bảo trì phần mềm
PDF
Giao Trinh Jquery
PDF
Bài giảng mật mã học cơ sở PTIT
DOC
Đồ án tốt nghiệp Xây dựng ứng dụng fastfood trên nền android
DOCX
Bai tap thuc hanh
PDF
He thong-dieu-kien-phan-tan
PDF
Chuong 3. cnpm
Đồ án trang web bán văn phòng phẩm
các khái niệm cơ bản dự án phần mềm
Quy tắc thiết kế giao diện và viết code C#
Giáo trình Lập trình C căn bản - Aptech
Quản lý dự án
BTL phân tích thiết kế hệ thống- Đề tài quản lý nhập hàng thực phẩm khô tại s...
Giáo Trình CCNA Full Tiếng Việt
Thực tập kiểm thử phần mềm
Slide báo cáo đồ án tốt nghiệp "Website cửa hàng điện thoại trực tuyến"
Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)
Giáo trình Quản trị mạng
Php cơ bản của trung tâm hocweb.com.vn
Bảo trì phần mềm
Giao Trinh Jquery
Bài giảng mật mã học cơ sở PTIT
Đồ án tốt nghiệp Xây dựng ứng dụng fastfood trên nền android
Bai tap thuc hanh
He thong-dieu-kien-phan-tan
Chuong 3. cnpm
Ad

Viewers also liked (7)

PDF
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
PDF
Hướng dẫn tạo Loader trong .NET - bản dịch
PDF
Reverse Engineering .NET - Advanced Patching, Playing with IL
PDF
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
PDF
Decrypt các MSIL methods một cách thử công - Bài dịch
PDF
Reverse Engineering in Linux - The tools showcase
PPTX
Software maintenance
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Hướng dẫn tạo Loader trong .NET - bản dịch
Reverse Engineering .NET - Advanced Patching, Playing with IL
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
Decrypt các MSIL methods một cách thử công - Bài dịch
Reverse Engineering in Linux - The tools showcase
Software maintenance
Ad

Similar to Những thuật ngữ thường gặp trong Reverse Engineering .NET (20)

PDF
Sinh vienit.net --57669587-c-dhkh-hue
PDF
Câu hỏi phỏng vấn.pdf
PDF
Agent mang bayes
PPT
Chuong 1
PDF
[123doc] - do-a-n-ung-dung-tro-chuyen-truc-tuyen.pdf
PDF
Asp.net 3.5 _1
PPT
Mau slide
DOC
Bao cao web cake php
PDF
Cong nghnet
PDF
04 de cuong
PDF
Bài 1 - Làm quen với C# - Lập trình winform
PDF
Gt java080102005
PDF
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
PDF
Ebook lập trình Java hướng đối tượng (Tiếng việt)
DOC
Báo cáo thực tập chuyên nghành lập trình Android GPSGroup
PPTX
Metasploit
PPT
Ltgd ch01
PDF
Tài liệu Lập trình Zend Framework 2.x
PPT
Linux+03
DOC
Core java 2
 
Sinh vienit.net --57669587-c-dhkh-hue
Câu hỏi phỏng vấn.pdf
Agent mang bayes
Chuong 1
[123doc] - do-a-n-ung-dung-tro-chuyen-truc-tuyen.pdf
Asp.net 3.5 _1
Mau slide
Bao cao web cake php
Cong nghnet
04 de cuong
Bài 1 - Làm quen với C# - Lập trình winform
Gt java080102005
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
Ebook lập trình Java hướng đối tượng (Tiếng việt)
Báo cáo thực tập chuyên nghành lập trình Android GPSGroup
Metasploit
Ltgd ch01
Tài liệu Lập trình Zend Framework 2.x
Linux+03
Core java 2
 

Recently uploaded (20)

DOCX
Báo cáo thực tập công ty Ah-GlobalGroup vị trí Data Analyst
PDF
12894-44864-1-CE-1037-1038_Văn bản của bài báo.pdf
PDF
CHUYÊN ĐỀ BỔ TRỢ NÂNG CAO DẠNG BÀI TẬP MỚI FORM 2025 - TIẾNG ANH 12 (TỜ RƠI Q...
PPT
SINH 8 TUYẾN YÊN TUYẾN GIÁP CÂU TẠO VÀ CHỨC NĂNG
PPTX
Chương 2 - Mô hình thực thể kết hợp.pptx
DOCX
Set menu 3 món rất hay và hiện đại dành cho người
PPTX
14. thoát vị bẹn nghẹt bệnh học ngoại khoa.pptx
PDF
BÀI TẬP BỔ TRỢ FRIENDS PLUS 9 - BÀI TẬP TRẮC NGHIỆM, TỰ LUẬN - CẢ NĂM (BÁM SÁ...
PPTX
Bài 9.4 TUYẾN SINH DỤC NAM VÀ NU CẤU TẠO VÀ CHỨC NĂNG
PDF
BÀI TẬP TEST FOR UNIT TIẾNG ANH LỚP 8 GLOBAL SUCCESS CẢ NĂM THEO TỪNG ĐƠN VỊ ...
DOCX
Luận văn group-Bài tiểu luận Ý thức - Giấc mơ.docx
PPTX
Powerpoint cho Ke toan tai chinh KET307_Bai1_SV.pptx
PDF
PHÁT TRIỂN NĂNG LỰC KHÁM PHÁ TỰ NHIÊN CHO HỌC SINH TRONG DẠY HỌC CHỦ ĐỀ VẬT S...
PPTX
Direct Marketing- chieu thi truyen thong
DOCX
BÀI TIỂU LUẬN HẾT HỌC PHẦN MÔN ĐÁNH GIÁ TRONG GIÁO DỤC
PPTX
Triết học: Vận dụng nguyên tắc phát triển trong nhận thức và hoạt động thực...
PDF
[Toán 10] - Bộ 5 Đề Ôn Tập học Kì 2.pdf cho học sinh lớp 10
PPTX
TIẾT 8, 9, 10. BÀI 32. DINH DƯỠNG VÀ TIÊU HÓA Ở NGƯỜI.pptx
PPTX
Bài giảng chương 3 phương pháp luận nghiên cứu khoa học_HQH.pptx
PDF
Public economy và vai trò trong phân bổ nguồn lực, cung cấp hàng hóa công, đi...
Báo cáo thực tập công ty Ah-GlobalGroup vị trí Data Analyst
12894-44864-1-CE-1037-1038_Văn bản của bài báo.pdf
CHUYÊN ĐỀ BỔ TRỢ NÂNG CAO DẠNG BÀI TẬP MỚI FORM 2025 - TIẾNG ANH 12 (TỜ RƠI Q...
SINH 8 TUYẾN YÊN TUYẾN GIÁP CÂU TẠO VÀ CHỨC NĂNG
Chương 2 - Mô hình thực thể kết hợp.pptx
Set menu 3 món rất hay và hiện đại dành cho người
14. thoát vị bẹn nghẹt bệnh học ngoại khoa.pptx
BÀI TẬP BỔ TRỢ FRIENDS PLUS 9 - BÀI TẬP TRẮC NGHIỆM, TỰ LUẬN - CẢ NĂM (BÁM SÁ...
Bài 9.4 TUYẾN SINH DỤC NAM VÀ NU CẤU TẠO VÀ CHỨC NĂNG
BÀI TẬP TEST FOR UNIT TIẾNG ANH LỚP 8 GLOBAL SUCCESS CẢ NĂM THEO TỪNG ĐƠN VỊ ...
Luận văn group-Bài tiểu luận Ý thức - Giấc mơ.docx
Powerpoint cho Ke toan tai chinh KET307_Bai1_SV.pptx
PHÁT TRIỂN NĂNG LỰC KHÁM PHÁ TỰ NHIÊN CHO HỌC SINH TRONG DẠY HỌC CHỦ ĐỀ VẬT S...
Direct Marketing- chieu thi truyen thong
BÀI TIỂU LUẬN HẾT HỌC PHẦN MÔN ĐÁNH GIÁ TRONG GIÁO DỤC
Triết học: Vận dụng nguyên tắc phát triển trong nhận thức và hoạt động thực...
[Toán 10] - Bộ 5 Đề Ôn Tập học Kì 2.pdf cho học sinh lớp 10
TIẾT 8, 9, 10. BÀI 32. DINH DƯỠNG VÀ TIÊU HÓA Ở NGƯỜI.pptx
Bài giảng chương 3 phương pháp luận nghiên cứu khoa học_HQH.pptx
Public economy và vai trò trong phân bổ nguồn lực, cung cấp hàng hóa công, đi...

Những thuật ngữ thường gặp trong Reverse Engineering .NET

  • 1. Trang 1 Các thuật ngữ thường gặp trong .NET Reverse Engineering Tác giả: Levis Nickaster (http://ltops9.wordpress.com ) .NET Reverse Engineering là 1 nhánh nhỏ của Reverse Engineering, và hiện tại đang phát triển khá mạnh và khá nhanh. Đối tượng nghiên cứu của .NET Reverse Engineering là các ứng dụng được viết dựa trên .NET Framework và bản thân chính .NET Framework. Các thuật ngữ tôi viết dưới đây có thể là không được đầy đủ, và tôi viết theo ý hiểu và kinh nghiệm của tôi, cho nên sẽ không tránh khỏi những sai sót về mặt chuyên môn, vì vậy, tôi sẽ rất cảm kích nếu các bạn giúp tôi sửa những lỗi đó và góp phần giúp cho bài viết được tốt hơn. Thuật ngữ trong .NET Reversing tập trung chủ yếu ở các kiến thức và khái niệm nằm trong lập trình .NET, bởi vì khi thực hiện Reverse Engineering .NET thì chúng ta có thể tiếp xúc với các code gần code gốc của chương trình , vì vậy kiến thức về lập trình .NET rất hữu ích trong quá trình Reverse Engineering .NET để đọc và hiểu được hoạt động của code, biết càng nhiều thì càng khiến việc Reverse Engineering .NET trở nên dễ dàng hơn Bên cạnh các thuật ngữ thường thấy trong Reverse Engineering PE file cổ điển, Reverse Engineering .Net còn có thêm một vài thuật ngữ mới sau: Assembly: Hay có tên đầy đủ là .NET Assembly, đây không phải là tên ngôn ngữ bậc thấp (Assembly). Assembly trong .NET để chỉ một thực thể (1 file nào đó) được viết bằng .NET đã được biên dịch, và hoạt động dựa trên .NET Framework ‘Assembly” dịch nôm na là “lắp ghép, kết hợp”, thì 1 file trong .NET cũng là tập hợp của các method, class và các phần resource cũng như references + các thông tin kèm theo. Khi nhắc đến Assembly trong .NET thì có nghĩa là người viết đang muốn nói đến file .NET đó IL; viết tắt của Intermediate language, là 1 loại ngôn ngữ làm nhiệm vụ trung gian giao tiếp của code .NET và jit compiler (sẽ nói đến khái niệm này sau). Các chương trình .NET sau khi được biên dịch, sẽ không chứa mã máy giống như các chương trình viết bằng ngôn ngữ bậc cao khác mà sẽ chứa các bytecode của IL code. Dạng biểu diễn của IL code MSIL: Microsoft intermediate language, tên khác của IL CIL: Common Intermediate Language, cũng giống như MSIL và IL
  • 2. Trang 2 Native Application: Native có nghĩa là “tự nhiên, nguyên thủy”, Thuật ngữ này dùng để chỉ các chương trình không viết bằng .NET - không dựa trên .NET. Các chương trình được viết bằng C/C++, Delphi, vb, asm,… được gọi là những Native Application, để phân biệt với các .NET Application Bênh cạnh Native Application còn có thêm 2 thuật ngữ khác, đó là: - Managed: Các chương trình viết bằng .NET và khi chạy, được quản lý (managed) bởi .NET Framework và CLR (Sẽ nói đến sau). Vì vậy, khi nhìn thấy “managed application” cũng có nghĩa là chương trình .NET - Unmanaged: Tên gọi khác của native Application, bởi vì chúng không được quản lý bởi .NET framework và CLR. Vì vậy khi nhìn thấy “unmanaged application” cũng có nghĩa là đang nói đến các native Application. Các thuật ngữ “Managed” và “Unmanaged” được tạo nên chủ yếu dựa vào hoạt động quản lý và cấp phát bộ nhớ của chương trình (memory management). Trong khi các chương trình .NET được quản lý bộ nhớ bỏi 1 Garbage collector, thì các native application thường không sử dụng garbage collector của CLR đó. Mixed mode: Đây là thuật ngữ được sử dụng khi nói đến 1 chương trình có sử dụng các kĩ thuật code của .NET và cả code của các ngôn ngữ khác không dựa trên .NET Decompile/ Disassemble; Quá trình dịch ngược một chương trình .NET, lấy các bytecode có trong chương trình, chuyển chúng về IL code (dạng có thể đọc được) và các loại ngôn ngữ bậc cao khác. Sử dụng IDA để decompile một chương trình .NET về dạng IL code Obfuscate/obfuscator : là “làm rối”, thuật ngữ này dùng để chỉ phương pháp được sử dụng để làm rối toàn bộ mã nguồn của chương trình, khiến cho việc dịch ngược và hiểu được code trở nên khó khăn hơn. Obfuscator là thuật ngữ để chỉ chung các chương trình giúp người dùng làm rối code. Obfuscate giúp bảo vệ chương trình, che giấu code thật. Tên của một vài Obfuscator: SmartAssembly, ILProtector, .NET Reactor, Confuser, Dotfuscator, Rummage, Xenocode, CodeVeil,…
  • 3. Trang 3 Giao diện của Confuser – 1 Obfuscator phổ biến Code khi decompile của 1 chương trình bị obfuscate
  • 4. Trang 4 Deobfuscate/Deobfuscator: Thêm “De-“ ở đằng trước mang ý nghĩa ngược lại. Vậy nên debofuscate là thuật ngữ dùng để chỉ các phương pháp được sử dụng để loại bỏ quá trình obfuscate đã được sử dụng lên chương trình cần nghiên cứu, giúp chuyển code về code gốc, hoặc một kiểu code mà người ta có thể đọc hiểu dễ dàng hơn. Deobfuscator là thuật ngữ để chỉ chung các chương trình giúp người dùng làm việc đó. Pack/Packer/Unpack/Unpacker: “Pack” là phương pháp sử dụng các thuật toán để nén một chương trình (hay 1 thư viện, dữ liệu…) lại. Trong .NET thì pack được sử dụng như một phương pháp bảo vệ chương trình để tránh bị dịch ngược và xem mã nguồn. Chương trình gốc thường thường sẽ được nén lại (có thể kèm theo mã hóa) và được cất trong code của 1 chương trình do các packer (các chương trình thực viện việc pack) tạo ra gọi là 1 loader. Khi chạy, loader sẽ tiến hành load, giải nén (hoặc giải mã nếu bị mã hóa) chương trình gốc ra trên memory và thực thi chương trình gốc ngay trên đó. Unpack là quá trình sử dụng các phương pháp để loại bỏ việc pack và tìm lại chương trình gốc để có thể dịch ngược và xem code. Unpacker là các chương trình được viết ra để thực hiện việc unpack tự động. Một vài packer phổ biến trong .NET thường gặp là : .NETZ, BoxedApp (có thể pack cả native app), MPRESS (có thể pack cả native app), rpx, ExePack.NET,… Giao diện dòng lệnh của .NETZ Packer khi đang chạy CLR: Viết tắt của Common Language Runtime, là môi trường để quản lý việc vận hành các ứng dụng viết bằng .NET, bắt đầu từ việc khởi chạy chương trình, biên dịch tức thời (JIT) , quản lý bộ nhớ, kiểm soát exception và type safety. Các chương trình .NET khi hoạt động đều được đặt trong sự quản lý của CLR. JIT Compiler: JIT viết tắt của Just-in-time (vừa kịp lúc). Đây là chương trình có tính năng tiếp nhận các IL code có trong chương trình .NET và biên dịch chúng thành mã máy, sau đó giao cho CPU thực thi. Như đã nói ở trên, các chương trình viết bằng .NET không được biên dịch ngay ra mã máy mà sẽ được chuyển thành IL code, vậy nên JIT Compiler rất quan trọng vì nó đảm bảo các chương trình .NET được biên dịch thành mã máy, như thé mới có thể chạy được. Nếu không có jIT Compiler, các chương trình .NET không thể hoạt động. Có thể nhìn ảnh sau để hiểu cách 1 chương trình .NET hoạt động như thế nào: Sơ đồ cơ chế hoạt động của 1 chương trình .NET
  • 5. Trang 5 Scanner/Detector: Các chương trình làm nhiệm vụ phân tích tổng quan chương trình để cho biết được chương trình có được bảo vệ hay không, và bảo vệ bằng obfuscator nào. Các chương trình kiểu này rất quan trọng, cho biết những thông tin hữu ích khi phải phân tích các chương trình bị obfuscate. Biết được cơ chế bảo vệ rồi thì mới có phương pháp để vượt qua. Giao diện của 1 Scanner/Detector tên là ExeinfoPE đang scan 1 chương trình .NET Metadata: dịch theo nghĩa đen là “siêu dữ liệu”. Thuật ngữ này được dùng để chỉ về phần dữ liệu có tổ chức và cấu trúc cao nằm trong 1 chương trình .NET sau khi được biên dịch từ mã nguồn. Trong metadata lưu trữ rất nhiều thứ: Thông số, cấu hình của chương trình, cấu trúc và thuộc tính của các thành phần có trong chương trình, IL Code và các resource của chương trình cũng được lưu ở đây, và những thông tin khác nữa. Đọc thêm bài viết về cấu trúc của file .NET để hiểu về metadata và cách tổ chức, lưu trữ dữ liệu của nó. Metadata nhìn từ trong CFF Explorer
  • 6. Trang 6 Token: Tên đầy đủ là Metadata token, là một giá trị có kích thước 4byte, để chỉ đến phần dữ liệu tương ứng được lưu trữ trong metadata. Đọc thêm bài viết về cấu trúc file .NET. Metadata token hiển thị trong 1 decompiler .NET Reflector: Tên của một trình dịch ngược rất rổi tiếng dảnh riêng cho các chương trình .NET. Có thể đọc thêm về chương trình này tại loạt bài viết “Các công cụ cần thiết cho quá trình Reverse Engineering .NET” đăng trên blog cá nhân của tôi. Giao diện của .NET Reflector
  • 7. Trang 7 Reflexil: Một plugin quan trọng của .NET Reflector dùng để xem, chỉnh sửa IL code ngay bên trong .NET Reflector và có thể lưu lại những chỉnh sửa này. Đây là một plugin rất quan trọng và vô cùng cần thiết khi sử dụng .NET Reflector. Khung hiển thị của Reflexil bên trong .NET Reflector ILSpy: Một decompiler mã nguồn mở. Có thể đọc thêm thông tin từ loạt bài viết “Các công cụ cần thiết cho quá trình Reverse Engineering .NET” được đăng trên blog cá nhân của tôi. Giao diện của ILSpy
  • 8. Trang 8 De4dot: Tên của 1 chương trình deobfuscator rất nổi tiếng dảnh riêng cho .NET. Có thể đọc thêm về chương trình này tại loạt bài viêt “Các công cụ cần thiết cho quá trình Reverse Engineering .NET” đăng trên blog cá nhân của tôi. Giao diện dòng lệnh của de4dot Mono.Cecil: Mono.Cecil là một thư viện mã nguồn mở, cung cấp các phương pháp để thao tác với các chương trình viết bằng .NET. Với Mono.Cecil, chúng ta có thể thao tác, chỉnh sửa mọi thông tin lưu trữ trong 1 chương trình .NET (từ các thuộc tính, đến cấu trúc chương trình và cả IL code). Vì đây chỉ là một thư viện, cho nên cần phải có kiến thức lập trình để xây dựng chương trình mới có thể sử dụng các tính năng được cung cấp bởi thư viện này. Dnlib: Một bộ thư viên tương tự với Mono.Cecil, được 0xd4d, tác giả của de4dot phát triển độc lập với Mono.Cecil, nhằm khắc phục các yếu điểm của Mono.Cecil. Các obfuscator/protector trước đây thường nhằm vào các yếu điểm của Mono.Cecil để tạo ra các phương pháp chống lại các chương trình dịch ngược có sử dụng Mono.Cecil. dnlib ra đời nhằm mục đích để vượt qua các cơ chế bảo vệ đó, được sử dụng đầu tiên trong chính de4dot, và hiện tại thư viện này đang được sử dụng rộng rãi hơn trong giới Reverser. DnSpy – Một decompiler biến thể của ILSpy, sử dụng dnlib thay vì Mono.Cecil
  • 9. Trang 9 CFF Explorer: Một chương trình hex editor, nhưng có khả năng đọc và chỉnh sửa thông tin của các chương trình viết bằng .NET. Có thể đọc thêm về chương trình này tại loạt bài viết “Các công cụ cần thiết cho quá trình Reverse Engineering .NET” đăng trên blog cá nhân của tôi. SAE: Tên viết tắt của SmartAssemblyExplorer, một chương trình decompiler cho .NET. Có thể tìm thêm thông tin về chương trình này trong loạt bài viêt “Các công cụ cần thiết cho quá trình Reverse Engineering .NET” đăng trên blog cá nhân của tôi.
  • 10. Trang 10 Khung hiển thị code của SAE khi đang dịch ngược 1 chương trình .NET (Bài viết đang trong giai đoạn hoàn thiện, nếu bạn cần nhiều thêm định nghĩa, khái niệm về các thuật ngữ khác, háy liên lác với tôi : levintaeyeon@live.com để cùng đóng góp và xây dựng tài liệu này trở nên đầy đủ hơn)