Tag: ida

How to learn Reverse Engineering?

Cứ một vài ngày lại có 1 gã mới xuất hiện ở Tuts4you và hỏi rằng: “Tôi muốn học Reverse Engineering, vậy thì tôi nên bắt đầu từ đâu?”

Hmmm….

Có rất nhiều lời khuyên được đưa ra, ví dụ như ở trong bài viết trên Reddit này. Một trong những lời khuyên phổ biến nhất là háy bắt đầu với loạt hướng dẫn của Lena151. Lí do là loạt hướng dẫn này cung cấp được cái nhìn tổng quan về những thao tác phổ biến cần thực hiện, những công cụ phổ biến cung cấp đến sự hài lòng ngay lập tức. Nhưng liệu những bài hướng dẫn đó có thực sự dạy bạn về Reverse Engineering? Tôi không nghĩ như vậy

Tại sao các bài hướng dẫn của Lena151 lại không tốt

Thực tế thì tôi không phải người duy nhất nghĩ như vậy:

Tôi đã nghĩ tại sao việc này lại xảy ra. Về cá nhân tôi, tôi đã bắt đầu học Reverse Engineering bằng cách xem loạt bài hướng dẫn của Lena151. Tôi đã nghĩ rằng chúng thật tuyệt vời chỉ đến khi Daeken nói với tôi rằng đó thật sự là một phương pháp tồi tệ để học Reverse Engineering.

Lúc đầu tôi vẫn không hiểu tại sao (anh ta nói) chúng là không tốt. Loạt bài viết của Lena đã dạy cho tôi để tôi có thể crack phần mềm đầu tiên.

Và đó chính là vấn đề đấy. Bạn chỉ muốn crack phần mềm. Đó là sự thỏa mãn trong thoáng chốc. Nhưng thực tế là bạn đã học được những gì? Chạy một vài công cụ phổ biến, tìm “từ huyệt (bad boy jump” và patch nó? Wow! Bạn thật sự “l33t” (một tính từ châm biếm, kiểu “pro, khủng” khi nói các trẻ trâu) đấy.

Trong thực tế, loạt bài hướng dẫn này đã tạo ra cả một thế hệ những kẻ “muốn làm cracker”, những kẻ chỉ biết sử dụng các công cụ có sẵn, nhưng thực tế thì không biết cách động não (script kiddies). Với mỗi vấn đề gặp phải, họ cần một video hướng dẫn. Chỉ cần một khúc mắc nhỏ thôi họ cũng lập một topic để yêu cầu giúp đỡ.

Đấy mới chỉ là một phần của vấn đề.

Những video hướng dẫn tạo bởi người mới (beginner) thậm chí còn tệ hơn

Albert Einstein đã từng nói:

Tôi càng biết nhiều, thì tôi càng nhận ra rằng càng nhiều thứ tôi không biết.

The more I learn, the more I realize how much I don’t know.

Những người mới, những người xem series của Lena151 không nhận ra điều này. Họ crack được một chương trình đầu tay và họ tự nhận mình là Reverser. Và điều tệ hơn nữa là, họ cố gắng chia sẻ “kiến thức” của họ bằng cách làm vô số những video hướng dẫn “siêu siêu tệ” để cho thế hệ những kẻ “muốn làm cracker” sau xem.

Tôi đã từng xem một video dài 15 phút có tiêu đề “Làm cách nào để Unpack CryptoObfuscator”. Bạn biết nó như thế nào ko? Bạn kéo-và-thả file vào trong de4dot. Chỉ đơn giản như vậy thôi. Vâng, cóngười đã làm một video 15p để dạy bạn làm như thế đấy.

Vậy, cách tiếp cận khác là gì?

Blog ReverseWithme khuyên nên học:

1. x86 Assembly (Giống như hệ thống điện và dây dẫn trong một chiếc ô tô)

2. Cách mà hệ điều hành hoạt động và cách chúng quản lý bộ nhớ (giống như động cơ xe)

3. Quá trình biên dịch từ code C thành Assembly (điều này tương tự như biết cách làm sao để lắp rap một chiếc xe)

4. Chu trình của một mã nhị phân (“The lìfe òf a binary”, khó dịch sát nghĩa) (tương tự như việc hiểu tất cả mọi thứ xảy ra trong chiếc xe từ khi tra khóa vào ổ để khởi động cho đến khi tắt máy).

Tôi cũng không nghĩ đây là hướng đi đúng đắn.

Giống như là bạn học một ngoại ngữ bằng cách đọc một quyển từ điển. Bắt đầu với chữ “a”, và một khi bạn kết thúc chữ “z”, bạn biết tất cả các từ. Có thể. Nhưng bạn sẽ không thể nào đặt được một câu hoàn chỉnh, hay giao tiếp được với một người bản xứ.

Lấy 1 ví dụ: Tôi đã làm Reverse các file .NET trong vòng 10 năm rồi. Tôi đã viết một vài unpackers cho một vài .NET Protectior đơn giản. Và đến giờ tôi vẫn không thể hiểu đưọc IL assembly một cách “thấu đáo” (by heart). Tại sao? Bởi vì tôi không cần phải thế? Dạng biểu diễn dễ nhớ của “branch-if-equal” (rẽ nhánh nếu bằng nhau, một chỉ lệnh IL) là gì? Nó là be, beq, hay bre? Nó lấy 1 hay 2 tham số từ stack ra?. Tôi không biết. Nếu khi nào tôi cần biết, thì chỉ việc tìm kiếm trên Google.

Vâng, để trở thành 1 Reverse tốt, bạn cần phải nắm vững hầu hết những mảng kiến thức đã nêu ở trên. Nhưng bạn không cần phải biết tất cả khi bạn mới bắt đầu tìm hiểu.

Nói tôi biết câu trả lời đi, mẹ kiếp! (Dịch nguyên văn)

À, hãy bắt đầu với loạt hướng dẫn của Lena151. Đúng, tôi nói chúng không tốt, nhưng đó là điều tốt nhất chúng ta có ở đây. Và nếu bạn làm theo một vài lời khuyên thêm dưới dây, bạn sẽ có một khởi đầu khá ổn:\

  • Học cách nghĩ cho bản thân mình. Đây là phần quan trọng nhất. Đừng chỉ mù quáng làm theo những bài hướng dẫn, mà hãy cố gắng để hiểu rằng tại sao lại như vậy, và điều đó xảy ra bằng cách nào.
  • Học cách tìm kiếm. Đa phần các câu hỏi đều đã được trả lời, bạn chỉ cần kiếm câu trả lời mà thôi. Hãy luôn nhớ rằng “Google is your friend”!
  • Tìm hiểu về các công cụ mà bạn có. Bạn không cần phải biết đến từng tùy chọn, và các tính năng của công cụ bạn có. Đa phần người ta chỉ sử dụng khoảng 10% tính năng của Microsoft Excel. Dân chuyên nghiệp thì có thể dùng đến khoảng 20%. Điều này cũng tương tự với các công cụ RE. Nếu bạn có thể sử dụng thuần thục 10% các tính năng của Olly hay IDA, là bạn đã có thể làm rất ổn rồi.
  • Và điều cuối cùng, hay luôn vui vẻ và đam mê! Không có gì hủy diệt năng suất làm việc của bạn nhanh hơn sự nhàm chán. Nếu như vấn đề quá khó, thì hãy bỏ nó đi, thử một vài thứ khác, và quay lại nghiên cứu tiếp vấn đề đó sau.

(Dịch từ bài viết trên blog của kao – Translated from English article at kao’s blog)

Advertisements

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

5. ILDASM

ILDASM là tên viết tắt của IL Disassembler. Đây là 1 công cụ decompile các file .NET của chính Microsoft tạo ra, nằm cùng trong bộ Visual Studio+ Window SDK, có thể được gọi từ Visual Studio Command Prompt (nguồn: MSDN). Chức năng chính là dịch ngược chương trình .NET và có thể chuyển về dạng IL, sau đó save lại dưới dạng txt file. Chúng ta có thể sửa code từ file text này, và sau đó compile lại bằng một công cụ đi cùng với ILDASM là ILASM. ILDASM và ILASM (cũng nằm trong bộ Visual Studio).

Đúng như tên gọi của nó, ILDASM chỉ đơn thuần là 1 công cụ Disassemble không hơn không kém, và nhiệm vụ của nó chỉ là dịch ngược về mã IL, cho nên nó thiếu đi rất nhiều tính năng cần thiết như :code analysis, code search, multi-file disassemble,

ILDASM

ILDASM

+ Điểm cộng: Nhẹ, có sắn (nếu như có cài Visual Studio và Windows SDK), hiện thị code tốt, export code khá tốt

+Điểm trừ: Quá đơn điệu, thiếu nhiều tính năng cơ bản cũng như các tính năng mở rông, nâng cao

6. ILSpy

Thông tin và download: http://ilspy.net/

ILSpy là trình decompiler/Disassembler mã nguồn mở, được tạo ra nhằm mục đích thay thế cho .NET Reflector sau khi Red-Gate mua lại .NET Reflector và biến nó thành phần mềm thương mại. ILSpy là 1 công cụ rất nhẹ, chỉ bao gồm các tính năng cơ bản đủ dùng, đã có thể thay thế một phần nào .NET Reflector. Cá nhân tôi thích nhất ở phần mềm này là sự nhanh và nhẹ của nó. Code sau khi dịch ngược khá chuẩn xác.

Tính năng:

  • Assembly browsing
  • IL Disassembly
  • Support C# 5.0 “async”
  • Decompilation to C#
    • Supports lambdas and ‘yield return’
    • Shows XML documentation
  • Decompilation to VB
  • Saving of resources
  • Save decompiled assembly as .csproj
  • Search for types/methods/properties (substring)
  • Hyperlink-based type/method/property navigation
  • Base/Derived types navigation
  • Navigation history
  • BAML to XAML decompiler
  • Save Assembly as C# Project
  • Find usage of field/method
  • Extensible via plugins (MEF)
  • Assembly Lists

ILSPY

ILSpy

+ Điểm cộng: RẤT NHẸ, nhanh, đầy đủ tính năng cơ bản, mã nguồn mở, miễn phí

+Điểm trừ: Ít plugin, thiếu tính năng mở rộng nâng cao

7. Dotnet Resolver

Thông tin và download: http://dotnetresolver.eu5.org/

Đây là 1 công cụ do cộng động Reverser thiết kế ra, nhằm mục đích thay thế cho .NET Reflector và các chương trình decompile khác, Vì được xây dựng bởi các Reverser có nhiều kinh nghiệm cho nên nó đáp ứng được khá đầy đủ các tính năng cần thiết, vừa có sự trực quan và dễ sử dụng như .NET Reflector, vừa nhẹ và nhanh như ILSpy, vừa nhẹ và nhanh hơn cả ILSpy, và cũng rất mạnh, gần như SAE. Cá nhân tôi đánh giá đây là 1 công cụ rất tốt, tuy nhiên công cụ này khá mới mẻ và vẫn còn đang trong giai đoạn phát triển, và chúng ta có thể hi vọng sẽ có thêm nhiều tính năng mới trong tương lai. Phiên bản hiện tại rất ổn định và đã sẵn sang để sử dụng.

Tính năng:

  • Translate to C# and Visual Basic
  • Editing MSIL Instructions
  • Stable Assembly Reader
  • Member Analyser
  • Plug-in Support

dotnet resolver

DotNet Resolver

+Điểm cộng: Nhanh, mạnh, khá đầy đủ tính năng, nhẹ, miễn phí, phát triển tốt, dễ sử dụng, khả năng mở rộng tốt

+Điểm trừ: Ít plugin

8. IDA

Thông tin và download: https://www.hex-rays.com/products/ida/

IDA thì quá nổi tiếng trong giới Reverser rồi. Đây là công cụ mạnh nhất trong việc dịch ngược và phân tích chương trình với rất nhiều plugin và các tính năng chuyên nghiệp. Thế nhưng nhà phát triển IDA tập trung chủ yêu vào việc phát triển công cụ này cho mục đích dịch ngược native PE file và các ứng dụng trên các nền tảng khác như iOS, ARM, Linux, Android,… Cho nên các tính năng cho việc dịch ngược .NET chỉ dừng lại ở mức vừa đủ, không thế so sánh với các chương trình dịch ngược tôi đã giới thiệu ở trên được. Và tôi cũng không sử dụng IDA quá nhiều cho việc dịch ngược các chương trình .NET, cho nên phần này chỉ viết cho mục đích để tham khảo là chính, không thể đánh giá cụ thể. Bởi vì chỉ dựa trên khả năng dịch ngược .NET của IDA mà đánh giá sức mạnh của chương trình này thì thật sự không chính xác chút nào.

IDA

IDA

(còn tiếp)

Đọc phần 1 tại đây