Windows 7부터 적용된 세션 관리 정책
- 시스템 프로세스들과 서비스 프로세스들이 실행되는 시스템 세션(Session ID=0)과 로그온 사용자의 세션(Session ID>=1)을 분리
- CreateRemoteThread() API를 이용한 DLL 인젝션 기법은
1) Session 1의 사용자 세션에서 실행되는 프로세스 대상으로는 잘 동작하지만
2) Session 0의 시스템 세션에서 실행되는 프로세스 대상으로는 동작하지 x
해결 방법
- Kernel32!CreateRemoteThread() API 내부에서 remote thread를 생성할 때 ZwCreateThreadEx()를 이용해 suspend 모드로 생성하는데, 만약 리모트 프로세스가 Session 0이라면 (CreateSuspended 파라미터가 TRUE(1)로 세팅되면서) resume시키지 않고(ZwResumeThread() API가 호출되지 않고 건너뜀) 에러를 리턴함
Therefore...
=> CreateRemoteThread() 내부에서 호출되는 ZwCreateThreadEx()를 직접 호출한다
=> Ollydbg에서 CreateSuspended 파라미터를 조작하거나, ZwResumeThread 직전 분기를 조작한다
'security > 리버싱핵심원리' 카테고리의 다른 글
TEB & PEB 정리 (0) | 2023.04.05 |
---|---|
TLS 콜백 함수 (0) | 2023.04.05 |
ASLR 제거 (0) | 2023.04.04 |
API 코드 패치를 이용한 API hooking - notepad.exe 프로세스 은폐하기 (2) (0) | 2023.04.03 |
API 코드 패치를 이용한 API hooking - notepad.exe 프로세스 은폐하기 (1) (0) | 2023.04.01 |