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

What's hot (20)

Giáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việtGiáo trình c++ full tiếng việt
Giáo trình c++ full tiếng việt
 
Open Closed Principle kata
Open Closed Principle kataOpen Closed Principle kata
Open Closed Principle kata
 
Building an API with Django and Django REST Framework
Building an API with Django and Django REST FrameworkBuilding an API with Django and Django REST Framework
Building an API with Django and Django REST Framework
 
Solid principles
Solid principlesSolid principles
Solid principles
 
Threads And Synchronization in C#
Threads And Synchronization in C#Threads And Synchronization in C#
Threads And Synchronization in C#
 
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
 
Php and MySQL
Php and MySQLPhp and MySQL
Php and MySQL
 
Chuong 1. cnpm
Chuong 1. cnpmChuong 1. cnpm
Chuong 1. cnpm
 
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
 
Reactjs
Reactjs Reactjs
Reactjs
 
Ebook học Javascript cơ bản tới nâng cao
Ebook học Javascript cơ bản tới nâng caoEbook học Javascript cơ bản tới nâng cao
Ebook học Javascript cơ bản tới nâng cao
 
Introduction to Eclipse IDE
Introduction to Eclipse IDEIntroduction to Eclipse IDE
Introduction to Eclipse IDE
 
What Is Virtual DOM In React JS.pptx
What Is Virtual DOM In React JS.pptxWhat Is Virtual DOM In React JS.pptx
What Is Virtual DOM In React JS.pptx
 
Oops concepts in php
Oops concepts in phpOops concepts in php
Oops concepts in php
 
Manipulating Android tasks and back stack
Manipulating Android tasks and back stackManipulating Android tasks and back stack
Manipulating Android tasks and back stack
 
ReactJS presentation
ReactJS presentationReactJS presentation
ReactJS presentation
 
Chuong3 lập trình hợp ngữ
Chuong3 lập trình hợp ngữChuong3 lập trình hợp ngữ
Chuong3 lập trình hợp ngữ
 
React JS - Introduction
React JS - IntroductionReact JS - Introduction
React JS - Introduction
 
TypeScript - An Introduction
TypeScript - An IntroductionTypeScript - An Introduction
TypeScript - An Introduction
 
Intro to React
Intro to ReactIntro to React
Intro to React
 

Viewers also liked

Tong Quan Ve Malware
Tong Quan Ve MalwareTong Quan Ve Malware
Tong Quan Ve Malware
guest4a3ff91
 

Viewers also liked (14)

Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịchPhân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - 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
 
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
 
Tùy biến Confuser
Tùy biến ConfuserTùy biến Confuser
Tùy biến Confuser
 
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 .NET - Advanced Patching, Playing with IL
Reverse Engineering .NET - Advanced Patching, Playing with ILReverse Engineering .NET - Advanced Patching, Playing with IL
Reverse Engineering .NET - Advanced Patching, Playing with IL
 
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 (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