본문 바로가기

My Study/Programming&Theory

OpenProcess를 막는 방법은??

모든 기말고사 시험이 끝나고.. 데이터베이스 발표만을 앞둔 상황에서.. 새벽에 심심하던 찰나 문뜩 생각이 나서 장난같지 않은 장난을 한번 쳐봤습니다. 될까 싶었는데 그냥 되더군요.

OpenProcess는 PID를 가지고 대상 프로세스의 커널오브젝트를 가리키는 핸들을 얻어오는 함수입니다.
dll injection을 하건 해당 프로세스의 메모리 패치를 하던간에.. 무조건 호출되어야하는 함수입니다.
뭐.. FindWindow를 사용할수도 있지만 윈도우 이름보단 프로세스 이름으로 pid를 얻는게 더 효율적이죠... 

저놈의 함수를 막을려면 어떻게 할까요.. 유저단에서 생각을 해보면 전역 후킹을 통해 모든 프로세스에 dll을 inection 시키고 모든 프로세스의 kernel32.dll에 있는 OpenProcess를 후킹해서 막아야할까요?.. 물론 되겠죠.

이번엔 커널단에서 생각해보겠습니다. 그냥 간단히  KiServiceTable 있는 ZwOpenProcess 함수를 후킹할까요?(SSDT..)
이 방법은 커널 프로그래밍을 해야되는 것 이지만 후킹 탐지가 쉽게 되므로 효율성이 얼마나 있을지 모르겠군요.

그 외에도 SYSENTER를 후킹해서 하는 방법..( ZwOpenProcess 시스템 번호로 식별해.. )

많은 방법이 있지만 이번에 해볼 방법은 쫌..  살짝 장난스럽긴 하지만
PID를 계속적으로 바꿔버리는 것입니다.
프로세스를 계속 살렸다 죽였다 살렸다 죽였다.. 하는 방법은 아니구요;;
살아있는 프로세스의 PID를 계속 바꾸는 것 입니다. 



바로 저 PID 말이죠.
프로세스의 PID가 저장되어 있는 장소는 두 군데로 알고 있습니다. 첫번째는


TEB 구조체의 ClientId 멤버변수에 있습니다. 이건 유저에 저장되어 있는 값이구요.
GetCurrentProcessId()함수를 사용해서 얻오는 PID가 바로 저기서 얻어오는 것 입니다.

두번째는


커널에 있는 EPROCESS 구조체 내부에 있는 UniqueProcessId 멤버변수에 있습니다.

그러면 프로세스 이름으로 검색해 PID를 얻어오는 방법인
CreateToolhelp32Snapshot()
Process32First()
Process32Next()
세 함수를 사용한다면 어떠한 PID를 가져올까요??

바로 EPROCESS 구조체 내부에 있는 UniqueProcessId 값을 가져오게 됩니다.

하지만 저 값이 계속적으로 바뀌어버리면??
제대로 된 PID 값을 알지못해 OpenProcess가 실패하게 될 것입니다.
사실 한번만 바꿔도 되는데... 계속 바뀌어지면 뭔가 있어보이잔아요?...흠..

아무튼 그런 방법을 사용해 PID를 변경시키는 프로그램을 만들어보았습니다.
그리고 다른 프로세스에서는 해당 프로세스의 핸들을 얻기위해 OpenProcess를 계속 시도하였습니다. 

아래는 동영상.. ( 마우스 휠로 브라우져를 확대에 보세요.. )


이것도 조금만 생각해보시면 파훼법이 있겠죠??
혹시 좋은 방법들이 있다면 댓글로 조언을 해주세요 ^^ 

'My Study > Programming&Theory' 카테고리의 다른 글

SwapContext를 이용한 프로세스 찾기  (7) 2012.01.04
Remote Library Injection  (4) 2011.12.29
Immunity Debugger Hard Hooking  (2) 2011.12.08
ScreenSaver 만들어보기  (3) 2011.11.30
API vs MFC  (1) 2011.11.30