Saturday 8 November 2014

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

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: