1. Hook
- CPU는 INT이 1개 이므로 8259를 이용하여 외부신호를 받아온다. 15개의 신호를 받아 올수 있다.
- 마스터 8259중 하나는 IRQ# : Slave신호를 받아온다.
- IDT는 OS가 구축 해 놓아서 디바이스 드라이버에 신호를 보내준다.
- 키보드 핸들러는 PORT상에서 키보드 상태를 얻어서 SHIQ에 넣어준다.
- USER 영역에서는 SHIQ=>RIT로 보낼때 Low Level Hook 를 하거나
- RIT => MSGQ에 보낼때 가로 챌수 있다. ( 제일 쉬움 )
- NProtected 와 같은 보안 프로그램은 커널쪽인 IDT에서 암호화를 해서 내보낸다.
- 훅은 '전역'(모든 윈도우) 의 성격을 지닌다. 또한 GetMessage 단계에서 메시지를 가로 챌 수 있다.
- 서브클래싱은 특정윈도우에 메시지를 보내는 DispatchMessage 에서 가로 챈다.
GetMessage()
{
1. SendQ, PostQ, 가상입력 Q순으로 메세지를 조사한다.
2. 먼저 WH_GETMESSAGE 훅이 설치 되어 있다면 DLL을 Load하고 hook 함수를 호출한다.
3. 메세지를 가져간다.
}
///////////////////////////////////////////////////////////////////////
// 모든 스레드는 Kernel32.dll에 있는 아래 함수 부터 실행된다.
////////////////////////////////////////////////////////////////////////
BaseThreadStart()
{
__try
{
스레드도 dll을 가지고 있으므로 ThreadEntryPoint를 이함수로 해준다.
가상주소에 있는 모든 Dll에 대해서 DllMain을 호출해준다.
그리고 사용자 함수(foo) 호출을 한다.
해지를 위해선 foo가 종료 되었을때 DllMain을 또 불러준다.
}
__except( 1 ) // 예외처리
{
}
}
///////////////////////////////////////////////////////////////////////
// FreeLibrary 도 MMF를 열고 해지를 한다.
// LoadLibrary의 원리
//////////////////////////////////////////////////////////////////////
HMODULE WINAPI LoadLibrary( LPCTSTR name )
{
1. CreateFile 로 파일 생성
2. MMF를 사용해서 가상주소와 연결( MapViewOfFileEx - PE헤더의 주소로 연결)
3. if ( DllMain 호출( 주소, DLL_PROCESS_ATTACH, 0(명시적) ) == FALSE )
MMF 해지, 화일 닫고 return 0; // 로드를 다시 해지한다. TRUE리턴이 아니라면..
4. return 주소!!!
}
- CPU는 INT이 1개 이므로 8259를 이용하여 외부신호를 받아온다. 15개의 신호를 받아 올수 있다.
- 마스터 8259중 하나는 IRQ# : Slave신호를 받아온다.
- IDT는 OS가 구축 해 놓아서 디바이스 드라이버에 신호를 보내준다.
- 키보드 핸들러는 PORT상에서 키보드 상태를 얻어서 SHIQ에 넣어준다.
- USER 영역에서는 SHIQ=>RIT로 보낼때 Low Level Hook 를 하거나
- RIT => MSGQ에 보낼때 가로 챌수 있다. ( 제일 쉬움 )
- NProtected 와 같은 보안 프로그램은 커널쪽인 IDT에서 암호화를 해서 내보낸다.
g_hHook = SetWindowsHookEx( WH_GETMESSAGE, // 훅의 종료(15가지)
GetMsgProc, // 훅함수
g_hDll, // 훅함수를 가진 DLL핸들(주소)
tid ); // 훅을 설치할 스레드( 0:Global hook )
GetMsgProc, // 훅함수
g_hDll, // 훅함수를 가진 DLL핸들(주소)
tid ); // 훅을 설치할 스레드( 0:Global hook )
- 훅은 '전역'(모든 윈도우) 의 성격을 지닌다. 또한 GetMessage 단계에서 메시지를 가로 챌 수 있다.
- 서브클래싱은 특정윈도우에 메시지를 보내는 DispatchMessage 에서 가로 챈다.
GetMessage()
{
1. SendQ, PostQ, 가상입력 Q순으로 메세지를 조사한다.
2. 먼저 WH_GETMESSAGE 훅이 설치 되어 있다면 DLL을 Load하고 hook 함수를 호출한다.
3. 메세지를 가져간다.
}
///////////////////////////////////////////////////////////////////////
// 모든 스레드는 Kernel32.dll에 있는 아래 함수 부터 실행된다.
////////////////////////////////////////////////////////////////////////
BaseThreadStart()
{
__try
{
스레드도 dll을 가지고 있으므로 ThreadEntryPoint를 이함수로 해준다.
가상주소에 있는 모든 Dll에 대해서 DllMain을 호출해준다.
그리고 사용자 함수(foo) 호출을 한다.
해지를 위해선 foo가 종료 되었을때 DllMain을 또 불러준다.
}
__except( 1 ) // 예외처리
{
}
}
///////////////////////////////////////////////////////////////////////
// FreeLibrary 도 MMF를 열고 해지를 한다.
// LoadLibrary의 원리
//////////////////////////////////////////////////////////////////////
HMODULE WINAPI LoadLibrary( LPCTSTR name )
{
1. CreateFile 로 파일 생성
2. MMF를 사용해서 가상주소와 연결( MapViewOfFileEx - PE헤더의 주소로 연결)
3. if ( DllMain 호출( 주소, DLL_PROCESS_ATTACH, 0(명시적) ) == FALSE )
MMF 해지, 화일 닫고 return 0; // 로드를 다시 해지한다. TRUE리턴이 아니라면..
4. return 주소!!!
}
2007/10/16 - [Study/System] - 10.16(화) 실습 ( 스택,힙, 훅, DLL )