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 소스 다운로드 ]