SlideShare a Scribd company logo
Trang 1
Hacking de4dot for fun
Tác giả: kao
Người dịch Levis Nickaster (http://ltops9.wordpress.com)
Đây là tài liệu MIỄN PHÍ, nhằm phục vụ mục đích nghiên cứu và chia sẻ kiến thức. Khi copy và đăng tải ở bất kì đâu cần ghi rõ nguồn để tôn
trọng tác giả cũng như tôn trọng người dịch, cảm ơn. Đề xuất, đóng góp để bản dịch tốt hơn, hãy gửi email cho tôi:
levintaeyeon[at]live[dot]com.
Đây chỉ là một bài hướng dẫn nho nhỏ, nhưng đủ cho bạn kiếm được một chút kinh nghiệm để bắt đầu với việc tinh chỉnh/sửa
lỗi cho de4dot. Tôi sẽ không hướng dẫn cho các bạn cách phân tích cơ chế bảo vệ của các obfuscator/protector từ đầu đến cuối,
hay là cách để thêm một tính năng hoàn toàn mới vào trong de4dot – những việc này thuộc về một lĩnh vực khác nằm ngoài mục
đích của bài viết này.
Tôi sẽ không tự làm tốn thời gian của mình để giải thích về cách sử dụng Visual Studio cơ bản. Nếu bạn không biết sử dụng
Visual Studio hoặc không có bất cứ một kiến thức nào về C# cũng như lập trình, thì hãy dừng việc đọc tài liệu này và chỉ quay
trở lại đọc tiếp một khi bạn đã có đủ những kiến thức đó.
Yêu cầu cần có:
- Visual Studio 2010, bạn cần phải có bản đầy đủ, không phải bản Express
- Một số kiến thức về C#. Bạn biết càng nhiều, thì mọi chuyện đối với bạn càng trở nên dễ dàng hơn
- Một trình .NET Decompiler tốt. .NET Reflector cũng được, hoặc là ILSpy hay JustDecompile. Không có công cụ nào là
hoàn hảo, cho nên sử dụng bất cứ công cụ nào bạn thích
- 2 File được bảo về bởi CryptoObfuscator – một file de4dot có thể deobfuscate được, file còn lại thì không.
Để phục vụ bài viết này chúng ta sẽ sử dụng 2 phiên bản của CryptoObfuscator (viết tắt là CO):
- Phiên bản gần nhất mà de4dot 2.0.2 có thể deobfuscate được là “CryptoObfuscator v2012 R2 Build 130111”. Bạn có thể
tải về từ link này: http://www.multiupload.nl/WETXYQWH13 (hiện tại link đã die, bài viết này chỉ mang tính chất tham
khảo, cách thực hiện với các bản mới hơn cũng tương tự)
- Phiên bản mới nhất mà de4dot 2.0.2 không thể deobfuscate được là “CryptoObfuscator V2012 R2 build 130114”. Bạn có
thể tải về tại đây: http://www.multiupload.nl/GZD8NY91XB (hiện tại link đã die, bài viết này chỉ mang tính chất tham
khảo, cách thực hiện với các bản mới hơn cũng tương tự)
Bạn cũng có thể sử dụng 2 file bất kì được bảo về bởi 2 phiên bản khác nhau của CryptoObfuscator – nhưng bạn sẽ thấy rằng sẽ
dễ hơn rất nhiều khi bạn có cùng 1 file nhưng được bảo vệ bởi 2 phiên bản khác nhau của trình protector
Let’s Start Hacking
1. Tải mã nguồn của de4dot về và hãy đảm bảo rằng bạn có thể biên dịch và chạy chương trình trong debugger của Visual Studio.
Đọc hướng dẫn của 0xd4d tại: https://github.com/0xd4d/de4dot/wiki/Compiling-de4dot (link đã được chỉnh sửa theo phiên
bản de4dot mới nhất)
Nếu bạn không làm được bước này, thì bài viết này không dành cho bạn. Quay trở lại đọc tiếp khi bạn đã có kiến thức cơ bản
về lập trình
Trang 2
2. Cài đặt cả 2 phiên bản của CryptoObfuscator và copy cả 2 file cryptoobfuscator.exe vào cùng 1 thư mục nào đó. Đổi tên chúng
thành CO-good.exe và CO-bad.exe (CO-good.exe là file mà de4dot có thể deobfuscate, còn CO-bad.exe là file mà de4dot không
deobfuscate được)
3. Thử unpack CO-good.exe – de4dot hoạt động ổn định
Thử unpack CO-bad.exe – de4dot sẽ không hoạt động được, kèm theo một thông báo lỗi: “WARNING: Found Unknown
Resource Encryption Flags: 0xF5”
4. Tìm thông báo lỗi của de4dot “Found unknown resource Encryption flags”. Thông báo này nằm trong file
de4dot.codedeobfuscatorsCryptoObfuscatorResourceDecrypter.cs, dòng 333. Mở file ResourceDecrypter.cs và tìm hiểu về
cấu tạo của phần Resource Decrypter này. Ở đây có một số khai báo đáng chú ý:
TypeDef resourceDecrypterType;
byte[] buffer1 = new byte[BUFLEN];
byte[] buffer2 = new byte[BUFLEN];
byte desEncryptedFlag;
byte deflatedFlag;
byte bitwiseNotEncryptedFlag;
FrameworkType frameworkType;
bool flipFlagsBits;
int skipBytes;
5. Bây giờ thử chạy de4dot lần lượt với 2 file CO-good.exe và CO-bad.exe và tìm ra sự khác biệt. Thiết lập cho “command line
arguments” trong Visual Studio:
6. Đặt breakpoint ở dòng code phía trên thông báo lỗi:
byte allFlags = (byte)(desEncryptedFlag | deflatedFlag | bitwiseNotEncryptedFlag);
if ((flags & ~allFlags) != 0)
Logger.w("Found unknown resource encryption flags: 0x{0:X2}", flags);
Trang 3
7. Chạy de4dot trong debug mode. Visual Studio sẽ dừng lại ở breakpoint mà ta đã đặt. Nếu không dừng, có thể do thiết lập
Visual Studio hoặc project của de4dot không đúng – Tra google để tìm nguyên nhân và khắc phục.
Nếu bạn không làm được bước này, thì tài liệu này không dành cho bạn. Quay lại đọc tiếp khi đã biết cách sử dụng Visual
Sudio và lập trình C# cơ bản.
8. Theo dõi giá trị của các biến toàn cục. Với file CO-good.exe, chúng ta có:
9. Lặp lại các bước từ 7-10 đối với file CO-bad.exe và kiểm tra các biến toàn cục:
Ok, chúng ta đã xác định được vấn đề - resourceDecrypterType mang giá trị null khi chạy với file CO-đa.exe. Bên cạnh đó thì
skipBytes, flipFlagBits và giá trị của các flag đều không chính xác
10. Tìm kiếm phần code đặt giá trị cho resourceDecrypterType trong CO-good.exe:
Có ba nơi thực hiện việc đặt giá trị này: dòng 144, dòng 169, dòng 94, về lý thuyết thì bạn cần phải sửa lại cả 3 phần (dành cho
.NET 1.0, .NET 2.0+ và Sliverlight). Tuy nhiên trong ví dụ này, chúng ta chỉ tập trung vào file cần unpack của chúng ta.
Trang 4
Nhìn code ta thấy chương trình đang cố kiếm 1 class gồm có 5 trường (field) và những trường này phải có kiểu đặc biệt
(requiredTypes). Chúng ta cân tìm đúng tên và token của class đó, trong giao diện của Visual Studio. Ở đây classname là
cff37ae02e27a0ea65f54ffc586d28228 và token là 0x0200001B.
Với một vài kiểu bảo vệ, classname có thể bị thay đổi khiến cho ta không thể đọc được, nhưng token thì luôn luôn chính xác.
Vì vậy, tốt hơn hết là hãy học cách sử dụng token.
11. Tìm class có tên cff37ae02e27a0ea65f54ffc586d28228 trong chương trình decompiler:
Bây giờ tìm class tương tự trong CO-bad.exe. Trong trường hợp này chúng ta có thể sử dụng classname, vậy nên sẽ rất dễ dàng.
Đối với những cơ chế bảo vệ khác, bạn không thể sử dụng classname, cho nên sẽ tốn nhiều thời gian và công sức để tìm được
class chính xác. Sẽ không có một cách nào dễ dàng và đơn giản cả, chỉ có thử nghiệm và sửa lỗi. Nếu bạn sử dụng 2 file khác
nhau, thì phần này sẽ là khó khăn nhất, vì vậy tôi vô cùng khuyến khích các bạn sử dụng các unpackmes đơn giản (hoặc chính
bản thân các chương trình protector) để nghiên cứu.
Như bạn có thể thấy, trong class tương tự của CO-bad.exe có 6 trường (field) thay vì 5 như ở trong CO-good.exe. Nhà phát triển
đã thêm vào 1 trường vô tác dụng với kiểu “byte”, và thế là cũng đủ khiến cho de4dot không hoạt động được.
12. Bây giờ sẽ tiến hành sửa code của de4dot, nếu bạn không quá quan tâm về tính tương thích với các phiên bản protector cũ,
thì hãy viết lại code đại loại như sau:
static string[] requiredTypes = new string[] { "System.IO.MemoryStream", "System.Object", "System.Int32",
"System.Byte", };
bool findDesktopOrCompactFramework() {
resourceDecrypterType = null;
foreach (var type in module.Types) {
if (type.Fields.Count != 6)
continue;
if (!new FieldTypes(type).exactly(requiredTypes))
continue;
var cctor = type.FindStaticConstructor();
if (cctor == null)
continue;
Trang 5
Đây là phương pháp sửa nhanh nhưng sẽ khiến cho de4dot không thể deobfuscate các phiên bản cũ hơn của CO. Tôi khuyến
khích các bạn không nên dùng!
Cách chỉnh code hiệu quả hơn, sẽ chỉ phải thêm vào một vài dòng code mới:
static string[] requiredTypes = new string[] { "System.IO.MemoryStream",
"System.Object","System.Int32", };
static string[] requiredTypes2 = new string[] { "System.IO.MemoryStream", "System.Object",
"System.Int32", "System.Byte", };
bool findDesktopOrCompactFramework() {
resourceDecrypterType = null;
foreach (var type in module.Types) {
bool found = false;
if ((type.Fields.Count == 5) && (new FieldTypes(type).exactly(requiredTypes)))
found = true;
if ((type.Fields.Count == 6) && (new FieldTypes(type).exactly(requiredTypes2)))
found = true;
if (!found)
continue;
var cctor = type.FindStaticConstructor();
if (cctor == null)
continue;
Sau khi đã sửa xong code, tiến hành thử unpack CO-bad.exe một lần nữa. Nhưng nếu bạn tiếp tục gặp lỗi, bạn sẽ nhìn thấy có
một vài tiến triển nhỏ:
resourceDecryptType đã chính xác, tuy nhiên skipBytes và các flags thì vẫn chưa chính xác
Trang 6
14. Sử dụng phương pháp tương tự như trên. Tìm các phần code gán giá trị cho desEncryptFlag. Có 4 phần tất cả, đặt breakpoint
ở những nơi đó rồi tiến hành debug lại 2 file CO-good.exe và CO-bad.exe
Bạn sẽ nhận thấy rằng, với CO-good.exe thì chúng ta dừng lại ở đây:
if (constants.Count == 2) {
desEncryptedFlag = (byte)constants[0];
deflatedFlag = (byte)constants[1];
return true;
}
Và call stack sẽ như thế này:
Còn trong CO-bad.exe bạn sẽ dừng ở đây:
void initializeHeaderInfo(ISimpleDeobfuscator simpleDeobfuscator) {
skipBytes = 0;
foreach (var method in getDecrypterMethods(resourceDecrypterType)) {
if (updateFlags(method, simpleDeobfuscator))
return;
}
desEncryptedFlag = 1;
deflatedFlag = 2;
bitwiseNotEncryptedFlag = 4;
}
Và call stack cũng sẽ khác:
Tiến hành debug function initalizeHeaderInfo() và bạn sẽ nhìn thấy lỗi xảy ra ở getDecrypterMethods(), method này sẽ không trả
về dữ liệu khi chạy với file CO-bad.exe
15. Tìm hiểu cách hoạt động của getDecrypterMethods(). Nó sẽ tìm kiếm một method xác định trong class
resourceDecrypterType. Quay trở lại trong decompiler và so sánh các method của class này:
Trang 7
Trong CO-good.exe:
Trong CO-bad.exe:
Thì ra nhà phát triển đã sử dụng “long”(int64), thay vì “sbyte”. Ta sẽ tiến hành thay đổi lại code trong getDecrypterMethods():
16. Biên dịch, chạy chương trình và kiểm tra lại các biến toàn cục:
Mọi thứ đều đã chính xác, và bạn sẽ thấy rằng file CO-bad.exe sẽ được unpack bình thường.
Thế là chúng ta đã thành công
Tôi đã hướng dẫn các bạn cách để debug và chỉnh sửa de4dot để khắc phục lỗi xảy ra khi unpack/deobfuscate các phiên bản mới
chưa được hỗ trợ, về những gì cần xem xét và so sánh trong decompiler. Hi vọng sẽ giúp ích cho các bạn để bắt đầu việc “hack”
de4dot và giải quyết các lỗi xảy ra với các phiên bản của các protector mới hơn.
Chúc vui vẻ
Kao
This article is originally created by kao, and has been translated into Vietnamese by me (Levis), so I’m not the author of it. All
credits go to him. Any suggests for better translation in future, feel free to contact me: levintaeyeon[at]live[dot]com or my
personal blog: http://ltops9.wordpress.com
Enjoy and best Regards,
Levis
Created Aug 3 2014

More Related Content

What's hot

Giới thiệu Git và một số tính năng cơ bản
Giới thiệu Git và một số tính năng cơ bảnGiới thiệu Git và một số tính năng cơ bản
Giới thiệu Git và một số tính năng cơ bản
Huy Nguyen Quang
 
Quy tắc thiết kế giao diện và viết code C#
Quy tắc thiết kế giao diện và viết code C#Quy tắc thiết kế giao diện và viết code C#
Quy tắc thiết kế giao diện và viết code C#
An Nguyen
 
FSOFT - Test Java Exam
FSOFT - Test Java ExamFSOFT - Test Java Exam
FSOFT - Test Java Exam
Nguyễn Đăng Đức
 
BÀI 2: Thiết kế FORM và xử lý sự kiện - Giáo trình FPT
BÀI 2: Thiết kế FORM và xử lý sự kiện - Giáo trình FPTBÀI 2: Thiết kế FORM và xử lý sự kiện - Giáo trình FPT
BÀI 2: Thiết kế FORM và xử lý sự kiện - Giáo trình FPT
MasterCode.vn
 
File inclusion attack(nop thay)
File inclusion attack(nop thay)File inclusion attack(nop thay)
File inclusion attack(nop thay)
phanleson
 
Luận văn: Kỹ thuật giấu ảnh màu trong ảnh màu, HOT
Luận văn: Kỹ thuật giấu ảnh màu trong ảnh màu, HOTLuận văn: Kỹ thuật giấu ảnh màu trong ảnh màu, HOT
Luận văn: Kỹ thuật giấu ảnh màu trong ảnh màu, HOT
Dịch vụ viết bài trọn gói ZALO: 0909232620
 
[Đồ án môn học] - Đề tài: Tìm hiểu Git và Github
[Đồ án môn học] - Đề tài: Tìm hiểu Git và Github[Đồ án môn học] - Đề tài: Tìm hiểu Git và Github
[Đồ án môn học] - Đề tài: Tìm hiểu Git và Github
Matt Colonel
 
Lap trinh huong doi tuong
Lap trinh huong doi tuongLap trinh huong doi tuong
Lap trinh huong doi tuong
Duc Nguyen
 
Hệ điều hành (chương 3)
Hệ điều hành (chương 3)Hệ điều hành (chương 3)
Hệ điều hành (chương 3)realpotter
 
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT.pptx
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT.pptxCẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT.pptx
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT.pptx
VuDuong69
 
Les principes de base de PHP
 Les principes de base de PHP  Les principes de base de PHP
Les principes de base de PHP
EL JAOUARI Ahmed
 
Cấu trúc hệ điều hành
Cấu trúc hệ điều hànhCấu trúc hệ điều hành
Cấu trúc hệ điều hành
PhamTuanKhiem
 
91684060 356-cau-trắc-nghiệm-csdl-2
91684060 356-cau-trắc-nghiệm-csdl-291684060 356-cau-trắc-nghiệm-csdl-2
91684060 356-cau-trắc-nghiệm-csdl-2tranquanthien
 
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thôngBáo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Huyen Pham
 
Monitor và tối ưu sql server
Monitor và tối ưu sql serverMonitor và tối ưu sql server
Monitor và tối ưu sql server
Huân Bùi Đình
 
Thuc hanh 13
Thuc hanh  13Thuc hanh  13
Thuc hanh 13
Thuyet Nguyen
 
Bai giang atbmtt
Bai giang atbmtt Bai giang atbmtt
Bai giang atbmtt Hà Vũ
 
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...
MasterCode.vn
 
tìm hiểu các lỗ hổng bảo mật
tìm hiểu các lỗ hổng bảo mậttìm hiểu các lỗ hổng bảo mật
tìm hiểu các lỗ hổng bảo mật
anhkhoa2222
 

What's hot (20)

Giới thiệu Git và một số tính năng cơ bản
Giới thiệu Git và một số tính năng cơ bảnGiới thiệu Git và một số tính năng cơ bản
Giới thiệu Git và một số tính năng cơ bản
 
Quy tắc thiết kế giao diện và viết code C#
Quy tắc thiết kế giao diện và viết code C#Quy tắc thiết kế giao diện và viết code C#
Quy tắc thiết kế giao diện và viết code C#
 
FSOFT - Test Java Exam
FSOFT - Test Java ExamFSOFT - Test Java Exam
FSOFT - Test Java Exam
 
BÀI 2: Thiết kế FORM và xử lý sự kiện - Giáo trình FPT
BÀI 2: Thiết kế FORM và xử lý sự kiện - Giáo trình FPTBÀI 2: Thiết kế FORM và xử lý sự kiện - Giáo trình FPT
BÀI 2: Thiết kế FORM và xử lý sự kiện - Giáo trình FPT
 
File inclusion attack(nop thay)
File inclusion attack(nop thay)File inclusion attack(nop thay)
File inclusion attack(nop thay)
 
Luận văn: Kỹ thuật giấu ảnh màu trong ảnh màu, HOT
Luận văn: Kỹ thuật giấu ảnh màu trong ảnh màu, HOTLuận văn: Kỹ thuật giấu ảnh màu trong ảnh màu, HOT
Luận văn: Kỹ thuật giấu ảnh màu trong ảnh màu, HOT
 
[Đồ án môn học] - Đề tài: Tìm hiểu Git và Github
[Đồ án môn học] - Đề tài: Tìm hiểu Git và Github[Đồ án môn học] - Đề tài: Tìm hiểu Git và Github
[Đồ án môn học] - Đề tài: Tìm hiểu Git và Github
 
Lap trinh huong doi tuong
Lap trinh huong doi tuongLap trinh huong doi tuong
Lap trinh huong doi tuong
 
Hệ điều hành (chương 3)
Hệ điều hành (chương 3)Hệ điều hành (chương 3)
Hệ điều hành (chương 3)
 
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT.pptx
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT.pptxCẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT.pptx
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT.pptx
 
Bai tap quan_ly_chuyen_bay
Bai tap quan_ly_chuyen_bayBai tap quan_ly_chuyen_bay
Bai tap quan_ly_chuyen_bay
 
Les principes de base de PHP
 Les principes de base de PHP  Les principes de base de PHP
Les principes de base de PHP
 
Cấu trúc hệ điều hành
Cấu trúc hệ điều hànhCấu trúc hệ điều hành
Cấu trúc hệ điều hành
 
91684060 356-cau-trắc-nghiệm-csdl-2
91684060 356-cau-trắc-nghiệm-csdl-291684060 356-cau-trắc-nghiệm-csdl-2
91684060 356-cau-trắc-nghiệm-csdl-2
 
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thôngBáo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
 
Monitor và tối ưu sql server
Monitor và tối ưu sql serverMonitor và tối ưu sql server
Monitor và tối ưu sql server
 
Thuc hanh 13
Thuc hanh  13Thuc hanh  13
Thuc hanh 13
 
Bai giang atbmtt
Bai giang atbmtt Bai giang atbmtt
Bai giang atbmtt
 
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...
 
tìm hiểu các lỗ hổng bảo mật
tìm hiểu các lỗ hổng bảo mậttìm hiểu các lỗ hổng bảo mật
tìm hiểu các lỗ hổng bảo mật
 

Viewers also liked

Tùy biến Confuser
Tùy biến ConfuserTùy biến Confuser
Tùy biến Confuser
Levis Nickaster
 
Hướng dẫn tạo Loader trong .NET - bản dịch
Hướng dẫn tạo Loader trong .NET - bản dịchHướng dẫn tạo Loader trong .NET - bản dịch
Hướng dẫn tạo Loader trong .NET - bản dịch
Levis Nickaster
 
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịchPhân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
Levis Nickaster
 
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịchPhân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Levis Nickaster
 
Decrypt các MSIL methods một cách thử công - Bài dịch
Decrypt các MSIL methods một cách thử công - Bài dịchDecrypt các MSIL methods một cách thử công - Bài dịch
Decrypt các MSIL methods một cách thử công - Bài dịch
Levis Nickaster
 
Reverse Engineering in Linux - The tools showcase
Reverse Engineering in Linux - The tools showcaseReverse Engineering in Linux - The tools showcase
Reverse Engineering in Linux - The tools showcase
Levis Nickaster
 
Xây dựng nhóm phân tích mã độc
Xây dựng nhóm phân tích mã độcXây dựng nhóm phân tích mã độc
Xây dựng nhóm phân tích mã độc
Levis Nickaster
 
Introduction to Malware Detection and Reverse Engineering
Introduction to Malware Detection and Reverse EngineeringIntroduction to Malware Detection and Reverse Engineering
Introduction to Malware Detection and Reverse Engineering
intertelinvestigations
 
Evading & Bypassing Anti-Malware applications using metasploit
Evading & Bypassing Anti-Malware applications using metasploitEvading & Bypassing Anti-Malware applications using metasploit
Evading & Bypassing Anti-Malware applications using metasploit
n|u - The Open Security Community
 
Reverse Engineering Malware Workshop
Reverse Engineering Malware WorkshopReverse Engineering Malware Workshop
Reverse Engineering Malware Workshop
Mustafa Qasim
 
Tong Quan Ve Malware
Tong Quan Ve MalwareTong Quan Ve Malware
Tong Quan Ve Malwareguest4a3ff91
 
Understanding APT1 malware techniques using malware analysis and reverse engi...
Understanding APT1 malware techniques using malware analysis and reverse engi...Understanding APT1 malware techniques using malware analysis and reverse engi...
Understanding APT1 malware techniques using malware analysis and reverse engi...
Cysinfo Cyber Security Community
 
Các cấu trúc lệnh trong C
Các cấu trúc lệnh trong CCác cấu trúc lệnh trong C
Các cấu trúc lệnh trong C
pnanhvn
 

Viewers also liked (13)

Tùy biến Confuser
Tùy biến ConfuserTùy biến Confuser
Tùy biến Confuser
 
Hướng dẫn tạo Loader trong .NET - bản dịch
Hướng dẫn tạo Loader trong .NET - bản dịchHướng dẫn tạo Loader trong .NET - bản dịch
Hướng dẫn tạo Loader trong .NET - bản dịch
 
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịchPhân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
Phân tích Confuser 1.9.0.0 - method proxy confusion - Bản dịch
 
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịchPhân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
 
Decrypt các MSIL methods một cách thử công - Bài dịch
Decrypt các MSIL methods một cách thử công - Bài dịchDecrypt các MSIL methods một cách thử công - Bài 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
Reverse Engineering in Linux - The tools showcaseReverse Engineering in Linux - The tools showcase
Reverse Engineering in Linux - The tools showcase
 
Xây dựng nhóm phân tích mã độc
Xây dựng nhóm phân tích mã độcXây dựng nhóm phân tích mã độc
Xây dựng nhóm phân tích mã độc
 
Introduction to Malware Detection and Reverse Engineering
Introduction to Malware Detection and Reverse EngineeringIntroduction to Malware Detection and Reverse Engineering
Introduction to Malware Detection and Reverse Engineering
 
Evading & Bypassing Anti-Malware applications using metasploit
Evading & Bypassing Anti-Malware applications using metasploitEvading & Bypassing Anti-Malware applications using metasploit
Evading & Bypassing Anti-Malware applications using metasploit
 
Reverse Engineering Malware Workshop
Reverse Engineering Malware WorkshopReverse Engineering Malware Workshop
Reverse Engineering Malware Workshop
 
Tong Quan Ve Malware
Tong Quan Ve MalwareTong Quan Ve Malware
Tong Quan Ve Malware
 
Understanding APT1 malware techniques using malware analysis and reverse engi...
Understanding APT1 malware techniques using malware analysis and reverse engi...Understanding APT1 malware techniques using malware analysis and reverse engi...
Understanding APT1 malware techniques using malware analysis and reverse engi...
 
Các cấu trúc lệnh trong C
Các cấu trúc lệnh trong CCác cấu trúc lệnh trong C
Các cấu trúc lệnh trong C
 

Similar to Hacking de4dot for fun - Bài dịch

Haiphongit.com.tai lieu-learning-php-my sql
Haiphongit.com.tai lieu-learning-php-my sqlHaiphongit.com.tai lieu-learning-php-my sql
Haiphongit.com.tai lieu-learning-php-my sqlGiang Nguyễn
 
Chap 5 6 - The Art of Readable Code
Chap 5 6 - The Art of Readable CodeChap 5 6 - The Art of Readable Code
Chap 5 6 - The Art of Readable Code
minhnc91
 
Seminar clean code
Seminar clean codeSeminar clean code
Seminar clean code
Nguyen Thieu
 
PMMNM.docx
PMMNM.docxPMMNM.docx
PMMNM.docx
NgnHng26
 
Lập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệLập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệTrần Thiên Đại
 
Hdsd eclipse
Hdsd eclipseHdsd eclipse
Hdsd eclipse
Phuong Nguyen
 
005. LAP TRINH C#.pdf
005. LAP TRINH C#.pdf005. LAP TRINH C#.pdf
005. LAP TRINH C#.pdf
VietNguyen622816
 
005. LAP TRINH C#.pdf
005. LAP TRINH C#.pdf005. LAP TRINH C#.pdf
005. LAP TRINH C#.pdf
VietNguyen622816
 
Nhat nghe c#
Nhat nghe   c#Nhat nghe   c#
Nhat nghe c#Hihi Hung
 
Nhat nghe c#
Nhat nghe   c#Nhat nghe   c#
Nhat nghe c#
LanLT2011
 
Nhat nghe c#
Nhat nghe   c#Nhat nghe   c#
Nhat nghe c#
LanLT2011
 
Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]
Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]
Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]leduyk11
 
C# cơ bản hay
C# cơ bản hayC# cơ bản hay
C# cơ bản hay
Phi Tường
 
Slide ESLint.pptx
Slide ESLint.pptxSlide ESLint.pptx
Slide ESLint.pptx
DoanhNguyn31
 
Bai giangvb.net
Bai giangvb.netBai giangvb.net
Bai giangvb.net
vvpcdsptin
 
Cac bai tap .net
Cac bai tap .netCac bai tap .net
Cac bai tap .net
kevinpham123
 
Meo lap trinh_tech24.vn
Meo lap trinh_tech24.vnMeo lap trinh_tech24.vn
Meo lap trinh_tech24.vnphiagame
 
Huong dan su dung packet tracer
Huong dan su dung packet tracerHuong dan su dung packet tracer
Huong dan su dung packet tracer
Duc Nguyen
 

Similar to Hacking de4dot for fun - Bài dịch (20)

Haiphongit.com.tai lieu-learning-php-my sql
Haiphongit.com.tai lieu-learning-php-my sqlHaiphongit.com.tai lieu-learning-php-my sql
Haiphongit.com.tai lieu-learning-php-my sql
 
Chap 5 6 - The Art of Readable Code
Chap 5 6 - The Art of Readable CodeChap 5 6 - The Art of Readable Code
Chap 5 6 - The Art of Readable Code
 
Seminar clean code
Seminar clean codeSeminar clean code
Seminar clean code
 
PMMNM.docx
PMMNM.docxPMMNM.docx
PMMNM.docx
 
Lập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệLập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất Nghệ
 
Bai giangvb.net
Bai giangvb.netBai giangvb.net
Bai giangvb.net
 
Hdsd eclipse
Hdsd eclipseHdsd eclipse
Hdsd eclipse
 
005. LAP TRINH C#.pdf
005. LAP TRINH C#.pdf005. LAP TRINH C#.pdf
005. LAP TRINH C#.pdf
 
005. LAP TRINH C#.pdf
005. LAP TRINH C#.pdf005. LAP TRINH C#.pdf
005. LAP TRINH C#.pdf
 
Nhat nghe c#
Nhat nghe   c#Nhat nghe   c#
Nhat nghe c#
 
Nhat nghe c#
Nhat nghe   c#Nhat nghe   c#
Nhat nghe c#
 
Nhat nghe c#
Nhat nghe   c#Nhat nghe   c#
Nhat nghe c#
 
Nhat nghe c#
Nhat nghe   c#Nhat nghe   c#
Nhat nghe c#
 
Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]
Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]
Lập trình c# 2008 cơ bản (nhất nghệ) [thủ thuật it 360]
 
C# cơ bản hay
C# cơ bản hayC# cơ bản hay
C# cơ bản hay
 
Slide ESLint.pptx
Slide ESLint.pptxSlide ESLint.pptx
Slide ESLint.pptx
 
Bai giangvb.net
Bai giangvb.netBai giangvb.net
Bai giangvb.net
 
Cac bai tap .net
Cac bai tap .netCac bai tap .net
Cac bai tap .net
 
Meo lap trinh_tech24.vn
Meo lap trinh_tech24.vnMeo lap trinh_tech24.vn
Meo lap trinh_tech24.vn
 
Huong dan su dung packet tracer
Huong dan su dung packet tracerHuong dan su dung packet tracer
Huong dan su dung packet tracer
 

Hacking de4dot for fun - Bài dịch

  • 1. Trang 1 Hacking de4dot for fun Tác giả: kao Người dịch Levis Nickaster (http://ltops9.wordpress.com) Đây là tài liệu MIỄN PHÍ, nhằm phục vụ mục đích nghiên cứu và chia sẻ kiến thức. Khi copy và đăng tải ở bất kì đâu cần ghi rõ nguồn để tôn trọng tác giả cũng như tôn trọng người dịch, cảm ơn. Đề xuất, đóng góp để bản dịch tốt hơn, hãy gửi email cho tôi: levintaeyeon[at]live[dot]com. Đây chỉ là một bài hướng dẫn nho nhỏ, nhưng đủ cho bạn kiếm được một chút kinh nghiệm để bắt đầu với việc tinh chỉnh/sửa lỗi cho de4dot. Tôi sẽ không hướng dẫn cho các bạn cách phân tích cơ chế bảo vệ của các obfuscator/protector từ đầu đến cuối, hay là cách để thêm một tính năng hoàn toàn mới vào trong de4dot – những việc này thuộc về một lĩnh vực khác nằm ngoài mục đích của bài viết này. Tôi sẽ không tự làm tốn thời gian của mình để giải thích về cách sử dụng Visual Studio cơ bản. Nếu bạn không biết sử dụng Visual Studio hoặc không có bất cứ một kiến thức nào về C# cũng như lập trình, thì hãy dừng việc đọc tài liệu này và chỉ quay trở lại đọc tiếp một khi bạn đã có đủ những kiến thức đó. Yêu cầu cần có: - Visual Studio 2010, bạn cần phải có bản đầy đủ, không phải bản Express - Một số kiến thức về C#. Bạn biết càng nhiều, thì mọi chuyện đối với bạn càng trở nên dễ dàng hơn - Một trình .NET Decompiler tốt. .NET Reflector cũng được, hoặc là ILSpy hay JustDecompile. Không có công cụ nào là hoàn hảo, cho nên sử dụng bất cứ công cụ nào bạn thích - 2 File được bảo về bởi CryptoObfuscator – một file de4dot có thể deobfuscate được, file còn lại thì không. Để phục vụ bài viết này chúng ta sẽ sử dụng 2 phiên bản của CryptoObfuscator (viết tắt là CO): - Phiên bản gần nhất mà de4dot 2.0.2 có thể deobfuscate được là “CryptoObfuscator v2012 R2 Build 130111”. Bạn có thể tải về từ link này: http://www.multiupload.nl/WETXYQWH13 (hiện tại link đã die, bài viết này chỉ mang tính chất tham khảo, cách thực hiện với các bản mới hơn cũng tương tự) - Phiên bản mới nhất mà de4dot 2.0.2 không thể deobfuscate được là “CryptoObfuscator V2012 R2 build 130114”. Bạn có thể tải về tại đây: http://www.multiupload.nl/GZD8NY91XB (hiện tại link đã die, bài viết này chỉ mang tính chất tham khảo, cách thực hiện với các bản mới hơn cũng tương tự) Bạn cũng có thể sử dụng 2 file bất kì được bảo về bởi 2 phiên bản khác nhau của CryptoObfuscator – nhưng bạn sẽ thấy rằng sẽ dễ hơn rất nhiều khi bạn có cùng 1 file nhưng được bảo vệ bởi 2 phiên bản khác nhau của trình protector Let’s Start Hacking 1. Tải mã nguồn của de4dot về và hãy đảm bảo rằng bạn có thể biên dịch và chạy chương trình trong debugger của Visual Studio. Đọc hướng dẫn của 0xd4d tại: https://github.com/0xd4d/de4dot/wiki/Compiling-de4dot (link đã được chỉnh sửa theo phiên bản de4dot mới nhất) Nếu bạn không làm được bước này, thì bài viết này không dành cho bạn. Quay trở lại đọc tiếp khi bạn đã có kiến thức cơ bản về lập trình
  • 2. Trang 2 2. Cài đặt cả 2 phiên bản của CryptoObfuscator và copy cả 2 file cryptoobfuscator.exe vào cùng 1 thư mục nào đó. Đổi tên chúng thành CO-good.exe và CO-bad.exe (CO-good.exe là file mà de4dot có thể deobfuscate, còn CO-bad.exe là file mà de4dot không deobfuscate được) 3. Thử unpack CO-good.exe – de4dot hoạt động ổn định Thử unpack CO-bad.exe – de4dot sẽ không hoạt động được, kèm theo một thông báo lỗi: “WARNING: Found Unknown Resource Encryption Flags: 0xF5” 4. Tìm thông báo lỗi của de4dot “Found unknown resource Encryption flags”. Thông báo này nằm trong file de4dot.codedeobfuscatorsCryptoObfuscatorResourceDecrypter.cs, dòng 333. Mở file ResourceDecrypter.cs và tìm hiểu về cấu tạo của phần Resource Decrypter này. Ở đây có một số khai báo đáng chú ý: TypeDef resourceDecrypterType; byte[] buffer1 = new byte[BUFLEN]; byte[] buffer2 = new byte[BUFLEN]; byte desEncryptedFlag; byte deflatedFlag; byte bitwiseNotEncryptedFlag; FrameworkType frameworkType; bool flipFlagsBits; int skipBytes; 5. Bây giờ thử chạy de4dot lần lượt với 2 file CO-good.exe và CO-bad.exe và tìm ra sự khác biệt. Thiết lập cho “command line arguments” trong Visual Studio: 6. Đặt breakpoint ở dòng code phía trên thông báo lỗi: byte allFlags = (byte)(desEncryptedFlag | deflatedFlag | bitwiseNotEncryptedFlag); if ((flags & ~allFlags) != 0) Logger.w("Found unknown resource encryption flags: 0x{0:X2}", flags);
  • 3. Trang 3 7. Chạy de4dot trong debug mode. Visual Studio sẽ dừng lại ở breakpoint mà ta đã đặt. Nếu không dừng, có thể do thiết lập Visual Studio hoặc project của de4dot không đúng – Tra google để tìm nguyên nhân và khắc phục. Nếu bạn không làm được bước này, thì tài liệu này không dành cho bạn. Quay lại đọc tiếp khi đã biết cách sử dụng Visual Sudio và lập trình C# cơ bản. 8. Theo dõi giá trị của các biến toàn cục. Với file CO-good.exe, chúng ta có: 9. Lặp lại các bước từ 7-10 đối với file CO-bad.exe và kiểm tra các biến toàn cục: Ok, chúng ta đã xác định được vấn đề - resourceDecrypterType mang giá trị null khi chạy với file CO-đa.exe. Bên cạnh đó thì skipBytes, flipFlagBits và giá trị của các flag đều không chính xác 10. Tìm kiếm phần code đặt giá trị cho resourceDecrypterType trong CO-good.exe: Có ba nơi thực hiện việc đặt giá trị này: dòng 144, dòng 169, dòng 94, về lý thuyết thì bạn cần phải sửa lại cả 3 phần (dành cho .NET 1.0, .NET 2.0+ và Sliverlight). Tuy nhiên trong ví dụ này, chúng ta chỉ tập trung vào file cần unpack của chúng ta.
  • 4. Trang 4 Nhìn code ta thấy chương trình đang cố kiếm 1 class gồm có 5 trường (field) và những trường này phải có kiểu đặc biệt (requiredTypes). Chúng ta cân tìm đúng tên và token của class đó, trong giao diện của Visual Studio. Ở đây classname là cff37ae02e27a0ea65f54ffc586d28228 và token là 0x0200001B. Với một vài kiểu bảo vệ, classname có thể bị thay đổi khiến cho ta không thể đọc được, nhưng token thì luôn luôn chính xác. Vì vậy, tốt hơn hết là hãy học cách sử dụng token. 11. Tìm class có tên cff37ae02e27a0ea65f54ffc586d28228 trong chương trình decompiler: Bây giờ tìm class tương tự trong CO-bad.exe. Trong trường hợp này chúng ta có thể sử dụng classname, vậy nên sẽ rất dễ dàng. Đối với những cơ chế bảo vệ khác, bạn không thể sử dụng classname, cho nên sẽ tốn nhiều thời gian và công sức để tìm được class chính xác. Sẽ không có một cách nào dễ dàng và đơn giản cả, chỉ có thử nghiệm và sửa lỗi. Nếu bạn sử dụng 2 file khác nhau, thì phần này sẽ là khó khăn nhất, vì vậy tôi vô cùng khuyến khích các bạn sử dụng các unpackmes đơn giản (hoặc chính bản thân các chương trình protector) để nghiên cứu. Như bạn có thể thấy, trong class tương tự của CO-bad.exe có 6 trường (field) thay vì 5 như ở trong CO-good.exe. Nhà phát triển đã thêm vào 1 trường vô tác dụng với kiểu “byte”, và thế là cũng đủ khiến cho de4dot không hoạt động được. 12. Bây giờ sẽ tiến hành sửa code của de4dot, nếu bạn không quá quan tâm về tính tương thích với các phiên bản protector cũ, thì hãy viết lại code đại loại như sau: static string[] requiredTypes = new string[] { "System.IO.MemoryStream", "System.Object", "System.Int32", "System.Byte", }; bool findDesktopOrCompactFramework() { resourceDecrypterType = null; foreach (var type in module.Types) { if (type.Fields.Count != 6) continue; if (!new FieldTypes(type).exactly(requiredTypes)) continue; var cctor = type.FindStaticConstructor(); if (cctor == null) continue;
  • 5. Trang 5 Đây là phương pháp sửa nhanh nhưng sẽ khiến cho de4dot không thể deobfuscate các phiên bản cũ hơn của CO. Tôi khuyến khích các bạn không nên dùng! Cách chỉnh code hiệu quả hơn, sẽ chỉ phải thêm vào một vài dòng code mới: static string[] requiredTypes = new string[] { "System.IO.MemoryStream", "System.Object","System.Int32", }; static string[] requiredTypes2 = new string[] { "System.IO.MemoryStream", "System.Object", "System.Int32", "System.Byte", }; bool findDesktopOrCompactFramework() { resourceDecrypterType = null; foreach (var type in module.Types) { bool found = false; if ((type.Fields.Count == 5) && (new FieldTypes(type).exactly(requiredTypes))) found = true; if ((type.Fields.Count == 6) && (new FieldTypes(type).exactly(requiredTypes2))) found = true; if (!found) continue; var cctor = type.FindStaticConstructor(); if (cctor == null) continue; Sau khi đã sửa xong code, tiến hành thử unpack CO-bad.exe một lần nữa. Nhưng nếu bạn tiếp tục gặp lỗi, bạn sẽ nhìn thấy có một vài tiến triển nhỏ: resourceDecryptType đã chính xác, tuy nhiên skipBytes và các flags thì vẫn chưa chính xác
  • 6. Trang 6 14. Sử dụng phương pháp tương tự như trên. Tìm các phần code gán giá trị cho desEncryptFlag. Có 4 phần tất cả, đặt breakpoint ở những nơi đó rồi tiến hành debug lại 2 file CO-good.exe và CO-bad.exe Bạn sẽ nhận thấy rằng, với CO-good.exe thì chúng ta dừng lại ở đây: if (constants.Count == 2) { desEncryptedFlag = (byte)constants[0]; deflatedFlag = (byte)constants[1]; return true; } Và call stack sẽ như thế này: Còn trong CO-bad.exe bạn sẽ dừng ở đây: void initializeHeaderInfo(ISimpleDeobfuscator simpleDeobfuscator) { skipBytes = 0; foreach (var method in getDecrypterMethods(resourceDecrypterType)) { if (updateFlags(method, simpleDeobfuscator)) return; } desEncryptedFlag = 1; deflatedFlag = 2; bitwiseNotEncryptedFlag = 4; } Và call stack cũng sẽ khác: Tiến hành debug function initalizeHeaderInfo() và bạn sẽ nhìn thấy lỗi xảy ra ở getDecrypterMethods(), method này sẽ không trả về dữ liệu khi chạy với file CO-bad.exe 15. Tìm hiểu cách hoạt động của getDecrypterMethods(). Nó sẽ tìm kiếm một method xác định trong class resourceDecrypterType. Quay trở lại trong decompiler và so sánh các method của class này:
  • 7. Trang 7 Trong CO-good.exe: Trong CO-bad.exe: Thì ra nhà phát triển đã sử dụng “long”(int64), thay vì “sbyte”. Ta sẽ tiến hành thay đổi lại code trong getDecrypterMethods(): 16. Biên dịch, chạy chương trình và kiểm tra lại các biến toàn cục: Mọi thứ đều đã chính xác, và bạn sẽ thấy rằng file CO-bad.exe sẽ được unpack bình thường. Thế là chúng ta đã thành công Tôi đã hướng dẫn các bạn cách để debug và chỉnh sửa de4dot để khắc phục lỗi xảy ra khi unpack/deobfuscate các phiên bản mới chưa được hỗ trợ, về những gì cần xem xét và so sánh trong decompiler. Hi vọng sẽ giúp ích cho các bạn để bắt đầu việc “hack” de4dot và giải quyết các lỗi xảy ra với các phiên bản của các protector mới hơn. Chúc vui vẻ Kao This article is originally created by kao, and has been translated into Vietnamese by me (Levis), so I’m not the author of it. All credits go to him. Any suggests for better translation in future, feel free to contact me: levintaeyeon[at]live[dot]com or my personal blog: http://ltops9.wordpress.com Enjoy and best Regards, Levis Created Aug 3 2014