Saturday 8 November 2014

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

5.14 Dữ liệu
Khi làm việc với tập tin đảo mã, sẽ rất hữu ích khi ta bỏ qua trình đảo mã, và làm việc trực tiếp với các byte nhị phân. IDA cung cấp những hàm sau để làm việc đó (và một số hàm khác). Tất cả những hàm bên dưới được định nghĩa trong tập tin bytes.hpp. Những hàm đó làm việc với bytes, tuy nhiên cũng có những hàm làm việc với từ (word), từ dài (long) và từ kép (qwords) (get_word(), patch_word() và những thứ khác), mà có thể được tìm thấy trong tập tin bytes.hpp. Bên cạnh việc sử dụng những hàm đó để đọc dữ liệu từ chính tập tin nhị phân, chúng có thể được dùng để đọc những dữ liệu trong bộ nhớ trong khi tiến trình được thực thi dưới trình gỡ rối. Những điều này sẽ được nói rõ hơn trong phần liên quan đến Debugger.
5.14.1 get_byte
Định nghĩa
idaman uchar ida export get byte(ea t ea)
Chú giải
Trả về byte tại địa chỉ ea trong tập tin bị đảo mã hiện tại được mở trong IDA. Trả về BADADDR nếu địa chỉ ea không tồn tại. Những hàm được sử dụng để làm việc với những khối lớn hơn là get_word(), get_long() và get_qword(). Sử dụng get_many_bytes() để làm việc với nhiều khối bytes.
Ví dụ
#include <kernwin.hpp> // For get screen ea() definition #include <bytes.hpp>
// Display the byte value for the current cursor // position. The values returned should correspond // to those in your IDA Hex view. msg("%x\n", get byte(get screen ea()));


5.14.2 get_many_bytes
Định nghĩa
idaman bool ida export
get many bytes(ea t ea, void *buf, ssize t size)
Chú giải
Lấy một dãy các byte có kích thước size, tại địa chỉ ea và đưa vào *buf
Ví dụ
#include <kernwin.hpp> // For get screen ea() definition #include


5.14.3 get_dbg_byte
Định nghĩa
idaman bool ida export
get dbg byte(ea t ea, uint32 *x)
Chú giải
Lấy một byte tại địa chỉ trong bộ nhớ ea của tiến trình đang được dò lỗi và lưu giá trị đó tại địa chỉ *x. Trả về false nếu địa chỉ đó không thể truy cập được hoặc nếu tiến trình chưa được thực thi.
Ví dụ
#include <dbg.hpp> // For get reg val() definition #include <bytes.hpp>
uint32 stackdata; regval t regval;
if (get reg val("ESP", &regval)) {
// regval.ival holds the current stack pointer taken // from the ESP register by get reg val() get dbg byte(regval.ival, &stackdata);
} else {
msg("Stack couldn't be read");
}
msg("First byte on stack is: 0x%x\n", stackdata);


5.14.4 patch_byte
Định nghĩa
patch_byte
idaman bool ida_export patch byte(ea t ea, uint32 x)
Chú giải
Thay thế byte tại địa chỉ ea với x. Byte gốc được lưu vào CSDL của IDA, và có thể được truy xuất sử dụng get_orginal_byte() (xem trong bytes.hpp). Nếu không muốn lưu byte gốc, sử dụng put_byte(ea_t ea, ulong x) thay thế. Những hàm làm việc với khối lớn hơn là put_word, put_long(), và put_qword().
Ví dụ
#include <kernwin.hpp> // For get screen ea()
#include <bytes.hpp>
// Get the flags for the byte at the cursor position. flags t flags = get flags novalue(get screen ea());
// Replace the instruction at the cursor position with // a NOP instruction (0x90).
// Unless used carefully, your executable will probably // not work correctly after this :-) if (isCode(flags))
patch byte(get screen ea(), 0x90);


5.14.5 patch_many_bytes
Định nghĩa
idaman void ida export
patch many bytes(ea t ea, const void *buf, size t size)
Chú giải
Thay thế size byte tại địa chỉ ea với nội dung của *buf
Ví dụ
#include <kernwin.hpp> // For get screen ea() et al #include <bytes.hpp>
// Prompt the user for an address, then a string
ea t addr = get screen ea();
askaddr(&addr, "Address to put string:");
char *string = askstr(0, "", "Please enter a string");
// Write the user supplied string to the address // the user specified.
patch many bytes(addr, string, strlen(string));


5.15 I/O
Như đã được đề cập tại phần 5.1, một số lượng lớn các hàm của C làm việc với I/O được thay thế bởi các hàm tương đương của IDA SDK, và nó đề nghị bạn sử dụng những hàm đó thay vì những hàm của C. Những hàm đó được định nghĩa trong diskio.hpp.
5.15.1 fopenWT
Định nghĩa
idaman FILE *ida export fopenWT(const char *file)
Chú giải
Mở một tập tin văn bản, *file, trong chế độ ghi, trả về một con trỏ FILE hoặc NULL nếu việc mở tập tin thất bại. Để mở một tập tin ở chế độ đọc, sử dụng fopenRT(), và đối với tập tin nhị phân, thay R với W. Đối với dạng đọc/ghi, sử dụng fopenM().
Ví dụ
#include <diskio.hpp>
FILE *fp = fopenWT("c:\\temp\\txtfile.txt"); if (fp == NULL)
warning("Failed to open output file.");


5.15.2 openR
Định nghĩa
idaman FILE *ida export openR(const char *file)
Chú giải
Mở một tập tin nhị phân, *file, trong chế độ chỉ đọc, trả về một con trỏ FILE hoặc kết thúc (hiển thị một thông báo lỗi và đóng IDA) nếu nó thất bại. Để mở một tập tin dạng văn bản trong chế độ chỉ đọc, thoát khi thất bại, hãy sử dụng openRT(), để mở trong chế độ đọc/ghi sử dụng openM()
Ví dụ
#include <diskio.hpp>
FILE *fp = openR("c:\\temp\\binfile.exe");


5.15.3 ecreate
Định nghĩa
idaman FILE *ida export ecreate(const char *file)
Chú giải
Tạo một tập tin nhị phân, *file, trả về một con trỏ FILE ở chế độ chỉ ghi. Hiển thị một thông báo lỗi và kết thúc nếu nó không thể tạo tập tin. Để tạo một tập tin văn bản, sử dụng createT().
Ví dụ
#include <diskio.hpp>
FILE *fp = ecreate("c:\\temp\\newbinfile.exe");


5.15.4 eclose
Định nghĩa
idaman void ida export eclose(FILE *fp)
Chú giải
Đóng tập tin được đại diện bởi con trỏ FILE *fp. Hiển thị thông báo lỗi và kết thúc nếu nó không thể đóng tập tin.
Ví dụ
#include <diskio.hpp>
// Open the file first.
FILE *fp = openR("c:\\temp\\binfile.exe");
// Close it eclose(fp);


5.15.5 eread
Định nghĩa
idaman void ida export
eread(FILE *fp, void *buf, ssize t size)
Chú giải
Đọc size byte từ tập tin được đại diện bởi con trỏ FILE *fp, vào vùng bộ đệm *buf. Nếu việc đọc không thành công, một thông điệp lỗi được hiển thị và tiếp theo đó là đóng IDA.
Ví dụ
#include <diskio.hpp> char buf[MAXSTR];
// Open the text file
FILE *fp = openRT("c:\\temp\\txtfile.txt");
// Read MAXSTR bytes from the start of the file. eread(fp, buf, MAXSTR-1);
eclose(fp);


5.15.6 ewrite
Định nghĩa
idaman void ida export
ewrite(FILE *fp, const void *buf, ssize t size)
Chú giải
Ghi size byte của *buf vào tập tin được đại diện bởi con trỏ FILE *fp. Nếu việc ghi thất bại, một thông điệp lỗi được hiển thị tiếp theo đó là kết thúc IDA.
Ví dụ
char buf[MAXSTR]; ea t saddr, eaddr;
// Create the binary dump file FILE *fp = ecreate("c:\\bindump");
// Get the address range selected, or return false if // there was no selection if (read selection(&saddr, &eaddr)) { int size = eaddr - saddr;
// Dump the selected address range to a binary file get many bytes(saddr, buf, size); ewrite(fp, buf, size);
}
eclose(fp);



No comments: