오늘은 지난시간에 이어서 Frida툴을 이용한 windows api후킹을 해보겠습니다.
먼저 오늘 설치해야되는 툴이 있는데요, API MONITOR입니다.
http://www.rohitab.com/downloads
Downloads | rohitab.com
API Monitor v2 (Alpha) More Info… Download files below, or Click here to download from MediaFire Latest Release – Alpha r13 API Monitor v2 (Alpha-r13) - x86 32-bit - - 32-bit for Windows 2000, Server 2003, XP, Vista, Windows 7, Server 2008 and Windows
www.rohitab.com
해당 링크에서 다운받을 수 있고 해당 툴은 실행되고 있는 프로세스의 PID를 쉽게 확인할 수 있게 도와주고, 프로세스를 붙이고 나면 어떤 API가 언제 실행되는지 확인할 수 있습니다.프로세스의 PID를 쉽게 확인할 수 있게 도와주고, 프로세스를 붙이고 나면 어떤 API가 언제 실행되는지 확인할 수 있습니다.
특정 함수나 dll을 검색해서 그 함수가 실행될 때 출력해주는 기능도 있습니다.
제가 오늘 포스팅하고 싶은 내용은, window에서 글씨를 띄워주는 함수를 찾고, explorer.exe(프로세스)의 PID를 구한뒤 js로 후킹 스크립트를 짜서, 모든 출력을 poiri3r로 변경하는 작업을 하려고 합니다.
먼저 64비트 버전 api 모니터를 키면 다음과 같은 화면이 뜹니다.

이 중에서 저희가 보고싶은 내용은 프로세스의 PID입니다. 프로세스는 왼쪽하단에서 확인할 수 있습니다

저희가 오늘 후킹하려고 하는 대상인 explorer.exe의 pid는 10872입니다.
(*explorer.exe는 윈도우 운영체제의 파일탐색기를 담당하는 프로세스로, 탐색기 외에도 바탕화면,시작메뉴, GUI 요소들을 관리합니다.)

이제 왼쪽 상단에 보면 현재 로드되어 있는 모든 모듈과 dll을 확인할 수 있습니다.
어떤 대상의 어떤 함수로 후킹해야 될 지 모를 때 해당 창에서 dll이나 함수에 체크하면서 로그기록을 보시면됩니다.
저희가 찾으려는 함수는 화면에 글자를 띄우는 함수이므로 drawtext를 검색해주고 체크 해둡니다.

그 뒤 다시 왼쪽 아래 창에서

원하는 모듈을 우클릭하고 Start Monitoring을 눌러줍니다.

그럼 이렇게 우리가 설정해둔 함수가 작동될때마다 내용들과 리턴값, 지연시간 등을 출력해줍니다.
저희가 원하는건 출력되는 글자들을 변경하는건데 이렇게 모니터링을 해둔 상태에서 다양한 곳에 마우스를 올려보고 로그기록을 확인해보고 적절한 함수를 후킹하시면 됩니다.

보니까 바탕화면이나 작업표시줄에 마우스를 가져다대면 DrawTextW가 호출되고, 파일을 클릭하고 파일 안에 있는 이름들을 출력할때는 DrawTextExW함수가 호출되는 것을 확인하였습니다.
이 함수들에 맞춰서 함수 후킹 코드를 작성해보겠습니다.
먼저 후킹 대상 함수인 DrawTextW와 DrawTextExW를 알아보겠습니다


둘 다 지정된 사각형에 서식이 지정된 텍스트를 그리는 함수입니다.
https://learn.microsoft.com/ko-kr/windows/win32/api/winuser/nf-winuser-drawtextexw
DrawTextExW 함수(winuser.h) - Win32 apps
DrawTextEx 함수는 지정된 사각형에 서식이 지정된 텍스트를 그립니다. (유니코드)
learn.microsoft.com
https://learn.microsoft.com/ko-kr/windows/win32/api/winuser/nf-winuser-drawtextw
DrawTextW 함수(winuser.h) - Win32 apps
DrawTextW(유니코드) 함수는 지정된 사각형에 서식이 지정된 텍스트를 그립니다. (DrawTextW 함수)
learn.microsoft.com
전체코드는 다음과 같습니다.
const newStr = "Poiri3r";
const newBuf = Memory.allocUtf16String(newStr);
저희가 바꾸고 싶은 문자인 Poiri3r를 newStr에 저장하고 UTF-16형태로 변환해서 newBuf에 저장합니다.
Interceptor.attach(Module.getExportByName("user32.dll", "DrawTextW"),{
onEnter: function(args){
console.log("drawtextw 호출됨")
args[1] = newBuf;
args[2] = newStr.length;
}
});
DrawTextW를 후킹하는 코드입니다.
args[1]인 lpchText에 우리가 원하는 문자인 newBuf를 넣어주고
args[2]인 cchText에 문자열의 길이인 newStr.length를 넣어줍니다.
Interceptor.attach(Module.getExportByName("user32.dll", "DrawTextExW"),{
onEnter: function(args){
console.log("DrawTextExW 호출됨")
args[1] = newBuf;
args[2] = newStr.length;
}
})
위의 코드와 같습니다. 해당 전체 코드를 winhook.js으로 저장해두고, 해당 스크립트를 실행해줄 파이썬 코드를 만들어보겠습니다.
파이썬 코드 없이 직접 셸에다 frida -n으로 붙여도 상관은 없습니다
win.py로 저장을 해두었고 코드는 다음과 같습니다.
import frida
session = frida.attach(/pid)
script = session.create_script(open('winhook.js', 'r', encoding='utf-8').read())
script.load()
input()
session.detach()
import frida
session = frida.attach(/pid)
frida를 호출하고 pid번호에 있는 프로세스를 attach합니다. attach 객체는 session입니다.
script = session.create_script(open('winhook.js', 'r', encoding='utf-8').read())
같은 디렉토리에 있는 winhook.js파일을 UTF-8의 읽기 전용모드로 읽어옵니다
session.create_script는 읽은 js코드를 Frida 스크립트 객체로 등록합니다.
script.load()
input()
session.detach()
script.load에서는 위에서 등록한 후킹 코드를 대상 프로세스 내에 삽입하여 실행합니다. (user32.dll안에 삽입)
input()은 후킹 스크립트가 작동하는동안 대기하고
session.detach()는 attach된 프로세스에서 frida를 정리합니다. (detach)
실행해보겠습니다. 코드가 들어있는 곳에서 셸을 켜준 뒤 다음 명령어로 실행해줍니다.
python win.py

해당과 같이 로그가 찍힙니다.

열려있는 파일을 보시면 모든 글자가 Poiri3r로 바뀌어있는걸 확인할 수 있습니다.
이상으로 frida후킹 2번째 포스팅을 마치겠습니다.
후킹이 종류도 너무 다양하고 복잡해서 공부할게 너무 많은 것 같습니다..
다음 포스팅은 아마 드림핵의 CaptainHook의 Write-up을 작성할 것 같은데 아마 비공개로 작성하지 않을까 싶습니다.
이상 읽어주셔서 감사합니다~

'취약점분석 > Reversing' 카테고리의 다른 글
| [Reversing]DLL injection ( injector 스켈레톤 코드 분석 ) (5) | 2025.07.21 |
|---|---|
| [Reversing] Hooking - 5 (Inline Hooking ①) (0) | 2025.07.19 |
| [Reversing] Hooking - 3 (Frida Hooking ①) (2) | 2025.07.07 |
| [Reversing] Hooking -2 (IAT Hooking) (0) | 2025.07.05 |
| [Reversing] Hooking - 1 (DLL,IAT 이론) (2) | 2025.07.05 |