Saturday 8 November 2014

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

5.9 Tham chiếu
Bốn hàm tiếp theo không phải là những hàm độc lập, nhưng là thành viên của cấu trúc xrefblk_t, được định nghĩa trong xref.hpp. Chúng được sử dụng để thao tác và liệt kê những tham chiếu chéo đến hoặc đi từ một địa chỉ. Tất cả các hàm lấy flags như là tham số, mà giá trị có thể là một trong những giá trị sau, được lấy từ xref.hpp:
#define XREF ALL 0x00 // trả về tất cả tham chiéu
#define XREF FAR 0x01 // don't return ordinary flow xrefs
#define XREF DATA 0x02 // chỉ trả về tham chiếu dữ liệu
Một luồng thứ tự là khi thực thi thường truyền một chỉ thị đến một chỉ thị khác mà không sử dụng các lệnh như CALL hoặc JMP (hoặc tương đương). Nếu bạn chỉ quan tâm đến tham chiếu chéo mã (bỏ qua luồng thứ tự), thì bạn nên sử dụng XREF_ALL và kiểm tra nếu biến thành viên isCode được đặt giá trị true trong mỗi trường hợp. Sử dụng XREF_DATA nếu bạn chỉ quan tâm đến tham chiếu dữ liệu.
5.9.1 first_from
Định nghĩa
bool
first from(ea t from, int flags)
Chú giải
Thao tác với cấu trúc xrefblk_t với tham chiếu chéo đầu tiên từ địa chỉ from, cờ điều khiển tham chiếu chéo nào mà bạn quan tâm. Trả về false nếu không có tham chiếu nào đến từ from.
Ví dụ
#include <kernwin.hpp> // For get screen ea() definition #include <xref.hpp>
ea t addr = get screen ea(); xrefblk t xb;
if (xb.first from(addr, XREF ALL)) {
// xb is now populated
msg("First reference FROM %a is %a\n", xb.from, xb.to);
}


5.9.2 first_to
Định nghĩa
bool
first to(ea t to,int flags)
Chú giải
Thao tác với cấu trúc xrefblk_t với tham chiếu chéo đầu tiên được trỏ đến từ địa chỉ to. Cờ xác định loại tham chiếu nào mà bạn quan tâm. Trả về false nếu không có tham chiếu nào được trỏ đến.
Ví dụ
#include <kernwin.hpp> // For get screen ea() definition #include <xref.hpp>
ea t addr = get screen ea(); xrefblk t xb;
if (xb.first to(addr, XREF ALL)) {
// xb is now populated
msg("First reference TO %a is %a\n", xb.to, xb.from);
}


5.9.3 next_from
Định nghĩa
bool
next from(void)
Chú giải
Thao tác với cấu trúc xrefblk_t với tham chiếu chéo kế tiếp kể từ địa chỉ trong from. Trả về false nếu không có tham chiếu nào nữa.
Ví dụ
#include <kernwin.hpp> // For get screen ea() definition #include <lines.hpp> // For tag remove() and
// generate disasm line()
#include <xref.hpp> xrefblk t xb;
ea t addr = get screen ea();
// Replicate IDA 'x' keyword functionality
for (bool res = xb.first to(addr, XREF FAR); res;
res = xb.next to()) T char buf[MAXSTR]; _ char clean buf[MAXSTR];
// Get the disassembly text for the referencing addr generate disasm line(xb.from, buf, sizeof(buf)-l);
// Clean out any format or colour codes tag remove(buf, clean buf, sizeof(clean buf)-1); msg("%a: %s\n", xb.from, clean buf); i _


5.9.4 next_to
Định nghĩa
bool
next to(void)
Chú giải
Thao tác với cấu trúc xrefblk_t với tham chiếu chéo kế tiếp được trỏ đến. Trả về false nếu không có tham chiếu nào nữa.
Ví dụ
#include <kernwin.hpp> // For get screen ea() definition #include <xref.hpp>
xrefblk t xb;
ea t addr = get screen ea();
// Get the first cross reference to addr if (xb.first to(addr, XREF FAR)) T if (xb.next to())
msg("There are multiple references to %a\n", addr);
else
msg("The only reference to %a is at %a\n", addr, xb.from);
i


5.10 Tên
Những hàm tiếp theo sẽ làm việc với tên hàm (sub_*), tên vị trí (loc_*) và tên biến (arg_*, var_*) được đặt bởi IDA hoặc người dùng. Tất cả được định nghĩa trong tập tin name.hpp. Tên thanh ghi không được nhận biết bởi những hàm này.
5.10.1 get_name
Định nghĩa
idaman char *ida export
get name(ea t from, ea t ea, char *buf, size t bufsize)
Chú giải
Điền vào *buf với giới hạn độ dài được cho bởi bufsize, với giá trị tên không được tô màu ở địa chỉ ea. Con trỏ *buf được trả về nếu địa chỉ ea có tên, hoặc NULL nếu không. Nếu địa chỉ được đặt sau tên trong một hàm cục bộ, nó nên nằm trong cùng hàm đó, hoặc là nó sẽ không được thấy. Nếu bạn không nằm sau một tên cục bộ, form nên được đặt giá trị là BADADDR.
Ví dụ
#include <name.hpp>


5.10.2 get_name_ea
Định nghĩa
idaman ea t ida export
get name ea(ea t from, const char *name)
Chú giải
Trả về địa chỉ tại tên hàm được cung cấp tại *name. Nếu bạn nằm sau tên cục bộ trong hàm, nó nên được nằm trong cùng hàm, hoặc là nó sẽ không được thấy. Nếu bạn không nằm sau tên cục bộ, form nên được đặt giá trị là BADADDR.
Ví dụ
// Get the cursor address ea t addr = get screen ea();


5.10.3 get_name_value
Định nghĩa
idaman int ida_export
get_name_value(ea_t from, const char *name, uval_t *value)
Chú giải
Trả về giá trị vào *value, đại diện bởi tên *name, tương ứng với địa chỉ from. *value sẽ bao gồm cả địa chỉ lệch và địa chỉ tuyến tính.
Nếu bạn nằm sau tên trong phạm vi cục bộ hàm, bạn nên ở trong cùng một hàm, hoặc là nó sẽ không tìm thấy. nếu bạn không ở trong một hàm cục bộ, giá trị form nên được đặt là BADADDR. Giá trị trả về sẽ là một trong các giá trị sau, đại diện cho kiểu của tên. Được lấy trong tập tin name.hpp.
Ví dụ
uval t value;
ea t addr = get screen ea();



No comments: