SlideShare a Scribd company logo
1 of 5
Download to read offline
Trang 1
Hướng dẫn Deobfusacte DotnetPatcher 3.1 một cách thủ công
(viết bởi ubbelol cho http://rtn-team.cc)
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.
Công cụ sử dụng:
- DnSpy (http://ubbecode.wordpress.com/2014/05/03/dnspy-more-powerful-net-decompiler/)
- Windbg
- De4dot
File thực hành trong bài viết này: http://www.multiupload.nl/6GJ3UQX71Y (hiện tại link đã bị die, tác giả
chưa update, cho nên bài viết này chỉ mang tính chất tham khảo, cách thực hiện đối với các file khác cũng
tương tự).
Lời giới thiệu
Tôi đã thấy rất nhiều người gặp vấn đề khi cố gắng thực hiện deobfuscate loại protector này, lí do là dạng bảo
vệ này không thể bị loại bỏ một cách tự động chỉ bằng việc kéo và thả file vào de4dot. Vì vậy trong bài viết
này tôi sẽ hướng dẫn cách làm thủ công sử dụng Windbg và de4dot.
Nếu bạn thấy thích những bài viết như thế này, hãy ghé thăm blog của tôi, nơi mà tôi sẽ cố gắng đăng thêm
nhiều bài viết mới : http://ubbecode.wordpress.com
Trang 2
Chúng ta có 1 file được bảo vệ bằng DotnetPatcher 3.1 packer + obfuscation. Dạng này không phải là một
dạng bảo vệ quá phức tạp, nhưng de4dot không thể deobfuscate nó tự động nếu chương trình đó có sử dụng
packer và có 1 dạng mã hóa string chưa được nhận diện. Chúng ta sẽ bắt đầu bằng việc xem xét code của
entrypoint của chương trình trong DnSpy (hoặc .NET Reflector):
Nhìn giống như 1 loader cơ bản sử dụng Assembly.EntryPoint.Invoke(..), để load file nguyên thủy. Có nghĩa
là, chương trình sẽ phải load file nguyên thủy từ đâu đó. Hãy xem xét hàm call đầu tiên được sử dụng để load
Assembly vào và lăn xuống dưới 1 chút cho đến khi ta nhìn thấy Assembly.Load:
Phải rồi, vậy là chương trình sử dụng Assembly.Load(byte[]). Tiến hành load file vào trong WinDbg.
Chúng ta sẽ đặt 1 breakpoint ở clrjit và chạy chương trình:
0: 000> sxe ld:clrjit
0: 000> g
Breakpoint sẽ hoạt động ngay lập tức:
ModLoad: 64da0000 64e1d000 C:WindowsMicrosoft.NETFrameworkv4.0.30319clrjit
.dll
Bây giờ chúng ta sẽ load SOS extension:
0: 000> .loadby SOS clr
Chúng ta cần phải đặt 1 breakpoint ở Assembly.Load, hãy tìm địa chỉ của MethodDesc của method đó. Dùng
lệnh sau:
0: 000> !name2ee mscorlib.dll System.Reflection.Assembly.Load
Trang 3
Kết quả:
Token: 0600265c
MethodDesc: 55727db0
Name: System.Reflection.Assembly.Load(Byte[])
JITTED Code Address: 56080714
Đặt 1 breakpoint tại đó và chạy chương trình:
0: 000> !bpmd -md 55727db0
0: 000> g
Khi breakpoint có tác dụng có nghĩa là loader vừa mới gọi Assembly.Load, và chúng ta có 1 assembly buffer ở
trong memory. Dùng lệnh:
0: 000> !clrstack -a
Ở trên đỉnh (top) của clrstack chúng ta thấy có:
Child SP IP Call Site
0039f0f0 56080714 System.Reflection.Assembly.Load(Byte[])
PARAMETERS:
rawAssembly (<CLR reg>) = 0x024b5290
LOCALS:
<no data>
Dump thử:
0:000> !do 0x024b5290
Trong phần Content chúng ta có thể nhìn thấy rõ rang đây là 1 file exe với MZ signature:
Name: System.Byte[]
MethodTable: 55a74588
EEClass: 5570229c
Size: 12812(0x320c) bytes
Array: Rank 1, Number of elements 12800, Type Byte
Content: MZ......................@...
Trang 4
Tiến hành dump vùng nhớ xuống và lưu lại thành file:
0: 000> .writemem C:Dumpsdumped.exe 0x024b5290+8 L?0x320c
Bây giờ ta đã có được file gốc (không bị pack), tuy nhiên vẫn còn bị obfuscate. Đưa file này vào de4dot để
“làm sạch sẽ”, dễ đọc hơn 1 chút. Sau đó mở file mới tạo bằng de4dot trong DnSpy:
Phần code ghi là Class2.smethod_2() thực ra là 1 string, vì vậy chúng ta cần phải deobfuscate để lấy lại string
gốc. Để làm điều này, chúng ta sẽ sử dụng một tính năng rất hữu ích của de4dot, mà rất nhiều người không
biết sử dụng nó, thậm chí còn không biết đến sự tồn tại của tính năng này. Có một vài dạng string decrypter
bạn có thể lựa chọn trong de4dot:
Trong trường hợp này chugns ta sẽ sử dụng ‘emulate’. Nhưng để sử dụng được string decrypter chúng ta cần
phải có token (nôm na là địa chỉ các thành phần của chương trình lưu trong metadata của .NET file). Trong
trường hợp của smethod_2(), ta sẽ xem trong DnSpy:
Thật không may, DotNetPatcher sử dụng các hàm decrypt string riêng biệt cho mỗi 1 string. Nhìn vào class
chứa smethod_2():
Trang 5
Tất cả các method ở dưới smethod_1(byte*+) đều là các method dùng dể decrypt string. Cho nên chúng ta cần
phải lấy token của tất cả các method này, sau đó chạy de4dot với tham số như sau:
de4dot.exe "C:Dumpsdumped-cleaned.exe" --strtyp emulate --strtok 0600001b --str
tok
0600001c --strtok 0600001d …
(dấu “…” ở cuối có nghĩa là ghi lần lượt các token của method decrypt string cho đến khi hết, theo cùng 1
dạng “—strtok <token_value>”).
Sau khi de4dot hoạt động xong, mở file mới tạo ra bởi de4dot trong DnSpy:
Vậy là chúng ta đã thành công. File đã được unpack, các string được decrypt và có thể đọc được dễ dang, file
mới này cũng hoạt động ổn định.
Cảm ơn vì đã đọc
This article is originally created by ubbelol, 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

[14HCB]-Tìm Hiểu Weka
[14HCB]-Tìm Hiểu Weka[14HCB]-Tìm Hiểu Weka
[14HCB]-Tìm Hiểu WekaTran Van Cuong
 
Postgresql các vấn đề thực tế
Postgresql các vấn đề thực tếPostgresql các vấn đề thực tế
Postgresql các vấn đề thực tếTechMaster Vietnam
 
03 chuong 3 - data sets
03   chuong 3 - data sets03   chuong 3 - data sets
03 chuong 3 - data setstruong le hung
 
Tài liệu lập trình PHP từ căn bản đến nâng cao
Tài liệu lập trình PHP từ căn bản đến nâng caoTài liệu lập trình PHP từ căn bản đến nâng cao
Tài liệu lập trình PHP từ căn bản đến nâng caoZendVN
 
Clean code - Trở thành một lập trình viên tốt hơn
Clean code - Trở thành một lập trình viên tốt hơnClean code - Trở thành một lập trình viên tốt hơn
Clean code - Trở thành một lập trình viên tốt hơnNhật Nguyễn Khắc
 
Xây dựng hệ thống quản lý sân bóng sử dụng Yii Framework
Xây dựng hệ thống quản lý sân bóng sử dụng Yii FrameworkXây dựng hệ thống quản lý sân bóng sử dụng Yii Framework
Xây dựng hệ thống quản lý sân bóng sử dụng Yii FrameworkGMO-Z.com Vietnam Lab Center
 
Mẫu báo cáo bài tập lớn
Mẫu báo cáo bài tập lớnMẫu báo cáo bài tập lớn
Mẫu báo cáo bài tập lớnJohn MacTavish
 
Bai tap va loi giai sql
Bai tap va loi giai sqlBai tap va loi giai sql
Bai tap va loi giai sql. .
 
Giáo trình bảo mật thông tin
Giáo trình bảo mật thông tinGiáo trình bảo mật thông tin
Giáo trình bảo mật thông tinjackjohn45
 
Design Pattern - Những công thức vàng trong thiết kế
Design Pattern - Những công thức vàng trong thiết kếDesign Pattern - Những công thức vàng trong thiết kế
Design Pattern - Những công thức vàng trong thiết kếNhật Nguyễn Khắc
 
PHÂN CỤM DỮ LIỆU ỨNG DỤNG TRONG PHÂN TÍCH DỮ LIỆU CÔNG THỨC DƯỢC PHẨM
PHÂN CỤM DỮ LIỆU ỨNG DỤNG TRONG PHÂN TÍCH DỮ LIỆU CÔNG THỨC DƯỢC PHẨMPHÂN CỤM DỮ LIỆU ỨNG DỤNG TRONG PHÂN TÍCH DỮ LIỆU CÔNG THỨC DƯỢC PHẨM
PHÂN CỤM DỮ LIỆU ỨNG DỤNG TRONG PHÂN TÍCH DỮ LIỆU CÔNG THỨC DƯỢC PHẨMSoM
 
Bảo trì phần mềm
Bảo trì phần mềmBảo trì phần mềm
Bảo trì phần mềmNguyễn Anh
 
Tiền xử lí dữ liệu bằng weka và lập trình tiền xử lí
Tiền xử lí dữ liệu bằng weka và lập trình tiền xử líTiền xử lí dữ liệu bằng weka và lập trình tiền xử lí
Tiền xử lí dữ liệu bằng weka và lập trình tiền xử líKhoa Hồ Anh
 
Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05Nhóc Nhóc
 
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNG
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNGPHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNG
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNGThùy Linh
 
Cơ sở dữ liệu
Cơ sở dữ liệuCơ sở dữ liệu
Cơ sở dữ liệuThành Luân
 
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPTBài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPTMasterCode.vn
 

What's hot (20)

Heap Sort
Heap SortHeap Sort
Heap Sort
 
Chuong 2. cnpm
Chuong 2. cnpmChuong 2. cnpm
Chuong 2. cnpm
 
Node.js căn bản
Node.js căn bảnNode.js căn bản
Node.js căn bản
 
[14HCB]-Tìm Hiểu Weka
[14HCB]-Tìm Hiểu Weka[14HCB]-Tìm Hiểu Weka
[14HCB]-Tìm Hiểu Weka
 
Postgresql các vấn đề thực tế
Postgresql các vấn đề thực tếPostgresql các vấn đề thực tế
Postgresql các vấn đề thực tế
 
03 chuong 3 - data sets
03   chuong 3 - data sets03   chuong 3 - data sets
03 chuong 3 - data sets
 
Tài liệu lập trình PHP từ căn bản đến nâng cao
Tài liệu lập trình PHP từ căn bản đến nâng caoTài liệu lập trình PHP từ căn bản đến nâng cao
Tài liệu lập trình PHP từ căn bản đến nâng cao
 
Clean code - Trở thành một lập trình viên tốt hơn
Clean code - Trở thành một lập trình viên tốt hơnClean code - Trở thành một lập trình viên tốt hơn
Clean code - Trở thành một lập trình viên tốt hơn
 
Xây dựng hệ thống quản lý sân bóng sử dụng Yii Framework
Xây dựng hệ thống quản lý sân bóng sử dụng Yii FrameworkXây dựng hệ thống quản lý sân bóng sử dụng Yii Framework
Xây dựng hệ thống quản lý sân bóng sử dụng Yii Framework
 
Mẫu báo cáo bài tập lớn
Mẫu báo cáo bài tập lớnMẫu báo cáo bài tập lớn
Mẫu báo cáo bài tập lớn
 
Bai tap va loi giai sql
Bai tap va loi giai sqlBai tap va loi giai sql
Bai tap va loi giai sql
 
Giáo trình bảo mật thông tin
Giáo trình bảo mật thông tinGiáo trình bảo mật thông tin
Giáo trình bảo mật thông tin
 
Design Pattern - Những công thức vàng trong thiết kế
Design Pattern - Những công thức vàng trong thiết kếDesign Pattern - Những công thức vàng trong thiết kế
Design Pattern - Những công thức vàng trong thiết kế
 
PHÂN CỤM DỮ LIỆU ỨNG DỤNG TRONG PHÂN TÍCH DỮ LIỆU CÔNG THỨC DƯỢC PHẨM
PHÂN CỤM DỮ LIỆU ỨNG DỤNG TRONG PHÂN TÍCH DỮ LIỆU CÔNG THỨC DƯỢC PHẨMPHÂN CỤM DỮ LIỆU ỨNG DỤNG TRONG PHÂN TÍCH DỮ LIỆU CÔNG THỨC DƯỢC PHẨM
PHÂN CỤM DỮ LIỆU ỨNG DỤNG TRONG PHÂN TÍCH DỮ LIỆU CÔNG THỨC DƯỢC PHẨM
 
Bảo trì phần mềm
Bảo trì phần mềmBảo trì phần mềm
Bảo trì phần mềm
 
Tiền xử lí dữ liệu bằng weka và lập trình tiền xử lí
Tiền xử lí dữ liệu bằng weka và lập trình tiền xử líTiền xử lí dữ liệu bằng weka và lập trình tiền xử lí
Tiền xử lí dữ liệu bằng weka và lập trình tiền xử lí
 
Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05Kiến trúc máy tính và hợp ngữ bài 05
Kiến trúc máy tính và hợp ngữ bài 05
 
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNG
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNGPHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNG
PHÂN TÍCH THIẾT KẾ HỆ THỐNG BÁN HÀNG QUA MẠNG
 
Cơ sở dữ liệu
Cơ sở dữ liệuCơ sở dữ liệu
Cơ sở dữ liệu
 
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPTBài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
 

Viewers also liked

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ịchLevis 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ịchLevis 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ịchLevis 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ịchLevis 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 showcaseLevis 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ã độcLevis 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 Engineeringintertelinvestigations
 
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 metasploitn|u - The Open Security Community
 
Reverse Engineering Malware Workshop
Reverse Engineering Malware WorkshopReverse Engineering Malware Workshop
Reverse Engineering Malware WorkshopMustafa 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
 

Viewers also liked (11)

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
 
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 - 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...
 

Similar to Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch

Similar to Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch (20)

Tiểu Luận Tìm Hiểu NS2 Và Demo
Tiểu Luận Tìm Hiểu NS2 Và Demo Tiểu Luận Tìm Hiểu NS2 Và Demo
Tiểu Luận Tìm Hiểu NS2 Và Demo
 
Học python
Học pythonHọc python
Học python
 
Bai giangvb.net
Bai giangvb.netBai giangvb.net
Bai giangvb.net
 
Bao cao thuc tap tuan 1 Athena Tran Dang Khoa
Bao cao thuc tap tuan 1 Athena Tran Dang KhoaBao cao thuc tap tuan 1 Athena Tran Dang Khoa
Bao cao thuc tap tuan 1 Athena Tran Dang Khoa
 
Introduction ns2
Introduction ns2Introduction ns2
Introduction ns2
 
Linux Network Administration (LPI-1,LPI-2)
Linux Network Administration (LPI-1,LPI-2)Linux Network Administration (LPI-1,LPI-2)
Linux Network Administration (LPI-1,LPI-2)
 
Hdth02 ltudql02-su dungsubversion-1
Hdth02 ltudql02-su dungsubversion-1Hdth02 ltudql02-su dungsubversion-1
Hdth02 ltudql02-su dungsubversion-1
 
Baigiang Ns2
Baigiang Ns2Baigiang Ns2
Baigiang Ns2
 
Bai bao cao 3
Bai bao cao 3Bai bao cao 3
Bai bao cao 3
 
Co ban ve_matlab
Co ban ve_matlabCo ban ve_matlab
Co ban ve_matlab
 
Linux security
Linux securityLinux security
Linux security
 
Bai giangvb.net
Bai giangvb.netBai giangvb.net
Bai giangvb.net
 
Netcatbackdoor
NetcatbackdoorNetcatbackdoor
Netcatbackdoor
 
Linux thietlaphethongmangubunt-45879
Linux thietlaphethongmangubunt-45879Linux thietlaphethongmangubunt-45879
Linux thietlaphethongmangubunt-45879
 
Tailieu aircrack
Tailieu aircrackTailieu aircrack
Tailieu aircrack
 
Linux+02
Linux+02Linux+02
Linux+02
 
115 cau trac_nghiem_linux
115 cau trac_nghiem_linux115 cau trac_nghiem_linux
115 cau trac_nghiem_linux
 
Lab security+ Bài 8: Netcat
Lab security+ Bài 8: NetcatLab security+ Bài 8: Netcat
Lab security+ Bài 8: Netcat
 
Lab security+baiso8 netcat
Lab security+baiso8 netcatLab security+baiso8 netcat
Lab security+baiso8 netcat
 
các bước hack server
các bước hack servercác bước hack server
các bước hack server
 

Hướng dẫn deobfuscate DotnetPatcher 3.1 - Bài dịch

  • 1. Trang 1 Hướng dẫn Deobfusacte DotnetPatcher 3.1 một cách thủ công (viết bởi ubbelol cho http://rtn-team.cc) 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. Công cụ sử dụng: - DnSpy (http://ubbecode.wordpress.com/2014/05/03/dnspy-more-powerful-net-decompiler/) - Windbg - De4dot File thực hành trong bài viết này: http://www.multiupload.nl/6GJ3UQX71Y (hiện tại link đã bị die, tác giả chưa update, cho nên bài viết này chỉ mang tính chất tham khảo, cách thực hiện đối với các file khác cũng tương tự). Lời giới thiệu Tôi đã thấy rất nhiều người gặp vấn đề khi cố gắng thực hiện deobfuscate loại protector này, lí do là dạng bảo vệ này không thể bị loại bỏ một cách tự động chỉ bằng việc kéo và thả file vào de4dot. Vì vậy trong bài viết này tôi sẽ hướng dẫn cách làm thủ công sử dụng Windbg và de4dot. Nếu bạn thấy thích những bài viết như thế này, hãy ghé thăm blog của tôi, nơi mà tôi sẽ cố gắng đăng thêm nhiều bài viết mới : http://ubbecode.wordpress.com
  • 2. Trang 2 Chúng ta có 1 file được bảo vệ bằng DotnetPatcher 3.1 packer + obfuscation. Dạng này không phải là một dạng bảo vệ quá phức tạp, nhưng de4dot không thể deobfuscate nó tự động nếu chương trình đó có sử dụng packer và có 1 dạng mã hóa string chưa được nhận diện. Chúng ta sẽ bắt đầu bằng việc xem xét code của entrypoint của chương trình trong DnSpy (hoặc .NET Reflector): Nhìn giống như 1 loader cơ bản sử dụng Assembly.EntryPoint.Invoke(..), để load file nguyên thủy. Có nghĩa là, chương trình sẽ phải load file nguyên thủy từ đâu đó. Hãy xem xét hàm call đầu tiên được sử dụng để load Assembly vào và lăn xuống dưới 1 chút cho đến khi ta nhìn thấy Assembly.Load: Phải rồi, vậy là chương trình sử dụng Assembly.Load(byte[]). Tiến hành load file vào trong WinDbg. Chúng ta sẽ đặt 1 breakpoint ở clrjit và chạy chương trình: 0: 000> sxe ld:clrjit 0: 000> g Breakpoint sẽ hoạt động ngay lập tức: ModLoad: 64da0000 64e1d000 C:WindowsMicrosoft.NETFrameworkv4.0.30319clrjit .dll Bây giờ chúng ta sẽ load SOS extension: 0: 000> .loadby SOS clr Chúng ta cần phải đặt 1 breakpoint ở Assembly.Load, hãy tìm địa chỉ của MethodDesc của method đó. Dùng lệnh sau: 0: 000> !name2ee mscorlib.dll System.Reflection.Assembly.Load
  • 3. Trang 3 Kết quả: Token: 0600265c MethodDesc: 55727db0 Name: System.Reflection.Assembly.Load(Byte[]) JITTED Code Address: 56080714 Đặt 1 breakpoint tại đó và chạy chương trình: 0: 000> !bpmd -md 55727db0 0: 000> g Khi breakpoint có tác dụng có nghĩa là loader vừa mới gọi Assembly.Load, và chúng ta có 1 assembly buffer ở trong memory. Dùng lệnh: 0: 000> !clrstack -a Ở trên đỉnh (top) của clrstack chúng ta thấy có: Child SP IP Call Site 0039f0f0 56080714 System.Reflection.Assembly.Load(Byte[]) PARAMETERS: rawAssembly (<CLR reg>) = 0x024b5290 LOCALS: <no data> Dump thử: 0:000> !do 0x024b5290 Trong phần Content chúng ta có thể nhìn thấy rõ rang đây là 1 file exe với MZ signature: Name: System.Byte[] MethodTable: 55a74588 EEClass: 5570229c Size: 12812(0x320c) bytes Array: Rank 1, Number of elements 12800, Type Byte Content: MZ......................@...
  • 4. Trang 4 Tiến hành dump vùng nhớ xuống và lưu lại thành file: 0: 000> .writemem C:Dumpsdumped.exe 0x024b5290+8 L?0x320c Bây giờ ta đã có được file gốc (không bị pack), tuy nhiên vẫn còn bị obfuscate. Đưa file này vào de4dot để “làm sạch sẽ”, dễ đọc hơn 1 chút. Sau đó mở file mới tạo bằng de4dot trong DnSpy: Phần code ghi là Class2.smethod_2() thực ra là 1 string, vì vậy chúng ta cần phải deobfuscate để lấy lại string gốc. Để làm điều này, chúng ta sẽ sử dụng một tính năng rất hữu ích của de4dot, mà rất nhiều người không biết sử dụng nó, thậm chí còn không biết đến sự tồn tại của tính năng này. Có một vài dạng string decrypter bạn có thể lựa chọn trong de4dot: Trong trường hợp này chugns ta sẽ sử dụng ‘emulate’. Nhưng để sử dụng được string decrypter chúng ta cần phải có token (nôm na là địa chỉ các thành phần của chương trình lưu trong metadata của .NET file). Trong trường hợp của smethod_2(), ta sẽ xem trong DnSpy: Thật không may, DotNetPatcher sử dụng các hàm decrypt string riêng biệt cho mỗi 1 string. Nhìn vào class chứa smethod_2():
  • 5. Trang 5 Tất cả các method ở dưới smethod_1(byte*+) đều là các method dùng dể decrypt string. Cho nên chúng ta cần phải lấy token của tất cả các method này, sau đó chạy de4dot với tham số như sau: de4dot.exe "C:Dumpsdumped-cleaned.exe" --strtyp emulate --strtok 0600001b --str tok 0600001c --strtok 0600001d … (dấu “…” ở cuối có nghĩa là ghi lần lượt các token của method decrypt string cho đến khi hết, theo cùng 1 dạng “—strtok <token_value>”). Sau khi de4dot hoạt động xong, mở file mới tạo ra bởi de4dot trong DnSpy: Vậy là chúng ta đã thành công. File đã được unpack, các string được decrypt và có thể đọc được dễ dang, file mới này cũng hoạt động ổn định. Cảm ơn vì đã đọc This article is originally created by ubbelol, 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