C언어로 만든 키 후킹 분석하기
노트패드에 전달되는 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를 하는 것을 알 수 있습니다.
끝!
'악성코드 및 포렌식' 카테고리의 다른 글
Citadel 악성코드 분석 1 기초정적분석 (0) | 2021.04.06 |
---|---|
Citadel Atmos CnC서버 설치와 bot 테스트 (0) | 2021.03.31 |
스파이웨어 악성코드 (0) | 2021.03.29 |
쿠쿠박스 인터페이스와 유틸리티 (0) | 2021.03.28 |
cuckoo 설정파일 (0) | 2021.03.28 |