|
음, 내용을 보니, F12키가 눌러진 횟수를 체크하고 있네요.
시스템전체 갈고리이니, 당연히 dll로 만드신 것 같구요.
우선 dll과 app의 자료 공유가 문제인 것 같은데, 대부분 이럴때는 일반 file io를 사용하거나, 이것이 조금 추잡해 보인다면, 메모리상에서 자료 공유를 할 수 있도록 하는 Memory Mapped File IO(MMF) 방식을 많이 사용합니다.
제가 예제를 하나 첨부할께여.
첨부한 것은 MMF의 예입니다.
이와 같이 하는 이유는 아시겠지만, 32bit 체제에서의 dll은 다른 프로그램에서 실행되고 있으면 다른 메모리를 가지고 작업하기 때문입니다. 그래서 자료공유를 해야 할 경우는 공통적으로 접근할 수 있는 방법이 필요한데, 가장 손쉬운 방법이 파일접근법이져. MMF는 가상메모리 기법이 나오면서 부가적으로 나온 기법이라고 해야 할까요.
일단 이렇게 해서 dll과 app에서 자료를 읽을 때는 GetData를 쓸때는 SetData를 쓰면 될 것 같습니다.
MMF에 대해서 더 궁금하시다면, 델파이코리아에 강좌가 올라와 있으니 참고하시기를....
//---------------------------------------------------
void GetData (HookData *hd)
{
HANDLE hMMF;
LPVOID pData;
hMMF = CreateFileMapping ((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0,
sizeof (HookData), "MMF_SC_Hook");
if ( GetLastError () == 0 )
{ // 오류발생시 제시도
hMMF = CreateFileMapping ((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0,
sizeof (HookData), "MMF_SC_Hook");
}
try
{
pData = MapViewOfFile (hMMF, FILE_MAP_WRITE, 0, 0, 0);
if ( pData != NULL )
{
hd = (HookData*)pData;
UnmapViewOfFile (pData);
}
}
__finally
{
CloseHandle (hMMF);
}
}
//---------------------------------------------------
void SetData (HookData *hd)
{
HANDLE hMMF;
LPVOID pData;
hMMF = CreateFileMapping ((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0,
sizeof (HookData), "MMF_SC_Hook");
try
{
pData = MapViewOfFile (hMMF, FILE_MAP_WRITE, 0, 0, 0);
if ( pData != NULL )
{
(HookData*)pData = hd;
UnmapViewOfFile (pData);
}
}
__finally
{
CloseHandle (hMMF);
}
}
//---------------------------------------------------
이용한 님이 쓰신 글 :
: 시스템 후킹을 위해 아래와 같이 코딩했습니다. 데이터공유를 위해 여러가지 사이트를 뒤져서 pragma까지 왔습니다만..
: KbdHookProc에서의 showmessage에는 계속적으로 값(g_cnt)이 증가하는데..
: GetCount()에서는 계속 초기값 100으로 return을 합니다.
: 여러가지 방법을 써보았지만.. 잘안되는군요.. 혹시 제가 모르는 부분이 더 있는것인가요..
:
:
: // hookat.dll header에는
: #define EXPORT_DECL __declspec(dllexport)
: extern "C" EXPORT_DECL void __stdcall KBHookIni( int instance );
: extern "C" EXPORT_DECL void __stdcall UnKBHook( );
: extern "C" EXPORT_DECL DWORD __stdcall GetCount();
:
:
: // hookat.dll source에는
: #pragma data_seg(".shared")//"SHARDATA")
: __declspec(dllexport) DWORD g_cnt = 100;
: #pragma data_seg()
:
: #pragma comment(linker, "/SECTION:.shared,RWS")
:
:
: HHOOK g_hKbdHook;
:
: LRESULT __stdcall KbdHookProc(int code, WPARAM wParam, LPARAM lParam)
:
: {
: if ((code==HC_ACTION) && (lParam&0x80000000) && wParam == VK_F12 )
: {
: ++g_cnt;
: String msg;
: msg.sprintf("int[%d]", g_cnt);
: ShowMessage(msg);
: } // end of if
:
: return CallNextHookEx(g_hKbdHook, code, wParam, lParam);
: }
:
: void __stdcall KBHookIni( int instance )
: {
: // 키보드 훅을 설정합니다.
: g_hKbdHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KbdHookProc, HInstance, 0);
:
: // 핸들 값을 검사합니다.
: if (!g_hKbdHook)
: ShowMessage("키보드 훅 실패!");
: }
:
:
: void __stdcall UnKBHook( )
: {
: // 키보드 훅 제거
: UnhookWindowsHookEx(g_hKbdHook);
:
: }
:
: DWORD __stdcall GetCount()
: {
: return g_cnt;
: }
:
|