Saturday 8 November 2014

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

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: