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:
Post a Comment