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:
Post a Comment