Wednesday 26 February 2014

Hexrays Python Binding for IDA 6.1 and Python 2.7

This is my hexrays-python prebuild:

IDA 6.1 & Python 2.7
https://mega.co.nz/#!sd8ARbSZ!gQeF3RqzgS_ynVR2KYxA0MIZxri1Ak5db45oiJ15gfw
Read more about hexrays-python in:

https://github.com/EiNSTeiN-/hexrays-python

Video Demo:

Demo Hexrays Python in IDA Pro 6.1 & Python 27

Demo code:

""" It demonstrates how to decompile full function at current cursor position.
Author: ASUS
"""
import hexrays
import idaapi
 
def main():
  # Start hexrays plugin
  if not hexrays.init_hexrays_plugin():
    return False
 
  print "Hex-rays version %s has been detected" % hexrays.get_hexrays_version()
 
  # Get function at current screen address
  f = idaapi.get_func(idaapi.get_screen_ea());
  if f is None:
    print "Please position the cursor within a function"
    return True
 
  # Decompile whose function
  cfunc = hexrays.decompile(f);
  if cfunc is None:
    print "Failed to decompile!"
    return True
 
  # Print function as string
  print str(cfunc)
 
if main():
  # Terminate hexrays plugin
  hexrays.term_hexrays_plugin();

Read more:

http://techbliss.org/threads/hexrays-python-binding-for-ida-6-1-hexrays-1-5.479/

Xây dựng trình cắm cho IDA Pro (Phần 4)

Phần 1:
http://vcyberwarface.blogspot.com/2014/02/xay-dung-trinh-cam-cho-ida-pro-phan-1.html
Phần 2:
http://vcyberwarface.blogspot.com/2014/02/xay-dung-trinh-cam-cho-ida-pro-phan-2.html
Phần 3:
http://vcyberwarface.blogspot.com/2014/02/xay-dung-trinh-cam-cho-ida-pro-phan-3.html


4. Cơ bản

Có nhiều lớp, cấu trúc dữ liệu và kiểu khác nhau trong IDA SDK, một số được sử dụng nhiều hơn những thứ khác. Mục tiêu của phần này là sẽ giới thiệu bạn với những phần đó, vì chúng cung cấp một cái nhìn sâu hơn vào những gì mà IDA biết về tập tin disassemle, và có thể đưa ra những ý tưởng về những khả năng mà bạn có thể sử dụng với SDK.

Một vài lớp và cấu trúc có kích thước quá lớn, với nhiều biến thành viên và phương thức/hàm. Trong phần này, hầu hết các biến sẽ được mô tả, những phương thức sẽ được mô tả trong Chương 5 – Hàm. Một vài đoạn chú thích mã ở bên dưới được lấy trực tiếp từ IDA SDK, một vài là do tôi chú thích, và một số khác thì kết hợp cả hai. Những chỉ thị tiền xử lý #define, trong một vài trường hợp, được sử dụng bên cạnh nhiều biến thành viên, giống như cách mà nó được dùng trong SDK. Tôi đặt những phần đó ở đây, bởi vì nó mô tả một cách rõ ràng những giá trị hợp lệ mà những biến thành viên có thể có.

Chú ý quan trọng về mã ví dụ: Mã từ bất kỳ phần ví dụ nào của phần này nên được đặt trong hàm iDAP_run() ở khuôn mẫu 3.5, trừ khi nó có mục đích khác.

4.1 Những kiểu dữ liệu cơ sở
Những kiểu sau được sử dụng qua suốt SDK trong tài liệu này, bởi vậy, điều quan trọng là bạn phải nhận ra được nó khi nó được sử dụng.

Tất cả những kiểu bên dưới đều thuộc kiểu nguyên dài không dấu (unsigned long), và kiểu nguyên dài trong hệ thống 64bit. Chúng được định nghĩa trong pro.h.

Kiểu
Mô tả
ea_t
Viết tắt của ‘Effective Address’, và mô tả hầu như tất cả địa chỉ nào trong IDA (bộ nhớ, tập tin, limits, vvv)
sel_t
Chọn lọc phân đoạn, như trong mã, ngăn xếp và đoạn dữ liệu.
uval_t
Dùng để đại diện cho một giá trị không dấu.
asize_t
Hầu hết được dùng để đại diện cho kích cỡ một thứ gì đó, thường là một đoạn của bộ nhớ.

Những kiểu dữ liệu tiếp theo là những kiểu nguyên có dấu, và kiểu nguyên dài có dấu trong nền tảng 64bit. Chúng được định nghĩa trong tập tin pro.h

Kiểu
Mô tả
sval_t
Dùng để đại diện cho giá trị có dấu
adiff_t
Dùng để đại diện cho sự khác biệt giữa hai địa chỉ.

Cuối cùng, có một số hằng số cần phải được chú ý; một trong số đó là BADADDR, nó đại diện cho một địa chỉ không hợp lệ hoặc không tồn tại, bạn sẽ thấy nó được sử dụng trong vòng lặp để dò tìm phần kết của một khoảng địa chỉ đọc được hoặc một cấu trúc. Bạn cũng sẽ bắt gặp MAXSTR được sử dụng trong định nghĩa bộ đệm ký tự, có giá trị 1024.

4.2 Những cấu trúc và lớp cơ sở

4.2.1 Siêu thông tin

struct idainfo
{
  char          tag[3];                        // 'IDA'
  ushort        version;                    // Version of database
  char          procName[8];            // Name of current processor
  void set_proc_name(const char *name)
  {
    size_t len = strlen(name) + 1;
    memcpy(procName, name, qmin(len, sizeof(procName)));
  }
  char *get_proc_name(char *buf) const
  {
    buf[0] = procName[0];
    buf[1] = procName[1];
    buf[2] = procName[2];
    buf[3] = procName[3];
    buf[4] = procName[4];
    buf[5] = procName[5];
    buf[6] = procName[6];
    buf[7] = procName[7];
    buf[8] = '\0';
    return buf;
  }

  uchar         lflags;                 // Misc. flags
…………
};

Cấu trúc idainfo, được lưu trữ vật lý trong tập tin cơ sở dữ liệu của IDA (IDB), lưu giữ những gì mà tôi sẽ xem như là những ‘siêu thông tin’ về việc khởi tạo cho tập tin được nạp vào IDA. Nó không thay đổi nếu nhiều tập tin được nạp. Đây là một vài phần hấp dẫn của nó, như được định nghĩa trong ida.hpp:

inf là một thực thể có thể truy cập toàn cục của cấu trúc này. Bạn sẽ thường thấy những kiểm tra đối với inf.procName trong hàm khởi tạo của plugins, kiểm tra kiến trúc máy mà plugins được viết để làm việc.
Ví dụ, nếu bạn viết một plugins chỉ làm việc với loại tập tin nhị phân dạng PE và ELF cho kiến trúc x86, bạn có thể thêm vào những dòng sau vào phần khởi tạo của plugin (iDAP_init từ khuôn mẫu plugin của chúng ta ở mục 3.5).

// “metapc” đại diện cho kiến trúc x86
if (strncmp(inf.procName, "metapc", 8) != 0
            || inf.filetype != f_ELF && inf.filetype != f_PE))
{
            error("Only PE and ELF binary type compiled"
             "for the x86 platform is supported, sorry.");
            return PLUGIN SKIP;
            // Trả về PLUGIN_SKIP có nghĩa rằng plugin này
            // sẽ không được nạp
}
return PLUGIN KEEP; // Cho phép plugin tiếp tục nạp


F_ELF và f_PE là hai phần tử trong kiểu liệt kê filetype_t được định nghĩa trong tập tin tiêu đề ida.hpp.
4.2.2 Vùng

Trước khi đi vào chi tiết trong những cấu trúc lớp ở mức cao hơn để làm việc với đoạn, hàm và các chỉ thị, chúng ta hãy xem xét hai khái niệm nòng cốt; tên vùng và khối điều khiển vùng.

4.2.2.1 Cấu trúc area_t

Một vùng được đại diện bằng một cấu trúc area_t, được định nghĩa trong tập tin tiêu đề area.hpp. Dựa vào những ghi chú trong tập tin này, ta có thể nói một cách cụ thể:
“Vùng” bao gồm nhiều vùng con thuộc kiểu  area_t. Một vùng là một khoảng không rỗng bao gồm những địa chỉ tuyến tính (được xác định bởi địa chỉ bắt đầu và địa chỉ kết thúc, địa chỉ kết thúc không được chỉ rõ trong vùng) với những thuộc tính của nó.Ví dụ, một đoạn là một tập của các vùng.

Bạn có thể thấy phần khai báo bên dưới được lấy từ định nghĩa area_t, một vùng được định nghĩa bởi địa chỉ bắt đầu (startEA) và địa chỉ kết thúc (endEA) – địa chỉ này thường bị bỏ qua. Cùng một loạt các phương thức để kiểm tra nếu một vùng có chứa một địa chỉ cụ thể hay không, kiểm tra vùng rỗng, và cho biết kích thước của vùng. Một đoạn là một vùng, nhưng một  hàm cũng là một vùng, điều đó có nghĩa là nhiều vùng có thể lồng nhau.

struct area_t
{
            ............
  ea_t startEA;
  ea_t endEA;                  // endEA bị bỏ qua
  area_t(void) {}
  area_t(ea_t ea1, ea_t ea2) : startEA(ea1), endEA(ea2) {}
            ............
};


Theo cách nói kỹ thuật, nói rằng hàm và phân đoạn là vùng, là nói rằng lớp func_t và segment_t được mở rộng từ lớp area_t. Điều này có nghĩa rằng tất cả các biến và hàm trong cấu trúc area_t đều có thể được sử dụng bởi func_t và segment_t (ví dụ, segment_t.startEA và func_t.contains() đều hợp lệ). func_t và segment_t thêm vào area_t với những biến và hàm riêng biệt của chúng. Chúng sẽ được trình bày sau.
Một vài lớp được mở rộng từ lớp area_t như ở bên dưới:

Kiểu (tập tin)
Mô tả
hidden_area_t (bytes.hpp)
Vùng ẩn là nơi mà mã/dữ liệu được thay thế và tóm gọn bởi mô tả có thể được mở rộng để xem những thông tin ẩn.
regvar_t (frame.hpp)
Những tên thanh ghi được thay thế bởi những tên định nghĩa bởi người dùng (biến thanh ghi)
memory_info_t (idd.hpp)
Một khối bộ nhớ (khi sử dụng trình dò lỗi)
segreg_t (srarea.hpp)
Thông tin về thanh ghi đoạn (CS, SS, vv, trên nền x86)

4.2.2.2 Lớp areacb_t

Một khối điều khiển vùng (Area Control Block)  được đại diện bằng lớp areacb_t, và được định nghĩa trong tập tin area.h. Chú thích cho nó, như được trình bày bên dưới, có rất ít thông tin, nhưng không thật sự cần thiết:

“areacb_t” là một lớp cơ sở được sử dụng trong nhiều phần của IDA
Để mở rộng định nghĩa này; lớp này chỉ đơn giản là một tập hợp các phương thức được sử dụng để thao tác với vùng. Những phương thức này bao gồm get_area_qty(), get_next_area() và một số khác. Hầu như bạn sẽ không sử dụng những phương thức này một cách trực tiếp, khi bạn làm việc với những ví dụ, bạn sẽ sử dụng nhiều các phương thức của các lớp dẫn xuất như func_t và segment_t, và đây nguyên tắc chung được áp dụng cho những lớp được mở rộng từ area_t.

Có hai thực thể toàn cục của lớp areacb_t, tên là segs (được định nghĩa trong segment.hpp) và funcs (được định nghĩa trong funcs.hpp), mà nó đại diện cho tất cả các phân đoạn và hàm, tương ứng với tập tin bị đảo mã hiện tại. Bạn có thể thực thi đoạn mã sau để liệt kê số lượng phân đoạn và hàm trong tập tin đang bị đảo mã được mở bởi IDA (nhớ rằng đầy không phải là đoạn mã độc lập, nó phải được đặt trong iDAP_run):

#include <segment.hpp>
#include <funcs.hpp>
msg("Segments: %d, Functions: %d\n", segs.get_area_qty(),
            funcs.get_area_qty());



(Còn tiếp)

Xây dựng Trình cắm cho IDA Pro (Phần 3)

Phần 1:
Phần 2:

3. Cài đặt môi trường phát triển
Lưu ý đối với người dùng Borland: Chỉ có trình biên dịch Borland được hỗ trợ bởi IDA SDK không được trình bày trong phần này. Bạn cần phải đọc tập tin install_cb.txt và makenv_br.mak trong thư mục gốc của SDK để xác định những thông số cần thiết cho trình dịch và liên kết.
Trước khi bắt đầu việc viết mã, thì tốt nhất là bạn cần phải có một môi trường lập trình được cài đặt trước để thuận tiện cho quá trình phát triển. Những môi trường phổ biến sẽ được đề cập, thành thật xin lỗi nếu môi trường của bạn không được đề cập ở đây. Nếu bạn đã cài đặt thành công, hãy cảm thấy thoải mái để bỏ qua phần này.

3.1 Hệ điều hành Windows (Sử dụng Visual Studio)
Phiên bản Visual Studio được sử dụng trong ví dụ này là Visual C++ 2008 phiên bản Express, nhưng hầu hết có thể tương tích với những phiên bản cũ hơn.
1
Chọn File à New à Project (Ctrl + Shift + N)
2
Chọn vào thư mục Visual C++, chọn thư mục con Win32, tại đây bạn sẽ chọn biểu tượng Win32 Project. Đặt tên cho dự án này và nhấn OK.
3
Trình thuật sĩ của Visual Studio sẽ xuất hiện, chọn vào Application Settings ở phía bên trái và chắc chắn rằng tùy chọn Windows Application được chọn, sau đó nhấp chọn vào hộp kiểm Empty Project. Nhấn Finish.
4
Trong Khung Solutions Explorer ở phía bên phải, nhấn chuột phải và chọn thư mục Source Files, chọn vào Add à New Item…
5
Chọn C++ File (.cpp) trong phần Templates và đặt tên tập tin. Chọn Add và lặp lại bước này cho những tập tin mà bạn muốn thêm vào.
6
Vào Project à ProjectName à Properties
7
Thay đổi những thiết lập bên dưới (những phần được đặt ở đây là để giảm bớt kích thước của plugin)
Chọn vào mục cấu hình ở trên cùng và chọn Release
Configuration Properties à General : thay đổi Configuration Type thành Dynamic Library (.dll)
C/C++ à General : Chọn vào Detect 64-bit Portability Issuses giá trị No
C/C++ à General : Đặt giá trị Debug Information Format thành Disabled.
C/C++ à General : Thêm thư mục Include của SDK vào Additional Include Directory (vd : C:\IDA\SDK\Include)
C/C++ à Preprocessor : thêm NT; IDP vào mục Preprocessor Definitions
C/C++ à Code Generation : Tắt chế độ Buffer Security check, đặt Basic Runtime Check thành Default và đặt Runtime Library thành Multi-thread
C/C++ à Advanced : Calling Convention thành stdcall
Linker à General : Thay đổi Output từ *.exe thành *.plw trong thư mục IDA plugin
Thêm đường dẫn của thư mục chứa thư viện libvc.wXX vào Additional Library Directory. (vd. C:\IDA\SDK\libvc.w32
Linker à Input : Thêm ida.lib vào Additional Dependencies.
Linker à Debugging : Generate Debug Info thành No
Linker à Command Line : Thêm vào /EXPORT:PLUGIN
Build Events à Post-Build Event : Đặt lệnh cho idag.exe khởi động IDA sau mỗi lần plugin được dịch thành công (Tùy chọn)
Chọn OK
8
Vào Build à Configuration Manager và thay đổi mục trong hộp xổ xuống tại cột Configuration từ Debug thành Release. Chọn OK
9
Xem phần 3.5

3.1.1 Sử dụng Python để biên dịch
Ngoài việc sử dụng Visual Studio để biên dịch, bạn có thể sử dụng trực tiếp giao diện dòng lệnh thông qua sự trợ giúp của Python.
……… (Phần này sẽ bổ xung sau)
3.2 Hệ điều hành Windows, sử dụng Dev-C++ với trình GCC và MingGW
Bạn có thể lấy một bản sao chép của Dev-C++, GCC và MinGW như một gói từ http://www.bloodshed.net/dev/devcpp.html. Cài đặt và cấu hình nó thì không thuộc phạm vi của tài liệu này, bởi vậy kể từ đây, tôi sẽ giả sử là tất cả các bước trước đó đều hoàn tất.
Cũng như trước, khởi động Dev-C++ và chắc chắn rằng không có dự án và tập tin nào được mở, chúng ta muốn cấu hình mọi thứ từ đầu.
1
Chọn vào File à New Project, chọn Empty Project, hãy chắc chắn rằng C++ Project được chọn và hãy đặt tên cho nó, sau đó chọn OK.
2
Chọn thư mục để lưu tập tin đề án, đây có thể là bất cứ đâu bạn thích. Chọn OK
3
Vào Project à New File, đây là nơi sẽ chứa mã nguồn của plugin. Lặp lại bước này với những tập tin mà bạn muốn thêm vào dự án.
4
Vào Project à Project Options, chọn vào mục Parameter.
5
Trong mục C++ Compiler, thêm vào
-DWIN32 –D NT –D IDP –v –mrtd
6
Trong mục Linker, thêm vào
../path/to/your/sdk/libgcc.wXX/ida.a –Wl, --dll –shared
Chú ý rằng tốt nhất đường dẫn nên bắt đầu với ../, bởi vì msys có vẻ bị lúng túng khi bạn sử dụng /, và nó cố gắng tham chiếu nó vào thư mục gốc của msys.
7
Chọn vào mục Directory, và mục con Include Directories. Thêm đường dẫn SDK vào danh sách.
8
Trong mục Build Options, đặt Executable Output trỏ đến thư mục chứa plugin của IDA, và ghi đè tập tin kết xuất với phần mở rộng là .plw.  Chọn OK.
9
Xem phần 3.5

3.3 Hệ điều hành Linux, sử dụng GCC
Không giống như những plugin trong môi trường Window, được kết thúc bởi .plw. Những plugin trong Linux cần phải được kết thúc bằng .plx. Hơn nữa, trong ví dụ này, không có trình IDE, bởi vậy thay vì đi qua một loạt các bước. Tôi sẽ chỉ trình bày những thông số cần thiết cho Makefile mà bạn sẽ phải dùng. Ví dụ bên dưới có thể không phải là một tập tin Makefile rõ ràng, nhưng nó sẽ làm việc.
Trong ví dụ này, Ida được cài đặt tại /usr/local/idaadv, và SDK được đặt tại thư mục con sdk. Đặt tập tin makefile này vào thư mục mà bạn chứa mã nguồn của plugin. Bạn cũng cần phải sao chép tập tin plugin.script từ sdk/plugins vào thư mục chứa mã nguồn của bạn và makefile.
Đặt biến SRC bên dưới cho phù hợp với plugin của bạn, và OBJS là những tập tin đối tượng mà nó sẽ được dịch (giống tên, chỉ thay thế bởi phần mở rộng .o)
SRC=file1.cpp file2.cpp OBJS=file1.o file2.o CC=g++
LD=g++
CFLAGS=-D IDP  -D PLUGIN  -c -D LINUX  \
-I/usr/local/idaadv/sdk/include $(SRC)
LDFLAGS=--shared $(OBJS) -L/usr/local/idaadv -lida \
--no-undefined -Wl,--version-script=./plugin.script
all:
$(CC) $(CFLAGS)
$(LD) $(LDFLAGS) -o myplugin.plx cp myplugin.plx /usr/local/idaadv/plugins


Để dịch plugin của bạn, tập tin make sẽ làm việc, và sao chép nó vào thư mục plugins của IDA.

3.4 Những nền tảng khác
Nếu bạn phát triển plugins cho máy Mac và những nền tảng khác không được đề cập ở đây, nguyên tắc chung vẫn giống nhau, tuy nhiên bạn hãy xem xét tập tin pro.h bởi vì bạn sẽ cần phải thay đổi một số thứ trong những chỉ thị tiền xử lý để truyền cho trình biên dịch của bạn. Ví dụ, trong máy Mac bạn sẽ phải định nghĩa MAC_ (thay vì __LINUX_ hoặc __NT_ như được trình bày ở trên), và nếu bạn làm việc với kiến trúc 64bit, bạn sẽ cần phải thêm định nghĩa X64_ (_X86 là mặc định)

3.5 Khuôn mẫu của một plugin
Cách mà IDA được móc nối với plugin của bạn là thông đối tượng PLUGIN của lớp plugin_t, và hầu như đây là thứ duy nhất mà bạn export bằng plugin của bạn (để IDA có thể hiểu nó). Cũng vậy, tập tin duy nhất mà bạn cần thiết phải được bao gồm trong plugin là tập tin ida.hpp, idp.hpp và loader.hpp
Khuôn mẫu bên dưới nên được xem là khuôn mẫu cho tất cả những gì cần thiết để bạn viết một plugin. Nếu bạn dán nó vào một tập tin trong môi trường phát triển của mình, nó sẽ có thể được dịch, và khi bạn chạy nó trong IDA (Edit -> Plugins->Tên plugins, hoặc một phím tắt được định nghĩa), nó sẽ chèn một dòng văn bản “Hello World” vào trong của sổ Log của IDA. Chú ý là ngoài việc khai báo đối tượng PLUGIN là bắt buộc phải đặt đúng tên, còn các khai báo hàm như IDAP_init, IDAP_term, IDAP_run là các tên gợi nhớ, bạn có thể đặt tùy thích và nhớ khai báo chúng tương tứng khi khai báo đối tượng PLUGIN.

#include <ida.hpp>
#include <idp.hpp>
#include <loader.hpp>

int IDAP_init(void)
{
    // Kiem tra o day de chac rang plugin duoc chay trong moi truong
    // phu hop. Tra ve PLUGIN_SKIP neu viec kiem tra that bai
    // nguoc lai se tra ve PLUGIN_KEEP.

    return PLUGIN_KEEP;
}

void IDAP_term(void)
{
    // Doan ma nay duoc thuc hien khi plugin exit, thong thuong
    // ban se can phai lam mot so thu tuc xoa bien o day.
    return;
}

// Mot vai plugin co the duoc truyen cho gia tri kieu nguyen tai tap tin  plugins.cfg
// Dieu nay co the huu dung neu ban muon plugin thuc hien mot chuc nang nao do
// tuy thuoc vao phim tat duoc nhan hoac thuc don nao
// duoc chon.
void IDAP_run(int arg)
{
    // Phan noi dung chinh cua plugin
    msg("Hello world!");
    return;
}

// Doan nay khong co nhieu y nghia. Nhung toi muon dung chung o day
char IDAP_comment[] = "This is my test plug-in";
char IDAP_help[]    = "My plugin";

// Ten cua plugin duoc hien thi tai Edit->Plugins menu. No co the
// duoc ghi de trong tap tin plugins.cfg.
char IDAP_name[]    = "My plugin name";

// Phim tat ma nguoi dung su dung de kich hoat plugin.
char IDAP_hotkey[]  = "Alt-X";

// Phan quan trong nhat la cau truc PLUGIN
plugin_t PLUGIN =
{
    IDP_INTERFACE_VERSION,         // Phien ban IDA ma plugin duoc viet
    0,                     // Nhung co (xem ben duoi)
    IDAP_init,        // Ham khoi tao
    IDAP_term,       // Ham huy
    IDAP_run,         // Phan chinh cua plugin
    IDAP_comment, // Ghi chu (khong dung)
    IDAP_help,        // Giong nhu tren (khong dung)
    IDAP_name,       // Ten cua plugin duoc hien thi o thuc don
                             // Edit->Plugins
    IDAP_hotkey      // Phim tat de chay plugin
};



Bạn có thể bỏ qua việc thiết lập thuộc tính cờ trong cấu trúc PLUGIN, trừ khi nó là một modun dò lỗi, hoặc bạn muốn làm một vài điều như là ẩn nó trong Edit->Plugins. Hãy đọc tập tin loader.hpp để biết thêm thông tin về những cờ mà bạn có thể đặt.

3.6 Cấu hình và chạy plugin
Nếu trình biên dịch của bạn không tự dộng đặt tập tin vào thư mục plugins của IDA, bạn hãy sao chép tập tin plugin (chắc chắn rằng bạn đặt nó có phần mở rộng là .plw cho Windows, hoặc .plx cho Linux) vào thư mục chứa plugins của IDA, và IDA sẽ tự động nạp nó khi khởi động.
Hãy chắc chắn rằng plugins có thể nạp tất cả các thư viện cần thiết (DLL & shared library) lúc khởi động bằng việc thiết lập biến môi trường chính xác (LD_LIBRARY_PATH trong LINUX). Bạn có thể khởi động IDA với tham số cờ -z2 0, sẽ khởi động chế độ dò lỗi của plugin. Điều này sẽ xác định nếu có xảy ra lỗi trong suốt quá trình nạp.
Nếu bạn đặt mã trong hàm IDAP_init(), nó sẽ được thực thi khi IDA nạp tập tin đầu tiên để disassm. Ngược lại, nếu bạn đặt mã vào phần IDAP_run(), nó sẽ được thực thi khi người dùng nhấn phím tắt hoặc thông qua thực đơn Edit->Plugins.

Người dùng có thể ghi đè một vài thông số của PLUGIN trong tập tin plugins.cfg(như là tên và phím tắt), nhưng đó không phải là những điều mà bạn cần phải quan tâm. Tập tin plugins.cfg có thể được sử dụng để truyền những tham số vào plugin của bạn lúc khởi động.

(Còn tiếp...)

Xây dựng trình cắm cho IDA Pro (Phần 2)


Bản thân IDA là một trình đảo mã tuyệt vời cùng với một số lượng lớn các trình gỡ rối. Khi mà bản thân IDA đã có một lượng lớn các chức năng, thì luôn có những thứ mà bạn muốn nó được thực hiện tự động hoặc là làm việc theo những cách mà IDA không hỗ trợ. Thật may mắn là nhà phát triển Hex-Rays đã cho phát hành IDA SDK, đây là cách để bạn kết nối những chức năng mà bạn phát triển với IDA.
Có 4 loại modun mà bạn có thể viết cho IDA sử dụng IDA SDK, modun trình cắm là chủ đề của bài viết này
Kiểu Modun
Mục đích
Trình xử lý
Hỗ trợ thêm cho những kiến trúc ví sử lý khác. Được biết như là các Modun IDP.
Trình cắm
Mở rộng các chức năng khác cho IDA
Trình nạp
Hỗ trợ nạp nhiều định dạng tập tin thực thi
Trình gỡ rối
Hỗ trợ việc dò lỗi trên nhiều nền tảng khác nhau và tương tác với các trình gỡ rối, cho phép gỡ rối từ xa.

Từ đây trở đi, thuật ngữ “trình cắm” sẽ được sử dụng để thay thế cho “plugin modun”, ngoại trừ những trường hợp cần thiết phải nói rõ.
IDA SDK đã bao gồm tất cả những tập tin tiêu đề và thư viện cần thiết để viết trình cắm cho IDA. Nó hỗ trợ một số trình biên dịch trên Linux, Mac và Windows, và cũng kèm theo nhiều ví dụ minh họa những chức năng cơ bản.
Cho dù bạn là một nhà đảo mã, một người nghiên cứu lỗ hồng, phân tích phần mềm độc hại, hoặc làm tất cả những việc trên, SDK cho bạn một sức mạnh lớn và sự mềm dẻo. Bạn có thể tự viết một trình gỡ rối hoặc trình đảo mã mà chỉ sử dụng SDK, và đó chỉ là sự hỗn độn bề ngoài. Đây là một trong những ví dụ nhỏ dễ hiểu về những điều mà bạn có thể làm với SDK.
§  Tự động hóa việc phân tích và giải nén cho những tập tin nhị phân được đóng gói.
§  Tự động hóa việc tìm kiếm việc sử dụng những hàm cụ thể (ví dụ, LoadLibrary(), strcopy(), và bất cứ thứ gì mà bạn có thể nghĩ ra)
§  Phân tích luồng chương trình và dữ liệu, xem xét những thứ mà bạn thấy thích thú.
§  So sánh sự khác biệt giữa 2 tập tin nhị phân
§  Viết một trình dịch ngược.
Vv
Để thấy được ví dụ về những gì mà một số người đã viết sử dụng IDA SDK, tham khảo IDA Palace website hoặc tại trang tải về của ida để biết thêm.
2.1 Cài đặt
Rất dễ dàng. Một khi bạn đã có được SDK (mà thường được nén trong một tập tin dạng .zip), giải nén nó vào một nơi mà bạn chọn. Nơi tôi thường đặt SDK là trong thư mục cài đặt IDA và đặt tất cả mọi thứ vào trong này, nhưng điều này không quan trọng.
2.2 Cấu trúc thư mục
Thay vì đi qua tất cả những thư mục và tập tin trong SDK. Tôi dự định sẽ đi qua các thư mục cần thiết để viết plugin và những gì mà chúng chứa.
Thư mục
Nội dung
/ (Thư mục gốc)
Thư mục gốc chứa các tập tin hướng dẫn biên dịch (makefile) hỗ trợ nhiều môi trường khác nhau, bạn có thể đọc qua tập tin readme.txt trong cùng thư mục để có được cái nhìn tổng thể về SDK, và thấy những thay đổi qua các phiên bản.
Include/
Những tập tin tiêu đề được phân loại theo nhóm tùy theo chức năng. Tôi khuyên bạn nên đọc qua tất cả các tập tin và ghi chú lại những hàm mà bạn thấy cần thiết sau khi đọc qua tài liệu này.
Libbor.wXX/
Đây là những thư viện hàm được IDA sử dụng khi liên kết với trình biên dịch Borland C
LibgccXX.lnx/
LibgccXX.mac/
Các thư viện được sử dụng khi liên kết với trình biên dịch GCC trên nền Mac hoặc Linux
Libgcc.wXX
Các thư viện được sử dụng khi liên kết với GCC sử dụng trong nền Windows
Libvc.wXX
Thư viện IDA sử dụng khi liên kết với trình biên dịch Visual C++ trên nền Windows
Plugins/
Thư mục chứa các trình cắm mẫu
XX là 32 (bit) hoặc 64 (bit), tùy thuộc vào kiến trúc vi sử lý mà bạn đang sử dụng.
2.3 Những tập tin tiêu đề
Có 52 tập tin tiêu đề trong thư mục include, tôi thấy những tập tin sau là cần thiết nhất khi viết plugins cho IDA. Nếu bạn muốn thông tin về tất cả các tập tin tiêu đề, hãy đọc tập tin readme.txt trong thư mục gốc của SDK, hoặc trực tiếp trong tập tin tiêu đề. Danh sách này chỉ cung cấp một tra cứu ngắn gọn khi tìm kiếm một chức năng cụ thể nào đó – nhiều chi tiết hơn sẽ được trình bày trong những phần sau.
Tập tin
Nội dung
area.hpp
Chứa lớp area_t và areacb_t được sử dụng để đại diện cho một “khối”mã, hai lớp này sẽ được trình bày chi tiết ở phần sau.
bytes.hpp
Chứa các định nghĩa và hàm làm việc với những byte trong tập tin được đảo mã.
dbg.hpp & idd.hpp
Chứa những lớp làm việc với trình gỡ rối và các hàm chức năng
diskio.hpp & fpro.h
Chứa các hàm bao cho những hàm chuẩn của ngôn ngữ C như fopen(), open() và một số hàm hỗ trợ để làm việc với tập tin và thư mục.
entry.hpp
Những hàm trong này được dùng để lấy thông tin và thao tác với các điểm nhập (entry point) của tập tin thực thi.
frame.hpp
Những hàm này hỗ trợ làm việc với bộ nhớ như ngăn xếp, ngăn xếp cục bộ hàm, các biến và nhãn cục bộ.
funcs.hpp
Chứa lớp func_t và các hàm làm việc với lớp này.
ida.hpp
Chứa cấu trúc idainfo, cấu trúc này chứa hầu hết thông tin về tập tin được đảo mã.
kernwin.hpp
Các lớp và hàm dùng giao tiếp với IDA.
lines.hpp
Các định nghĩa và hàm làm việc với văn bản được đảo mã, màu sắc mã.
loader.hpp
Chứa hầu hết các hàm có nhiệm vụ nạp tập tin thực thi và thao tác với IDB.
name.hpp
Các hàm và định nghĩa được dùng để thao tác và thiết lập tên gọi cho các byte (tên biến, tên hàm …)
pro.h
Chứa rất nhiều các hàm tiện ích, các định nghĩa
search.hpp
Chứa rất nhiều hàm và định nghĩa dùng để tìm kiếm văn bản, dữ liệu, mã trong tập tin bị đảo mã và nhiều hàm hữu dụng khác.
segment.hpp
Chứa lớp segment_t và tất cả các hàm làm việc với các đoạn nhị phân và các vùng.
strlist.hpp
Cấu trúc về thông tin chuỗi string_info_t và các hàm liên quan để đại diện cho mỗi chuỗi trong một danh sách chuỗi của IDA.
ua.hpp
Chứa lớp insn_t, op_t và optype_t mô tả các chỉ thị của hợp ngữ, các toán tử, kiểu toán tử cùng với các hàm để thao tác với trình phân tích IDA.
xref
Các hàm làm việc với các tham chiếu văn bản và tham chiếu dữ liệu.

2.4 Sử dụng SDK

Nói một cách tổng quát, bất cứ hàm nào trong tập tin tiêu đề có tiền tố là ida_export thì sẵn sàng để bạn sử dụng, cũng như những biến toàn cục có tiền tố là ida_export_data. Nguyên tắc là nên bỏ qua những hàm ở mức thấp (những hàm đó được xác định trong tập tin header) và sử dụng những hàm ở mức giao diện cao cung cấp. Bất cứ định nghĩa lớp, cấu trúc, và liệt kê thì sẵn sàng cho bạn sử dụng.

(Còn tiếp)