Tag: SAE

Các công cụ cần thiết cho quá trình Reverse Engineering .NET (Phần 1)

Các chương trình viết bằng .NET có cấu trúc khác với  các native PE file, cho nên các công cụ debug/disassembler  thong thường không thể phát huy hết sức mạnh, mà muốn dịch ngược được các chương trình .NET và phân tích cấu trúc + mã nguồn của chúng, không gì tốt hơn bằng việc sử dụng các chương trình chuyên dụng dành riêng cho .NET, tôi sẽ giới thiệu với các bạn trong bài viết này.

Tôi sẽ tạm thời phân chia thành 2 nhóm chương trình chính sau đây:

  • Nhóm Editor/Decompiler/Disassembler/Utilities:  Nhóm này là tập hợp các công cụ giúp ta xem xét, phân tích cũng như thay đổi cấu trúc và thong số của chương trình .NET. Kèm theo đó là một vài tiện ích nho nhỏ để phục vụ cho quá trình dịch ngược chương trình được trở lên dễ dàng hơn

 

  • Nhóm Unpacker/Deobfuscator/Detector: Nhóm này tập hợp các công cụ giúp chúng ta phát hiện  và loại bỏ các lớp bảo vệ của chương trình .NET. Hiện tại có rất nhiều các  sản phẩm bảo vệ cho mã nguồn .NET để tránh việc dịch ngược, đọc và phân tích code cho nên nhóm công cụ này cũng khá quan trọng.

 

OK, bây giờ tôi sẽ liệt kê các chương trình phổ biến trong 2 nhóm trên. Bắt đầu với nhóm 1 trước.

1. CFF Explorer

Thông tin và download: http://www.ntcore.com/exsuite.php

Đây là 1 chương trình rất đa năng nằm trong bộ Explore Suite của NTCore phát triển. Mặc dù đây chỉ là dự án ngoài lề (Side-project) được viết bởi Daniel Pistelli, tuy nhiên các tính năng của nó được đánh giá rất cao và hữu ích. Chương trình là 1 PE Editor đúng nghĩa với các tính năng sau:

  • Process Viewer
  • Drivers Viewer
  • Windows Viewer
  • PE and Memory Dumper
  • Full support for PE32/64
  • Special fields description and modification (.NET supported)
  • PE Utilities
  • PE Rebuilder (with Realigner, IT Binder, Reloc Remover, Strong Name Signature Remover, Image Base Changer)
  • View and modification of .NET internal structures
  • Resource Editor (full support for Windows Vista icons)
  • Support in the Resource Editor for .NET resources (dumpable as well)
  • Hex Editor
  • Import Adder
  • PE integrity checks
  • Extension support
  • Visual Studio Extensions Wizard
  • Powerful scripting language
  • Dependency Walker
  • Quick Disassembler (x86, x64, MSIL)
  • Name Unmangler
  • Extension support
  • File Scanner
  • Directory Scanner
  • Deep Scan method
  • Recursive Scan method
  • Multiple results
  • Report generation
  • Signatures Manager
  • Signatures Updater
  • Signatures Collisions Checker
  • Signatures Retriever

(Vì đây đa phần là các thuật ngữ chuyên môn nên khi dịch ra tiếng Việt có thể không sát nghĩa, cho nên tôi để nguyên tiếng Anh).

Đối với việc Reversing .NET thì các tính năng sau rất hữu ích:

  • Special fields description and modification (.NET supported)
  • PE Rebuilder (with Realigner, IT Binder, Reloc Remover, Strong Name Signature Remover, Image Base Changer)
  • View and modification of .NET internal structures
  • Support in the Resource Editor for .NET resources (dumpable as well)
  • Hex Editor
  • Quick Disassembler (x86, x64, MSIL)
  • Dependency Walker

 

Đây cũng là chương trình đầu tiên hỗ trợ việc xem và thay đổi cấu trúc, thông số của .NET PE file, có thể thực hiện ngay cả khi trong máy không cài .NET Framework. Ta cũng có thể mở rộng khả năng hoạt động của chương trình bằng cachs viết các script cho chương trình tự động chạy, đó cũng là điểm mạnh rất đáng giá. Vậy nên, nếu bạn muốn thực hiện Reverse Engineering .NET, đây là công cụ bạn cần phải có trong bộ “đồ nghề” của mình

cff_explorer

 

CFF Explorer

 

+ Điểm cộng: Nhẹ, miễn phí, nhiều tính năng rất hữu ích, hỗ trợ hiệu quả .NET, khả năng mở rộng tốt

+ ĐIểm trừ: Không có

 

2. .NET Reflector

Thông tin và Download:  http://www.red-gate.com/products/dotnet-development/reflector/

Nhắc đến .NET Reflector thì không phải là cái tên quá xa lạ đối với những ai đang nghiên cứu về .NET. Đây là công cụ phổ biến nhất trong việc dịch ngược .NET. Có một decompile engine chất lượng, có nhiều plugin/addin hỗ trợ, tính năng hữu ích, giao diện trực quan dễ sử dụng, có thể tích hợp vào trong Visual Studio, kèm theo đó là 1 “ông trùm” chống lung phía sau là Red-Gate, không lạ lắm khi .NET Reflector càng ngày càng trở lên mạnh mẽ và phổ biến hơn. Tính năng dịch ngược của .NET Reflector theo quan điểm cá nhân của tôi là rất tốt, có thể đưa về 90-95% code gốc, và có thể browse code không khác lắm so với việc chúng ta đọc code trong Visual Studio. Tuy nhiên tôi vẫn thích các phiên bản cũ của .NET Reflector khi Lulz Roeiier còn phát triển độc lập. Lúc đó .NET Reflector chạy rất nhẹ nhàng và chính xác, mặc dù không có nhiều tính năng hay ho như .NET Reflector hiện hành, và quan trọng nhất là nó “miễn phí”. Red-Gate đã mua lại .NET Reflector và biến nó thành một công cụ độc quyền của hang, và bán với giá cao. Tất nhiên là cracker / reverser không thích điều này, và họ đã phát triển các công cụ thay thế khác  với tính năng giống .NET Reflector và chạy nhẹ nhàng hơn rất nhiều (tôi sẽ giới thiệu một vài các công cụ nổi bật khác ở phần dưới).

reflector

.NET Reflector

+ Điểm cộng: Mạnh, phổ biến, dễ sử dụng, nhiều addin, khả năng tích hợp tốt với Visual Studio, nhiều tính năng hữu ích

+ Điểm trừ: Nặng, mất phí, thiếu các tính năng chuyên dụng và nâng cao

3. Simple Assembly Explorer

Thông tin và download: https://sites.google.com/site/simpledotnet/simple-assembly-explorer

Đây là công cụ mà độ phổ biến của nó cũng ngang tầm với .NET Reflector. Thường được gọi tắt là SAE, một dự án mã nguồn mở được viết bởi Wicky Hu. Chương trình cung cấp các tính năng sau:

  • Assembler: call ilasm to assemble il file
    Disassembler: call ildasm to disassemble assembly
    Deobfuscator: de-obfuscate obfuscated assembly
    Strong Name: remove strong name, sign assembly, add/remove assembly to/from GAC
    PE Verify: call peverify to verify assemblies
  • Class Editor: browse/view assembly classes, edit method instructions
    Run Method: run static methods
    Profiler: Trace function calls and parameters with SimpleProfiler
  • Relector: plugin which call Reflector to browse selected assembly
    ILMerge: plugin which call ilmerge to merge selected assemblies
    Edit File: plugin which call your editor to view selected assembly
    Plugin Sample: plugin sample
  • Copy Info: copy information of selected assemblies to clipboard
    Open Folder: open container folder
    Delete File: delete selected file(s)

 

Đây là các tính năng rất mạnh và chuyên nghiệp mà hầu như không có trong .NET Reflector. Một điểm mạnh khác của chương trình là có hỗ trợ sử dụng decompiler Engine của .NET Reflector hay ILSpy để đưa ra code dịch ngược dưới dạng các ngôn ngữ bậc cao (C#,VB.NET….) bởi vì mặc định của chương trình là dịch ngược về mã IL. Nó cũng có thể dịch ngược rất nhiều những file .NET mà .NET Reflector bó tay (ví dụ điển hình là các .NET bị obfuscated/packed)

Điểm yếu của chương trình là nó hơi khó sử dụng, và thích hợp với những người có nhiều kinh nghiệm hơn là những người mới bắt đầu. Tuy nhiên nếu bạn hiểu và nắm rõ cách sử dụng của chương trình, thì đây là một chương trình tuyệt vời nhất cho việc dịch ngược .NET

sae

SAE

+ Điểm cộng: RẤT MẠNH, mã nguồn mở, nhẹ,  miễn phí, nhiều tính năng chuyên nghiệp mà các công cụ khác không có, khả năng mở rộng và tích hợp các công cụ khác

+ Điểm trừ: Khó sử dụng, đòi hỏi có kinh nghiệm

4. Telerik JustDecompile

JustDecomple của Telerik cũng là một công cụ chịu nhiều ảnh hưởng từ .NET Reflector, và được coi là sự thay thế tốt nhất cho .NET Reflector. Bao gồm các tính năng chính sau:

  • 10 times faster than competitors.
  • Open API for everyone to create extensions.
  • Supports .NET 2, 3.5, 4, 4.5, 4.5.1, WinRT Metadata, C#5, APPX and WinMD.
  • Code becomes easily searchable with JustDecompile.
  • Create a Visual Studio project from a decompiled assembly.
  • JustDecompile integrates with JustCode and JustTrace.
  • Switch easily between different methods and assemblies in one JustDecompile instance.
  • Decompile referenced assemblies in a Visual Studio project.
  • Save resources from assemblies.
  • Bookmark usages in loaded assemblies.
  • Export code directly from the command prompt.

Decompile an assembly after browsing to it in Windows Explorer.

Đây là một công cụ khá tốt cho việc dịch ngược .NET, được một doanh nghiệp phát triển cho nên được đầu tư khá tốt. Nó bao gồm các tính năng cơ bản có trong .NET Reflector và có khả năng mở rộng tốt. Tuy nhiên vì mới được phát triển cho nên chưa có quá nhiều sự nổi bật và tính năng khác biệt nên vẫn phải đứng sau cái bóng quá lớn của .NET Reflector. Trong tương lai chắc chắn đây sẽ là một công cụ rất mạnh và hữu ích. Còn bây giờ, nó vẫn là một sự lựa chọn khá tốt cho việc thay thế .NET Reflector vì hai công cụ này tính năng có nhiều điểm tương đồng và rất dễ sử dụng. Một vài điểm khác đáng chú ý ở đây là hỗ trợ command line và khả năng export ra source code rất tuyệt. Về plugin thì lúc tôi sử dụng mới chỉ có 3 plugin.

justdecompile

JustDecompile

+ Điểm cộng: miễn phí, dễ sử dụng, nhiều tính năng hữu ích giống .NET Reflector, khả năng mở rộng tốt, khả năng decompile tốt, nhẹ, được phát triển khá tốt

+ ĐIểm trừ: Mới, ít plugin hỗ trợ, thiếu các tính năng chuyên dụng nâng cao

(Còn tiếp)

Tìm kiếm tử huyệt của phần mềm trong Reverse Engineering / Cracking

Em Caolac VC có nhớ tôi viết 1 bài chia sẻ về cách tìm ra “tử huyệt” của một chương trình sao cho nhanh nhất, chính xác nhất và hiệu quả nhất. Hôm nay tôi viết bài này để nhằm mục đích đó. Và đây chỉ là bài viết dạng fast-note( ghi chú nhanh) nên sẽ không đi phân tích quá sâu và chi tiết, chỉ đi theo cách của script kiddies cho dễ hiểu, dễ nhớ hehe 😀 )

 

Như chúng ta đã biết, việc Reversing 1 phần mềm là không mấy khó khăn khi giờ đây chúng ta có rất nhiều sự lựa chọn về các decompiler /disassembler. Nhưng điểm mấu chốt là: dịch ngược được rồi, đọc được code rồi nhưng không biết “tử huyệt” nó nằm ở đâu. Điều này chắc chắn không tránh khỏi, với tất cả những ai đã và đang nghiên cứu về cracking/reversing, từ newbie cho đến guru.

 

Định nghĩa sơ qua về tử huyệt 1 chút: Tử huyệt ta có thể hiểu nôm na là những đoạn code chính mà chức năng của chúng là dùng để kiểm tra bản quyền. Tìm ra được tử huyệt thì có thể nói là công việc cracking hoàn thành đến 70-80% rồi. Thế nhưng chuyện tìm ra tử huyệt của 1 chương trình, như đã nói là rất khó khăn. Một newbie có thể mất từ 1 đến vài ngày, để tìm ra tử huyệt của một soft và crack nó, bởi vì họ chưa có nhiều kinh nghiệm nhận biết, nên nhiều khi bị lạc đường trong cái “ma trận code” chỉ gồm toàn chữ và số 🙂 .

 

Đối với cá nhân tôi (hoặc cũng có thể nhiều người khác nữa), phương pháp chủ yếu đi tìm “tử huyệt” là … đoán mò. Đúng, đoán mò xem nó nằm ở chỗ nào. Tuy nhiên không phải là đoán bừa phán bậy, mà là đoán dựa trên các dấu hiệu. Loại dấu hiệu đơn giản nhất mà ai cũng có thể dùng được, tuy nhiên luôn luôn hiệu quả nhất, đó là sử dụng các cụm từ “nhạy cảm”. Nhạy cảm ở đây không phải là vấn đề “sinh lý” nhé, mà là nhạy cảm trong vấn đề bản quyền. Tôi có thể liệt kê ra một vài từ sau:

-Register / Unregister / Registered / Unregisterd

– Trial / Pro / Expired

– License / Unlicensed / Licensed

– Activate / Activation / Deactivate / Deactivation

– Try / Buy / Purchase

-Serial / Key / Username

 

Còn nhiều lắm các từ nhạy cảm, tùy theo từng chương trình mà các từ họ dùng là khác nhau, ta cũng có thể dựa trên các thông báo, các text có liên quan đến bản quyền trong chương trình, thông thường nhất là thông báo khi ta nhập sai serial, hoặc là các text trong phần about Dialog của chương trình.

Tại sao chúng ta phải tìm các từ khóa này? Bởi vì có thể chúng nằm rất gần tử huyệt. Khi ta tìm được vị trí của nhứng từ khóa này rồi, từ đây ta có thể đọc code những phần xung quanh đó và tìm ra tử huyệt một cách vô cùng dễ dàng.

 

Còn 1 vài cách là dựa trên các API call và dấu hiệu thường thấy của các trình compiler thay vì các từ nhạy cảm thì nó hơi dài dòng, và đòi hỏi nhiều kiến thức hơn nữa nên tôi sẽ không nói trong bài viết này, và một phần là vì mấy phương pháp này không có trong .NET nên khó migrate lại bài viết  cho đúng theo 1 phương pháp nhất định là tìm các từ nhạy cảm

 

Tuy nhiên cách tìm ra các từ khóa này cũng tương đối đa dạng, bởi vì nhiều khi chúng không được phơi bày rõ ràng, mà có thể bị ẩn đi bằng nhiều cách khác nhau.

Trong Olly, cách đơn giản nhất là Right Click – Search for – All Referenced Text strings để liệt kê tất cả những string có trong code của chương trình, rồi sau đó ấn Ctrl + L để search các string nhạy cảm. Cái này thì quá quen thuộc rồi  😀

 

 

Cách tiếp theo là sử dụng Phương pháp Stack. Cách này thường áp dụng khi ta không tìm thấy string chứa message thông báo đăng kí không thành công. Có rất nhiều tut đã nói về phương pháp này rồi, chỉ cần tìm đọc là được

 

Một cách khác là search trong Resource của chương trình, Việc này thì cần nhờ đến 1 vài Resource Editor như Reshacker hay Restorator…. Bởi vì nhiều khi các string được cất ở trong đây thay vì cất ở trong code của chương trình. Người lập trình có thể tạo 1 string table trong resource của chương trình, và sau đó trong code họ chỉ cần dùng hàm LoadStringA/W để load string từ trong Resource ra. Vậy nên nếu không tìm được bằng Referenced Text String trong Olly, chúng ta cũng có thể dùng cách này.

Với .NET thì mọi chuyện có vẻ dễ thở hơn bởi vì code dễ đọc hơn và công cụ decompile cho .NET cũng mạnh và nhiều tính năng. Trong Reflector, có một biểu tượng rất đáng giá ở trên toolbar của nó:

Search in .NET Reflector

 

Đây chính là công cụ search của Reflector, ta có thể bấm vào và nó sẽ hiện ra 1 bảng như sau, ngay trên cửa sổ hiện thị code:

Search Panel Shown

 

 

 

Có 3 nút cần chú ý được đánh dấu bằng ô chữ nhật màu xanh. Từ trái qua phải là Search Type (search theo kiểu dữ liệu), Search Member(search theo thành phần của code), và Search Text( cái này chắc khỏi dịch 😀 ). Công dụng của từng nút như sau:

 

– Search Type : Các kiểu dữ liệu do lập trình viên định nghĩa, có thể là class, struct, các property,…. Vd như một class có tên là BuyForm (cái tên nói lên tất cả :D), thì ta có thể tìm đến code của Form này 1 cách nhanh nhất thông qua cách search type này. Các từ khóa nhạy cảm có thể được sử dụng khá tốt ở đây: vd như Buy, try, Register, License, vì thường thường các từ này thường được đặt trong class name hoặc struct name

 

– Search member: Các thành phần chứa trong 1 class, thường thấy trong các name của method nằm trong 1 class nào đó. Có vẻ hơi khó hiểu, nhưng đây là 1 ví dụ: class của Register form được đặt là Form1, form2, form3,… formn gì đó, thì cách search type không thể phát hiện ra, nhưng nếu ta dùng chức năng Search member này thì ta có thể tìm ra rất dễ dàng bởi vì Reflector sẽ kiểm tra toàn bộ thành phần có trong class, từ tên biến, tên method/function để đưa ra những kết quả phù hợp. Quay trở lại với ví dụ, form register được đặt tên là Form1 nhưng trong form này lại có 1 button tên là RegisterBtn( Register Button) thì dùng search member ta có thể tìm ra được button này và đọc luôn code của nó (method RegisterBtn_Click() cũng chắc chắn sẽ được tìm ra). Các từ khóa có thể áp dụng là khá nhiều: Try, Register, Serial, license,…. vv

 

– Search Text: Cái này chắc chỉ nói qua thôi, bởi vì ai cũng hiểu là chức năng của nó rồi : Tìm kiếm tất cả các string có trong code. Cách này đặc biệt hữu ích khi mà chương trình bị packed/ obfuscated. Sau khi deobfuscate thì phần lớn các Class name, method name, variable name sẽ bị thay đổi đi hết, không còn giữ đươc như code gốc nữa (điển hình là dùng với de4dot thì ra kiểu như method_x hay GClassx, Delegatex, nsx (với x là các số)). Tuy nhiên các string đều đã được decrypted, nên việc search theo text này khá ổn. Ta có thể search theo thông báo đăng kí không thành công, hoặc là search theo string hiển thị trong các Form thông báo trial hay buy thông thường sẽ nhảy đến method InitalizeComponent() của 1 class nào đó. InitalizeComponent() là 1 method build sẵn để tiến hành khởi tạo tất cả các thành phần của 1 form :tên form, vị trí, định dạng, các thành phần như label, textbox, button,… và vị trí, thông số của chúng. Đến được đây thì có nghĩa là chúng ta đang đúng ở đúng form cần tìm rồi, chỉ việc đọc code các method của form là có thể tìm ra tử huyệt :).

 

Trong SAE (simpleAssemblyExplorer) cũng có tính năng search nằm ngay trên top panel), và còn mạnh hơn cả .NET Reflector :D:

Search in SAE

Tuy nhiên SAE hơi khó dùng nên với các chương trình .NET bình thường ta chỉ cần .NET Reflector là cũng quá đủ rồi

 

Theo nguyện vọng của em Caolac VC, nói rõ hơn 1 tí về .NET :D. Chúng ta còn có 1 tính năng khá hay trong Reflector là chức năng Analyze của nó. Chức năng này có thể được kích hoạt bằng cách bấm chuột phải vào 1 thành phần bất kì ở khung Assembly Explorer( khung nhỏ nằm bên trái hiển thị các assembly đã được load vào Reflector), một menu hiện lên và ta bấm vào Analyze.

 

Một khung mới sẽ xuất hiện ở dưới khung code view trong reflector tương tự như hình sau:

Analyze Panel

 

Ở đây là 1 ví dụ cho việc analyze 1 method và analyze 1 static variable: ta có thể thấy:

 

– Với method (nằm ở phía trên, được chọn nên có màu xanh): thì khi chúng ta expand sẽ thấy có 2 mục nhỏ hơn là Depend On và Used By. Depend on là liệt kê tất cả các thành phần mà method đó cần có để code có thể hoạt động, và Used by là liệt kê tất cả các thành phần nào đã sử dụng method này

– Với Variable (nằm ở dưới, tương tự cũng có 2 mục nhỏ là Assigned By và Used By. Used by thì giống như của method, là liệt kê thành phần nào đã sử dụng biến này, còn assigned by sẽ liệt kê tất cả những method nào đã gán giá trị cho biến này.

 

Chức năng này thật sự rất hữu ích bởi vì .NET là OOP ( Object-oriented Programming) cho nên có rất nhiều class, method, variable và rất nhiều mối liên hệ giữa chúng, và ta nên sử dụng chức năng này, để tránh đi lạc đường. Có thể lấy ví dụ như sau:

 

1 Class được đặt tên là RegistrationData, trong class này có 1 biến tên là IsRegistered. Một class khác lại có tên là CheckLicense, trong class này có 1 method tên là Check() để nhằm kiểm tra chương trình có bản quyền hay chưa, nếu có rồi thì sẽ set biến IsRegistered thành true, nếu không thì sẽ set thành False. Sau đó khi chương trình khởi động (Mainform.Load()) thì đườngsẽ kiểm tra xem biến isRegistered này là true hay false, nếu true thì chạy, nếu false thì quit. Ta có thể biểu diễn thành pcode như sau (C# pseudo-code):

 


public class RegistrationData

{

public bool isRegistered = false;

}

public class CheckLicense

{

public void Check()

{

if (ABCXYZ) RegistrationData.IsRegistered = true else RegistrationData.IsRegistered = false;

}

}

public class MainForm()

{

public void Load()

{

if RegistrationData.IsRegistered) Application.Run() else Application.Exit();

}

}

Giả sử chúng ta tìm được biến IsRegistered bằng Search Member rồi, nhưng chưa biết biến đó được sử dụng như thế nào, thì ta sẽ dùng chức năng Analyze để phân tích biến đó, sẽ thấy trong Assigned by hiện lên method Check() của class CheckLicense và trong Used By sẽ hiện ra method Load() của class MainForm. Việc cần làm là bấm chuột phải vào 2 method này và chọn Go to Member, và tận hưởng 🙂

Simple Assembly Explorer (SAE) – Another great .NET disassembler

Hello all mates,

After the New year holiday, i totally focus on my study courses, because i will be graduated this June,  so i don’t have free time for my hobby – Reverse Engineering. However, i will try to update news and introduce to you guys interesting stuffs or helpful tools. And today is an short topic to show you about a tool named Simple Assembly Explorer (SAE)  which is written by WiCKY Hu.- an open-source and lightweight but powerful .NET disassembler, can be compared to famous (but expensive) shareware .NET Reflector :).

With people who’re using .NET Reflector and some tool like that (JustDecompile – I have a short introduction topic here), sometimes those tools can’t decompile some strange assembly, especially obfuscated/encrypted. So they gave us wrong code or can not browse method to take a look inside, or simply show a error message. i dealt with many many .NET targets, and yes, .NET Reflector is not enough. Because it’s too famous and powerful, but they (crackers/coders) also find many way to anti .NET Reflector. So SAE is my choice, for those cases. By reading assembly and directly decompile code to IL code, everything is really clearly, and i am able to read, analyze and modify code without any restriction. If you want to modify code in .NET Reflector, you need to use Reflexil, but in this tool, code modifying is intergrated. It’s not all, there are more cool features waiting you.:D Here the info i grabbed from its page:

Assembler: call ilasm to assemble il file
Disassembler: call ildasm to disassemble assembly
Deobfuscator: de-obfuscate obfuscated assembly
Strong Name: remove strong name, sign assembly, add/remove assembly to/from GAC
PE Verify: call peverify to verify assemblies

Class Editor: browse/view assembly classes, edit method instructions
Run Method: run static methods
Profiler: Trace function calls and parameters with SimpleProfiler

Relector: plugin which call Reflector to browse selected assembly
ILMerge: plugin which call ilmerge to merge selected assemblies
Edit File: plugin which call your editor to view selected assembly
Plugin Sample: plugin sample

Copy Info: copy information of selected assemblies to clipboard
Open Folder: open container folder
Delete File: delete selected file(s)

Requirements:
.Net Framework 4.0 or upper
.Net Framework 4.0 SDK or upper

Installation:
1. Install .Net Framework 4.0 or upper
2. Install .Net Framework 4.0 SDK or uppder
3. Extract to any directory

Usage:
1. Click Click Click …
2. Select one or many …
3. Double Click or Right Click ….

This is hompage of that tool:

https://sites.google.com/site/simpledotnet/simple-assembly-explorer

Screenshot:

 

SAE

It also be able to use decompile engine of .NET Reflector or ILSpy to show the higher level programming codes (C#,VB.NET) but primary is IL, which is a bit harder for beginner. But it’s not a big issue

Download link (Official Direct link):

DOWNLOAD v1.14.4 for 64bit system
DOWNLOAD v1.14.4 for 32 bit system

Enjoy and best regard,
Levis