4.5.3
Cảnh báo sự kiện trình gỡ rối
Cảnh
báo sự kiện trình gỡ rối được chia ra làm 3 loại là
cảnh báo cấp thấp, cảnh báo cấp cao và cảnh báo kết
quả hàm; sự khác biệt giữa 3 loại sẽ được làm sáng
tỏ trong phần sau. Tất cả các sự kiện cảnh báo được
đề cập đến trong phần này thuộc về kiểu liệt kê
dbg_notification_t, được định nghĩa trong dbg.hpp. nếu bạn
cung cấp HT_DBG cho hàm hook_to_notification_point(), những cảnh
báo sự kiện bên dưới sẽ được truyền vào plugin của
bạn khi một tiến trình chạy trong chế độ dò lỗi của
IDA.
4.5.3.1
Những sự kiện mức thấp
Những
sự kiện dưới đây được lấy từ kiểu
dbg_notification_t là những cảnh báo sự kiện cấp thấp.
Cảnh báo sự kiện cấp thấp được tạo ra bởi trình
gỡ rối.
Cảnh báo sự kiện
|
Mô tả
|
Dbg_process_start
|
Process started
|
dbg_process_exit
|
Process ended
|
dbg_process_attach
|
Attached to process
|
dbg_process_detach
|
Detached from process
|
dbg_thread_start
|
Thread started
|
dbg_thread_exit
|
Thread ended
|
dbg_library_load
|
Library was loaded
|
dbg_library_unload
|
Library was unloaded
|
dbg_exception
|
Exception was raised
|
dbg_information
|
Data sent from debugged application using
OutputDebugString (Win32 API)
|
Cấu
trúc debug_event (idd.hpp), mà bạn có thể sử dụng để
lấy nhiều thông tin hơn về cảnh báo sự kiện trình gỡ
rối, nó luôn được cung cấp trong tham số va trong hàm
call-back (chỉ dùng trong cảnh báo sự kiện cấp tháp).
Đây là toàn bộ cấu trúc debug_event_t.
struct
debug_event_t
{
event_id_t eid; //
Event code (used to decipher 'info' union)
pid_t pid; //
Process where the event occurred
thid_t tid; //
Thread where the event occurred
ea_t ea; //
Address where the event occurred
bool
handled; // Is event handled by the debugger?
//
(from the system's point of view)
//
The comments on the right indicate what eid value is
//
required for the corresponding union member to be set.
union
{
module_info_t
modinfo; // dbg_process_start, dbg_process_attach,
// dbg_library_load
int
exit_code; // dbg_process_exit, dbg_thread_exit
char
info[MAXSTR]; // dbg_library_unload (unloaded lib name)
// dbg_information (will be displayed in the
// messages window if not empty)
e_breakpoint_t
bpt; // dbg_bpt
e_exception_t
exc; // dbg_exception
};
};
|
4.5.3.2
Cảnh báo sự kiện cấp cao
Sau
đây là những sự kiện được lấy từ dbg_notification_t,
tất cả đều là những cảnh báo sự kiện cấp cao, được
tạo ra bởi nhân IDA.
Cảnh báo sự kiện
|
Mô tả
|
dbg bpt
|
User-defined breakpoint was hit
|
dbg trace
|
One instruction was executed (needs step
tracing enabled)
|
dbg suspend process
|
Process has been suspended
|
dbg request error
|
An error occurred during a request (see section
5.14)
|
Mỗi
cảnh báo sự kiện có tham số khác nhau được cung cấp
cùng với chung trong tham số va của hàm call-back. Không một
sự kiện nào có debug_event_t được cung cấp, giống như
sự kiện cảnh báo cấp thấp.
Cảnh
báo sự kiện dbg_bpt đi cùng với ThreadID(thid_t) của tiểu
trình bị ảnh hưởng và địa chỉ nơi màđiểm dừng
được kích hoạt trong va. Ví dụ bên dưới hiển thị
một thông điệp trong cửa sổ Log của IDA khi một điểm
dừng của người dùng định nghĩa được kích hoạt.
...
// Our callback
function to handle HT_DBG event notifications
static int
idaapi dbg_callback(void *udata, int event_id,
va_list va)
{
// va contains a
debug_event_t pointer
debug_event_t
*evt = va_arg(va, debug_event_t *);
// If the event
is dbg_library_load, we know modinfo will be set
// and contain
the name of the library loaded
if
(event_id == dbg_library_load)
msg("Loaded
library, %s\n", evt->modinfo.name);
return 0;
}
// Our init
function
int
IDAP_init(void)
{
// Register the
notification point as our dbg_callback function.
hook_to_notification_point(HT_DBG, dbg_callback, NULL);
...
|
4.5.3.3
Cảnh báo kết quả hàm
Trong
phần sau, khái niệm hàm dò lỗi đồng bộ và không đồng
bộ sẽ được thảo luận chi tiết hơn; sau đó, tất cả
những điều bạn cần biết là những hàm dò lỗi đồng
bộ giống như những hàm thông thường – bạn gọi nó,
nó làm một điều gì đó và trả về kết quả. Tuy
nhiên, những hàm dò lỗi bất đối xứng được gọi và
trả về mà không hoàn thành nhiệm vụ, yêu cầu được
đặt vào một hàng đợi và chạy trong chế độ nền.
Khi nhiệm vụ được hoàn thành, một cảnh báo sự kiện
được tạo ra để xác định là yêu cầu gốc đã được
hoành thành.
Bên
dưới là tất cả những cảnh báo kết quả hàm.
Event Notification
|
Description
|
dbg_process_start |
Debugger started a process |
dbg_process_exit |
Process being debugged ended |
dbg_process_attach |
Debugger attached to a process |
dbg_process_detach |
Debugger detached from a process |
dbg_step_into |
Debugger stepped into a function |
dbg_step_over |
Debugger stepped over a function |
dbg_run_to
|
Debugger has run to user's cursor position
|
dbg_step_until_ret
|
Debugger has run until return to caller was
made
|
Ví
dụ, đoạn mã được đặt trong IDAP_run() yêu cầu IDA
nhập vào một tiến trình. Khi được nhập vào thành
công, IDA tạo ra một sự kiện cảnh báo,
dbg_process_attach, mà sẽ được đảm nhận bởi hàm
call-back dbg_callback.
int idaapi
dbg_callback(void *udata, int event_id, va_list va)
{
// Get the
process ID of what was attached to.
pid_t pid =
va_arg(va, pid_t);
if
(event_id == dbg_process_attach)
msg("Successfully attached to PID %d\n", pid);
return 0;
}
void
IDAP_run(int arg)
{
int res;
// Attach to a
process. See Chapter 5 for usage.
attach_process(NO_PROCESS, res);
return;
}
int
IDAP_init(void)
{
hook_to_notification_point(HT_DBG, dbg_callback, NULL);
|
No comments:
Post a Comment