1. 상대방 IP 알아낸다. : netstat -na

- nmap : nmap을 이용하여 대상 서버를 알아본다.(리눅스,유닉스,윈도우NT 계열인지...)

http://insercure.org/nmap 사에트에서 리눅스, 윈도우 버전으로 제공중이다.

- fport : fport로 자신의 포트가 열려 있는지 확인한다.

fport /? -> 명령어로 원하는대로 정렬이 가능하다.

http://www.foundstone.com 사이트에 가면 다운로드 할수 있다.

- Windows 2000 Or Windows 2003 서버일경우에는 아래와 같은 공격이 통함.

- 단, Message 서비스가 켜져있어야 한다.

2. 명령어

net send IP 전할 말

3. 명령어 응용

for /L %1 IN (5,-1,1) do net send [IP] [메세지]

4. 공유 폴더확인 : net share

5. 공유 폴더삭제 : net share [폴더명] /delete

가. DLL 인젝션과 API 후킹

1. DLL 인젝션 정의

만일 어떻게든 A프로세스의 주소 공간에 서브클래싱을 위한 윈도우 프로시저를 포함시킬 수 있다면, SetWindowLongPtr을 사용하여 A프로세스 주소 공간에 포함된 MySubclassProc의 주소로 해당 윈도우의 윈도우 프로시저를 변경할 수 있을 것이다. 이러한 기법을 우리는 프로세스의 주소 공간으로 DLL 인젝션 한다고 한다.

2. 서브클래싱 이란?

서브클래싱(SubClassing)이란 윈도우 프로시저로 전달되는 메시지를 중간에 가로채는 방법이다. 중간에서 메시지를 조작하게 됨으로써 윈도우의 모양을 변경하거나 동작을 감시하거나 하는 작업을 할 수 있게 되는 것이다.

윈도우는 CreateWindow()를 통해 만들어진다. 이 때 CreateWindow()의 첫번 째 인수인 윈도우 클래스에서 윈도우 생성에 필요한 정보를 구하게 되는데, 그 중 가장 중요한 것이 메시지를 처리하는 윈도우 프로시저의 번지(lpfnWndProc)이다. 이는 윈도우 클래스에 보관되는 것이 아니고 윈도우별로 별도로 보관된다.

윈도우는 메시지를 받게 되면 해당 윈도우의 윈도우 프로시저 번지를 조사한 후 조사된 번지로 메시지를 보내고 메시지를 받은 윈도우 프로시저는 이 메시지를 받아 해당 윈도우에서 작성한 코드대로 처리를 하게 된다.

이 때 윈도우 프로시저를 다른 윈도우 프로시저로 변경을 한다면, 모든 메시지는 새로 만든 윈도우 프로시저로 전달이 될 것이다.

이렇게 새로 만들어진 윈도우 프로시저를 서브클래스 프로시저(SubClass Procedure)라고 한다.

윈도우 프로시저의 번지를 변경하기 전에 원래의 윈도우 프로시저 번지를 보관해 두고 서브클래스 프로시저에서 처리하지 않은 메시지는 반드시 원래 윈도우 프로시저로 전달하도록 해야한다.

서브클래스 프로시저를 등록하기 위해서는 아래와 같은 함수를 사용한다.

LONG_PTR SetWindowLongPtr( HWND hWnd, int nIndex, LONG_PTR dwNewLong )

hWnd - 프로시저를 바꾸려는 윈도우에 속한 클래스의 핸들

nIndex - MSDN 참고

GWL_EXSTYLE : Sets a new extended window style

GWL_STYLE : Sets a new Window style

GWLP_WNDPROC : Sets a new address for the window procedure.

GWLP_HINSTANCE : Sets a application instance handle.

...

dwNewLong - 대체할 값(프로시져)을 지정.

예)

원래번지 = SetWindowLongPtr(변경 윈도우, GWLP_WNDPROC, 서브클래스 프로시져);

위와 같이 하면, 변경 윈도우로 보내지는 모든 메시지는 일단 서브클래스 프로시져로 전달 될 것이다.

변경 윈도우는 일반적인 윈도우가 될 수도 있고, 버튼, 에디트박스와 같은 윈도우도 될 수 있다. 버튼이나 에디트박스가 변경 윈도우가 될 경우 그 윈도우에서 처리하고 싶은 이벤트, 메시지에 관련된 부분을 서브클래스 프로시져에 넣어주면 된다.

추가로 서브클래스 프로시져를 작성한다.

LRESULT CALLBACK 프로시져(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)

{

switch(iMessage){

case XXX:

...

break;

}

return CallWindowProc(원래번지, hWnd, iMessage, wParam, lParam);

}

CallWindowProc() 는 위 예제의 서브클래스의 case 에 속하지 않은 메시지를 처리하는 부분이다. 이 메시지들은 lpPrevWndFunc에 정의된 윈도우 프로시져로 보내저 처리가 될 것이다.

LRESULT CallWindowProc (WNDPROC lpPrevWndFunc,

HWND hWnd,

UINT Msg,

WPARAM wParam,

LPARAM lParam )

lpPrevWndFunc - 서브클래스 등록(SetWindowLongPtr)시 리턴된 값으로 원래의 윈도우 프로시저(번지)

hWnd - 메시지를 받을 윈도우 프로시저의 핸들

Msg - 메시지 내용

wParam - 메시지의 추가적인 정보

lParam - 메시지의 추가적인 정보

예)

return CallWindowProc(원래번지, hWnd, iMessage, wParam, lParam);

윈도우즈 API 정복을 참고한 간단하게 본 서브클래스의 개념과 주요 함수들이다.

3. 레지스트리를 이용하여 DLL 인젝션하기.

- 전체시스템의 구성 정보는 레지스트리에 저장된다.

- 이 설정 값을 변경함으로써 시스템의 동작 방식을 변경할 수 있다.

'기타 > 리버스엔지니어링' 카테고리의 다른 글

올리디버거  (0) 2009.07.29
리버싱 관련 툴  (0) 2009.07.29
리버스엔지니어링이란 무엇인가?  (0) 2009.07.29

리버스(Recerse)와 엔지니어링(Engineering)의 합성어인 리버스엔지니어링(reverse engineering)은 줄여서 리버싱(reversing)이라고 한다. 또, 리버스엔지니어링을 하는 사람을 리버스엔지니어(reverse engineer)라고 부르지만 줄여서 리버서(reverser)라고도 한다. 보안 분야에서의 리버싱은 보통 소프트웨어 리버스엔지니어링을 의미한다.

리버싱은 영어 의미 그대로 풀이하면 거꾸로 분석하는 것을 의미한다.

리버싱과 디컴파일을 하는 것은 다른 개념이지만 국내 법률에서는 동일하게 프로그램 코드 역분석으로 규정하고 있기 때문에 리버싱은 소스를 복원하는 과정으로도 여겨지고 있다.

우리가 주변에서 보게 되는 소프트웨어의 인증을 깨는 크랙(crack)들은 이러한 리버싱 과정을 통해서 개발자가 자신의 프로그램을 보호하기 위해 만든 장치들의 허점을 찾아내어 우회하는 툴이라고 보면된다.

'기타 > 리버스엔지니어링' 카테고리의 다른 글

네트워크 기초적 명령어 및 DLL 인젝션과 API 후킹 정리  (0) 2009.08.19
올리디버거  (0) 2009.07.29
리버싱 관련 툴  (0) 2009.07.29

+ Recent posts