방학프로젝트 Shadower _4 Process 감추기
이번에는 사용자가 Shadower를 종료시기지 못하게 아에 프로세스를 감추기를 시도할 것이다.
하지만 이 프로세스 감추기가 그리 녹녹치 않은게 rootkit 을 해야하기 때문이다.
벌써부터 쫄린다.
그래서 이번에는 처음에 구글링해서 찾았던 문서를 따라해보기로 했다.링크
이번에는 사용자가 Shadower를 종료시기지 못하게 아에 프로세스를 감추기를 시도할 것이다.
하지만 이 프로세스 감추기가 그리 녹녹치 않은게 rootkit 을 해야하기 때문이다.
벌써부터 쫄린다.
그래서 이번에는 처음에 구글링해서 찾았던 문서를 따라해보기로 했다.링크
http://blog.nextcube.pe.kr/entry/%EB%B0%A9%ED%95%99%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-Shadower
hideprocess.pdf
hideprocess.pdf
1. Soft-ICE
soft-ice는 커널 디버거 이다. 위의 문서에서는 Soft-ICE 를 사용하여 기술하였기때문에 우선 Soft-ICE 를 찾을수밖게 없었다.
해서 구글링.
그러던중 디비거가 잘 정리된 사이트가 있어 추천한다.
soft-ice는 커널 디버거 이다. 위의 문서에서는 Soft-ICE 를 사용하여 기술하였기때문에 우선 Soft-ICE 를 찾을수밖게 없었다.
해서 구글링.
그러던중 디비거가 잘 정리된 사이트가 있어 추천한다.
http://reversengineering.wordpress.com/debuggers/
그러나 처음부터 그리 쉽지많은 않았다.
우선 Soft-ICE 는 설치했으나 사용법을 모른다는것.
아무리 뒤져봐도 못하겠어서
windbg 로 바꾸었다.
위의 문서에는 Soft-ICE 를 사용해 명령어 사용에 어려움이 많았지만
help(F1) 가 잘되어 있어 매우 큰 도움이 되었다.
windbg 의 실행 모습이다

File 메뉴에서 Kernel Debug 를 실행시키자
그럼 다음과 같은 창이 뜨는데 여기서 Local 탭을 선택 후 확인
그럼 다음과 같이 windbg 가 Kernel Debug 로 실행된다
그리고 테스트를 위해
계산지, 메모장, 작업관리자 순으로 프로그램을 띄웠다

여기서 부터가 문제이다
우선 프로세스 목록을 보기위해
!process 명령어를 사용한다

명령어를 실행하면 calc.exe, notepad.exe, taskmgr.exe 가 순서대로 실행되어있음을 볼수 있다.
그리고 dt 명령으로 프로세스 구조체의 구조를 보자

0x88 offset 에 ActivceProcessLinks 라는 _LIST_ENTRY 구조체로 되어있는 것이 있다. 이것이 바로 프로세스들 간에 연관관계를 갇는 Linked List 구조체이다
다시 dt 명령어를 통해 _LIST_ENTRY 구조체의 구조를 알아보자

보이는 그대로 Flink 는 자신의 앞의 프로세스, Blink 는 자신의 뒤의 프로세스를 연결하는 구조로 되어 있던 것이다.
이제 프로세스의 구조와 Linked List 의 구조를 알아냈으니 추적을 해보자
아까 프로세스 리스트에서
굵은 글씨된 주소가 해당 프로세스 구조체의 시작 주소이다.
그럼 그 해당 주소로 접근해서 해당 프로세스의 구조에 대해서 알아보자(calc.exe)

계산기 프로세스의 정보임을 알수 있다.
하지만 중요한건 0x88의 ActiveProcessLinks 의 정보이다.
다시 dd 명령어를 통해 ActiveProcessLinks 의 메모리 정보를 보도록 하겠다.
8957fda0 의 프로세스구조체 시작 주에소 88 더한 8957fe28 에는
8967e5e8 89573ad0 00000de8 00012b64 정보가 저장되어있다.
여기서 빨간색으로 된
8967e5e8 이것이 Flink 이고
89573ad0 이것이 Blink 이다
맞는지 확인해 보자
dt 명령으로 Flink 의 주소에 -88 을하여 프로세스 구조체 정보를 보도록 해보자

아까의 순서대로 calc.exe 앞에는 notepad.exe 가 있는 것이다
간단하게 해보겠다.
여기에서
calc.exe 의 시작주소 8957fda0 에 +88 을하여 dd 명령으로 메모리 정보를 확인하여 Flink 주소에 다시 -88 을 하면 notepad.exe 의 시작주소인 8967e560 이 나올것이다.
calc.exe
Flink 8967e5e8
Blink 89573ad0
계산기로 계산을 해보자
8967e5e8-88 = 8967E560
정확히 notepad.exe 의 시작주소가 나온것을 볼수 있다.

정리하면 이렇게 되겠다
해서 calc.exe 의 Flink를 taskmgr.exe 를 가리키도록 8967e5e8 로 수정하고
taskmgr.exe 의 Blink를 calc.exe 를 가리키도록 89573ad0 로 수정하면..

이렇게!!!!
되야는데.. 어떤이유에서인지 windbg 의 Memory Window 에서 ActiveProcessLinks 의 주소로 접근해 수정하면 한글자씩 수정되면서 컴퓨터가 꺼져버리는게 아닌가!
복사해서 붙여 넣어도 계속 똑같은 현상.
우선은 위 문서를 거의 따라하고 이론적으로 남아 이해함에 만족하고 다음으로 미루기로 했다.
ps. 디버깅이 생각보다 잼있더라, 나중에 Ollydbg를 이용해 어플리케이션도 디버깅 해봐야겠다.
우선 Soft-ICE 는 설치했으나 사용법을 모른다는것.
아무리 뒤져봐도 못하겠어서
windbg 로 바꾸었다.
windbg 다운로드
위의 문서에는 Soft-ICE 를 사용해 명령어 사용에 어려움이 많았지만
help(F1) 가 잘되어 있어 매우 큰 도움이 되었다.
windbg 의 실행 모습이다
File 메뉴에서 Kernel Debug 를 실행시키자
그럼 다음과 같은 창이 뜨는데 여기서 Local 탭을 선택 후 확인
그럼 다음과 같이 windbg 가 Kernel Debug 로 실행된다
그리고 테스트를 위해
계산지, 메모장, 작업관리자 순으로 프로그램을 띄웠다
여기서 부터가 문제이다
우선 프로세스 목록을 보기위해
!process 명령어를 사용한다
lkd>!process 0 0
명령어를 실행하면 calc.exe, notepad.exe, taskmgr.exe 가 순서대로 실행되어있음을 볼수 있다.
그리고 dt 명령으로 프로세스 구조체의 구조를 보자
lkd>dt _EPROCESS
0x88 offset 에 ActivceProcessLinks 라는 _LIST_ENTRY 구조체로 되어있는 것이 있다. 이것이 바로 프로세스들 간에 연관관계를 갇는 Linked List 구조체이다
다시 dt 명령어를 통해 _LIST_ENTRY 구조체의 구조를 알아보자
lkd>dt _LIST_ENTRY
보이는 그대로 Flink 는 자신의 앞의 프로세스, Blink 는 자신의 뒤의 프로세스를 연결하는 구조로 되어 있던 것이다.
이제 프로세스의 구조와 Linked List 의 구조를 알아냈으니 추적을 해보자
아까 프로세스 리스트에서
... 중략 ...
PROCESS 8957fda0 SessionId: 0 Cid: 0954 Peb: 7ffd6000 ParentCid: 07b8
DirBase: 0ac00500 ObjectTable: e2ba7318 HandleCount: 77.
Image: calc.exe
PROCESS 8967e560 SessionId: 0 Cid: 0980 Peb: 7ffd3000 ParentCid: 07b8
DirBase: 0ac003c0 ObjectTable: e29114f8 HandleCount: 77.
Image: notepad.exe
PROCESS 89577278 SessionId: 0 Cid: 097c Peb: 7ffd4000 ParentCid: 0390
DirBase: 0ac00460 ObjectTable: e3a9ec08 HandleCount: 108.
Image: taskmgr.exe
... 생략 ...
PROCESS 8957fda0 SessionId: 0 Cid: 0954 Peb: 7ffd6000 ParentCid: 07b8
DirBase: 0ac00500 ObjectTable: e2ba7318 HandleCount: 77.
Image: calc.exe
PROCESS 8967e560 SessionId: 0 Cid: 0980 Peb: 7ffd3000 ParentCid: 07b8
DirBase: 0ac003c0 ObjectTable: e29114f8 HandleCount: 77.
Image: notepad.exe
PROCESS 89577278 SessionId: 0 Cid: 097c Peb: 7ffd4000 ParentCid: 0390
DirBase: 0ac00460 ObjectTable: e3a9ec08 HandleCount: 108.
Image: taskmgr.exe
... 생략 ...
굵은 글씨된 주소가 해당 프로세스 구조체의 시작 주소이다.
그럼 그 해당 주소로 접근해서 해당 프로세스의 구조에 대해서 알아보자(calc.exe)
lkd>dt _EPROCESS 8957fda0출력된 내용중 0x174 offset 을보면 ImageFileName 있는데
계산기 프로세스의 정보임을 알수 있다.
하지만 중요한건 0x88의 ActiveProcessLinks 의 정보이다.
다시 dd 명령어를 통해 ActiveProcessLinks 의 메모리 정보를 보도록 하겠다.
lkd>dd 8957fda0+88여기서 왜 +88 을 하는 이유는 8957fda0 은 calc.exe 의 시작 주소이다 그리고 0x88 offset 에 ActiveProcessLinks 가 저장되므로 시작주소에서 offset 만큼 더해줘야 ActiveProcessLinks 의 주소가 된다는 것이다.
lkd> dd 8957fda0+88
8957fe28 8967e5e8 89573ad0 00000de8 00012b64
8957fe38 000003a5 00000f78 00012cf4 000003a9
8957fe48 000003a5 029ab000 0296b000 8967e614
8957fe58 89573afc 00000000 e1448758 e2ba7318
8957fe68 e3b73033 00000001 aa0e4c58 00000000
8957fe78 00040001 00000000 8957fe80 8957fe80
8957fe88 00000000 00046804 00000001 aa0e4c58
8957fe98 00000000 00040001 00000000 8957fea4
8957fe28 8967e5e8 89573ad0 00000de8 00012b64
8957fe38 000003a5 00000f78 00012cf4 000003a9
8957fe48 000003a5 029ab000 0296b000 8967e614
8957fe58 89573afc 00000000 e1448758 e2ba7318
8957fe68 e3b73033 00000001 aa0e4c58 00000000
8957fe78 00040001 00000000 8957fe80 8957fe80
8957fe88 00000000 00046804 00000001 aa0e4c58
8957fe98 00000000 00040001 00000000 8957fea4
8957fda0 의 프로세스구조체 시작 주에소 88 더한 8957fe28 에는
8967e5e8 89573ad0 00000de8 00012b64 정보가 저장되어있다.
여기서 빨간색으로 된
8967e5e8 이것이 Flink 이고
89573ad0 이것이 Blink 이다
맞는지 확인해 보자
dt 명령으로 Flink 의 주소에 -88 을하여 프로세스 구조체 정보를 보도록 해보자
lkd>dt _EPROCESS 8967e5e8-88여기서 왜 -88 을 하는 이유는 위에 이유와 같다. ActiveProcessLinks 는 프로세스 구조체 시작 주소에서 +88 곳의 주소이다. 마찬가지로 Flink 의 주소도 자신의 앞의 프로세스의 의 ActiveProcessLinks 주소이므로 다시 -88 을 해줘야 앞의 프로세스 구조체의 시작 주소가 되는 것이다.
아까의 순서대로 calc.exe 앞에는 notepad.exe 가 있는 것이다
간단하게 해보겠다.
... 중략 ...
PROCESS 8957fda0 SessionId: 0 Cid: 0954 Peb: 7ffd6000 ParentCid: 07b8
DirBase: 0ac00500 ObjectTable: e2ba7318 HandleCount: 77.
Image: calc.exe
PROCESS 8967e560 SessionId: 0 Cid: 0980 Peb: 7ffd3000 ParentCid: 07b8
DirBase: 0ac003c0 ObjectTable: e29114f8 HandleCount: 77.
Image: notepad.exe
PROCESS 89577278 SessionId: 0 Cid: 097c Peb: 7ffd4000 ParentCid: 0390
DirBase: 0ac00460 ObjectTable: e3a9ec08 HandleCount: 108.
Image: taskmgr.exe
... 생략 ...
PROCESS 8957fda0 SessionId: 0 Cid: 0954 Peb: 7ffd6000 ParentCid: 07b8
DirBase: 0ac00500 ObjectTable: e2ba7318 HandleCount: 77.
Image: calc.exe
PROCESS 8967e560 SessionId: 0 Cid: 0980 Peb: 7ffd3000 ParentCid: 07b8
DirBase: 0ac003c0 ObjectTable: e29114f8 HandleCount: 77.
Image: notepad.exe
PROCESS 89577278 SessionId: 0 Cid: 097c Peb: 7ffd4000 ParentCid: 0390
DirBase: 0ac00460 ObjectTable: e3a9ec08 HandleCount: 108.
Image: taskmgr.exe
... 생략 ...
여기에서
calc.exe 의 시작주소 8957fda0 에 +88 을하여 dd 명령으로 메모리 정보를 확인하여 Flink 주소에 다시 -88 을 하면 notepad.exe 의 시작주소인 8967e560 이 나올것이다.
calc.exe
Flink 8967e5e8
Blink 89573ad0
계산기로 계산을 해보자
8967e5e8-88 = 8967E560
정확히 notepad.exe 의 시작주소가 나온것을 볼수 있다.
정리하면 이렇게 되겠다
해서 calc.exe 의 Flink를 taskmgr.exe 를 가리키도록 8967e5e8 로 수정하고
taskmgr.exe 의 Blink를 calc.exe 를 가리키도록 89573ad0 로 수정하면..
이렇게!!!!
되야는데.. 어떤이유에서인지 windbg 의 Memory Window 에서 ActiveProcessLinks 의 주소로 접근해 수정하면 한글자씩 수정되면서 컴퓨터가 꺼져버리는게 아닌가!
복사해서 붙여 넣어도 계속 똑같은 현상.
우선은 위 문서를 거의 따라하고 이론적으로 남아 이해함에 만족하고 다음으로 미루기로 했다.
ps. 디버깅이 생각보다 잼있더라, 나중에 Ollydbg를 이용해 어플리케이션도 디버깅 해봐야겠다.
'공부 > 0x01 C / C++' 카테고리의 다른 글
| 방학프로젝트 Shadower _4 Process 감추기(2) (0) | 2009/08/20 |
|---|---|
| 방학프로젝트 Shadower _4 Process 감추기 (0) | 2009/08/07 |
| 방학프로젝트 Shadower _3 C#Process 실행 감시 (0) | 2009/08/06 |
| 방학프로젝트 Shadower _2 C#원격 DB 연동2 (0) | 2009/08/06 |
| 방학프로젝트 Shadower _1 C#원격 DB 연동 (3) | 2009/08/05 |
| 방학프로젝트 Shadower (0) | 2009/07/21 |