윈도우
PE IMAGE SWITCHING
youngsouk
2019. 11. 6. 10:42
1. 스위칭 할 exe 파일 전체 읽어오기 - CreateFile(), ReadFile()을 통해서
2. 스위칭 될 exe CreateProcess()를 통해 실행
3. GetThreadContext()로 2번에서 생성한 프로세스의 정보(PEB)를 이용해 IMAGEBASE 구하기
4. 1번에서 얻어온 PE헤더를 바탕으로 IMAGEBASE를 구한다.
5 - 1. 3번과 4번에서 얻어온 IMAGEBASE를 비교해서 같으면 ZwUnmapViewOfSection()을 이용해 2번과정에서 실행된 이미지 언맵핑
6 - 2. 다르면 3번에서 얻은 PEB에 IMAGEBASE를 수정한다.
7. VirtualAllocEx()를 통해 IMAGEBASE로부터 이미지 크기만큼 할당
8. PE 헤더정보 맵핑 - WriteProcessMemory() 이용
9. PE 헤더의 IMAGE_SECTION_HEADER를 통해 섹션을 맵핑 - WriteProcessMemory()이용
10. 다시한번 GetThreadContext()로 메인 스레드의 CONTEXT를 구한다.
ntdll.RtlUserThreadStart() API가 호출이 된 뒤 Eax의 값으로 가게되므로
11. Eax를 스위칭 할 exe의 EP코드로 변경
12. ResumeThread()로 실행
디버깅 방법은 스위칭 될 exe의 EP의 코드를 무한 반복이 되게 한 후에 attach 해 디버깅한다.