Bài 3: Lập trình giao diện điều khiển & Xử lý sự kiện - Lập trình winform - G...MasterCode.vn
Các nhóm điều khiển trên form
Các điều khiển thường dùng
Các điều khiển chứa
Các điều khiển menu
Các điều khiển dữ liệu
Các thành phần
Các điều khiển hỗ trợ in
Các điều khiển hộp thoại
Sự kiện và xử lý sự kiện trong C#
Các nhóm điều khiển trên form
Các điều khiển thường dùng
Các điều khiển chứa
Các điều khiển menu
Các điều khiển dữ liệu
Các thành phần
Các điều khiển hỗ trợ in
Các điều khiển hộp thoại
Sự kiện và xử lý sự kiện trong C#
Bài 3: Lập trình giao diện điều khiển & Xử lý sự kiện - Lập trình winform - G...MasterCode.vn
Các nhóm điều khiển trên form
Các điều khiển thường dùng
Các điều khiển chứa
Các điều khiển menu
Các điều khiển dữ liệu
Các thành phần
Các điều khiển hỗ trợ in
Các điều khiển hộp thoại
Sự kiện và xử lý sự kiện trong C#
Các nhóm điều khiển trên form
Các điều khiển thường dùng
Các điều khiển chứa
Các điều khiển menu
Các điều khiển dữ liệu
Các thành phần
Các điều khiển hỗ trợ in
Các điều khiển hộp thoại
Sự kiện và xử lý sự kiện trong C#
Qu'est ce que PHP ? Dans ce diaporama, vous allez découvrir les principes de base de PHP dans une courte introduction et apprendre à créer vous aussi des sites web dynamiques.
Pour plus de tuto: https://www.funinformatique.com/comment-pirater-un-compte-facebook/
Mô tả các dịch vụ mà hệ điều hành cung cấp cho người dùng, cho tiến trình và cho các hệ thống khác
Giải thích được cách mà lời gọi hệ thống được sử dụng để cung cấp dịch vụ hệ điều hành
Thảo luận về các cấu trúc khác nhau của hệ điều hành
Giải thích hệ điều hành được cài đặt, tùy biến như thế nào và quá trình khởi động của nó
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
Giới thiệu về ADO.NET
Các thành phần của ADO.NET
DataProvider
DataSet
Các loại DataProvider
Sql Data Provider
SqlConnection
SqlDataAdapter
Ứng dụng nhiều form
Ứng dụng SDI
Ứng dụng MDI
Thêm Toolbar, Tooltip vào form
Qu'est ce que PHP ? Dans ce diaporama, vous allez découvrir les principes de base de PHP dans une courte introduction et apprendre à créer vous aussi des sites web dynamiques.
Pour plus de tuto: https://www.funinformatique.com/comment-pirater-un-compte-facebook/
Mô tả các dịch vụ mà hệ điều hành cung cấp cho người dùng, cho tiến trình và cho các hệ thống khác
Giải thích được cách mà lời gọi hệ thống được sử dụng để cung cấp dịch vụ hệ điều hành
Thảo luận về các cấu trúc khác nhau của hệ điều hành
Giải thích hệ điều hành được cài đặt, tùy biến như thế nào và quá trình khởi động của nó
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
Giới thiệu về ADO.NET
Các thành phần của ADO.NET
DataProvider
DataSet
Các loại DataProvider
Sql Data Provider
SqlConnection
SqlDataAdapter
Ứng dụng nhiều form
Ứng dụng SDI
Ứng dụng MDI
Thêm Toolbar, Tooltip vào form
Tài liệu giới thiệu tổng quan về các nguồn lực, công cụ cần thiết để xây dựng một nhóm chuyên thực hiện các công việc phân tích mã độc cho doanh nghiệp/tổ chứ
Beginner level presentation on Malware Identification as part of the Malware Reverse Engineering course. Learn what malware is, how it functions, how it can be detected, identified and isolated for reverse engineering. For more information about malware detection and removal visit https://www.intertel.co.za
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