C언어로 만든 키 후킹 분석하기

악성코드 및 포렌식|2021. 3. 29. 20:14

노트패드에 전달되는 EVENT 를 전달되지않게 

하는건데

 

 

 

 

 

FILE -> new -> project를 하고

 

create directory for solution을 합니다.

 

 

 

 

 

 

 

 

이렇게 됬으면

 

 

 

 

프로젝트를 하나더 만듭니다.

 

 

KeyHook 이라는 것은 dll로 체크를 하자.

 

 

 

 

 

 

 

keyhook은 dll을 만들어주는 프로그램 

 

HookMain은 exe파일을 만들어주는 프로그램이 될 것 입니다.

 

 

훅메인이 실행되면서 dll을 다른것에 이벤트를 등록할수있도록 support되게한다

 

 

source에 하나하나씩 만듭니다.

 

 

 

cpp 로 소스에 하나씩만든다

 

 

그리고 우리가 가지고있던 cpp내용들을 복사해서 넣습니다

 

그리고 빌드를해서 점검 오류가없어야한다.

 

 

 

 

hook을 실행시켜보니까 메모장에 어떤걸 입력하더라도 여기에는 아무것도 입력이되지않습니다.

 

 

HookStart 와 

HookStop이 dll   main.cpp에 들어가있습니다

 

 

이름만정의해놓고 사용은밑에서합니다

 

LoadLibrary 는 라이브러리를 불러옵니다 여기서 keyhook.dll을 불러옵니다

 

에러가없다면

넘어가는데

HookStart와

HooksStop 을 정의해놓고

 

GetProcAddress

이라이브러리 즉 hdll

hook.dll로 받았던 hdll을

거기안에있던 DEF_HOOSTART와 DEF_HOOKSTOP을 불러옵니다.

 

 

여기에있는 

DEF_HOOSTART와 DEF_HOOKSTOP을 불러오는 함수입니다.

 

 

HOOKSTART를 즉 후킹을 시작합니다.

 

그리고 Print 메세지를 띄워주게되고

 

q가눌러졌다면 Hook걸었던것을 종료하게되는것입니다.

 

 

 

  

 

 

메인자체는

 

library 가 로드되는 순간에 dllmain이 동작을합니다.

 

 

dllmain에서는 4가지 케이스가있는데

 

일단은 dll 이름만정의해주고있다.

 

 

HookStart와 HookStop을

 

 

hookmain에다가 제공을 해준다 라고생각하면됩니다.

 

 

SetWindowsHookEx(WH_KEYBOARD

 

키보드에다가 윈도우 이벤트에대한 후킹을 걸겠다

 

keyboardProc은 프로시저를 등록을 하는 것입니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

사용자가 프로그램에다가 데이터 event를 보내서 어떤 key를 입력을한 것을 전달하고

 

그전달된 key를 보내주는역할을하는데

 

hooking이란 개념이들어가는데

이때등록되는것이 procedure입니다.

 

procedure가 등록이되면 어떤루틴이있다 원래 키가올바른곳으로전달되야하는데

우리쪽으로 key 를 전달한다.

 

그러면 key를 어떻게할지 정하는데

정해진방법대로 키를 다룬다음에 어떤신호를 저기다 전달합니다.

 

key를 누락되는 경우도있지만 key를 변경하게 즉 a입력했는데 g로만들거나

 

 

 

 

내용이전달이되서 키보드에다가  현재 이프로시저를 등록하고 dll은 저쪽에있다

 

 

그리고 return 1 자체가 무시ignore이라고생각하면되고

 

 

데이터를 전달안할때는 return 1을 하고 키를 전달안하겠다는 뜻

 

데이터를 정상적으로 전달을하면 return CallNextHookEx 이거를 하면정상적으로 동작 

 

 

즉 우리가메모장에서 데이터를 사용자에게 전달시킬려면 

return callNextHookEx를 하고 안보낼때는 return 1을 함

 

 

 

 

WPARM wParm, LPARAM IParam

이거는 코드인데 키보드입력된 어떤게입력된 정보에대한 것이고

 

 

if( !(LParam 을 통해서 키가눌렸는지 안눌렸는지확인하고있고

 

 

이 키가눌린것에

 

프로세스 이름이 =P

 

p+1 에대한 내용이 DEF_PROCESS_NAME 이면

 

notepad.exe 라고 되는 것입니다.

 

 

프로세스 별로받는것인데

 

그중에서 노트패드일때만

 

stricmp 비교하고 return을 1로하도록 즉 무시한다

 

 

그거아니면 정상적으로 실행이 되게 합니다.

 

 

 

 

 

만약에 문제가있을때만 이런것들을 return 1을 하도록

 

내용을 변경할 때는 wParm 을하고 파일을 저장하거나 그런식으로 만들면된다.

 

 

 

 

 

 

 

 

이렇게 HookMain.exe 를 실행을햇거

 

process Explorer로 실행을해보고 나서 

 

관찰을 해보면

 

 

 

HookMain.exe와

 

procexp.exe에서만 존재하는 것을 볼수가 있고

 

 

노트패드에 올라가는것은아닙니다.

 

 

 

이렇게 keyhook.dll이 보이지가않기때문에 메모장 에올라가는 것이아니다.

 

 

 

 

 

HookMain.exe 가 keyhook.exe를 로드해놓고 사용하는 것을 볼 수 있습니다

 

 

 

hookmain을 실행하고 실행중인파일을 ollydbg에서 attach를 합니다.

 

 

 

M을 눌러 메모리에 가게되면 keyhook이 존재하게되는데

 

 

 

 

여기서 dll이 로드되는건데 라이브러리가 로드된 상태라서 이렇게 잘보이는것입니다.

 

 

 

이프로세스가 dll을 로드할떄 어디서부터 실행되는지확인을 합니다.

dll을 peview로 엽니다.

 

 

 

address of Entry Point를 따라갑니다.

 

그래서 

10001587로 따라갑니다.

 

위에서 keyhook이

10000000 번지쪽에있었기때문에

 

entry point 는 10001587입니다.

 

 

 

여기는 대체뭐냐면

 

여기가 바로 dll main이 시작되면 항상시작되는 주소

 

 

 

 

여기입니다.

 

 

브레이크포인트가 걸려야하는데 안걸리기때문에 

라이브러리가 올라와있지만 여기는 원래올라와있는애가아니다

 

언제 라이브러리가 올라오냐면

 

 

 

LoadLibrary에서 실행이되는데 main까지는 실행이되면서

 

loadlibrary가 실행되는 것이기때문에 브레이크포인트가 걸리지않습니다

 

 

실제로 ctrl+f2로 하면 10001587로 갈수가없기떄문에

 

실행을 다시하고 한다

 

즉이럴떄는 hardware breakpoint를 겁니다.

 

 

 

 

 

이렇게 hardware, on execution을 누르고

 

 

 

hardware breakpoints를 보면

 

여기에 잘 걸려있는 것을 볼 수 있습니다.

 

break point가 잘 걸렸습니다.

 

 

 

 

 

라이브러리는 딱히 분석할 내용이없어서

 

ctrl+f2를 가서 다시 HookMain을 봅시다.

 

 

 

 

hookmain을 왔을떄

Hardware Point를 지웁니다 일단

 

 

f8로 진행하면

 

c로만든 것들중 특징이 있는데 그게바로 뭐냐면

 

 

여기서 잘보면

 

push를 3번하게되고

 

그뒤에 바로 call HookMain.00401000을 하게되는데

 

이게 보통 c로짜진 프로그램들의 특징입니다.

 

enter를 치고 call 함수를  들어가서 f2로 브레이크 포인트를 겁니다.

 

 

그리고 여기서 KeyHook.dll이 있다는 것도 알수있는데

 

LoadLibrary를 먼저하는 것을 알 수 있습니다.

 

 

그리고 GetProcAddress를 통해서

HookStart와 HookStop을 하게되고

 

그다음에 quit 메세지를 보내게됩니다.

 

 

 

 

EBX를 먼저 실행한 다음에 그다음에 quit을 하고있습니다.

 

 

HookStop 으로 받았던거를

 

먼저 실행을 하고나서 FreeLibrary를 실행하고있었습니다.

 

HookStop은 키를 해제하는 코드들이 들어가있었다.

 

 

 

 

 

 

지금까지 hookmain에 대해서 관찰을 하였고

 

 

 

 

그리고 keyhook.dll 을 좀 제대로 분석하기 위해서 ida로 엽니다

 

 

 

 

 

dll entry point 인데 진짜 열어보니까 뭐 아무것도 존재하지가 않습니다.

 

 

그래서 funtions로 갑니다.

 

 

 

 

그러면 여기 HookStart의entry point가 있는데

 

HookStart를 올리디버거에서 

 

명령어 주소를 찾아가서

 

하면됩니다.

 

 

 

 

 

 

break point를 걸고

 

 

별로 실행되는 내용이없었다.

그래서 메모장을 열고 입력을했더니 아무것도 안됬다.

 

 

 

 

 

notepad.exe 에 드디어 KeyHook.dll이 들어가게되어서

 

이것을 attach해봅시다.

 

 

올리를 하나더 열고

 

notepad를 attach시킵니다.

 

 

 

 

 

그리고 HookStart entry point 로 가봅시다.

 

 

 

 

아까와 같은코드가 있다는 것을 확인할 수 있습니다.

 

메모장에서 attach하는내용과 똑같다 .

 

확인가능했고

 

 

그뒤에

 

 

 

 

 

그리고 프로시져로 갑니다.

 

KeyboardProc 이것을 찾아봅시다

 

 

 

하지만 ida에서 

KeyboardProc가 존재를 하지를 않아서

 

fn이 심볼이 날아간 KeyboardProc

을 찾아봅시다

 

 

여기 HookStart를 가서

 

찾아봅시다

 

 

 

SetWindowsHookExW를 실행하기전에

 

fn이 전달이됩니다

 

그래서 위치를 파악했고

 

저기를 엔터로 들어가보면

 

 

여기 10001020이 시작 주소가 됩니다.

 

 

 

 

 

여기에

 

브레이크 포인트를 겁니다.

 

HookMainl을 열었던 올리에서 10001020에 브레이크 포인트를 건것과

 

노트패드.exe를 실행시켜서 attach한것을 브레이크 포인트를 걸고

 

notepad에 글을 입력하면

 

 

 

 

오른쪽에서는 push ebp에서 걸렸는데

 

왼쪽에서는 걸리지 않았다

 

 

왼쪽에서는 안걸린 이유는

 

WH_KEYBOARD 실제로 올라오기는 하지만 

 

프로시저가 등록이 되면서 nopad.exe에 keyhook.dll이 올라갔다는 것을 알 수 있습니다.

 

loadlibrary로 올라가는것

 

 

 

왼쪽은 keyhook.dll ( 브레이크 포인트 안걸림)       오른쪽은 notepad.exe (브레이크 포인트 걸림)

 

 

결국에 동작되는 쪽은 notepad에있는 keyhook.dll이 notepad에서 동작을 하고있다는 것을 알 수 있습니다.

 

이게뭐냐

즉 우리가 키보드 프로시저를 브레이크포인트를 걸었으니까 거기에 만약 브레이크 포인트가 걸린다면

 

그쪽에서 실행을 하고있는데 

 

여기에서 나타나는것은 notepad에서 keyhook을 실행하므로 프로시저를 등록할때 브레이크 포인트가 걸리는 것입니다.

 

 

 

 

 

 

ida로 보면

notepad.exe가 맞다면

 

 

 

왼쪽으로 보내고 

return할때 0c를 보내는 것을 확인을 하수있고

 

아니면 CallNextHookEx를 하는 것을 알 수 있습니다.

 

 

 

 

끝!

 

 

댓글()