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", ®val)) {
// 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:
Post a Comment