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 해 디버깅한다.
'윈도우' 카테고리의 다른 글
악성코드 분석 도구 모음 (0) | 2019.12.08 |
---|---|
Debug Blocker (0) | 2019.11.06 |
자기 자신을 자식 프로세스를 생성시키는 프로그램 디버그 (0) | 2019.11.04 |
Service Process 디버깅 (0) | 2019.11.04 |
SEH 예외 처리 (0) | 2019.10.31 |