Wednesday 26 February 2014

Xây dựng trình cắm cho IDA Pro (Phần 2)


Bản thân IDA là một trình đảo mã tuyệt vời cùng với một số lượng lớn các trình gỡ rối. Khi mà bản thân IDA đã có một lượng lớn các chức năng, thì luôn có những thứ mà bạn muốn nó được thực hiện tự động hoặc là làm việc theo những cách mà IDA không hỗ trợ. Thật may mắn là nhà phát triển Hex-Rays đã cho phát hành IDA SDK, đây là cách để bạn kết nối những chức năng mà bạn phát triển với IDA.
Có 4 loại modun mà bạn có thể viết cho IDA sử dụng IDA SDK, modun trình cắm là chủ đề của bài viết này
Kiểu Modun
Mục đích
Trình xử lý
Hỗ trợ thêm cho những kiến trúc ví sử lý khác. Được biết như là các Modun IDP.
Trình cắm
Mở rộng các chức năng khác cho IDA
Trình nạp
Hỗ trợ nạp nhiều định dạng tập tin thực thi
Trình gỡ rối
Hỗ trợ việc dò lỗi trên nhiều nền tảng khác nhau và tương tác với các trình gỡ rối, cho phép gỡ rối từ xa.

Từ đây trở đi, thuật ngữ “trình cắm” sẽ được sử dụng để thay thế cho “plugin modun”, ngoại trừ những trường hợp cần thiết phải nói rõ.
IDA SDK đã bao gồm tất cả những tập tin tiêu đề và thư viện cần thiết để viết trình cắm cho IDA. Nó hỗ trợ một số trình biên dịch trên Linux, Mac và Windows, và cũng kèm theo nhiều ví dụ minh họa những chức năng cơ bản.
Cho dù bạn là một nhà đảo mã, một người nghiên cứu lỗ hồng, phân tích phần mềm độc hại, hoặc làm tất cả những việc trên, SDK cho bạn một sức mạnh lớn và sự mềm dẻo. Bạn có thể tự viết một trình gỡ rối hoặc trình đảo mã mà chỉ sử dụng SDK, và đó chỉ là sự hỗn độn bề ngoài. Đây là một trong những ví dụ nhỏ dễ hiểu về những điều mà bạn có thể làm với SDK.
§  Tự động hóa việc phân tích và giải nén cho những tập tin nhị phân được đóng gói.
§  Tự động hóa việc tìm kiếm việc sử dụng những hàm cụ thể (ví dụ, LoadLibrary(), strcopy(), và bất cứ thứ gì mà bạn có thể nghĩ ra)
§  Phân tích luồng chương trình và dữ liệu, xem xét những thứ mà bạn thấy thích thú.
§  So sánh sự khác biệt giữa 2 tập tin nhị phân
§  Viết một trình dịch ngược.
Vv
Để thấy được ví dụ về những gì mà một số người đã viết sử dụng IDA SDK, tham khảo IDA Palace website hoặc tại trang tải về của ida để biết thêm.
2.1 Cài đặt
Rất dễ dàng. Một khi bạn đã có được SDK (mà thường được nén trong một tập tin dạng .zip), giải nén nó vào một nơi mà bạn chọn. Nơi tôi thường đặt SDK là trong thư mục cài đặt IDA và đặt tất cả mọi thứ vào trong này, nhưng điều này không quan trọng.
2.2 Cấu trúc thư mục
Thay vì đi qua tất cả những thư mục và tập tin trong SDK. Tôi dự định sẽ đi qua các thư mục cần thiết để viết plugin và những gì mà chúng chứa.
Thư mục
Nội dung
/ (Thư mục gốc)
Thư mục gốc chứa các tập tin hướng dẫn biên dịch (makefile) hỗ trợ nhiều môi trường khác nhau, bạn có thể đọc qua tập tin readme.txt trong cùng thư mục để có được cái nhìn tổng thể về SDK, và thấy những thay đổi qua các phiên bản.
Include/
Những tập tin tiêu đề được phân loại theo nhóm tùy theo chức năng. Tôi khuyên bạn nên đọc qua tất cả các tập tin và ghi chú lại những hàm mà bạn thấy cần thiết sau khi đọc qua tài liệu này.
Libbor.wXX/
Đây là những thư viện hàm được IDA sử dụng khi liên kết với trình biên dịch Borland C
LibgccXX.lnx/
LibgccXX.mac/
Các thư viện được sử dụng khi liên kết với trình biên dịch GCC trên nền Mac hoặc Linux
Libgcc.wXX
Các thư viện được sử dụng khi liên kết với GCC sử dụng trong nền Windows
Libvc.wXX
Thư viện IDA sử dụng khi liên kết với trình biên dịch Visual C++ trên nền Windows
Plugins/
Thư mục chứa các trình cắm mẫu
XX là 32 (bit) hoặc 64 (bit), tùy thuộc vào kiến trúc vi sử lý mà bạn đang sử dụng.
2.3 Những tập tin tiêu đề
Có 52 tập tin tiêu đề trong thư mục include, tôi thấy những tập tin sau là cần thiết nhất khi viết plugins cho IDA. Nếu bạn muốn thông tin về tất cả các tập tin tiêu đề, hãy đọc tập tin readme.txt trong thư mục gốc của SDK, hoặc trực tiếp trong tập tin tiêu đề. Danh sách này chỉ cung cấp một tra cứu ngắn gọn khi tìm kiếm một chức năng cụ thể nào đó – nhiều chi tiết hơn sẽ được trình bày trong những phần sau.
Tập tin
Nội dung
area.hpp
Chứa lớp area_t và areacb_t được sử dụng để đại diện cho một “khối”mã, hai lớp này sẽ được trình bày chi tiết ở phần sau.
bytes.hpp
Chứa các định nghĩa và hàm làm việc với những byte trong tập tin được đảo mã.
dbg.hpp & idd.hpp
Chứa những lớp làm việc với trình gỡ rối và các hàm chức năng
diskio.hpp & fpro.h
Chứa các hàm bao cho những hàm chuẩn của ngôn ngữ C như fopen(), open() và một số hàm hỗ trợ để làm việc với tập tin và thư mục.
entry.hpp
Những hàm trong này được dùng để lấy thông tin và thao tác với các điểm nhập (entry point) của tập tin thực thi.
frame.hpp
Những hàm này hỗ trợ làm việc với bộ nhớ như ngăn xếp, ngăn xếp cục bộ hàm, các biến và nhãn cục bộ.
funcs.hpp
Chứa lớp func_t và các hàm làm việc với lớp này.
ida.hpp
Chứa cấu trúc idainfo, cấu trúc này chứa hầu hết thông tin về tập tin được đảo mã.
kernwin.hpp
Các lớp và hàm dùng giao tiếp với IDA.
lines.hpp
Các định nghĩa và hàm làm việc với văn bản được đảo mã, màu sắc mã.
loader.hpp
Chứa hầu hết các hàm có nhiệm vụ nạp tập tin thực thi và thao tác với IDB.
name.hpp
Các hàm và định nghĩa được dùng để thao tác và thiết lập tên gọi cho các byte (tên biến, tên hàm …)
pro.h
Chứa rất nhiều các hàm tiện ích, các định nghĩa
search.hpp
Chứa rất nhiều hàm và định nghĩa dùng để tìm kiếm văn bản, dữ liệu, mã trong tập tin bị đảo mã và nhiều hàm hữu dụng khác.
segment.hpp
Chứa lớp segment_t và tất cả các hàm làm việc với các đoạn nhị phân và các vùng.
strlist.hpp
Cấu trúc về thông tin chuỗi string_info_t và các hàm liên quan để đại diện cho mỗi chuỗi trong một danh sách chuỗi của IDA.
ua.hpp
Chứa lớp insn_t, op_t và optype_t mô tả các chỉ thị của hợp ngữ, các toán tử, kiểu toán tử cùng với các hàm để thao tác với trình phân tích IDA.
xref
Các hàm làm việc với các tham chiếu văn bản và tham chiếu dữ liệu.

2.4 Sử dụng SDK

Nói một cách tổng quát, bất cứ hàm nào trong tập tin tiêu đề có tiền tố là ida_export thì sẵn sàng để bạn sử dụng, cũng như những biến toàn cục có tiền tố là ida_export_data. Nguyên tắc là nên bỏ qua những hàm ở mức thấp (những hàm đó được xác định trong tập tin header) và sử dụng những hàm ở mức giao diện cao cung cấp. Bất cứ định nghĩa lớp, cấu trúc, và liệt kê thì sẵn sàng cho bạn sử dụng.

(Còn tiếp)

No comments: