Tag: .NET Reflector

Series Reversing/Cracking .NET cơ bản bằng tiếng Việt

Xin chào,

Tôi đã trở lại sau một thời gian vắng bóng. Chỉ là tôi ít viết blog hơn. Ít viết blog thôi nhé, chứ còn tôi vẫn viết, nhưng tôi viết và up ở nơi khác. Tôi viết cũng khá nhiều thể loại, từ văn học kích động quần chúng, công kích cá nhân, đả phá, xuyên tạc, bôi nhọ danh dự cũng như quyền lợi của các ông lớn (trong ngành phần mềm), nhiều khi tôi còn cổ súy một cách nồng nhiệt cho việc ngồi xổm lên luật pháp (vi phạm bản quyền), lúc hứng chí thì lại quay ra viết các thể loại ngôn tình sướt mướt, cũng ít nhiều lấy đi nước mắt người đọc và làm xao xuyến trái tím non nớt của nhiều bạn trẻ mới chập chững vào đời. Ôi chao…

Chính vì một trong các nguyên nhân đó mà đợt trước tôi có bị WordPress gọi lên cảnh cáo và yêu cầu rút kinh nghiệm sâu sắc, vì có những hành vi sai trái, không hợp chuẩn mực ứng xử của blogger trong thời gian vừa qua, nếu còn tái phạm chắc bị đình chỉ công tác và thuyên chuyển qua Blogspot, thế nên tôi sợ lắm, không dám manh động nữa, để giữ chắc cái ghế tôi đang ngồi, hoặc âm thầm tự diễn biến, tự chuyển hóa sang một dạng khác, lén lút hơn, tinh vi hơn và dĩ nhiên, có tổ chức hơn.

Nói nhiều như vậy nhưng nó chỉ xoay quanh một chủ thể chính: Những bài viết của tôi. Bởi vì tự nhiên hôm nay tôi giật mình ngồi nhìn lại, thấy trong những năm tháng qua, tôi viết nhiều papers, làm nhiều tuts, cố gắng giữ gìn rồi cũng rơi rụng bớt phần nào, là do mọi thứ thay đổi quá nhanh.

Có những cái host ngày xưa tôi đinh ninh rằng nó trường tồn lắm, như megaupload, rapidshare,…. Nhớ lại nhiều năm về trước, tôi cặm cụi làm rồi up, làm rồi up không ngừng nghỉ, hòng lưu giữ lại những thứ tôi coi là giá trị, những bài viết, những video tôi tự quay, những clip được dàn dựng cắt ghép công phu (tất nhiên là không che),…. Rồi một ngày đẹp trời, đám service provider bông nhiên lăn đùng ngã ngửa ra. Ngoảnh mặt lại, đã thấy mình trắng tay…

Giờ đây, đó đã là “vài năm về trước”, khi tôi còn hoang dại và thơ ngây, những bài viết non nớt. Ấy thế mà đó lại là một phần trong chuyến phiêu du của tôi, ghi lại những dấu ấn nhất định, và tôi rất tôn trọng chúng, chỉ tiếc rằng tôi không giữ nổi. Ngày đó nghèo, cái usb còn không có, chứ không đã lưu lại offline, để sau này truyền lại thành bài học cho con cháu, theo kiểu “Đấy, mày thấy chưa, thằng bố mày ngày xưa trẩu thế này này, đừng dại mà làm theo con nhé”.

Rồi tôi nghe phong phanh thấy thiên hạ đồn rằng up lên Github không sợ bị remove, nên tôi cũng thử một lần cho biết, bởi vì trước đây hình như có thằng cha nào up cả cái bộ IDA (leaked) lên, rồi bị report, Github mới biết và xóa đi. Cho nên chắc cũng ổn.

Xin giới thiệu với các bạn loạt tut về Reversing/Cracking .NET cơ bản dành cho người mới bắt đầu. Loạt tut này trước đây tôi làm rồi bán để lấy tiền mua cây đờn đặng tính học gảy để đờn cho người con gái nọ (đọc xong bài này bạn cuộn chuột lên dầu trang và liếc nhẹ sang bên phải). Thế rồi giờ em đã có người yêu, biết gảy đàn và hát hay, còn tôi thì phiêu bạt chân chời góc bể, đờn vẫn mang theo, những chẳng bao giờ gảy… Đó là cuộc đời…

Xin thứ lỗi, tôi không có ý định viết ngôn tình đâu, nhưng cứ động đến là cảm xúc nó lại cứ phọt ra như vậy đấy. Xin mô tả sơ qua về loạt tut này. Tut này là tut cũ, và tôi có share cách đây một thời gian trong một số channel mật. Thực ra nó không có gì đặc biệt để phải giấu diếm lâu như thế, chỉ bởi vì tôi tôn trọng những người hảo tâm đã mua đám tut này của tôi, nên tôi giữ kín trong một thời gian dài để đảm bảo quyền lợi cho họ. Còn bây giờ thì chắc là khấu hao nó cũng hết, nên tôi mới public.

Loạt tut này thuộc vào dạng “Hết sức cơ bản”, dành cho cả những người chưa biết gì. Trong mỗi tut tôi có cố gắng giải thích cặn kẽ hết sức có thể trong khả năng của tôi. Mỗi tut bao gồm:
– Video hướng dẫn
– Target được sử dụng trong mỗi video (crackme, apps,…)
– Các công cụ, tài liệu có liên quan đến nội dung video
– Bài tập: Các target khác tương tự như target trong video để người đọc sau khi xem xong có thể thực hành lại.

Mục lục:

  1. Gió
  2. Khởi đầu – Reflector và Serial Fishing
  3. Patching (Phiên bản văn minh với Reflexil)
  4. Patching (Phiên bản cồng kềnh với Hex Editor)
  5. Đọc code và Keygen (phần 1)
  6. Đọc code và Keygen (phần 2)
  7. Unpack .NET đơn giản
  8. Unpack .NET cùng Beloved Olly
  9. Tập cách kéo thả cùng de4dot
  10. Tạo keygen ứng dụng thương mại
  11. Vạn kiếm quy tông – Thử lửa với hần mềm đăng kí sim rác

Link download:

https://github.com/levisre/dotnettuts

Hi vọng nó sẽ có ích cho các bạn, ở một khía cạnh nào đó 🙂

Enjoy and best regards,

Levis

P/S: Về loạt bài Flare-on, tôi đình công vì phía FireEyes làm ăn cồng kềnh, gần nửa năm rồi mà không thấy giải thưởng gửi về. Bao giờ tôi nhận được giải thì biết đâu, bằng một biện pháp tâm linh nào đó, tôi lại có hứng để viết tiếp thì sao?

Advertisements

[Bài viết] Các thuật ngữ thường gặp trong .NET Reverse Engineering

Xin chào các bạn,

Đây là bài viết mới nhất của tôi trong loạt bài viết tiếng Việt về .NET Reverse Engineering. Trong bài viết này tôi đã tổng hợp và ghi chép lại các thuật ngữ thường gặp trong .NET Reverse Engineering, kèm theo lời giải thích và một số hình minh họa, để làm tài liệu tiện cho mọi người tra cứu. Vì được viết trong thời gian ngắn nên chưa tập hợp đủ các thông tin, thuật ngữ còn thiếu. Vậy nên, tôi rất hoan nghênh nếu các bạn có thể đóng góp những gì mình biết, bổ sung để bài viết trở nên hoàn thiện hơn. Xin cảm ơn!

Các bạn có thể đọc bài viết tại đây:

 

Enjoy and best regards,

Levis

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 🙂

JustDecompile – A Great free decompiler for .NET Program

Hello all mates,

This is another tool to help you Decompile .NET assembly ( same as .NET Reflector, but it’s free), named JustDecompile. It’s developed by Telerik (A commercial Company), so it’s well developed and very stable. This tool is not new, but I think this is a good replacement of .NET Reflector. Just download, install it and enjoy! 🙂

Let’s see what Softpedia said:

JustDecompile description
Decompile your applications with ease

JustDecompile is a productivity tool for developers designed to enable easy .NET assembly decompiling and browsing.

JustDecompile builds on years of experience in code analysis and development productivity originally created for JustCode, Telerik’s Visual Studio productivity add-in. JustDecompile lets you effortlessly explore and analyze compiled .NET assemblies, decompiling code with the simple click of a button.
Here are some key features of “JustDecompile”:

Innovative Code Navigation and Analysis:
Telerik JustDecompile offers the industry’s leading code search and navigation features enabling you to quickly locate and navigate to different parts of your code. All loaded assemblies can be effortlessly browsed by type, method or member, results appear on-the-fly as you type and can be navigated effortlessly. JustDecompile also benefits from one-click load of all system libraries for each framework and trim. Developers can also create their own custom assembly lists and load them at the click of a button.
Side-by-side Assembly Loading:
Telerik’s stand-alone free decompiling tool allows the concurrent load of a broad range of .NET framework version systems (1.1, 2.0….4.0, Silverlight and Compact Framework). This capability enables references to be resolved correctly, results in the seamless navigation through any given framework version system library, and eliminates the need for jumping across version boundaries.
Better Decompiling Accuracy:
Not all decompiling is created equal. JustDecompile goes beyond existing decompiling tools by better decompiling language features like lambda expressions, generics, yield statements, and auto-generated properties. Decompiling speed and accuracy will continue to improve during the BETA.
Powerful Free Tool by a Leading Commercial Vendor:
Unlike Open Source alternatives, Telerik JustDecompile benefits from a dedicated development team, which is focused on continuously improving the product in line with your feedback. Telerik is recognized as one of the leading providers of .NET development tools and JustDecompile will benefit from our years of experience in the field.
Auto-updating and Regular Updates:
JustDecompile is evolving quickly. Thankfully, from day one JustDecompile ships with built-in support for auto-updating when new versions are available. JustDecompile will be updated frequently during the BETA, and will receive 3 major updates per year. Stop settling for stale tools, and always work with JustDecompile, a decompiling tool that is evolving and has the latest and greatest features.
Professional Support:
Getting started and resolving any issues that you might face is easy with Telerik’s Forums. In addition to tips and tricks by one of the largest and most passionate .NET communities out there, you will benefit from professional support by the very same developers who created JustDecompile. They frequent the forums to ensure no question is left unanswered and no issue left unaddressed.

What’s New in This Release: [ read full changelog ]

New:
The fastest decompilation among all .NET decompilers
Plugin manager
Ability to load x86/x64 .net framework assemblies

Reverse Engineering .NET JustDecompile
Click to see full image

Download link:

Download from Softpedia

Enjoy Reversing and Best Regards,

Levis