Wednesday 26 February 2014

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

Phần 1:
Phần 2:

3. Cài đặt môi trường phát triển
Lưu ý đối với người dùng Borland: Chỉ có trình biên dịch Borland được hỗ trợ bởi IDA SDK không được trình bày trong phần này. Bạn cần phải đọc tập tin install_cb.txt và makenv_br.mak trong thư mục gốc của SDK để xác định những thông số cần thiết cho trình dịch và liên kết.
Trước khi bắt đầu việc viết mã, thì tốt nhất là bạn cần phải có một môi trường lập trình được cài đặt trước để thuận tiện cho quá trình phát triển. Những môi trường phổ biến sẽ được đề cập, thành thật xin lỗi nếu môi trường của bạn không được đề cập ở đây. Nếu bạn đã cài đặt thành công, hãy cảm thấy thoải mái để bỏ qua phần này.

3.1 Hệ điều hành Windows (Sử dụng Visual Studio)
Phiên bản Visual Studio được sử dụng trong ví dụ này là Visual C++ 2008 phiên bản Express, nhưng hầu hết có thể tương tích với những phiên bản cũ hơn.
1
Chọn File à New à Project (Ctrl + Shift + N)
2
Chọn vào thư mục Visual C++, chọn thư mục con Win32, tại đây bạn sẽ chọn biểu tượng Win32 Project. Đặt tên cho dự án này và nhấn OK.
3
Trình thuật sĩ của Visual Studio sẽ xuất hiện, chọn vào Application Settings ở phía bên trái và chắc chắn rằng tùy chọn Windows Application được chọn, sau đó nhấp chọn vào hộp kiểm Empty Project. Nhấn Finish.
4
Trong Khung Solutions Explorer ở phía bên phải, nhấn chuột phải và chọn thư mục Source Files, chọn vào Add à New Item…
5
Chọn C++ File (.cpp) trong phần Templates và đặt tên tập tin. Chọn Add và lặp lại bước này cho những tập tin mà bạn muốn thêm vào.
6
Vào Project à ProjectName à Properties
7
Thay đổi những thiết lập bên dưới (những phần được đặt ở đây là để giảm bớt kích thước của plugin)
Chọn vào mục cấu hình ở trên cùng và chọn Release
Configuration Properties à General : thay đổi Configuration Type thành Dynamic Library (.dll)
C/C++ à General : Chọn vào Detect 64-bit Portability Issuses giá trị No
C/C++ à General : Đặt giá trị Debug Information Format thành Disabled.
C/C++ à General : Thêm thư mục Include của SDK vào Additional Include Directory (vd : C:\IDA\SDK\Include)
C/C++ à Preprocessor : thêm NT; IDP vào mục Preprocessor Definitions
C/C++ à Code Generation : Tắt chế độ Buffer Security check, đặt Basic Runtime Check thành Default và đặt Runtime Library thành Multi-thread
C/C++ à Advanced : Calling Convention thành stdcall
Linker à General : Thay đổi Output từ *.exe thành *.plw trong thư mục IDA plugin
Thêm đường dẫn của thư mục chứa thư viện libvc.wXX vào Additional Library Directory. (vd. C:\IDA\SDK\libvc.w32
Linker à Input : Thêm ida.lib vào Additional Dependencies.
Linker à Debugging : Generate Debug Info thành No
Linker à Command Line : Thêm vào /EXPORT:PLUGIN
Build Events à Post-Build Event : Đặt lệnh cho idag.exe khởi động IDA sau mỗi lần plugin được dịch thành công (Tùy chọn)
Chọn OK
8
Vào Build à Configuration Manager và thay đổi mục trong hộp xổ xuống tại cột Configuration từ Debug thành Release. Chọn OK
9
Xem phần 3.5

3.1.1 Sử dụng Python để biên dịch
Ngoài việc sử dụng Visual Studio để biên dịch, bạn có thể sử dụng trực tiếp giao diện dòng lệnh thông qua sự trợ giúp của Python.
……… (Phần này sẽ bổ xung sau)
3.2 Hệ điều hành Windows, sử dụng Dev-C++ với trình GCC và MingGW
Bạn có thể lấy một bản sao chép của Dev-C++, GCC và MinGW như một gói từ http://www.bloodshed.net/dev/devcpp.html. Cài đặt và cấu hình nó thì không thuộc phạm vi của tài liệu này, bởi vậy kể từ đây, tôi sẽ giả sử là tất cả các bước trước đó đều hoàn tất.
Cũng như trước, khởi động Dev-C++ và chắc chắn rằng không có dự án và tập tin nào được mở, chúng ta muốn cấu hình mọi thứ từ đầu.
1
Chọn vào File à New Project, chọn Empty Project, hãy chắc chắn rằng C++ Project được chọn và hãy đặt tên cho nó, sau đó chọn OK.
2
Chọn thư mục để lưu tập tin đề án, đây có thể là bất cứ đâu bạn thích. Chọn OK
3
Vào Project à New File, đây là nơi sẽ chứa mã nguồn của plugin. Lặp lại bước này với những tập tin mà bạn muốn thêm vào dự án.
4
Vào Project à Project Options, chọn vào mục Parameter.
5
Trong mục C++ Compiler, thêm vào
-DWIN32 –D NT –D IDP –v –mrtd
6
Trong mục Linker, thêm vào
../path/to/your/sdk/libgcc.wXX/ida.a –Wl, --dll –shared
Chú ý rằng tốt nhất đường dẫn nên bắt đầu với ../, bởi vì msys có vẻ bị lúng túng khi bạn sử dụng /, và nó cố gắng tham chiếu nó vào thư mục gốc của msys.
7
Chọn vào mục Directory, và mục con Include Directories. Thêm đường dẫn SDK vào danh sách.
8
Trong mục Build Options, đặt Executable Output trỏ đến thư mục chứa plugin của IDA, và ghi đè tập tin kết xuất với phần mở rộng là .plw.  Chọn OK.
9
Xem phần 3.5

3.3 Hệ điều hành Linux, sử dụng GCC
Không giống như những plugin trong môi trường Window, được kết thúc bởi .plw. Những plugin trong Linux cần phải được kết thúc bằng .plx. Hơn nữa, trong ví dụ này, không có trình IDE, bởi vậy thay vì đi qua một loạt các bước. Tôi sẽ chỉ trình bày những thông số cần thiết cho Makefile mà bạn sẽ phải dùng. Ví dụ bên dưới có thể không phải là một tập tin Makefile rõ ràng, nhưng nó sẽ làm việc.
Trong ví dụ này, Ida được cài đặt tại /usr/local/idaadv, và SDK được đặt tại thư mục con sdk. Đặt tập tin makefile này vào thư mục mà bạn chứa mã nguồn của plugin. Bạn cũng cần phải sao chép tập tin plugin.script từ sdk/plugins vào thư mục chứa mã nguồn của bạn và makefile.
Đặt biến SRC bên dưới cho phù hợp với plugin của bạn, và OBJS là những tập tin đối tượng mà nó sẽ được dịch (giống tên, chỉ thay thế bởi phần mở rộng .o)
SRC=file1.cpp file2.cpp OBJS=file1.o file2.o CC=g++
LD=g++
CFLAGS=-D IDP  -D PLUGIN  -c -D LINUX  \
-I/usr/local/idaadv/sdk/include $(SRC)
LDFLAGS=--shared $(OBJS) -L/usr/local/idaadv -lida \
--no-undefined -Wl,--version-script=./plugin.script
all:
$(CC) $(CFLAGS)
$(LD) $(LDFLAGS) -o myplugin.plx cp myplugin.plx /usr/local/idaadv/plugins


Để dịch plugin của bạn, tập tin make sẽ làm việc, và sao chép nó vào thư mục plugins của IDA.

3.4 Những nền tảng khác
Nếu bạn phát triển plugins cho máy Mac và những nền tảng khác không được đề cập ở đây, nguyên tắc chung vẫn giống nhau, tuy nhiên bạn hãy xem xét tập tin pro.h bởi vì bạn sẽ cần phải thay đổi một số thứ trong những chỉ thị tiền xử lý để truyền cho trình biên dịch của bạn. Ví dụ, trong máy Mac bạn sẽ phải định nghĩa MAC_ (thay vì __LINUX_ hoặc __NT_ như được trình bày ở trên), và nếu bạn làm việc với kiến trúc 64bit, bạn sẽ cần phải thêm định nghĩa X64_ (_X86 là mặc định)

3.5 Khuôn mẫu của một plugin
Cách mà IDA được móc nối với plugin của bạn là thông đối tượng PLUGIN của lớp plugin_t, và hầu như đây là thứ duy nhất mà bạn export bằng plugin của bạn (để IDA có thể hiểu nó). Cũng vậy, tập tin duy nhất mà bạn cần thiết phải được bao gồm trong plugin là tập tin ida.hpp, idp.hpp và loader.hpp
Khuôn mẫu bên dưới nên được xem là khuôn mẫu cho tất cả những gì cần thiết để bạn viết một plugin. Nếu bạn dán nó vào một tập tin trong môi trường phát triển của mình, nó sẽ có thể được dịch, và khi bạn chạy nó trong IDA (Edit -> Plugins->Tên plugins, hoặc một phím tắt được định nghĩa), nó sẽ chèn một dòng văn bản “Hello World” vào trong của sổ Log của IDA. Chú ý là ngoài việc khai báo đối tượng PLUGIN là bắt buộc phải đặt đúng tên, còn các khai báo hàm như IDAP_init, IDAP_term, IDAP_run là các tên gợi nhớ, bạn có thể đặt tùy thích và nhớ khai báo chúng tương tứng khi khai báo đối tượng PLUGIN.

#include <ida.hpp>
#include <idp.hpp>
#include <loader.hpp>

int IDAP_init(void)
{
    // Kiem tra o day de chac rang plugin duoc chay trong moi truong
    // phu hop. Tra ve PLUGIN_SKIP neu viec kiem tra that bai
    // nguoc lai se tra ve PLUGIN_KEEP.

    return PLUGIN_KEEP;
}

void IDAP_term(void)
{
    // Doan ma nay duoc thuc hien khi plugin exit, thong thuong
    // ban se can phai lam mot so thu tuc xoa bien o day.
    return;
}

// Mot vai plugin co the duoc truyen cho gia tri kieu nguyen tai tap tin  plugins.cfg
// Dieu nay co the huu dung neu ban muon plugin thuc hien mot chuc nang nao do
// tuy thuoc vao phim tat duoc nhan hoac thuc don nao
// duoc chon.
void IDAP_run(int arg)
{
    // Phan noi dung chinh cua plugin
    msg("Hello world!");
    return;
}

// Doan nay khong co nhieu y nghia. Nhung toi muon dung chung o day
char IDAP_comment[] = "This is my test plug-in";
char IDAP_help[]    = "My plugin";

// Ten cua plugin duoc hien thi tai Edit->Plugins menu. No co the
// duoc ghi de trong tap tin plugins.cfg.
char IDAP_name[]    = "My plugin name";

// Phim tat ma nguoi dung su dung de kich hoat plugin.
char IDAP_hotkey[]  = "Alt-X";

// Phan quan trong nhat la cau truc PLUGIN
plugin_t PLUGIN =
{
    IDP_INTERFACE_VERSION,         // Phien ban IDA ma plugin duoc viet
    0,                     // Nhung co (xem ben duoi)
    IDAP_init,        // Ham khoi tao
    IDAP_term,       // Ham huy
    IDAP_run,         // Phan chinh cua plugin
    IDAP_comment, // Ghi chu (khong dung)
    IDAP_help,        // Giong nhu tren (khong dung)
    IDAP_name,       // Ten cua plugin duoc hien thi o thuc don
                             // Edit->Plugins
    IDAP_hotkey      // Phim tat de chay plugin
};



Bạn có thể bỏ qua việc thiết lập thuộc tính cờ trong cấu trúc PLUGIN, trừ khi nó là một modun dò lỗi, hoặc bạn muốn làm một vài điều như là ẩn nó trong Edit->Plugins. Hãy đọc tập tin loader.hpp để biết thêm thông tin về những cờ mà bạn có thể đặt.

3.6 Cấu hình và chạy plugin
Nếu trình biên dịch của bạn không tự dộng đặt tập tin vào thư mục plugins của IDA, bạn hãy sao chép tập tin plugin (chắc chắn rằng bạn đặt nó có phần mở rộng là .plw cho Windows, hoặc .plx cho Linux) vào thư mục chứa plugins của IDA, và IDA sẽ tự động nạp nó khi khởi động.
Hãy chắc chắn rằng plugins có thể nạp tất cả các thư viện cần thiết (DLL & shared library) lúc khởi động bằng việc thiết lập biến môi trường chính xác (LD_LIBRARY_PATH trong LINUX). Bạn có thể khởi động IDA với tham số cờ -z2 0, sẽ khởi động chế độ dò lỗi của plugin. Điều này sẽ xác định nếu có xảy ra lỗi trong suốt quá trình nạp.
Nếu bạn đặt mã trong hàm IDAP_init(), nó sẽ được thực thi khi IDA nạp tập tin đầu tiên để disassm. Ngược lại, nếu bạn đặt mã vào phần IDAP_run(), nó sẽ được thực thi khi người dùng nhấn phím tắt hoặc thông qua thực đơn Edit->Plugins.

Người dùng có thể ghi đè một vài thông số của PLUGIN trong tập tin plugins.cfg(như là tên và phím tắt), nhưng đó không phải là những điều mà bạn cần phải quan tâm. Tập tin plugins.cfg có thể được sử dụng để truyền những tham số vào plugin của bạn lúc khởi động.

(Còn tiếp...)

No comments: