5.11
Tìm kiếm
Những
hàm sau đâu được sử dụng để tìm kiếm trong tập tin
đực đảo mã bởi IDA, và được định nghĩa trong tập
tin search.hpp. Cũng có nhiều hàm tìm kiếm khác được sử
dụng cho những kiểu tìm kiếm khác nhau (ví dụ, lỗi)
cũng có thể được tìm thấy trong tập tin search.hpp.
Những hàm tìm kiếm sẽ nhận giá trị cờ, mà nó sẽ
điều kiển cách làm việc của hàm tìm kiếm, những gì
được tìm, vv. Những cờ này, như được lấy từ
Hầu
hết trường hợp, bạn chỉ cần sử dụng SEARCH_DOWN để
tìm kiếm không phân biệt hoa thường, và tiến theo chiều
đi xuống của tập tin.
5.11.1
find_text
Định nghĩa
|
idaman ea t ida
export
find text(ea t startEA, int y, int x, const
char *ustr, int sflag);
|
Chú giải
|
Tìm kiếm một chuỗi ký tự trong tập
tin được đảo mã, bắt đầu tại địa chỉ startEA
và tọa độ x, y (cả hai có thể gán bằng 0), cho chuỗi
có giá trị là *ustr, sflag có thể được gán giá trị
bằng các giá trị được đề cập ở trên.
|
Ví dụ
|
#include
<kernwin.hpp> // For askstr() definition #include
<search.hpp>
char *s = askstr(0,
"", "String to search for", NULL);
// Find the first
occurrence of the string
ea t foundAt = find
text(inf.minEA, 0, 0, s, SEARCH DOWN); while (foundAt != BADADDR)
{
msg("%s was
found at %a\n", s, foundAt);
}
|
5.11.2
find_binary
Định nghĩa
|
idaman ea t ida
export
find binary(ea t startea, ea t endea, const
char *ubinstr, int radix, int sflag)
|
Chú giải
|
Tìm kiếm giữa
địa chỉ startEA và endEA cho chuỗi trong tham số
*ubinstr. Cơ số là một hệ số (nếu bạn tìm kiếm
số), có thể là 8 (bát phân), 10 (thập phân), 16 (thập
lục phân). Sflag có thể là bất cứ cờ nào bên trên.
Chú ý hàm này không tìm kiếm chuỗi kí
tự đã được đảo mã mà bạn nhìn thấy trong IDA,
nhưng nó tìm kiếm trong tập tin nhị phân.
|
Ví dụ
|
#include <kernwin.hpp> // for askstr()
and jumpto() #include <search.hpp>
|
5.12
IDB
Những
hàm sau đây được sử dụng để làm việc với tập tin
cơ sở dữ liệu của IDA, nó có thể được tìm thấy
trong loader.hpp. Mặc dù không có định nghĩa thật sự nào
của lớp linput_t, bạn cần phải gọi hàm open_linput()
(diskio.hpp) để tạo một thực thể của lớp này, với
một vài hàm được sử dụng như là tham số. Bạn có
thể sử dụng make_linput() để chuyển một con trỏ FILE
thành một thực thể kiểu linput_t, xem thêm thông tin trong
tập tin loader.hpp
5.12.1
open_linput
Định nghĩa
|
idaman linput t *ida
export
open linput(const char *file, bool remote)
|
Chú giải
|
Tạo một thực thể của lớp linput_t
cho tập tin có đường dẫn *file. Nếu tập tin b xóa,
tham số remote sẽ được gán thành true. Trả về NULL
nếu thất bại khi mở tập tin.
|
Ví dụ
|
#include
<kernwin.hpp> // For askfile cv definition #include
<diskio.hpp>
// Prompt the user
for a file
char file = askfile
cv(0, "", "File to open", NULL); // Open the
file
linput t *myfile =
open linput(file, false);
if (myfile == NULL)
msg("Failed to
open or corrupt file.\n");
else
// Return the size of the opened file.
msg("File size: %d\n", qlsize(myfile));
|
5.12.2
chose_linput
Định nghĩa
|
idaman void ida export close linput(linput t
*li)
|
Chú giải
|
Đóng tập tin được đại diện bởi
thực thể linput_t *li, được tạo bởi open_linput().
|
Ví dụ
|
#include <loader.hpp>
|
5.12.3
load_loader_module
Định nghĩa
|
idaman int ida
export
load loader module(linput t *li, const char
*lname, const char *fname, bool is remote)
|
Chú giải
|
Nạp một tập tin vào CSDL IDB hiện tại,
có thể là một thực thể kiểu linput_t, *li, hoặc là
tên tập tin trong *fname, sử dụng modun nạp *lname. Nếu
*li có giá trị NULL, *fname phải được cung cấp và
ngược lại. Trả về 1 nếu thành công, 0 nếu thất
bại.
|
Ví dụ
|
#include <kernwin.hpp> // For askfile
cv()
|
5.12.4
load_binary_file
Định nghĩa
|
idaman bool ida
export
load binary file(const char *filename, linput t
*li, ushort neflags, long fileoff, ea t basepara, ea t binoff,
ulong nbytes);
|
Chú giải
|
Nạp tập tin nhị phân *li, có tên là
filename tại địa chỉ bắt đầu fileoff. Nflags là bất
cứ giá trị cờ nào được định nghĩa trong kiểu
liệt kê NEF tại tập tin loader.hpp. nbytes xác định số
byte được nạp từ tập tin, 0 sẽ nạp toàn bộ tập
tin. Basepara là đoạn mà tập tin nhị phân mới này sẽ
được nạp, và binoff là địa chỉ trong đoạn đó.
Bạn có thể yên tâm gán basepara đến địa chỉ mà
bạn muốn tập tin được nạp và gán binoff bằng 0.
Trả về sai nếu việc nạp thất bại.
|
Ví dụ
|
// Ask the user for
a filename
char file = askfile cv(0, "", "DLL
file..", NULL);
|
5.12.5
gen_file
Định nghĩa
|
idaman int
ida_export
gen_file(ofile_type_t otype, FILE *fp, ea_t
eal, ea_t ea2, int flags)
|
Chú giải
|
Tạo ra tập tin kết xuất, *fp, dựa
trên tập tin CSDL IDB đang mở. ea1 và ea2 là địa chỉ
bắt đầu và kết thúc tương ứng, tuy nhiên giá trị
này được bỏ qua đối với một vài kiểu kết xuất.
otype phải được đặt như sau. Giá trị được lấy
từ loader.hpp.
|
Ví dụ
|
|
5.12.6
save_database
Định nghĩa
|
idaman void ida
export
save database(const char *outfile, bool delete
unpacked)
|
Chú giải
|
Lưu lại tập tin CSDL theo đường dẫn
được cho bởi *output. Nếu tham số delete_unpacked có
giá trị false, tập tin được giải nén tạm thời
không được xóa. Hàm này không trả về bất cứ giá
trị nào, bởi vậy không thể xác định được là
việc lưu trữ có thành công hay không, ngoại trừ việc
kiểm tra tập tin có tồn tại sau khi hàm được gọi
hay không.
|
Ví dụ
|
#include
<loader.hpp>
msg("Saving
database..."); char *outfile = "c:\\myidb.idb";
save database(outfile, false);
// There was an
error if the filesize is <= 0 if (qfilesize(outfile) <= 0)
msg("failed.\n");
else
msg("ok\n");
|
5.13
Cờ
Những
hàm bên dưới được dùng để kiểm tra những cờ cụ
thể (xem phần 4.3) có được đặt cho một byte trong tập
tin được disassemble hiện tại hay không. Tất cả chúng
được định nghĩa trong bytes.hpp.
5.13.1
get_flags_novalue
Định nghĩa
|
inline flags t idaapi get flags novalue(ea t
ea)
|
Chú giải
|
Trả về cờ được đặt cho địa chỉ
ea. Bạn sẽ cần phải chạy hàm này để lấy cờ cho
một địa chỉ trước khi sử dụng các hàm như
isHead(), isCode(), vv.
|
Ví dụ
|
#include
<kernwin.hpp> // For get screen ea() definition #include
<bytes.hpp>
msg("Flags for
%a are %08x\n", get screen ea(),
get flags novalue(get screen ea()));
|
5.13.2
isEnabled
Định nghĩa
|
idaman bool ida export isEnabled(ea t ea)
|
Chú giải
|
Địa chỉ ea có tồn tại trong tập tin
được diassemble hay không?
|
Ví dụ
|
#include
<kernwin.hpp> // For askaddr() definition #include
<bytes.hpp>
ea t addr;
askaddr(&addr,
"Address to look for:");
if (isEnabled(addr))
msg("%a found
within the currently opened file(s).", addr);
else
msg("%a was not found.\n");
|
5.13.3
isHead
Định nghĩa
|
inline bool idaapi isHead(flags t F)
|
Chú giải
|
Tập cờ F có phải là đánh dấu bắt
đầu của mã hoặc dữ liệu ?
|
Ví dụ
|
#include <kernwin.hpp>
|
5.13.4
isCode
Định nghĩa
|
inline bool idaapi isCode(flags t F)
|
Chú giải
|
Tập cờ F đánh dấu bắt đầu chỉ
thị? Hàm này giống như isHead(), nhưng chỉ trả về
true đối với code, với dữ liệu thì không. Bởi vậy,
nếu bạn sủe dụng một mã byte không phải là byte
đầu, nó sẽ trả về sai.
|
Ví dụ
|
#include <segment.hpp> // For segment
functions #include <bytes.hpp>
|
5.13.5
isData
Định nghĩa
|
inline bool idaapi isData(flags t F)
|
Chú giải
|
Tập cờ F có đánh dấu đoạn đầu
của dữ liệu ? Hàm này giống như isHead() nhưng chỉ
trả về đúng nếu là dữ liệu, không phải là code.
Bởi vậy, nếu được sử dụng trong một byte dữ liệu
mà không phải là byte đầu, nó sẽ trả về sai.
|
Ví dụ
|
#include
<segment.hpp> // For segment functions #include <bytes.hpp>
for (int i = 0; i <
get segm qty(); i++) { segment t *seg = getnseg(i); if (seg->type
== SEG DATA) {
// Look for any
bytes in the data segment that // aren't data (possibly code).
for (ea t a =
seg->startEA; a < seg->endEA; a++) { flags t flags = get
flags novalue(a); if (isHead(flags) && !isData(flags))
msg("Non-data
at %a in segment: %s.\n", a,
get segm name(seg));
}
}
}
|
5.13.6
isUnknown
Định nghĩa
|
inline bool idaapi isUnknown(flags t F)
|
Chú giải
|
Tập cờ F có đánh dấu byte đã không
được phân tích bởi IDA hay không ?
|
Ví dụ
|
#include
<segment.hpp> // For segment functions #include <bytes.hpp>
// Loop through
every segment for (int i = 0; i < get segm qty(); i++) {
segment t *seg = getnseg(i);
// Look for any
unexplored bytes in this segment for (ea t a = seg->startEA; a
< seg->endEA; a++) { flags t flags = get flags novalue(a);
if (isUnknown(flags))
msg("Unknown
bytes at %a in segment: %s.\n", a,
get segm name(seg));
}
}
|
No comments:
Post a Comment