Saturday 8 November 2014

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

5.8 Chỉ thị
Những hàm tiếp theo sẽ làm việc với các chỉ thị trong tập tin bị disassemble hiện tại. Tất cả đều được định nghĩa trong ua.hpp, ngoại trừ hàm generate_disasm_line(), mà nó được định nghĩa trong lines.hpp.
5.8.1 generate_disasm_line
Định nghĩa
idaman bool ida export
generate disasm line(ea t ea, char *buf, size t bufsize, int flags=0)
Chú giải
Gán giá trị vào *buf, có kích thước giới hạn bởi bufsize, với chuỗi được disassemble tại địa chỉ ea. Chuỗi ký tự này được tô màu bởi vậy bạn sẽ phải sử dụng hàm tag_remove() (xem phần 5.20.1) để lấy đoạn ký tự có thể in được.
Ví dụ
#include <kernwin.hpp> // For get screen ea() definition #include <lines.hpp>
eat ea = get screen ea();
// Buffer that will hold the disassembly text char buf[MAXSTR];
// Store the disassembled text in buf generate disasm line(ea, buf, sizeof(buf)-l);
// This will appear as colour-tagged text (which will // be mostly unreadable in IDA's Log window) msg("Current line: %s\n", buf);


5.8.2 decode_insn
Định nghĩa
idaman int
ida export decode insn(ea t ea)
Chú giải
Đảo mã chỉ thị tại địa chỉ ea. Trả về kích cỡ của chỉ thị theo byte và gán vào cấu trúc toàn cục cmd thông tin về chỉ thị. Nếu địa chỉ ea không chứa chỉ thị nào, 0 sẽ được trả về. Đây là hàm chỉ đọc và không thay đổi cơ sở dữ liệu IDA.
Ví dụ
#include <kernwin.hpp> // For get screen ea() definition


5.8.3 create_insn
Định nghĩa
idaman int
ida export create insn(ea t ea)
Chú giải
Đảo mã tại địa chỉ ea và cập nhật cơ sở dữ liệu IDA bằng kết quả. Nó trả về kích thước của chỉ thị dạng byte và điền vào cấu trúc toàn cục cmd với thông tin về chỉ thị. Nếu ea không chứa chỉ thị nào, giá trị 0 sẽ được trả về.
Ví dụ
#include <kernwin.hpp> // For get screen ea() definition #include <ua.hpp>
eat ea = get screen ea();
if (create insn(ea) > 0)
msg("Instruction size: %d bytes\n", cmd.size);
else
msg("Not at an instruction.\n");


5.8.4 ua_ana0 (DEPRECATED)
Định nghĩa
idaman int
ida export ua ana0(ea t ea)
Chú giải
Đảo mã tại địa chỉ ea. Trả về kích thước của chỉ thị dạng byte và điền vào cấu trúc toàn cục cmd với thông tin về chỉ thị. Nếu ea không chứa chỉ thị, giá trị 0 sẽ được trả về. Đây là hàm chỉ đọc và không làm thay đổi cơ sở dữ liệu IDA. Hàm nãy đã lỗi thời, hãy sử dụng hàm decode_insn thay thế.
Ví dụ
#include <kernwin.hpp> // For get screen ea() definition #include <ua.hpp>
eat ea = get screen ea();
if (ua ana0(ea) > 0)
msg("Instruction size: %d bytes\n", cmd.size);
else
msg("Not at an instruction.\n");


5.8.5 ua_code (DEPRECATED)
Định nghĩa
idaman int
ida export ua code(ea t ea)
Chú giải
Đảo mã tại địa chỉ ea. Trả về kích thước của chỉ thị dạng byte, điền vào cấu trúc toàn cục cmd thông tin về chỉ thị và tập nhật cơ sở dữ liệu IDA với kết quả. Nếu ea không chứa chỉ thị nào, 0 sẽ được trả về. Hàm nãy đã lỗi thời, hãy sử dụng create_insn thay thế.
Ví dụ
#include <kernwin.hpp> // For read selection() definition #include <ua.hpp>
ea t saddr, eaddr; ea t addr;
// Get the user selection
int selected = read selection(&saddr, &eaddr); if (selected) {
// Re-analyse the selected address range addr = saddr; while(addr <= eaddr) {
addr += ua code(addr);
}
}


5.8.6 ua_mnem
Định nghĩa
idaman const char *ida export
ua mnem(ea t ea, char *buf, size t bufsize)
Chú giải
Điền vào mảng ký tự *buf, được giới hạn bởi bufsize, với từ khóa gợi nhớ được sử dụng trong chỉ thị tại địa chỉ ea và cập nhật CSDL IDA với chỉ thị đó nếu nó không được định nghĩa. Trả về con trỏ đến vùng *buf hoặc NULL nếu không có chỉ thị nào ở địa chỉ ea.
Ví dụ
#include <segment.hpp> // For segment functions #include <ua.hpp>
// Loop through each executable segment, displaying // the mnemonic used in each instruction for (int s = 0; s < get segm qty(); s++) { segment t *seg = getnseg(s); if (seg->type == SEG CODE) { int bytes = 0;
// a should always be the address of an // instruction, which is why bytes is dynamic // depending on the result of ua mnem() for (ea t a = seg->startEA;
a < seg->endEA; a += bytes) { char mnem[MAXSTR]; const char *res;


5.8.7 ua_outop2
Định nghĩa
idaman bool ida export
ua outop2(ea t ea, char *buf, size t bufsize, int n, int flags=0);
Chú giải
Điền vào *buf, kích thước giới hạn bởi bufsize, với chuỗi ký tự được đại diện cho toán tử thứ n của chỉ thị tại địa chỉ ea và cập nhật CSDL IDA với chỉ thị đó nếu nó không được định nghĩa. Trả về false nếu toán tử không tồn tại. flags được sử dụng trong tương lai.
Chuỗi ký tự trả về trong *buf được tô màu, bởi vậy bạn sẽ phải dùng hàm tag_remove() (xem phần 5.20.1) để lấy được chuỗi ký tự có thể in
Ví dụ
#include <ua.hpp>
// Get the entry point address ea t addr = inf.startIP;
// Fill cmd with information about the instruction // at the entry point decode insn(addr);
// Loop through each operand (until one of o void type // is reached), displaying the operand text. for (int i = 0; cmd.Operands[i].type != o void; i++) { char op[MAXSTR]; _ ua outop2(addr, op, sizeof(op)-1, i); msg("Operand %d: %s\n", i, op);
}


5.8.8 ua_outop (DEPRECATED)
Định nghĩa
idaman bool ida export
ua outop(ea t ea, char *buf, size t bufsize, int n)
Chú giải
Điền vào *buf, giới hạn bởi bufsize, với chuỗi ký tự đại diện cho toán tử ở vị trí thứ n của chỉ thị tại địa chỉ ea và cập nhật CSDL IDA với chỉ thị đó nếu nó không được định nghĩa. Trả về sai nếu toán tử thứ n không tồn tại.
Chuỗi ký tự trả về trong *buf được tô màu, nên bản phải sử dụng hàm tag_remove() (xem phần 5.20.1) để lấy đoạn ký tự có thể in. Hàm này đã lỗi thời, hãy sử dụng ua_outop2 thay thế.
Ví dụ
#include <ua.hpp>
// Get the entry point address ea t addr = inf.startIP;
// Fill cmd with information about the instruction // at the entry point decode insn(addr);
// Loop through each operand (until one of o void type // is reached), displaying the operand text. for (int i = 0; cmd.Operands[i].type != o void; i++) { char op[MAXSTR]; _ ua outop(addr, op, sizeof(op)-1, i); msg("Operand %d: %s\n", i, op);
}



No comments: