컴공 일기279
게시글 주소: https://orbi.kr/00076405203
보안 솔루션 개발에서 빼놓을 수 없는 Api Hook 기법의 예제입니다. 강의를 지금 수강하고 있는데, 예제를 돌려보면서 감을 잡는 중이네요. Hook은 상당히 위험한 기술입니다. 잘 쓰면 보안이지만, 그릇되게 사용하면 해킹 기법이기도 하거든요. 안성재 셰프님이 사시미 칼을 가지고 계신다면 맛있는 방어회를 기대할 수 있지만, 인천 조폭 오빠야들이 사시미 칼을 들고 있다면 그건 살인 도구가 됩니다.
hooking도 마찬가지입니다. 영어 표현이 넌지시 암시하듯이, 함수의 흐름을 멋대로 갈취해서, 자기만의 흐름으로 바꿔버리는 기술이지요. 프로그램을 열어주는 OpenProcess()라는 함수를 갈취해서, MyOpenProcess()로 실행되도록 한 것입니다. 원래의 OpenProcess()는 커널 수준의 프로그램을 제외한 유저모드 수준의 프로그램을 다 조회할 수 있도록 지원하지만, MyOpenProcess()의 경우 메모장 프로그램의 정보를 blind처리 시키는 구조를 가집니다.
예, 원래 함수가 다 보여주는 기능이라면 커스터마이징된 함수에서는 메모장의 정보 조회를 막고 있지요.
그러니까 원래 함수의 흐름에서 커스터마이징된 함수 즉 MyOpenProcess()로 함수의 흐름을 바꿔채기만 한다면 메모장의 정보 조회를 막는 보안 솔루션이 됩니다.
#include <iostream>
#include <windows.h>
#include <Psapi.h>
using namespace std;
#pragma pack(push, 1)
typedef struct JUMP_CODE {
BYTE opCode;
LPVOID targetAddr;
}JUMP_CODE;
#pragma pack(pop)
void* g_pOpenProcess;
BYTE g_codesBeforeHook[sizeof(JUMP_CODE)] = { 0 };
BOOL hookOpenProcess(void);
void unhookOpenProcess(void);
HANDLE MyOpenProcess(
DWORD dwDesiredAccess, BOOL bInheritHandle,
DWORD dwProcessId
)
{
//여기에서 unHook을 해야지만 무한루프에 빠지는 것을 방지할 수 있다.
unhookOpenProcess();
HANDLE(WINAPI * pfOpenProcess)(DWORD, BOOL, DWORD) = NULL;
pfOpenProcess = (HANDLE(WINAPI*)(DWORD, BOOL, DWORD)) g_pOpenProcess;
dwDesiredAccess |= PROCESS_QUERY_INFORMATION | PROCESS_VM_READ;
HANDLE hProcess = pfOpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
TCHAR name[MAX_PATH + _MAX_FNAME] = { 0 };
::GetModuleFileNameEx(hProcess, NULL, name, size(name));
if (wcsstr(name, L"Notepad.exe") != NULL)
{
cout << "\tMyOpenProcess()" << endl;
cout << "\t*******************************************************" << endl;
cout << "\t***************Block notepad Process!!!****************" << endl;
cout << "\t*******************************************************" << endl;
hookOpenProcess();
return NULL;
}
hookOpenProcess();
return hProcess;
}
void printProcessList(void)
{
HMODULE hk32 = ::LoadLibrary(L"Kernel32.dll");
HANDLE(WINAPI * pfOpenProcess)(DWORD, BOOL, DWORD) = NULL;
pfOpenProcess = (HANDLE(WINAPI*)(DWORD, BOOL, DWORD)) ::GetProcAddress(hk32, "OpenProcess");
DWORD aPid[1024] = { 0 };
DWORD dwNeeded = 0;
if (::EnumProcesses(aPid, sizeof(aPid), &dwNeeded))
{
DWORD count = dwNeeded / sizeof(DWORD); //Process Count
HANDLE hProcess;
for (DWORD i = 0; i <= count; ++i)
{
hProcess = pfOpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aPid[i]);
if (hProcess != NULL)
{
TCHAR name[MAX_PATH + _MAX_FNAME] = { 0 };
::GetModuleFileNameEx(hProcess, NULL, name, sizeof(name));
::wprintf(L"%s [PID: %d]\n", name, aPid[i]);
}
}
}
::FreeLibrary(hk32);
}
BOOL hookOpenProcess(void)
{
HMODULE hk32 = ::GetModuleHandle(L"Kernel32.dll");
HANDLE(WINAPI * pfOpenProcess)(DWORD, BOOL, DWORD) = NULL;
pfOpenProcess = (HANDLE(WINAPI*)(DWORD, BOOL, DWORD))::
GetProcAddress(hk32, "OpenProcess");
g_pOpenProcess = pfOpenProcess;
DWORD dwOldProtect = 0;
BOOL bResult = ::VirtualProtect(
(LPVOID)pfOpenProcess, 5,
PAGE_EXECUTE_READWRITE, &dwOldProtect
);
memcpy(g_codesBeforeHook, pfOpenProcess, 5);
//목적지 주소 - 현재 명령어 주소 - 5
//5는 JMP, CALL 명령어의 크기 만큼 빼주는 것
JUMP_CODE jmpCode = { 0 };
jmpCode.opCode = 0xE9; //JMP
jmpCode.targetAddr = (void*)((DWORD)MyOpenProcess - (DWORD)pfOpenProcess - 5);
memcpy(pfOpenProcess, &jmpCode, 5);
return TRUE;
}
void unhookOpenProcess(void)
{
if (g_pOpenProcess == NULL)
return;
//원상복구
memcpy(g_pOpenProcess, g_codesBeforeHook, 5);
}
//32bit Windows Api Inline hook
int main()
{
setlocale(LC_ALL, "");
hookOpenProcess();
printProcessList();
return 0;
}
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
탐망이라 물변에 영어 2등급 무감점 뜨면 좀더 오르긴 할텐데
-
어떤데에???
-
아무리예뻐도 담배피면안돼
-
님들 성대 나군은 과탐 가산점 별로 영향 없음?? 6 1
왜지
-
6시까지 4장문제하고 8시까지 5장문제하고 11시까지 2,3장하고 이러면 막판스퍼트는 언제치지
-
20분만 자도 될까요 6 0
지쳤슨
-
수시이월이 될테야 될테야!!
-
Ktx 오르비 꺼라 1 1
캬
-
전학갔던 학교였는데 대안학교였거든요 근데 학교 교육과정 중에 등산을 하는게 있었어요...
-
뭐가 낫나요??
-
오늘 사이비랑 만나러 갑니다 21 0
잘 도망칠게요
-
에타 어디가 젤 재밋음??? 17 0
경북대?
-
저녁무묵지 4 1
자극적이먄서도 와일드한 뭔가 없을가
공주다!
앙냥앙냥
1월 1일 상경했을 때부터 지금까지..
ㅋㅋㅋㅋㅋ 잠시만 매우 익숙한...?

마이크로명령어 해킹당하니 답없던골치아프죠... 그래도 "리버싱"이라는 강력한 기술이 있으므로..^^
예전에 제가 나이 관련해서 고민된다고 댓글 달아주셨을때
힘나는 답변 해주셔서 감사했어요
그리고 저도 창작자라는 꿈이 있는데 ai를 활용해서
더 넓은 분야들에서 움직여보려고요
저때 받은 답변 지금도 갖고 힘내고 있습니다
대학교도 컴공으로 진학 예정(반수 예정이지만..!)인데
늘 파이팅이요!
감개무량입니다.... 어떤 한 교수님이 저한테 그런 가르침을 주셨습니다. 외롭고 고되고 힘든 시기지만, 그럴 때일수록 인식의 열정에 사로잡힌 사람들이 빛나는 시대,라고. 더 큰 인식의 열정에 사로잡힌 채 젊음을 즐기시기를.... 그렇게 응원합니다 :)
와 이분 개오랜만이다
반갑습니다아~
Gpt가 보안영역은 아직 파이를 안뺏나여
보안솔루션은 GPT가 대체하기 매우 힘든 분야라고 할 수 있습니다. GPT가 전혀 모르는 코드를 짜야하는 일도 다반사이기 때문입니다. 참고하시기 바랍니다.
기시디에서 인사드립니다 선배님!
꺙 기시디 화이팅이에용 >.<
어렵닷