Saturday 8 November 2014

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

4.6 Chuỗi
Cửa sổ chuỗi trong IDA có thể được truy cập sử dụng SDK, thông thường mỗi chuỗi trong tập tin nhị phần (được xác định khi tập tin được mở) được đại diện bởi một cấu trúc string_info_t, định nghĩa trong tập tin strlist.hpp. Bên dưới là một trích đoạn ngắn của cấu trúc này.
struct string_info_t
{
ea_t ea; // Address of the string
int length; // String length
int type; // String type (0=C, 1=Pascal, 2=Pascal 2 byte
// 3=Unicode, etc.)
...
};



Chú ý rằng cấu trúc ở trên có thể không thật sự chứa một chuỗi. Để lấy chuỗi, bạn cần tríc nó từ tập tin nhị phân sử dụng get_bytes() hoặc get_many_bytes(). Để duyệt qua danh sách của chuỗi, bạn có thể sử dụng đoạn mã sau:
for (int i = 0; i < get_strlist_qty(); i++)
{
char string[MAXSTR];
string_info_t si; // Get the string item
get_strlist_item(i, &si);
if (si.length < sizeof(string))
{
// Retrieve the string from the binary
get_many_bytes(si.ea, string, si.length);
if (si.type == 0) // C string
msg("String %d: %s\n", i, string);
if (si.type == 3) // Unicode
msg("String %d: %S\n", i, string);
}
}



5. Hàm
Phần này sẽ được chia thành nhiều chuyên mục tương ứng với những nhóm hàm của IDA SDK. Tôi sẽ bắt đầu từ những hàm đơn giản và được sử dụng thường xuyên cho đến nhứng hàm phức tạp và hiếm dùng. Tôi cũng sẽ cung cấp những ví dụ cơ bản với mỗi hàm và ví dụ trong phần Ví dụ sẽ cung cấp ngữ cảnh nhiều hơn. Hiển nhiên, đây không phải tài liệu tham khảo toàn bộ (hãy dựa vào những tập tin tiêu đề trong SDK để làm điều đó), nhưng có ý nghĩa tổng quan hơn về những hàm được dùng nhiều và có ích.
Chú ý quan trọng về ví dụ : Tất cả các hàm bên dưới có thể được gọi từ IDAP_run(), IDAP_init() hoặc IDAP_term(), trừ khi chúng được xác định rõ. Mỗi ví dụ có thể được dán thẳng vào hàm IDAP_run() từ khuông mẫu plugin trong phần 3.5 và sẽ làm việc. Những tập tin tiêu đề cần thiết cho mỗi chức năng của ví dụ sẽ được xác định khi cần thiết.
5.1 Thay thế những hàm thường dùng
IDA cung cấp nhiều hàm thay thế cho những hàm thường dùng trong thư viện C. Tôi đề nghị bạn nên sử dụng những hàm thay thế bên dưới thay vì những hàm được cung cấp bởi thư viện C của bạn. Với phiên bản 4.9, rất nhiều hàm trong thư viện C không còn được sử dụng – bạn phải sử dụng những hàm tương đương trong IDA.
C Library Functions
IDA Replacements
Defined In
fopen, fread, fwrite, fseek, fclose
qfopen, qfread, qfwrite, qfseek,qfclose
fpro.h
fputc, fgetc, fputs, fgets
qfputc, qfgetc, qfputs, qfgets
fpro.h
vfprintf, vfscanf, vprintf
qfprintf, qfscanf, qvprintf
fpro.h
strcpy, strncpy, strcat, strncat
qstrncpy, qstrncat
pro.h
sprintf, snprintf, wsprintf
qsnprintf
pro.h
open, close, read, write, seek
qopen, qclose, qread, qwrite, qseek
pro.h
mkdir, isdir, filesize
qmkdir, qisdir, qfilesize
pro.h
exit, atexit
qexit, qatexit
pro.h
malloc, calloc, realloc, strdup, free
qalloc, qcalloc, qrealloc, qstrdup, qfree
pro.h


Tôi thật sự khuyên bạn nên sử dụng những hàm ở trên, tuy nhiên, nếu bạn chuyển đổi một plugin cũ và vì một vài lý do cần sử dụng những hàm của thư viện C, bạn có thể dịch plugin của bạn với tham số:

-DUSE_DANGEROUS_FUNCTIONS or –DUSE_STANDARD_FILE_FUNCTIONS.

No comments: