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 |