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...)
(Còn tiếp...)
No comments:
Post a Comment