Saturday 8 November 2014

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

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: