프로그래밍

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

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


답변해주시는 분께서 없어, 다시 한번 올립니다...

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

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

강좌내용중에,

아래 키로거.exe의 WndProc()을 보면,
DLL TEST.dll에서 선언된 int WiseGuys(int a, int b)의 형식에 맞추어
int (*MyFunc)(int, int); 로 함수포인터를 만들고
MyFunc = (int (*)(int, int))GetProcAddress(hinstDll, "WiseGuys"); 로 WiseGuys함수의 주소를 MyFunc함수포인터와 매치시키는 것은 짐작하겠는데요...

(int (*)(int, int))은 어떤 동작을 하는 건지요?
제 생각에는 MyFunc = GetProcAddress(hinstDll, "WiseGuys"); 하면 될 것같은데, 이렇게 하고 compile하면 오류납니다.

부디 자세한 설명을 부탁드리겠습니다! 감사합니다~



----------------------------< DLL TEST.dll의 코드 >------------------------------
#include <windows.h>
__declspec(dllexport) int WiseGuys(int a, int b)
{
        return a+b;
}



--------------------< 키로거.exe의 WndProc의 코드 >--------------------------------

LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
        static HINSTANCE hinstDll;        // 동적 라이브러리를 가리킬 핸들.
        int (*MyFunc)(int, int);        // DLL안의 WiseGuys 함수를 가리킬 포인터.
        char str[100];        // 메시지 출력에 사용할 변수.

        switch( iMessage )
        {        
        case WM_CREATE:
                hinstDll = LoadLibrary("DLL TEST.dll");        // DLL을 로드한다.
                if(!hinstDll){
                        MessageBox(hWnd, "DLL TEST.dll을 로드할 수 없습니다.", "오류", MB_OK);
                        ExitProcess(1);
                }

                MyFunc = (int (*)(int, int))GetProcAddress(hinstDll, "WiseGuys");
                // WiseGuys 함수를 로드한다.

                if(!MyFunc){
                        MessageBox(hWnd, "WiseGuys 함수를 로드할 수 없습니다.", "오류", MB_OK);
                        FreeLibrary(hinstDll);
                        ExitProcess(1);
                }

                wsprintf(str, "3 + 5는 %d 입니다.", MyFunc(3, 5));
                MessageBox(hWnd, str, "알림", MB_OK);

                return 0;
        case WM_DESTROY:
                PostQuitMessage( 0 );
                break;
        }
        return DefWindowProc( hWnd, iMessage, wParam, lParam );
}


  Hit : 4049     Date : 2011/08/26 06:42



    
$Zero 이것역시 형변환 문법입니다 좀 생소하긴한데 함수포인터도 나름 자료형이나 마찬가지입니다.
즉 Myfunc 의 자료형(포인터형)이 (int (*)(int , int)) 로 리턴값을 형변환 해줘야 주소값이 제대로 들어가게 됩니다. 파라미터의 갯수나 리턴값등을 매치시켜야 되니까요 .

*부분은 단지 형변환이기때문에 이름이 들어가지 않는것이고 , 함수포인터로 형변환 해야지 자료형이 일치하여 함수포인터에 리턴값이 들어가게 되는것입니다.

2번 질문이나 이 질문이나 모두 C문법에 관련된 것인데.. C의 포인터 & 구조체 부분을 조금 더 공부해보시는 건 어떠신지 ..
2011/08/27  
$Zero 그렇다고 아무함수나 막 저렇게 형변환 해서 쓰는건 아니구요 , 함수의 원형을 이미 알고 있기때문에 그에 맞는 함수포인터를 선언한것이고 리턴값을 함수포인터가 가리킬수 있도록 형변환한것이라고 간단히 이해하시면 됩니다.

함수의 주소를 얻어오는 함수가 리턴을 (int (*)(int , int)) 형으로 리턴해주지는 않으니까요 .
2011/08/27  
p0lly 감사합니다... 2011/08/27