컴공 일기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를 선물하세요.
-
자다깨면 1 0
다시 잘 못자는구나 오늘의 깨달음
-
이제 카피바라가 탑을 지배하네
-
생윤공부기간 0 0
언제시작핡ㄴ카요 노베인데 현돌로도 ㄱㄴ함?? 아님 개념강의 하나 들어야하나
-
176124 2 0
GCTGACACGCTGTCCTCTGGCGACCTGTCGCTGGAGAGGTTGGGCCT...
-
N수생 ptsd 오는글 1 0
지금은 2026년 11월 18일 저녁입니다. 수능 전날. 그 날이 코앞입니다....
-
경성제국대학교마스코트 6 0
설잠녀
-
2026.05.07(목) 실시된2026학년도 05월 고3 모의고사 수학영역...
-
수능한국사처럼 통합사회 통합과학시간을 따로 빼서 영어급의 절대평가형식으로 넣고...
-
수면패턴박살청년 4 1
2시22분에 자러가지만 쇼츠릴스보다 3시에잘듯
-
안자는사람 10 2
-
옯평은 어느 대학 정도임 9 1
고닉 평균은 ㅈ될거같은데
-
시험장에서 실력발휘하는법 0 1
강케이 서바 더프 서프 전회차 현장응시하기
-
풀수면때릴수업시간을정해야겟다 1 0
흠냐뇨이..
-
하시발ㅈ됏다 4 0
너무늦엇다 학교어키가노시발
-
ASL 결승 재밌다 1 0
롤보다 더 재밋는 ASL
-
잘게요 3 0
일찍 안자니까 졸려서 공부안됨
-
새르출석체크비 10 0
-
뜌땨이 1 1
그리움
-
잠안오는데 잘거임 3 0
잘자
-
흐흐 1 0
히히
-
닉바꾸고싶네 10 1
그렇다고 마땅히 할건 생각이 안나는군..
-
생윤 기시감 검더텅 0 0
지금 검더텅 문제 풀고 선지 분석하면서 거의 다 끝냈는데 기출은 기시감이 검더텅보다...
-
국숭세단 광명상가 맞음? 23 1
한서삼은 어디지 존나 헷갈림 인가경 부경인아 얘네 다 순위가 어케되는겨
-
탬버린이 눈물을 흘리면? 4 1
울버린 ㅋㅋ
-
설자전가면연애가능? 6 1
150 80임
-
계약학과는 그냥 저점 방어해주는 학과 아니었음??카이스트 반도체가 무학과보다 훨씬...
-
오겠지 해뜰날 오늘도 화이팅! 0 0
오늘은 금연 35일차 입니다
-
연고국문 가면 연애 ㄱㄴ? 9 2
본인은 164 남자임
-
오늘의 단어게임 6 1
2026년 5월 26일 오늘의 단어 맞히기 성공! ⬛?⬛⬛⬛ ⬛⬛⬛⬛? ⬛???⬛...
-
별 하니까 생각난건데 1 0
경희대 야경 볼만하더라
-
차돌박이구어먹을까 2 0
어떰 배고파
-
개그를 잘치고 싶다 1일차 1 0
ㅇㅇ
-
별 볼 일 없다니 3 1
네가 너무 밝아서 별빛이 안 보이는 거겠지
-
갑자기 화남 8 0
동아리 때문에 롯데월드에서 놀다가 본가에서 악기 가져와야 해서 8시에 나와서 왕복...
-
난 믿는다 5 0
서울대만 가면 연애하는거맞지?
-
단하나만빼고
-
사설컨이나 등등
-
장재원T 시즌1 0 0
들으신분 계신가요?
-
존잘고능아수학황이되고싶다 3 0
ㄹㅇㅠㅠ
-
쌀국수먹고싶다 3 0
힘줄들어간거
-
죽고싶어서 4 0
선풍기틀고잠
-
여붕이가되면가장먼저할거 2 1
딸
-
인증좀 했으니 3 0
내일부턴 다시 안중에도 없다 쓰겠습니다
-
ㅇㅈ 10 2
고3때임 ㅋ
-
제인증보는법 2 0
내년에옯만츄하시면됩니다~
-
다들 많이 웃고 행복하세요 10 1
부탁입니다
-
근데키커도장발이면 5 1
길거리에서사람들이여자로알아보던데.
-
[후기] 5덮 후기 (n수) 10 4
안녕하세요 늙고병듦입니다 5덮 친지도 벌써 일주일이 다되가는데.. 요즘 이런저런...
-
동기부여가 확실히 되긴 하네요 재밌기도 하고
-
최고의대학재학중 4 1
침대

공주다!
앙냥앙냥
1월 1일 상경했을 때부터 지금까지..
ㅋㅋㅋㅋㅋ 잠시만 매우 익숙한...?

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