Study/IDA

IDA Python Plugin

대장흰둥 2021. 3. 11. 13:50

1. 플러그인 로딩

  • IDA세션 시작은 IDA시작시 이뤄짐.
  • 사용자 입력을 받기 전과 대기 상태에 들어가기 전에 신규 바이너리를 분석 하거나 또는 기존 DB를 분석.
  • 그 동안 플러그인이 로딩 된다

2. 플러그인이 로딩되는 경우

  • DB로딩과 관계없이 IDA시작시에 로딩될 수 있다. PLUGIN.flags의 PLUGIN_FIX 비트의 설정여부에 달려있다
  • 프로세서 모듈 실행 후 즉시 플러그인이  로딩된다. 프로세서 모듈이 언로드 될때까지 로딩된 상태로 남아있는다. PLUGIN.flags의 PLUGIN_PROC 비트에 달려있다
  • 위에서 언급한 플래그 비트가 없다면 DB가 열릴때마다 플러그인 로딩환경을 만들어준다

3. 플러그인 로딩 과정

  • 기본적으로 PLUGIN.init 함수로 플러그인을 로딩하는데 이 때 위의 3가지 상태에 따라서 로딩이 가능한지를 판단한다
  • 판단 후 init은 int라는 것을  리턴하는데 그 값은 loader.hpp에 정의된 값중 하나를 반드시 리턴 해야 한다
loader.hpp 에 로딩되어있는 int 값
PLUGIN_SKIP 로드 될 필요없는 플러그인
PLUGIN_OK 플러그인이 현재 db를 이용할 수있다. 사용자가 메뉴 or 단축키로 플러그인을 실행할 때만 플러그인을 로딩한다
PLUGIN_KEEP 플러그인이 현재 db를 이용할 수 있고 메모리에 항시 플러그인이 로딩된 상태를 유지하게 한다.

 

4. 플러그인 활성화(플러그인 로딩 이후)

플러그인로딩이 다 된 경우 두 가지 방법으로 활성화 할 수 있다.

  • 메뉴나 단축키로 활성화 하는 방법 → 이때 ida 가 PLUGIN.run 을 호출하여 제어권을 플러그인으로 넘겨준다. 
  • IDA 의 이벤트 공지 메세지를 후킹하여 활성화 → IDA의 이벤트 중 관심있는 이벤트에 콜백함수를 등록시켜서 사용할 수 있다.

5. 플러그인 언로드

  • term 함수의 호출로 가능하다. 
  • flag 의 설정 값에 따라서 플러그인이 언로드 된다
  • 설정하지않았다면 보통 플러그인이 사용하는 DB가 닫힐 때 같이 언로드된다 .
  • flags 비트가 PLUGIN_UNL 비트를 기술해 놨다면 run 함수 호출 후 언로드  되며, 활성화 할 때마다 로드(init호출)를 다시  해야 한다

6. 이벤트 호출

보통 edit-plugin 탭이나 단축키로 호출되지만 이벤트 공지(event notification) 기능으로 플러그인을 호출할 수도 있다. 

  • hook_to_notification_point 함수로 관심있는 이벤트를 알릴 수 있다.
  • 해당 이벤트가 발생했을 때 등록한 함수를 호출할 수 있다.

예제소스

//typedef : 이벤트 후킹 콜백함수(loader.hpp)
typedef int idaapi hook_cb_t(void *user_data, int notification_code, va_list va);

//프로토타입 : hook_to_notification_point (loader.hpp)
bool hook_to_notification_point(hook_type_t hook_type, hook_cb_t *callback, void *user_data);

int idaapi idabook_plugin_init(){
   hook_to_notification_oint(HT_IDB,idabook_database_cb,NULL);
}

 

7. 공지 메시지를 처리하는 주요 4단계 프로세서

  • 프로세서 공지(idp_notify,HT_IDP of idp.hpp)
  • 사용자 인터페이스 공지(ui_notification_t, HT_UI of kernwin.hpp)
  • 디버거 이벤트(dbg_notification_t, HT_DBG of dbg.hpp)
  • 데이터베이스 이벤트(idP-event_t,HT_IDB of idp.hpp))

이벤트가 발생할 때마다 등록된 콜백 함수를 불러 공지코드와 추가 파라미터를 건네준다.

공지 메시지와 함께 전달되는 파라미터는 SDK 헤더의 공지코드 부분을 살펴보면 된다.

'Study > IDA' 카테고리의 다른 글

[PyQt4] Example  (0) 2021.03.28
IDA 간단한 팝업창 만들기  (0) 2021.03.22
IDAPython API 정리 2  (0) 2021.01.19
IDAPython API 정리  (0) 2021.01.12