컴공 일기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를 선물하세요.
-
넘 졸려 0 0
눈이 감겨
-
이상하게 수험생활하는 해당년 초여름쯤되면 이상한 꿈들을 엄청 생생하게 꾸는데 작년...
-
2만2천원은 씹
-
유독모 해설 연기 1 2
내일 쓰겠습니다 과외 자료 만드느라 바쁘네연
-
클라이밍 동아리 있음??
-
안녕하세요 저는은 뭐가 안녕하세요 저는이야 임마 17 2
안녕하세요 저는 여자입니다 저는 여성이었습니다 저는 말입니다 이히힝 저는 자연입니다...
-
블리치는 신이다 2 1
그림체 원탑절대 여캐 취향이 아닙니다.
-
듀얼을 신청한다 4 3
지는 놈은 내년 수능을 보는거다
-
책 사는 것도 중독인 듯 6 2
아직 풀지도 않았는데 구매한 것만으로도 실력 오른 거 같은 기분에 흥분됨 ㅎㅎ
-
바로 신청했을터인데 허
-
수성구 3 0
의 왕
-
와학 수학 실모 최저점 찍음 11 1
72점 ㄹㅈㄷ ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ하 뒤지겠다..
-
속시원하구먼 13 1
-
진짜 존나 신기하네 헬스만하고 딴거 안했는데 급 정상인된 기분ㅇ
-
실전문제(N제) 화1 3,4단원이 돌아왔습니다!! 기존 문항의 오류를 다잡고...
-
2900덕) 6평대비 2회 캘캠 빠답만 알려주실분 ㅠㅠㅠ 5 0
집에 답지를 두고 왔어요
-
생윤 홉스 질문 1 1
홉스가 사회계약에서 사회계약의 당사자가 통치자가 아니라는데 이게 무슨 말...
-
노동절을맞아호캉스오기 1 1
으흐흐 오늘은나도부르주아
-
5연딸을조졌다 7 2
-
죠죠 더록인지 뭔지 15 1
키도 작고 얼굴도 못생긴게 하는 짓도 개 찐따 같네 하는 짓도 별로인데 키도 작고...
-
기하와 기계공학과는 취향차이 0 0
ㅇ
-
멋잏ㄴ다 4 0
먼지는 비밀
-
하 오늘 공부 왜 이러냐 5 1
너무 안 되는데 어카지
-
진짜 team02 없나 3 2
흠
-
내년에 n수못한다 이런거 3 1
괜한 걱정이었던건가요? 보니까 전보다 n수불리해진건맞지만 사람들이 우려하던...
-
금마는 현역으로 연대갔는데 난 왜 n수지
-
요즘 유행하는걸로… 좀 신박한걸로요 한국인삼공사 빼고 부탁드립니다
-
티벧여우 n제(수정본) 2 0
수정 했습니다! 진짜 완벽 버전!!
-
감동란 확인란 0 0
-
수1은 감동이없음 6 2
(내가못해서) 수2는 감동이있음
-
본인이 입평연세대면 개츄 2 2
뿅뿅
-
수1 vs 수2 2 0
-
야 3 1
라고해도돼
-
수1 수2 수3 0 0
-
수2 오랜만에 하니깐 5 1
쉽지 않네... 22번은 삼각함수로
-
유빈 근데 몇년도에 생긴거임 5 0
나 빡갤때문에 고1?때 처음알게됬는데
-
블루보틀 0 0
텀블러 학원쌤 필수템임? 다 가지고 있으시네
-
n수할 때 여드름 폭탄이었는데 지금 볼이랑 이마 완전 깨끗해짐
-
유삼환님은 실천 윤리학도 이론을 정립하는 학문이 된다고 합니다. 0 1
1 2 유삼환님 주장: 더 나아가, 기술 윤리학 역시 하나의 학문일진대, 이론을...
-
제보하면 돈주는거임?왜 본인이 사거나 받은 자료를 남한테 공유하는거인지..
-
네 아따시 싯테루요 7 2
우~아
-
패스 제도가 되면서 0 0
강사들이 교재로 돈벌어야해서 교재가 비싼듯
-
시간관리 진심 뭐지다요 0 2
휴강 기간에 디자인 몰딩 밀린거 다 풀고 엔제푸는 상상은 그림떡 아니겠나
-
김지영 T 커리관련 0 0
반수 시작하고있습니다! 재작년 수능 영어 89점 맞고 2등급이였는데 평소 모의고사...
-
불법 야뎊의 유인요소는 무엇일까 11 2
1.당연히 돈 M사의 모 강사의 비싸고 맛있는 과일이 싸고 맛있는 과일로 변하는...
-
유빈에 자기자료 올라오면 4 1
나름 기분 좋을거같음 똥이모티콘 존나 달리지만 않는다면
-
이거 저작권 걸리나요? 1 0
학생 문제를 풀어주다가 얻어갈 부분이 많은 문제를 봐서요관련 주제로 글을 한 번...
-
3시까지 갔어야했는데 3 1
TFT 신청했어서 3시까지는 갔어야했는데 버스로 가기에는 커버 못치는 시간이라...
-
다는 아닌데 주로 그러하다함
-
기구하군

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

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