컴공 일기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를 선물하세요.
-
2036 수능영어 34번 1 0
??
-
님들 저 고대 가능성 있을까요 5 0
6모 백분위 언미물지 86 98 99 92인데 수학13번틀렸어요 지구도 실수하나함
-
저학력자만 오셈 6 1
왜클릭?
-
씻을까 5 1
음 씻을까 말까 일단 토 일 월 화 안 씻음
-
전글 옯서운 사실 4 0
중졸 한명 빼고 모두 인서울 이상의 고학력자다
-
2-2때 내신 성적표 0 0
저때 이후로 뒤질 때까지 물리 안보기로 다짐함
-
자존감들 높게 삽시다!! 6 1
나 좋은 사람이고 나 사지 멀정하고 나 공부 꽤 하고 나 앞으로 더 나아질 거고 나...
-
내일시험 공부 하나도안함 2 0
졸린데 잘까 내일 1시시험이긴 함 영어 교양필수로 10단원짜리책 4~10단원이라 빡셈
-
설뱃들이 이상한 사람인 이유 7 5
새르비에 많음
-
제가 한 ㄹㅈㄷ불효 2 1
태어나기
-
흐으으으으음 2 0
돈이많고싶다 애매수저라 복지혜택도 못받고 그리 풍족하지도않고 뭐 그렇다고...
-
사실 난 연대라옹 5 0
연>고
-
흠 안해도 되겟져
-
부모님 돈 훔쳐본 사람 3 0
초딩때 엄마 지갑에서 5만원 훔쳐봄 그런데 나에게 아무 말씀 안하셧음
-
여길보면 설뱃 23 1
저길보면 연고뱃 눈 비비고 뜨면 카이스트뱃 눈 가늘게 뜨고 보면 의뱃 뱃지단 천지네
-
연애는 5 0
사치임
-
넵
-
티 난지 오래야 1 0
네 맘을 말해줘
-
아악 짜증나 1 0
빨리 자든지 해야지 역시 인터넷이 문제였구만 당분간 랜선을 뽑아 놓든지 해야지
-
(정병 2탄) 2 1
보라 여행에서 돌아온 민선과 철수, 철수는 한국계 미국인이라 한국어가 서툴다....
-
고3 때 한 ㄹㅈㄷ 불효 3 1
지금 이 순간
-
학습비 월 70만이면 0 0
싼 편이 아닐까 생각이 갑자기 들었다
-
오늘의 야식 6 1
레이즈와 파울라너
-
고3때 한 ㄹㅈㄷ 효도 4 1
-
고3때 한 레전드 불효 6 1
현정훈 단과 9개월간다님 대략 500 태움 9모 물리 4뜸 상의 안하고 과목 바꾸고 옴
-
맞팔하실분 1 0
고고
-
지금 무슨메타임 3 1
나도끼워줘
-
우리 부모님이 특이한가 7 1
재수 선언: 맘대로 해라~ 6평 치고 탐구 바꾸겠다 선언: 맘대로 해라~의대 안감...
-
난 진짜 인생망했어 1 0
시발 기만자새끼들아
-
농담이겠죠...? 하하...
-
지금 빅테크사면 예적금아닌가 2 0
마소이런거 사고 1~2년 묵힌다고생각하면 돈을 잃을수가 없는것 같은데 마소 너무 눌려있음
-
연애 못하는 사람 특 9 0
연애는 하고싶지만 그정도 노력을 들이기에는 순서가 너무 뒤로 밀림 그냥 노력하는게...
-
근데 보통 13 2
부모님이 의사고 자식이 나름 포텐있다 싶으면 적극적으로 밀어붙이지 아늠? 내가 너무...
-
. 0 0
-
내일 종강기념 배달음식 추천좀 9 1
ㄹㅇ
-
월드컵보면서 맥주까고싶었는데 7 0
왜 오전에하니.... 낮술은안되잖아
-
연어가 영어로 뭔지 앎? 4 0
collocation
-
내가 연애를 안하는 이유는 7 2
연애를 못해서임
-
어케 푸는지 로직이 가물가물할 때 문제 갖다주면 다 기억남 물론 오랜만에 해서 절...
-
엄마 보고 싶음 2 0
계절때매 집에 못 내려감 ㅜㅜ
-
미적분 자작 문항 하나 투척 0 0
30번 치고는 좀 쉬울 수도
-
아시밯 오늘진짜밤샌다 11 1
다죽자
-
옯친들 솔로 vs 연애중 23 1
궁금 댓글ㄱ
-
세지 한지 잘하는법 4 2
알았음 만점을 받았겠지
-
본인 인생 ㅁㅌㅊ 4 1
트위터에 병신같은글 싸질렀다가 과외쌤이 봄 2회(각각 다른 과외쌤임) 책에 친구랑...
-
생윤 실모 0 1
이거 필요하나요..? 굳이 풀라면 현돌모, 서바이벌 정도만 풀어도 충분할까요?...
-
토마토쌀국수 먹어야지 나 진짜 천재인가 ㄹㅇ 개맛잇겟다앙
-
여행이나갈까 14 2
같이 갈 사람이 없어서 혼자 가야겠네 국내나 일본 함 갔다올까 방학동안 할게없다
-
오르비 가입하고 나니까 14 1
자꾸 들어오게 되네요...
-
인생이 미친듯이 편했겠지.. 부럽다

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

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