Saturday 8 November 2014

Xây dựng trình cắm cho IDA Pro - Phần 11

5.2 Thông điệp
Đây là hàm mà bạn sẽ phải sử dụng rất nhiều khi viết plugin, không chỉ bởi vì nó rất hữu dụng, nhưng bởi vì chúng cung chấp một phương tiện giao tiếp đơn giản với người dùng, và có thể trợ giúp rất hữu hiệu khi dò lỗi plugin.
Như đã được nói trong phần định nghĩa, tất cả các hàm đều thuộc dạng inline và sử dụng tham số giống như hàm printf trong C. Tất cả chúng đều được định nghĩa trong kernwin.hpp.
5.2.1 msg
Định nghĩa
inline int msg(const char *format,...)
Chú giải
Hiển thị một thông điệp dạng văn bản trong cửa sổ Nhật ký (Log) của IDA (ở dưới cùng của màn hình trong suốt quá trình đảo mã tĩnh, ở trên cùng màn hình trong suốt quá trình debug). Chuỗi định dạng có dạng giống như C, bạn có thể sử dụng các dấu hiệu thay thế %d (kiểu nguyên), %f (kiểu thực), %s (chuỗi), %c (ký tự), %a (địa chỉ - dạng hexa)
Ví dụ
msg("Starting analysis at: %a\n", inf.startIP);


5.2.2 info
Định nghĩa
inline int info(const char *format,...)
Chú giải
Hiển thị một thông điệp dạng văn bản trong một hộp thoại pop-up với một biểu tượng dạng ‘info’. (!)
Ví dụ
info("My plug-in v1.202 loaded.");


5.2.3 warning
Định nghĩa
inline int warning(const char *format,...)
Chú giải
Hiển thị một thông điệp dạng văn bản trong hộp thoại với một biểu tượng hình ‘warning’
Ví dụ
warning("Please beware this could crash IDA!\n");


5.2.4 error
Định nghĩa
inline int error(const char *format,...)
Chú giải
Hiển thị một hộp thoại dạng văn bản với một biểu tượng dạng ‘error’. Đóng IDA sau khi người dùng nhấn OK.
Ví dụ
error("There was a critical error, exiting IDA.\n");


5.3 Làm việc với UI (Giao diện sử dụng IDA)
Những hàm bên dưới được sử dụng để tương tác với người dùng và IDA GUI. Một vài hàm sử dụng callui() để tạo ra sự kiện cho IDA. Tất cả đều được định nghĩa trong kernwin.hpp.
5.3.1 get_screen_ea
Định nghĩa
inline ea_t get_screen_ea(void)
Chú giải
Trả về địa chỉ tại vị trí mà người dùng đang đặt con trỏ trong tập tin bị đảo mã hiện tại.
Ví dụ
#include <kernwin.hpp>
msg("Cursor position is %a\n", get_screen_ea());


5.3.2 jumpto
Định nghĩa
inline bool jumpto(ea_t ea, int opnum = -1)
Chú giải
Di chuyển con trỏ của người dùng trong tập tin bị đảo mã hiện tại đến địa chỉ được xác định bởi tham số ea. Tùy chọn opnum là hướng mã con trỏ sẽ di chuyển hoặc -1 nếu nó không bị thay đổi. Trả về đúng nếu thành công và sai nếu thất bại.
Ví dụ
#include <kernwin.hpp>
// Jump to the binary entry point + 8 bytes, don't move
// the cursor along the X-axis
jumpto(inf.startIP + 8);


5.3.3 get_cursor
Định nghĩa
inline bool get_cursor(int *x, int *y)
Chú giải
Điền vào *x và *y với giá trị tọa độ X, Y của con trỏ người dùng trong tập tin đảo mã hiện tại
Ví dụ
#include <kernwin.hpp>
int x, y;
// Store the cursor X coordinate in x, and the Y
// coordinate in Y, display the results in the Log window
Get_cursor(&x, &y);
msg("X: %d, Y: %d\n", x, y);


5.3.4 get_curline
Định nghĩa
inline char * get_curline(void)
Chú giải
Trả về một con trỏ đến dòng văn bản đang được trỏ đến bởi người dùng. Hàm này sẽ trả về bất cứ thứ gì trên dòng đó, bao gồm địa chỉ, mã, và ghi chú. Nó cũng sẽ được tô màu, mà bạn sẽ sử dụng hàm tag_remove() (xem phần 5.20.1) để xóa.
Ví dụ
#include <kernwin.hpp>
// Display the current line of text in the Log window
msg("%s\n", get_curline());


5.3.5 read_selection
Định nghĩa
inline bool read_selection(ea_t *ea1, ea_t *ea2)
Chú giải
Điền vào *ea1 và *ea2 với địa chỉ bắt đầu và kết thúc của khối văn bản được người dùng chọn. Trả về đúng nếu có đoạn được chọn, sai nếu không.
Ví dụ
#include <kernwin.hpp>
Ea_t saddr, eaddr;
// Get the address range selected, or return false if
// there was no selection
int selected = read_selection(&saddr, &eaddr);
if (selected) {
msg("Selected range: %a -> %a\n", saddr, eaddr);
} else {
msg("No selection.\n");
}


5.3.6 callui
Định nghĩa
idaman callui_t ida_export_data (idaapi *callui) (ui_notification_t what,...)
Chú giải
Hàm tương tác giới giao diện người dùng. Hàm này cho phép bạn gọi những sự kiện được liệt kê trong mục 4.5.2, và những sự kiện khác trong kiểu enum ui_notification_t. Hàm callui() luôn truyền kiểu ui_notification_t như là tham số đầu tiên (ui_jumpto, ui_banner, vv) tiếp theo là bất cứ tham số nào được yêu cầu bởi cảnh báo tương ứng.
Ví dụ
#include <windows.h> // for the HWND definition
#include <kernwin.hpp>
// For ui_get_hwn, *vptr of callui_t has the result
// We need to cast the result because vptr is a void
// pointer
HWND hwnd = (HWND) callui(ui_get_hwnd).vptr;
// If hwnd is NULL, we’re running under the IDA text
// version
If (hwnd == NULL)
Error(“Cannot run in the IDA text version!”);



5.3.7 askaddr
Định nghĩa
inline int
askaddr(ea_t *addr,const char *format,...)
Chú giải
Hiển thị một hộp thoại yêu cầu người dùng cung cấp một địa chỉ. *addr sẽ là giá trị mặc định để bắt đầu, và sau đó sẽ được điền với giá trị địa chỉ người dùng nhập vào khi nhấn OK. *format là chuỗi định dạng của hàm printf cho biết định dạng của văn bản được nhập vào hộp thoại.
Ví dụ
#include <kernwin.hpp>
// Set the default value to the entry point of the file
Ea_t addr = inf.startIP;
// As the user for an address.
askaddr(&addr, "Please supply an address to jump to.");
// Move the cursor to that address (see section 5.3.2)
jumpto(addr);


5.3.8 AskUsingForm_c
Định nghĩa
inline int
AskUsingForm c(const char *form,...)
Chú giải
Hiển thị một biểu mẫu cho người dùng, nó rất mềm dẻo để có thể được trình bày ở đây, nhưng nó được ghi chú rất rõ ràng trong kernwin.hpp. Nó có thể cho phép bạn thiết kế biểu mẫu của riêng mình, bao gồm nút lệnh, khung nhập văn bản, hộp tùy chọn và văn bản được định dạng.
Ví dụ
#include <kernwin.hpp>
// The text before the first \n is the title, followed
// by the first input field (as indicated by the <>) and
// then a second input field.
// The format of input fields is:
// <label: field type: maximum chars: field length: help
// identifier>
// The result is stored in result1 and result1
// respectively.
// For more information on input fields, see the
// AskUsingForm_c section of kernwin.hpp
char form[] = “My Title\n<Please enter some text “
“ here:A:20:30::>\n<And here:A:20:30::>\n”;
Char result1[MAXSTR] = “”;
Char result2[MAXSTR] = “”;
AskUsingForm_c(form, result1, result2);
Msg(“User entered text: %s and %s\n”, result1, result2);


5.4 Điểm nhập
Những hàm sau được sử dụng để làm việc với điểm nhập (nơi mà chương trình thực thi bắt đầu) trong tập tin nhị phân. Bạn có thể tìm thấy tất cả trong tập tin entry.hpp.
5.4.1 get_entry_qty
Định nghĩa
idaman size_t
ida_export get_entry_qty(void)
Chú giải
Trả về số lượng điểm nhập trong tập tin bị đảo mã hiện tại. Hầu nếu sẽ trả về 1, ngoại trừ đối với tập tin DLL, có thể có nhiều điểm nhập.
Ví dụ
#include <entry.hpp>
msg("Number of entry points: %d\n", get_entry_qty());


5.4.2 get_entry_ordinal
Định nghĩa
idaman uval_t
ida_export get_entry_ordinal(size_t idx)
Chú giải
Trả “số tứ tự” của điểm nhập được xác định bởi chỉ số “index”. Bạn cần số thứ tự bởi vì hàm get_entry() và get_entry_name() sử dụng nó.
Ví dụ
#include <entry.hpp>
// Display the ordinal number for all entry points
for (int e = 0; e < get_entry_qty(); e++)
msg("Ord # for %d is %d\n", e, get_entry_ordinal(e))


5.4.3 get_entry
Định nghĩa
idaman ea_t
ida_export get_entry(uval_t ord);
Chú giải
Trả về địa chỉ của điểm nhập tương ứng với số thứ tự được truyền vào bởi tham số ord. Sử dụng hàm get_entry_ordinal() để lấy giá trị của số thứ tự của điểm nhập, như được trình bày trong phần 5.4.2
Ví dụ
#include <entry.hpp>
// Loop through each entry point.
For (int e = 0; e < get_entry_qty(); e++)
Msg (“Entry point found at : %a\n”, get_entry(get_entry_ordinal(e)));


5.4.4 get_entry_name
Định nghĩa
idaman char *
ida_export get_entry_name(uval_t ord)
Chú giải
Trả về con trỏ đến tên của địa chỉ điểm nhập (ví dụ : start)
Ví dụ
#include <entry.hpp>

// Loop through each entry point
For (int e = 0; e < get_entry_qty(); e++) {
Int ord = get_entry_ordinal(e);
// Display the entry point address and name
Msg(“Entry point %a: %s\n”,
Get_entry(ord),
Get_entry_name(ord));
}




No comments: