예전에 "x64dbg" 에 대한 내용(http://www.xeronichs.com/2016/01/x64dbg.html)을 포스팅 한 이후로...
틈틈이 x64dbg 를 사용하면서 이것저것 익혀보고 있는데요...
이번에 x64dbg 의 '플러그인' 개발에 대해 포스팅을 해볼까~ 합니다 :)
OllyDBG v1.10 의 경우는 플러그인 SDK 안에 SDK 사용법에 관한 참고자료가 있어서 비교적 쉽게 익혔는데...
x64dbg 는 그런게 없어서 예제 플러그인 소스를 참고하며~ 하나 하나 해보면서 익히고 있는 중입니다.
( 혹시라도 x64dbg 플러그인 개발 관련 내용이 정리되어 있는 곳 아시면 공유 좀... ^^;;;;; )
자~ 그럼 이제 시작합니다 ~ !!!
오늘의 주제는 '내가 개발한 플러그인을 x64dbg 에 로딩시키기' 입니다... @_@
'천리길도 한걸음부터...' 라고 프로젝트 생성부터 시작해봅시다~
Visual Studio 프로젝트 생성
Visual Studio 프로젝트 생성 단계 #1 |
"Visual C++" -> "Win32" -> "Win32 프로젝트" 를 선택하고 프로젝트 이름을 작성합니다.
저는 임의로 'x64dbg_basic_plugin' 이라고 했는데 입맛에 맞게 정하시면 됩니다. ^^;;;
또, 개인적인 편의상 '솔루션용 디렉터리 만들기' 도 해제했습니다...
Visual Studio 프로젝트 생성 단계 #2 |
Visual Studio 프로젝트 생성 단계 #3 |
플러그인은 DLL 형태의 모듈이기 때문에 "DLL" 로 지정을 하고,
'빈 프로젝트' 항목에 체크를 해준 다음 '마침' 버튼을 눌러서 프로젝트 생성을 마칩니다.
x64dbg 는 XP 에서도 동작을 하는 걸로 알고 있는데...
프로젝트 속성 옵션에서 XP 에서도 동작하는 바이너리를 생성하도록 설정을 변경해줍니다.
XP 지원하도록 프로젝트 속성 변경 |
플러그인 SDK 폴더를 프로젝트 폴더로 복사
프로젝트 생성이 완료되면 플러그인 SDK 폴더를 프로젝트 폴더로 복사해줍니다.
x64dbg 압축파일의 플러그인 SDK 폴더 |
x64dbg 는 친절하게도(?) 디버거와 플러그인 SDK 를 묶어서 제공하는데요...
x64dbg 압축파일을 다운로드 받아서 압축 해제 후, pluginsdk 폴더만 프로젝트 폴더로 복사합니다.
프로젝트 폴더에 플러그인 SDK 폴더 복사 |
플러그인 소스파일 작성
플러그인 소스파일 작성 |
소스파일의 이름을 입맛에 맞게 작성하신 다음 코드 작성을 시작하면 됩니다.
일단 DLL 파일이니까 "DllMain" 이 있어야겠죠...?
// plugin.cpp // //------------------------------------------------------------------- // basic plugin [ x64dbg plugin ] //------------------------------------------------------------------- #include <Windows.h> //------------------------------------------------------------------- // DllMain //------------------------------------------------------------------- BOOL WINAPI DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved) { return TRUE; }
이렇게만 작성하고 '빌드' 를 해보면 DLL 파일이 생성이 될겁니다 :)
이 텅 빈 DLL 을 x64dbg 플러그인 형태로 바꿔봅시다~ :)
먼저 pluginsdk 폴더의 "_plugins.h" 파일을 인클루드하고~
"x32dbg.lib" 라이브러리 파일을 포함하도록 코드를 추가해줍니다.
( 64비트용 플러그인을 만들때는 "x64dbg.lib" 라이브러리 파일을 포함하면 됩니다. )
#include "pluginsdk\_plugins.h" #pragma comment(lib, "pluginsdk\\x32dbg.lib")
다음은 플러그인 이름과 버전에 대한 내용을 설정해줍니다.
//------------------------------------------------------------------- #define plugin_name "BasicPlugin" #define plugin_version 1
이제 x64dbg 가 플러그인이라고 인식할 수 있도록 export 함수("pluginit")를 작성해줍니다.
int g_iPluginHandle; //------------------------------------------------------------------- extern "C" __declspec(dllexport) bool pluginit(PLUG_INITSTRUCT* initStruct); //------------------------------------------------------------------- __declspec(dllexport) bool pluginit(PLUG_INITSTRUCT* initStruct) { initStruct->sdkVersion = PLUG_SDKVERSION; initStruct->pluginVersion = plugin_version; strcpy_s(initStruct->pluginName, 256, plugin_name); g_iPluginHandle = initStruct->pluginHandle; return true; }
테스트를 해본 결과 "pluginit" 함수만 있어도 플러그인으로 인식을 하더라구요.. @_@;;
pluginit 함수는 위의 코드처럼 PLUG_INITSTRUCT 구조체의 값을 채우도록 구현을 하면 됩니다.
sdkVersion, pulginVersion, pluginName 의 세 항목들은 값을 넣어줘야하고...
pluginHandle 은 값을 넣는게 아니라 다른 변수에 값을 복사해둡니다. @_@;;;
이 코드들을 몽땅 합치면 아래와 같이 되겠네요...
// plugin.cpp // //------------------------------------------------------------------- // basic plugin [ x64dbg plugin ] //------------------------------------------------------------------- #include <Windows.h> #include "pluginsdk\_plugins.h" #pragma comment(lib, "pluginsdk\\x32dbg.lib") //------------------------------------------------------------------- #define plugin_name "BasicPlugin" #define plugin_version 1 int g_iPluginHandle; //------------------------------------------------------------------- extern "C" __declspec(dllexport) bool pluginit(PLUG_INITSTRUCT* initStruct); //------------------------------------------------------------------- __declspec(dllexport) bool pluginit(PLUG_INITSTRUCT* initStruct) { initStruct->sdkVersion = PLUG_SDKVERSION; initStruct->pluginVersion = plugin_version; strcpy_s(initStruct->pluginName, 256, plugin_name); g_iPluginHandle = initStruct->pluginHandle; return true; } //------------------------------------------------------------------- // DllMain //------------------------------------------------------------------- BOOL WINAPI DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved) { return TRUE; }
이렇게 작성한 코드를 빌드하면 DLL 파일이 나올텐데요~
이 DLL 파일의 확장자를 'dp32' 로 바꾸고 32비트용 디버거의 'plugins' 폴더에 복사한 다음...
32비트용 디버거를 실행시키면 다음과 같이 플러그인이 로딩되는 걸 확인할 수 있습니다.
플러그인이 로딩되었다는 로그 |
64비트 디버거용 플러그인을 빌드할 때는 라이브러리 파일을 "x64dbg.lib" 로 바꾸고 빌드를 합니다.
DLL 파일이 생성되면 확장자를 'dp64' 로 바꿔서 64비트용 디버거의 'plugins' 폴더에 복사하면 됩니다.
여기까지 플러그인 껍데기(?)를 만들어서 x64dbg 에 로딩시키는 걸 알아봤구요...
다음 내용부터는 조금씩 플러그인 알맹이를 채워나가 보도록 하겠습니다 ~ :)
[ BasicPlugin 소스 다운로드 ]
좋은 자료 감사합니다.
답글삭제플러그인 제작을 목표삼고 있는데 큰 도움이 될 것 같습니다.
플러그인 제작 응원합니다~
삭제좋은 플러그인 만들어주세요~ 파이팅!
관심 있는 분야의 글을 포스팅해주셔서 감사합니다. 참고하겠습니다.
답글삭제방문 감사합니다~ :)
삭제