Saturday 8 November 2014

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

5.17 Điểm dừng
Một phần thiết yếu của việc dò lỗi là khả năng đặt và thao tác với những điểm dừng, mà có thể được đặt ở bất kỳ địa chỉ nào trong không gian bộ nhớ của tiến trình và có thể là dạng cứng hoặc mềm. Những hàm sau đây làm việc với điểm dừng, và được định nghĩa trong dbg.hpp.
5.17.1 get_bpt_qty
Định nghĩa
int idaapi get bpt qty(void)
Chú giải
Trả về số lượng điểm dừng đang tồn tại (bao gồm cả những điểm dừng đang hoặc không được kích hoạt)
Ví dụ
#include <dbg.hpp>
msg("There are currently %d breakpoints set.\n", get_bpt_qty());


5.17.2 getn_bpt
Định nghĩa
bool idaapi
getn bpt(int n, bpt t *bpt)
Chú giải
Điền vào *bpt với thông tin về điểm dừng có vị trí n. Trả về false nếu không có điểm dừng nào có vị trí đó.
Ví dụ
#include <dbg.hpp>
// Go through all breakpoints, displaying the address // of where they are set.
for (int i = 0; i < get bpt qty(); i++) { bpt t bpt;
if (getn bpt(i, &bpt))
msg("Breakpoint found at %a\n", bpt.ea);
}


5.17.3 get_bpt
Định nghĩa
bool idaapi
get bpt(ea t ea, bpt t *bpt)
Chú giải
Điền vào bpt thông tin về điểm dừng được đặt tại địa chỉ ea. Nếu không có điểm dừng nào tại địa chỉ này, giá trị false được trả về. Nếu *bpt là NULL, hàm này đơn giản sẽ trả về true hoặc false tùy vào điểm dừng có được đặt tại địa chỉ ea hay không.
Ví dụ



5.17.4 add_bpt *
Định nghĩa
bool idaapi
add bpt(ea t ea, asize t size = 0, bpttype t type = BPT SOFT)
Chú giải
Thêm một điểm dừng tại địa chỉ ea với kiểu được xác định bởi type và kích cỡ được xác định bởi size. Trả về false nếu nó không thể đặt điểm dừng. Tham khảo phần 4.4.2 để được mô tả chi tiết về những kiểu điểm dừng khác nhau. Size không hợp lệ khi đặt một điểm dừng mềm.
Ví dụ
<dbg.hpp>
// Add a software breakpoint at the cursor position if (add bpt(get screen ea(), 0, BPT SOFT))
msg("Successfully set software breakpoint at %a\n", get screen ea());


5.17.5 del_bpt *
Định nghĩa
bool idaapi del bpt(ea t ea)
Chú giải
Xóa một điểm dừng được định nghĩa tại địa chỉ ea. Nếu không có điểm dừng nào được định nghĩa tại đó, giá trị false được trả về.
Ví dụ
#include <dbg.hpp>
// Go through all breakpoints, deleting each one. for (int i = 0; i < get bpt qty(); i++) { bpt t bpt;
if (getn bpt(i, &bpt)) {
// Because we are performing many delete // operations, queue the request, otherwise the // getn bpt call will fail when the id // numbers change after the delete operation.


5.17.6 update_bpt
Định nghĩa
bool idaapi
update bpt(const bpt t *bpt)
Chú giải
Cập nhạt những thành phần có thể sửa đổi của điểm dừng được đại diện bởi *bpt. Trả về false nếu sửa đổi không thành công.
Ví dụ
#include <dbg.hpp>
// Loop through all breakpoints for (int i = 0; i < get bpt qty(); i++) { bpt t bpt;
if (getn bpt(i, &bpt)) {
// Change the breakpoint to not pause // execution when it's hit bpt.flags A= BPT BRK;
// Change the breakpoint to a trace breakpoint bpt.flags |= BPT TRACE;
// Run a little IDC every time it's hit qstrncpy(bpt.condition,
"Message(\"Trace hit!\")", sizeof(bpt.condition));
// Update the breakpoint if (!update bpt(&bpt))
msg("Failed to update breakpoint at %a\n", bpt.ea);
}
}


5.17.7 enable_bpt *
Định nghĩa
bool idaapi
enable bpt(ea t ea, bool enable = true)
Chú giải
Kích hoạt hoặc vô hiệu hóa điểm dừng tại địa chỉ ea. Nếu không có điểm dừng nào được định nghĩa tại địa chỉ ea, hoặc có một lỗi xảy ra khi kích hoạt/ vô hiệu hóa điểm dừng, giá trị false được trả về. Nếu tham số enable được đặt thành false, điểm dừng vị vô hiệu.
Ví dụ
#include <kernwin.hpp> // For get screen ea() definition #include <dbg.hpp>
bpt t bpt;
// If a breakpoint exists at the user's cursor, disable // it.
if (get bpt(get screen ea(), &bpt)) {
if (enable bpt(get screen ea(), false)) msg("Disabled breakpoint.\n");
}


5.18 Dò
Những hàm sử dụng để dò chủ yếu tập trung vào việc kiểm tra một kiểu dò nào đó có được kích hoạt, đang được kích hoạt hoặc đang vị vô hiệu một kiểu dò nào đó và lấy những sự kiện dò. Tất cả các hàm bên dưới được định nghĩa trong dbg.hpp.
5.18.1 set_trace_size
Định nghĩa
bool idaapi
set trace size(int size)
Chú giải
Đặt bộ đệm dò bằng kích cỡ được cho bởi size. Trả về false nếu có lỗi xảy ra khi cấp phát kích cỡ này. Đặt kích cỡ bằng 0 sẽ thiết lập một vùng đệm có kích thước vô hạn (nguy hiểm). Nếu bạn đặt kích cỡ vùng đệm nhỏ hơn số lượng sự kiện dò, kích cỡ của sự kiện sẽ bị xóa.
Ví dụ
#include <dbg.hpp>
// 1000 trace events allowed if (set trace size(1000))
msg("Successfully set the trace buffer to 1000\n");


5.18.2 clear_trace *
Định nghĩa
void idaapi clear trace(void)
Chú giải
Xóa bộ đệm dò
Ví dụ
#include <dbg.hpp>


5.18.3 is_step_trace_enabled
Định nghĩa
bool idaapi
is step trace enabled(void)
Chú giải
Trả về đúng nếu dò theo bước đang được kích hoạt.
Ví dụ
#include <dbg.hpp>
if (is step trace enabled())
msg("Step tracing is enabled.\n");


5.18.4 enable_step_trace *
Định nghĩa
bool idaapi
enable step trace(int enable = true)
Chú giải
Kích hoạt dò theo bước. Nếu tham số enable được đặt thành false, dò theo bước sẽ bị vô hiệu.
Ví dụ
#include <dbg.hpp>
// Toggle step tracing if (is step trace enabled()) enable step trace(false);
else
enable step trace();


5.18.5 is_insn_trace_enabled
Định nghĩa
bool idaapi
is insn trace enabled(void)
Chú giải
Trả về true nếu dò tho chỉ thị đang được kích hoạt.
Ví dụ
#include <dbg.hpp>
if (is insn trace enabled())
msg("Instruction tracing is enabled.\n");


5.18.6 enable_insn_trace *
Định nghĩa
bool idaapi
enable insn trace(int enable = true)
Chú giải
Kích hoạt dò theo chỉ thị. Nếu tham số enable được gán bằng false, dò theo chỉ thị sẽ bị vô hiệu.
Ví dụ
#include <dbg.hpp>
// Toggle instruction tracing if (is insn trace enabled()) enable insn trace(false);
else
enable insn trace();


5.18.7 is_func_trace_enabled
Định nghĩa
bool idaapi
is func trace enabled(void)
Chú giải
Trả về true nếu chức năng dò theo hàm dược kích hoạt.
Ví dụ
#include <dbg.hpp>
if (is func trace enabled())
msg("Function tracing is enabled.\n");


5.18.8 enable_func_trace
Định nghĩa
bool idaapi
enable func trace(int enable = true)
Chú giải
Kích hoạt chức năng dò theo hàm. Nếu tham số enable được gán bằng false, dò theo hàm bị vô hiệu.
Ví dụ
#include <dbg.hpp>
// Toggle function tracing if (is func trace enabled()) enable func trace(false);
else
enable func trace();


5.18.9 get_tev_qty
Định nghĩa
int idaapi
get tev qty(void)
Chú giải
Trả về số lượng sự kiện dò đang được lưu trong bộ đệm dò.
Ví dụ
#include <dbg.hpp>
msg("There are %d trace events in the trace buffer.\n", get tev qty());


5.18.10 get_tev_info
Định nghĩa
bool idaapi
get tev info(int n, tev info t *tev info)
Chú giải
Trả về *tev thông tin về sự kiện dò trong bộ đệm dò ở vị trí thứ n. Trả về false nếu không có sự kiện dò nào ở vị trí n.
Ví dụ
#include <dbg.hpp>
// Loop through all trace events for (int i = 0; i < get tev qty(); i++) { tev info t tev;
// Get the trace event information get tev info(i, &tev);
// Display the address the event took place msg("Trace event occurred at %a\n", tev.ea);
}


5.18.11 get_insn_tev_reg_val
Định nghĩa
bool idaapi
get insn tev reg val(int n, const char *regname, regval t *regval)
Chú giải
Lưu giá trị của thanh ghi *regname vào biến *regval khi chỉ thị của sự kiện dò thứ n xảy ra, trước khi thực thi chỉ thị này. Trả về false nếu sự kiện không phải là một chỉ thị dò.
Lưu giá trị của thanh ghi *regname vào biến *regval khi chỉ thị dò
Ví dụ
#include <dbg.hpp>
// Loop through all trace events for (int i = 0; i < get tev qty(); i++) { regval t esp; tev info t tev;
// Get the trace event information get tev info(i, &tev);
// If it's an instruction trace event... if (tev.type == tev insn) {
// Get ESP, store into &esp
if (get insn tev reg val(i, "ESP", &esp))
// Display the value of ESP
msg("TEV #%d before exec: %a\n", i, esp.ival);
else
msg("No ESP change for TEV #%d\n", i);
}
}


5.18.12 get_insn_tev_reg_result
Định nghĩa
bool idaapi
get insn tev reg result(int n, const char *regname, regval t *regval)
Chú giải
Lưu giá trị của thanh ghi *regname vào biến *regval khi chỉ thị dò thứ n xảy ra, sau khi thực thi chỉ thị này. Trả về false nếu thanh ghi không bị thay đổi hoặc n không phải là một chỉ thị dò.
Ví dụ
#include <dbg.hpp>


5.18.13 get_call_tev_callee
Định nghĩa
ea t idaapi
get call tev callee(int n)
Chú giải
Trả về địa chỉ của hàm được gọi cho hàm sự kiện dò thứ n. Trả về BADADDR nếu không có hàm dò nào thứ n. Kiểu của hàm sự kiện dò phải là tev_call.
Ví dụ
#include <dbg.hpp>
// Loop through all trace events for (int i = o; i < get tev qty(); i++) { regval_t esp; tev info t tev;
// Get the trace event information get tev info(i, &tev);
// If it's an function call trace event... if (tev.type == tev call) { ea t addr;
// Get ESP, store into &esp
if ((addr = get call tev callee(i)) != BADADDR) msg("Function at %a was called\n", addr);
}
}


5.18.14
Định nghĩa
ea t idaapi
get ret tev return(int n)
Chú giải
Trả về địa chỉ của hàm gọi đến hàm dò sự kiện thứ n. Trả về BADADDR nếu không có hàm dò sự kiện thứ n nào. Kiểu của hàm sự kiện dò phải là tev_ret
Ví dụ
#include <dbg.hpp>
// Loop through all trace events for (int i = 0; i < get tev qty(); i++) { tev info t tev;
// Get the trace event information get tev info(i, &tev);
// If it's an function return trace event... if (tev.type == tev ret) { ea t addr;
if ((addr = get ret tev return(i)) != BADADDR) msg("Function returned to %a\n", addr);
}
}


5.18.15
Định nghĩa
ea t idaapi
get bpt tev ea(int n)
Chú giải
Trả về địa chỉ của sự kiện dò thứ n có kiểu đọc/ghi/thực thi. Trả về false nếu không có sự kiện dò nào thuộc loại đọc/ghi/thực thi.
Ví dụ
#include <dbg.hpp>
// Loop through all trace events for (int i = 0; i < get tev qty(); i++) { tev info t tev;
// Get the trace event information get tev info(i, &tev);
// If it's an breakpoint trace event... if (tev.type == tev bpt) { ea t addr;
if ((addr = get bpt tev ea(i)) != BADADDR)
msg("Breakpoint trace hit at %a\n", addr);
}
}



No comments: