컴퓨터 공부/Win32 API 프로그래밍

서브클래싱, 슈퍼클래싱, PE포멧, 후킹

려리군 2009. 9. 30. 10:17

GetKeyState 메세지 입력 시점의 키 상태를 조사

GetAsyncKeyState 메세지 처리 시점의 키 상태를 조사


서브클래싱 : 윈도우 프로시저로 전달되는 메세지를 중간에 가로채는 기법.

윈도우 프로시저만 교체한다.

통과 : 관심 없는 메세지는 윈도우 프로시저로 전달

return CallWindowProc

직접 처리 : 원하는 메세지는 자신이 직접 처리하지 않고 리턴...

return 0;

변형 : 메세지를 변경한 후 원래 윈도우 프로시저로 보낸다.

wParam, lParam 바꾼 후 return CallWindowProc


인스턴스 서브클래싱 : 윈도우 하나에 대해서만 윈도우 프로시저를 교체하는 것

SetWindowLongPtr

전역 서브클래싱 : 윈도우 클래스에 대해 서브 클래싱. 앞으로 만들어질 윈도우만 영향을 준다.

SetClassLongPtr


슈퍼클래싱 : 기존 클래스의 정보를 바탕으로 완전히 새로운 클래스를 만드는 것.

GetClassInfo -> RegisterClass


PE : 플랫폼에 독립적. EXE, DLL, DRV, SCR, OBJ에 존재.

메모리에 전개될 이미지를 그대로 가지고 있음.


컴파일러의 중간결과 -> COFF, 최종 출력 결과 PE


도스스텁 

Signature : PE임을 나타내는 매직 넘버

IMAGE_FILE_HEADER : PE 주요 속성

IMAGE_OPTIONAL_HEADER : PE 세부 속성

섹션 헤더 배열 : PE를 구성하는 섹션 속성

섹션들 : code, data, resource, import, export등.


도스스텁 : 매직넘버 MZ로 시작. 오프셋 0x3c에 PE시작 위치가 기록되어 있음.

Signature : 매직넘버 PE로 시작.

Image_File_Header

Machine, 섹션수, 이미지가 만들어진 시간. 심볼 테이블 오프셋등...

Image_Optional_Header

Magic, AddressOfEntryPoint(시작지점이 있는 함수), ImageBase(이미지가 주소 공간으로 로드 될 때 번지) 등...(실행파일 : 0x400000, DLL : 0x10000000, CE용 PE : 0x100000의 베이스)

NumberOfRvaAndSizes : 디렉터리 배열의 개수

IMAGE_DATA_DIRECTORY

각 디렉터리(섹션) 시작 위치를 나타내는 virtual address와 크기를 기록.


섹션

   
 .text코드, 실행, 읽기 실행코드. CPU에 의존적. 
 .data초기화, 읽기, 쓰기 초기화된 전역변수를 가짐. 읽기 쓰기 모두 가능 
 .rdata초기화, 읽기읽기 전용 변수를 가지며 const를 쓸 때 저장됨. 
.bss 비초기화, 읽기, 쓰기 초기화되지 않는 전역변수
.edata 초기화, 읽기 DLL에만 존재. export할 함수에 대한 정보를 가진다. 
 .idata초기화, 읽기, 쓰기 import할 함수에 대한 정보. 어떤 DLL에 있는 어떤 함수가 필요한 지에 대한 정보 저장. 
 .rsrc초기화, 읽기리소스 
 .tls초기화, 읽기, 쓰기 쓰레드를 위한 지역 저장소 
 .relec
초기화, 읽기, 쓰기 DLL이 지정한 기준 번지에 배치 못할 때를 대비하여 재배치 정보를 가짐.


코드섹션 

소스 코드를 컴파일한 결과인 기계어 코드가 저장되는 영역.

Startup코드는 컴파일러가 제공 -> 응용 프로그램에 필요한 초기화

데이터섹션

변수를 저장하는 영역. 전역변수 및 정적변수가 여기에 저장된다.

.data 섹션은 기록이 되고 .rdata 섹션은 기록이 안된다.

리소스 섹션

리소스를 저장하는 영역. 비트맵은 DIB포멧으로 저장. 모든 문자열은 유니코드로 저장됨.

export 섹션

자신이 밖으로 공개하는 함수의 목록을 기록. DLL에만 존재.

import 섹션

DLL명, 함수명(또는 서수) 배열, 함수 포인터 배열(IAT)

IAT : import된 함수의 번지 배열. 로더가 import된 모든 함수들의 실제 번지를 찾아 IAT를 작성.

후킹 : import섹션을 실행중에 변경함으로서 API함수 후킹 가능.

custom 섹션

#pragma data_seg("섹션명"

변수 선언

#pragma data_seg()

#pragma comment(linker, "/SECTION:섹션명, RWS")

공유섹션은 반드시 초기값을 가져야 한다.


후킹 : 이미 작성되어 있는 코드의 특점 지점을 가로채서 동작 방식에 변화를 주는 일체의 기술

코드의 중간을 낚아내는 도구. (인터럽터 가로채기, 서브클래싱, 비슷함)

목표 윈도우로 전달되기 전에 메세지를 가로채는 특수한 프로시저. (덧)

지역 훅은 특정 쓰레드에서 발생하는 메세지들만 전달 받음.

전역 훅은 시스템의 모든 스레드에서 발생하는 메세지를 가로챌 수 있다.


운영체제는 훅 체인으로 프로시저를 관리. (훅체인이 목적 프로시저보다 먼저 실행)

훅체인 : 훔 프로시저 함수들의 번지를 담고 있는 함수 포인터 배열.