Inline Patch ๊ธฐ๋ฐ User-Mode API Hooking Stub ๊ตฌ์กฐ ๋ถ์
๋ณธ ๊ธฐ๋ก์ ์
์ฑ์ฝ๋์์ ๋น๋ฒํ ๊ด์ฐฐ๋๋ UserโMode API ํํน ํจํด ์ค,
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํํ์ธ Inline Patch(ํ๋กค๋ก๊ทธ ํจ์น) ๊ธฐ๋ฐ Hook Stub์ ๊ตฌ์กฐ๋ฅผ ๋ฆฌ๋ฒ์ฑ ๊ด์ ์์ ์ ๋ฆฌํ ๊ฒ์ด๋ค.
PE ๊ตฌ์กฐ, ํจ์ ํธ์ถ ๊ท์ฝ, ์คํ ํ๋ ์, ์ ์ด ํ๋ฆ ๋ถ์, ๊ทธ๋ฆฌ๊ณ ๋์ API ํ๋ยท์ํธํ ๋ฃจํด ๋ณต์ ์ ์ฐจ์ ์ฐ๊ฒฐ์ง์ด ๊ธฐ์ .
๋ฆฌ๋ฒ์ฑ ๊ธฐ๋ก
1. ๊ฐ๋ ์ Hooking ๊ตฌ์กฐ(C ๊ด์ , ๋น์คํ ์์)
์ด ์์๋ ์ค์ ๋ก ์คํ๋์ง ์๋๋ก ์ค๊ณ๋์์ผ๋ฉฐ,
์ผ๋ฐ์ ์ธ ์
์ฑ ์ํ์์ ๋ฐ๊ฒฌ๋๋ ๊ตฌ์กฐ์ ํจํด๋ง ๋ฐ์.
// ๊ฐ๋
์ ์์ โ ๊ตฌ์กฐ ๊ด์ฐฐ ์ ์ฉ
unsigned char originalBytes[16];
void hook_target_function(void* target, void* hookStub) {
// 1) ํ๊น ํจ์์ ์ฒซ 5๋ฐ์ดํธ ๋ฐฑ์
memcpy(originalBytes, target, 5);
// 2) JMP hookStub ํจ์น
DWORD rel = (DWORD)hookStub - (DWORD)target - 5;
BYTE patch[5] = {0xE9}; // JMP rel32
memcpy(patch + 1, &rel, 4);
// 3) ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ ๋ณ๊ฒฝ ํ ํจ์น ์ ์ฉ
write_patch_conceptually(target, patch, 5);
}
ํต์ฌ ์์ฝ:
- ํ๊น ํจ์์ ํ๋กค๋ก๊ทธ๋ฅผ ๋ฎ๊ณ JMP stub์ผ๋ก ์ ์ด ํ๋ฆ์ ์ด๋์ํด.
- ํจ์น ์ ์๋ณธ 5๋ฐ์ดํธ๋ ํธ๋จํ๋ฆฐ(๋ณต๊ตฌ์ฉ stub)์์ ์ฌ์ฉ๋จ.
- ๋ฉ์จ์ด๋ ๋ณดํต API๋ช ๋ฌธ์์ด์ ์ํธํํ์ฌ ๋ณดํธํจ.
2. Hook Stub ๊ตฌ์กฐ(๋น์คํ Assembly)
์ค์ ์ํ์์ ๊ฐ์ฅ ํํ ๋ณด์ด๋ ํํ์ ๊ฐ๋
์ ๋์ค์ด์
๋ธ๋ฆฌ์.
๊ตฌ์ฒด์ ์ฃผ์ยท์์คํ
์ฝยทํ๋ผ๋ฏธํฐ๋ ์ ์ธํจ.
; Hook Stub โ ๋น์คํ ๊ฐ๋
์ฝ๋
; ๋ชฉ์ :
; 1) ํธ์ถ์ ๋ ์ง์คํฐ/์คํ ๋ณด์กด
; 2) ์
์ฑ ๋ก์ง ์ํ
; 3) ์๋ณธ ํจ์์ ๋๋จธ์ง ๋ถ๋ถ(ํธ๋จํ๋ฆฐ)์ผ๋ก ๋ณต๊ท
HOOK_STUB:
pushad ; GP ๋ ์ง์คํฐ ์ ์ฒด ๋ณด์กด
pushfd ; EFLAGS ๋ณด์กด
; --- ์
์ฑ ๋ก์ง (์ถ์ฝ ์์) ---
; ์: API ํธ์ถ ์ด๋ฆ ๋ก๊น
, ํ๋ผ๋ฏธํฐ ๋ณ์กฐ, ์กฐ๊ฑด๋ถ ์ฐจ๋จ ๋ฑ
; --- ์๋ณธ ์ฝ๋ ํธ๋จํ๋ฆฐ ํธ์ถ ---
popfd
popad
jmp ORIGINAL_TRAMPOLINE ; ์๋ณธ ์ฝ๋๋ก ํ๋ฆ ๋ณต๊ท
โป pushad/popad๋ ๋ถ์์ฉ ๊ฐ๋
ํํ์ด๋ฉฐ ์ค์ ์ํ์ ๋ค๋ฅธ ๋ ์ง์คํฐ ๋ณด์กด ์ ์ฑ
์ ์ฌ์ฉํ๊ธฐ๋ํจ.
3. Inline Patch ์ ์ฉ ์์น ๋ถ์
PE Export Table์ ํตํด ์ป์ ํจ์ ์ฃผ์๋ ์ค์ ์คํ ๋ชจ๋ ๋ด๋ถ์ ์ค์ ์ํธ๋ฆฌ์ด๋ฉฐ,
๋ณดํต ๋ค์๊ณผ ๊ฐ์ ํ๋กค๋ก๊ทธ ํจํด์ ๊ฐ์ง.
; Typical Win32 API Prologue
MOV EDI, EDI ; Alignment
PUSH EBP
MOV EBP, ESP
SUB ESP, XX
์ ์ฑ์ฝ๋๋ ์ด ์๋จ 5๋ฐ์ดํธ๋ฅผ ๋ฎ์ด ์ฐ๋ฉฐ:
E9 XX XX XX XX ; JMP hookStub
**์ ์ด ํ๋ฆ ์ ํ(Control Flow Detour)**์ด ์ฆ์ ๋ฐ์.
4. ํธ๋จํ๋ฆฐ ๊ตฌ์กฐ ์์ธ
ํธ๋จํ๋ฆฐ์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ํ์ฑ๋จ.
; ๋น์คํ ์์ โ ํธ๋จํ๋ฆฐ
ORIGINAL_TRAMPOLINE:
; 1) ๋ฐฑ์
๋ ์๋ณธ ๋ฐ์ดํธ
DB 55 8B EC ... ; ์ค์ ์๋ณธ ํ๋กค๋ก๊ทธ ์ผ๋ถ
; 2) ์๋ ํจ์์ ๋ค์ ์ฃผ์๋ก ์ ํ
JMP [originalFunction + 5]
ํธ๋จํ๋ฆฐ์ ๋ถ์์์ ์ค์ํ ์๋ฏธ๊ฐ ์์:
- API ํํน ์ฌ๋ถ ์๋ณ ๊ฐ๋ฅ
- ์๋ ํจ์์ ์ค์ ์์ ์ง์ ์ ํ์ ๊ฐ๋ฅ
- ํํน ํ์ง ์ฝ๋์์ ์ฃผ๋ก ํ์ง๋๋ ์ง์
5. ๋์ API ์กฐํ(PEB ๋ฐ Export ํ์ฑ ๊ธฐ๋ฐ)
์
์ฑ์ฝ๋์ ํํน ๋ก์ง์ ์ข
์ข
API๋ช
์ ์ง์ ํฌํจํ์ง ์๊ณ ,
Export Directory๋ฅผ ์ง์ ํ์ฑํจ.
// ๊ฐ๋
์ ์์ โ Export ํ์ฑ
void* resolve_api_concept(const char* dll, const char* nameHash) {
// 1) PEB โ LDR โ Module ์ฐพ๊ธฐ
// 2) Export Directory ์กฐํ
// 3) ํจ์๋ช
ํด์ ๋น๊ต
// 4) IAT/์ฃผ์ ๋ฐํ
return 0;
}
๋ถ์ ํฌ์ธํธ:
- ๋ฌธ์์ด์ XOR, ROL ๋ฑ ๊ฐ๋จ ์ํธํ๊ฐ ํํจ
- ํจ์๋ช ๋น๊ต๋ 32๋นํธ/64๋นํธ ํด์๋ก ์ํ
- ์ ์ ๋ถ์์์๋ ํด์ ๋ฃจํด ๋ณต์ ํ์
6. AntiโDebugging๊ณผ ํํน์ ๊ฒฐํฉ ํจํด
์ผ๋ถ ์ ์ฑ์ฝ๋๋ ํํน ์ฝ๋ ๊ทผ์ฒ์์ ๋ค์๊ณผ ๊ฐ์ anti-debug ์ฒดํฌ๋ฅผ ์ํํจ.
mov eax, fs:[0x30] ; PEB
mov al, [eax+0x02] ; BeingDebugged
test al, al
jnz DEBUG_HANDLER ; ๋๋ฒ๊ฑฐ ์กด์ฌ ์ ๋ถ๊ธฐ
int 2D ; Soft breakpoint ์ ๋ฐ ํจํด
ํํ ํจํด:
- ํํน๋ API ํธ์ถ ์ ๋๋ฒ๊ฑฐ ํ์ง ์ํ
- ๋๋ฒ๊ฑฐ ๋ถ์๊ธฐ์์๋ง ๋ค๋ฅธ ํธ๋จํ๋ฆฐ์ ํธ์ถ
- ๋ ์ง์คํฐ ๋ณ์กฐ๋ก ์คํ ๋ถ๊ดด ์ ๋ฐ
7. Control Flow ๊ด์ฐฐ ํฌ์ธํธ
| ํญ๋ชฉ | ์ฒดํฌ ๋ด์ฉ |
|---|---|
| ์คํ ํ๋ ์ | ํ๋กค๋ก๊ทธ ํจํด ํ๊ดด ์ฌ๋ถ, ESP ๋ณํ |
| Export Table | ์ค์ API ์ํธ๋ฆฌ์ ํจ์น ์ฌ๋ถ ๋น๊ต |
| IAT | ํํน๋ API๊ฐ Import Table ๋์ Inline Patch ์ฌ์ฉํ๋์ง |
| ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ | .text ๊ตฌ๊ฐ์ด RWX๋ก ๋ณ๊ฒฝ๋์๋์ง |
| ์์ฌ ์ฝ๋ | ํธ๋จํ๋ฆฐ ๋ด jmp original+5 ์ ๋ฌด |
| ๋ ์ง์คํฐ ํ๋ฆ | hook stub ์ ํ ๋ ์ง์คํฐ ๋ณด์กด ์ฌ๋ถ |
์ด ์งํ๋ค์ API ํํน์ ์๋ณํ๊ณ ํํน ๋ก์ง์ด ์ด๋ค ๋ฐฉ์์ผ๋ก ๋์ํ๋์ง ํ๋จํ๋ ๋ฐ ์ ์ฉํจ.
โจ ๋ง๋ฌด๋ฆฌ ํ ์ค
Inline Patch ๊ธฐ๋ฐ UserโMode Hooking์ ์์ 5๋ฐ์ดํธ ํ๋กค๋ก๊ทธ๋ฅผ ๋ฐ๊พธ๋ ๊ฒ๋ง์ผ๋ก ์์คํ
ํ๋ฆ์ ์์ ํ ๊ฐ๋ก์ฑ๋ฉฐ,
๊ทธ ์ธ๋ฐํ ํจํด์ ์ฝ์ด๋ด๋ ๊ฒ์ด ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง์ ํต์ฌ ๊ฐ๊ฐ์ ๋จ๋ จํ๋ ์ค์ํ ๊ณผ์ ์ด๋ค.
๐ Written by Code & Compass