본문 바로가기

4-8. 2021-1 심화 스터디/리버싱을 활용한 디버거 플러그인 개발

[2021.3.13] 디버거 플러그인 개발 프로젝트 관련 개념

① 리버싱

 

- 리버스 엔지니어링(Reverse Engineering, 이하 리버싱)이란, 소스 코드를 역추적하는 것을 말한다. 소스 코드를 빌드해서 만들어진 exe, dll 바이너리를 분석해 원래의 소스 코드가 어떤 식으로 만들어졌는지 소스 코드의 구조를 파악하는 행위를 말한다. 이러한 리버싱은 악성코드 분석, 모의해킹 및 취약점 발견, 보안 코드 개발 등에 사용된다. 리버싱에서는 소프트웨어에서 가장 낮은 레벨의 언어인 ‘어셈블리어(Assembly language)’가 사용된다.



② 디버거

 

- 다른 대상 프로그램을 테스트하고 디버그 하는 데 쓰이는 컴퓨터 프로그램이다. 디버그란 컴퓨터 프로그램 개발 단계 중에 발생하는 시스템의 논리적인 오류나 비정상적 연산(버그)을 찾아내고 그 원인을 밝히고 수정하는 작업 과정을 뜻한다.

 

 

플러그인

 

- 플러그인(plugin)은 호스트 응용 프로그램과 서로 응답하는 컴퓨터 프로그램이며, 특정한 주문식 기능을 제공한다.

- OllyDBG에는 안티디버깅 및 안티리버싱을 무력화하는 플러그인, 로깅 기능이나 도우미 프로그램 같은 작업을 반복하지 않도록 시간을 절약해 주는 플러그인 등 굉장히 다양하고 막강한 플러그인이 존재한다.

- 현재 존재하고 있는 플러그인 뿐 아니라, 많은 사람들이 OllyDBG를 이용해 플러그인을 추가하고 배포할 수 있다.




④ 플러그인 SDK 사용 규약 (SDK를 사용하는 5가지 규칙)

 

1. 모든 function은 이름으로 익스포트해야 한다. ordinal로 내보내면 OllyDBG에서 GetProcAddress()로 함수 포인터를 가져올 때 제대로 얻어올 수 있기 때문이다.

2. C++ 컴파일러를 쓴다면 네임 맹글링을 사용하지 않아야 한다.(extern “C”로 선언해야 한다.)  1)번과  같은 이유로 익스포트 함수 문자열이 변경되는 것을 방지하기 위함이다.

3. 콜백 함수는 _cdecl을 사용해야 한다. 스택 정리의 규칙을 정하기 위해서이다.

4. SDK의 헤더 파일인 plugin.h의 모든 구조체는 BYTE 단위로 정렬돼 있다.

5. 기본 char 타입을 UNSIGNED로 설정해야 한다.

 

- 플러그인은 기본적으로 DLL 형태로 제작해야 한다.

- DLL 프로젝트를 구성한 뒤, OLLYDBG 라이브러리를 링크하고 필수적인 익스포트 펑션 몇가지를 선언해서 원하는 기능을 구성하면 간단히 플러그인 만드는 것 가능