4.2.4.4
Chỉ thị
Lớp
insn_t đại diện cho toàn bộ chỉ thị. Nó bao gồm một
mảng op_t,tên là Operands, mà sẽ đại diện cho tất cả
các toán tử được truyền vào chỉ thị. Hiển nhiên
những chỉ thị không có toán tử (như là pusha, hlt, ect),
thì Operands[0] sẽ có giá trị optype_t là o_void (không toán
tử).
class insn_t
{
public:
ea_t cs;
// segment base (in paragraphs)
ea_t ip;
// offset in the segment
ea_t ea;
// instruction start addresses
op_t
Operands[UA_MAXOP];
char flags;
// instruction flags
};
|
Có
một thực thể toàn cục của kiểu insn_t tên là cmd, giá
trị của nó được đặt khi gọi các hàm decode_insn() và
create_insn(). Đây là một ví dụ bằng việc lấy một chỉ
thị tại điểm nhập của tập tin và hiển thị số chỉ
thị, địa chỉ và kích cỡ của nó trong cửa sổ Log của
IDA.
#include <ua.hpp>
// decode insn()
populates the cmd structure with a disassembly of the
// address
supplied.
decode_insn(inf.beginEA);
// or inf.startIP
msg("Instruction
number: %d at %a is %d bytes in size.\n",
cmd.itype,
cmd.ea, cmd.size);
|
Giá
trị kết xuất với chỉ thị mov:
Instruction number: 16 at 10031ED is 5 bytes in
size.
|
4.2.5
Tham chiếu
Một
trong những chức năng thuận tiện của IDA là khả năng
tham chiếu, nó sẽ cho bạn biết tất cả những phần của
đoạn mã hiện tại được tham chiếu ở những phần
khác của tập tin bị disasm. Ví dụ, bạn có thể đánh
dấu một hàm trong cửa sổ diassembly, nhấn ‘x’ và tất
cả những địa chỉ mà hàm đó được tham chiếu (ví dụ
: hàm được gọi đến) sẽ xuất hiện trong cửa sổ.
Tương tự cũng có thể áp dụng cho dữ liệu và biến
cục bộ.
SDK
cung cấp một giao diện đơn giản để truy cập vào thông
tin này, nó được lưu trữ nội tại trong một cấu trúc
dữ liệu dạng cây-B, được truy xuất thông qua cấu trúc
xrefblk_t. Có một cách khác, thủ công hơn để lấy được
những thông tin này, nhưng nó chậm hơn phương thức được
nhấn mạnh ở trên.
Một
điều quan trọng để nhớ là thậm chí khi một chỉ thị
tự nhiên có thứ tự kế trên luồng, IDA có thể lấy
giá trị trước làm tham chiếu cho giá trị sau, nhưng điều
này có thể được vô hiệu hóa sử dụng một số cờ
được cung cấp bởi một vài phương thức của xrefblk_t,
được mô tả trong Chương 5 – Hàm.
4.2.5.1
Cấu trúc xrefblk_t
Cấu
trúc chính để thực hiện chức năng tham chiếu chéo là
cấu trúc xrefblk_t, được định nghĩa trong tập tin
xref.hpp. Cấu trúc này đầu tiên cần phải được thao
tác sử dụng phương thức first_from() hoặc first_to() (phụ
thuộc vào bạn muốn tìm tham chiếu đến hoặc đi từ
địa chỉ), và những thao tác con tuần tự sử dụng
next_from() và next_to() để bạn có thể duyệt qua các tham
chiếu.
Những
biến trong cấu trúc này được trình bày bên dưới và
những ghi chú hầu hết được lấy từ tập tin xref.hpp.
Những phương thức (first_from, first_to, next_from, next_to) đã
được lược bỏ, những sẽ được trình bày trong Chương
5 – Hàm.
struct xrefblk_t
{
ea_t from; // the
referencing address
ea_t to; // the
referenced address
uchar iscode; //
1-is the code reference; 0 – is data reference
uchar type; // one
of the cref_t or dref_t types (see
// section 4.2.5.2
and 4.2.5.3)
…
};
|
Như
được xác định bởi biến iscode, xrefblk_t có thể bao
gồm những thông tin về tham chiếu mã hoặc tham chiếu dữ
liệu, mỗi thành phần đó có thể là một của một vài
kiểu tham chiếu, được xác định bởi kiểu biến. Những
dạng mã và dữ liệu tham chiếu này được mô tả trong
phần sau.
Đoạn
mã nhỏ bên dưới sẽ cho bạn những thông tin về tham
chiếu chéo tại địa chỉ con trỏ chuột tại vị trí
hiện tại :
#include
<kernwin.hpp>
#include <xref.hpp>
xrefblk_t xb;
// Get the
address of the cursor position ea t addr = get screen ea();
// Loop through
all cross references
for (bool
res = xb.first_to(addr, XREF FAR); res; res = xb.next_to()) {
msg("From:
%a, To: %a\n", xb.from, xb.to);
msg("Type:
%d, IsCode: %d\n", xb.type, xb.iscode);
}
|
Kết
xuất của đoạn mã trên tại vị trí con trỏ nằm tại
dòng mã được tham chiếu ở một địa chỉ nào đó
trong tập tin thực thi được nạp:
From:
10032E3, To: 10032BE Type: 19, IsCode: 1
4.2.5.2
Mã
Đây
là kiểu liệt kê cref_t, cùng với một vài thành phần
khác. Phụ thuộc vào kiểu tham chiếu, kiểu biến trong
xrefblk_t sẽ là một trong những mã bên dưới nếu iscode
được đặt bằng 1. Những ghi chú bên dưới được lấy
từ tập tin xref.hpp.
enum cref_t
{
fl_U,
// unknown -- for compatibility with old
// versions. Should not be used anymore.
fl_CF = 16,
// Call Far
// This xref creates a function at the
// referenced location
fl_CN,
// Call Near
// This xref creates a function at the
// referenced location
fl_JF,
// Jump Far
fl_JN,
// Jump Near
fl_USobsolete,
// User specified (obsolete)
fl_F,
// Ordinary flow: used to specify execution
// flow to the next instruction.
};
|
Một
đoạn mã tham chiếu được lấy từ một tập tin nhị
phân như ví dụ bên dưới. Trong trường hợp này 712D9BFE
được tham chiếu bởi 712D9BF6, có kiểu tham chiếu
mã là nhảy gần (fl_JN)
.text:712D9BF6 jz short
loc 712D9BFE
.text:712D9BFE
loc_712D9BFE:
.text:712D9BFE lea ecx, [ebp+var 14]
|
No comments:
Post a Comment