취약점분석/Reversing

[Reversing] Hooking - 8 ( notepad.exe 후킹 ③ )

poiri3r 2025. 8. 8. 15:47

안녕하세요. 엄청 오랜만에 포스팅으로 돌아왔습니다.

최근 본가다녀오느라 공부를 잘 못해서 좀 어색하네요...

 

먼저 하던 후킹을 마저 해보자면 먼저 목표를 두가지로 정했습니다.

먼저 로컬 메모장을 하나 만들어둔 뒤 

 ①사용자가 영문을 입력할 때 로컬 메모장에 저장

 ②사용자가 불러오기를 할 때 어떤 메모장을 선택하든 관계없이 로컬에 저장해둔 메모장이 실행

 

여태껏 공부할 때 알아냈던 정보들을 한번 갈무리하고 가보겠습니다.

 

먼저 notepad는 EDIT 컨트롤을 사용합니다.

EDIT 컨트롤은 C++에서  제공하는 MFC인데 텍스트 입력창을 만들어줍니다.

 

CreateWindowExA에서 인자값에 'EDIT'이 들어갈 시 EDIT 컨트롤이 생성됩니다.

notepad를 IDA로 분석했을 때 다음과 같은 EDIT 컨트롤 생성 코드를 찾을 수 있었습니다.

 

 

저희가 문자를 후킹하기 위해서는 문자를 입력한 뒤 WM_CHAR 메세지가 어디서 어떻게 처리되는지 알아야 합니다.

api monitor에서 View - parameter를 켜주고, DispatchMessageW와 TraslateMessage와 SendMessageW를 모니터링해줬습니다.

 

174번 DispatchMessageW를 보면 WM_KEYDOWN으로 키보드 눌림 메세지와 함께 키코드를 담고 있습니다. (물리적인 키보드 이벤트)

그 후 TraslateMessage가 호출되는데 TranslateMessage()는 WM_KEYDOWN 메세지를 기반으로 WM_CHAR을 생성해서 메세지큐에 추가합니다. 그 후 호출된 DispatchMessage를 보겠습니다.

 

그 후 176번 메세지를 보면 WM_CHAR과 함께 97 (ASCII코드로 a)가 담겨있는걸 확인할 수 있었습니다.

안에 핸들을 보면 0x00400328이 담겨있는데 Edit Control의 핸들일 가능성이 높습니다. 이후에

SendMessageW를 보시면 첫번째 인자값으로 핸들값이 담겨있는데 5394~5396은 저희가 저번에 찾았던 텍스트 입력시마다 호출되는 EDIT 컨트롤 사용자 정의 함수였습니다.

 

여태까지 두개의 DispatchMessageW를 분석하여 WM_CHAR의 생성과 전달을 확인했습니다.

EDIT 컨트롤로 전달된 WM_CHAR이 어떻게 처리되는지는 핸들값이 0x00400328이 담겨있는 로그를 확인해보면 될 것 같습니다.

 

일단 저희가 원하는 첫번째 기능의 구현을 위해서는 DispatchMessageW의 message값이 WM_CHAR일 때 세번째 값을 훔쳐오는 방식으로 코드를 짜면 될 것 같습니다. 다른 방법도 찾을 수 있을 것 같은데 이번 notepad후킹에 시간을 너무 많이 쓰는것 같기도 하고, 언어 공부도 해야되서 좀 스피디하게 할 수 있는 방법은 바로바로 해보는게 나을 것 같습니다.

 

오늘 포스팅은 여기까지 하고 다음 포스팅 때 해당 후킹 코드를 작성해보도록 하겠습니다.

읽어주셔서 감사합니다