'리소스'에 해당되는 글 4건

  1. 2010.02.11 커널 오브젝트(Kernel Object) (2)
  2. 2009.12.24 리소스(Resource)
  3. 2009.11.07 바이너리 분석 (1)
  4. 2009.11.07 디컴파일러(Decompliers)

커널 오브젝트 : Windows 운영체제에서 리소스(Resource : 프로세스, 쓰레드, 파일)들을
                      관리하기 위한 데이터를 저장하는 메모리 블록



Windows에서 관리하는 리소스 특성을 변경하기 위해서는 해당 리소스의 커널 오브젝트를 조작해야한다.

해당 리소스의 정보를 저장하고 있는 커널 오브젝트에 접근하기 위해서는

커널 오브젝트들을 구별하는 커널 오브젝트 핸들(Object Handle)을 얻어야 한다.



커널 오브젝트와 핸들 :

커널 오브젝트는 Windows 운영체제에 종속적이다.

사용자가 리소스 생성을 요청하면 운영체제에서 사용자가 요청한 대로 리소스를 생성하게 되고

이를 관리하기 위해 커널 오브젝트를 생성한다.

즉, 커널 오브젝트는 Windows 운영체제에 의해 생성 및 소멸이 결정된다.


리소스가 생성되어 커널 오브젝트가 생성되면 커널 오브젝트에 핸들이 부여되고

부모 리소스도 구조체 변수를 통해 자식의 커널 오브젝트 핸들을 획득할 수 있다.

즉, 부모와 자식이 자식의 커널 오브젝트를 공유한다.


예)

부모 프로세스가 자식 프로세스의 커널 오브젝트 핸들 획득.

typedef struct _PROCESS_INFORMATION
{
      HANDLE hProcess;            // 커널 오브젝트 구분 위한 핸들
      HANDLE hThread;
      DWORD dwProcessId;        // 프로세스 구분 위한 ID
      DWORD dwThreadId;         
} PROCESS_INFORMAION;

위 구조체는 CreateProcess 호출할때 인자로 전달되는 구조체이다.(&pi)
호출이 완료되면 이 구조체에 자식 프로세스의 커널 오브젝트 핸들값이 hProcess 에 저장된다.

자신의 커널 오브젝트 핸들 획득.

GetCurrentProcess()

위함수를 사용하면 자신의 커널 오브젝트 핸들값을 리턴한다.



커널 오브젝트와 Usage Count :

운영체제는 해당 커널 오브젝트를 참조하는 대상이 하나도 없을때 커널 오브젝트를 소멸시킨다.

참조하는 대상은 Usage Count(참조 횟수)로 관리한다.

즉, Usage Count = 0 일 때 커널 오브젝트를 소멸한다.

리소스의 생성과 동시에 해당 커널 오브젝트의 Usage Count = 1 이된다.
생성이 완료되면 부모가 자식 리소스 커널 오브젝트의 핸들을 획득하기에 Usage Count = 2 가 된다.

만약 자식 리소스를 소멸하면 Usage Count 가 하나 줄어든다.

여기서 문제가 발생한다. 리소스가 소멸됬음에도 그 리소스를 관리하는 커널 오브젝트는 소멸되지 않는다.
(Usage Count 가 1이므로)

Usage Count = 0 을 만들기 위해선

부모의 자식의 커널 오브젝트 참조를 해제해야 한다.

CloseHandle() 함수를 사용하면 자식의 커널 오브젝트 핸들을 반환하여 참조를 해제한다.

즉, Usage Count 가 하나 줄어든다.

따라서 커널 오브젝트를 소멸하기 위해서는

부모가 소유한 자식의 커널 오브젝트 핸들을 반환해야 한다.


예)

부모 프로세스가 자식의 커널 오브젝트 핸들을 반환하지 않아 커널 오브젝트가 소멸되지 않았다고 가정할때

계산기 프로세스를 생성하면 그에 따른 커널 오브젝트가 생성된다.

계산기 프로세스를 종료시켜도 커널 오브젝트는 소멸되지 않는다(Usage Count =  1이므로 )
 
실행-> 종료, 실행 -> 종료 를 반복한다고 할때

커널 오브젝트는 실행의 수만큼 존재한다.

따라서 이 문제를 해결하기 위해 CloseHandle 을 통해 부모의 자식의 커널 오브젝트 참조를 해제함으로써

자식 프로세스가 종료될때 Usage Count = 0 이 되어 커널 오브젝트가 소멸된다)


(참고 :

바탕화면에서 아이콘을 통해 프로세스를 생성할 경우에도 Usage Count = 2 다.

바탕화면 자체도 프로세스이기 때문이다. 이 때는 바탕화면이 부모 프로세스가 된다.
(Cmd 에서 실행하면 Cmd 가 부모 프로세스)

즉, 프로세스는 생성과 동시에 Usage Count = 2 가 된다)

Posted by Dakuo
리소스(Resouce) : 코드의 논리와 무관한 데이터
메뉴, 비트맵, 액셀러레이터, 문자열, 아이콘, 커서 등이 속한다.
 
1. 리소스의 분리 :

프로그램은 코드와 데이터로 구성된다. 데이터는 프로그램의 처리 대상이며 코드는 데이터를 처리하는 수단이다. 도스 프로그래밍과 달리 윈도우즈 프로그래밍에서는 이러한 데이터를 만들고 관리하는 것이 별도의 작업으로 분리되어 있다.
이 데이터들 중에 코드와 무관한 것들을 리소스(Resource)라 하며 별도의 편집기로 만들어져 컴파일되며 링크시에 실행파일에 결합된다.


윈도우즈 프로그래밍에서 리소스와 코드가 분리되어 있어 다음과 같은 장점이 있다.

1. 디자이너와 프로그래머가 분담하여 작업을 하기가 편하다.

2. 리소스를 수정하더라도 리소스만 컴파일 하면 되므로 컴파일 속도가 빨라진다.

3. 만들어 놓은 리소스를 다른 프로젝트에 쉽게 가져다 쓸 수 있어 재사용에 유리하다.

4. 리소스는 실행중에 교체가 가능하여 상황에 따라 다른 형태의 리소스를 사용할 수 있다.

리소스의 소스파일인 RC 파일은 메모장 등의 텍스트 편집기로 작성할 수 있는 텍스트 파일이다. RC 파일에 사용하고자 하는 리소스의 종류, 모양 등을 작성한 후 이 파일을 컴파일(리소스 컴파일러)하면 RES 라는 이진 파일이 생성되며 이 파일이 최종적으로 실행 파일에 합쳐진다.
(참고 : 리소스를 기술하는 RC 파일을 작성하는 데는 고유의 문법이 적용된다.
리소스 편집기를 사용할 경우 굳이 RC 파일의 문법에 대해서 몰라도 상관이 없다.)



2. 리소스 작성 :

Win32 Application 프로젝트를 만든다. 그리고 .cpp 파일을 추가하며 그다음에


Resource Script 파일을 추가한다.
작업영역에 Menu.rc 가 열리고 워크 스페이스를 보면 리소스 뷰가 열려있다.
리소스 뷰는 프로젝트에 포함되어 있는 리소스들의 목록을 계층적으로 보여주며 새로운 리소스를 작성하거나 다른 프로젝트에 있는 리소스를 Import 하는 등의 전반적인 리소스 관리를 할수 있다.

'Windows > _Windows Programming' 카테고리의 다른 글

GetLastError() 함수  (2) 2010.02.10
Mstsc(원격) 사용하기  (4) 2010.02.06
리소스(Resource)  (0) 2009.12.24
윈도우 프로그램 기본 틀  (0) 2009.12.23
윈도우 관리 메시지  (0) 2009.12.23
타이머(Timer)  (0) 2009.12.23
Posted by Dakuo

바이너리 분석

Tool 2009.11.07 21:28
바이너리 분석(Binary Analysis) 툴은 어떤 패커를 이용해서 바이너리를 패킹했는지, 어떤 언어로 제작된 프로그램인지를 알아 낼 때 사용된다.

PEID :


파일을 열어도 되고 드래그 앤 드롭을 하여 파일을 넣을 수도 있다. 또한 Multi Scan 기능으로 여러개의 파일을 분석할 수 있다. 플러그인에는 unpack을 해주거나 문자열을 추출해주는 것들이 있다.



리소스 해커 :

리소스를 분석해야 하느 경우, 프로그램 내부에서 사용되는 문자열이나 아이콘, 이미지, 폼 구조에 대해서 분석할 때 사용된다. 사용전에 PEID 같은 툴로 패킹이 되어있는지 확인을 먼저 해야한다.
 

패킹이 되어 있으면 이런 경고가 뜬다.


프로그램에서 사용되는 아이콘이나 bitmap들을 추출해서 저장할 수 있고, 프로그램에서 사용되는 문자열이나 폼 형태를 바꿔서 저장도 가능하다.



Strings :

바이너리 내부에서 사용된 문자열들을 추출해준다.

Cmd 창에서 String 를 입력하면


usgae : strings [-a] [-b bytes] [-n length] [-o] [-q] [-s] [-u] <file or directiory>

특별히 옵션을 추가해야 할 경우는 없다.

(tip : 내컴퓨터->속성->고급->환경 변수->PATH 변수 값에 디렉터리를 추가하면 그 추가된 디렉터리 안에 있는 파일을 실행할때는 그 디렉터리까지 접근하지 않아도 실행이 가능하다)

문자열만 추출해도 분석하는데 도움이 된다. strings를 이용하여 문제를 풀어보자.

(참고 : http://www.hackthissite.org/  해킹 문제들이 다수 실려 있습니다. 관심 있으신 분들은 문제를 풀어보세요)


문제를 실행해보면


시리얼키를 넣으라는 문제이다 strings로 문자열만 추출해 보아도 내부의 시리얼처럼 보이는 문자열이 나타날지도 모른다.


(참고 : strings 다음에 오는 파일명은 환경 변수에 등록해도 안됩니다 따라서 추출할 파일명 폴더에 접근한 상태에서 strings 를 실행합시다.
> 은 새로 만들기입니다. 따라서 위의 명령은 추출한 문자열을 str.txt 파일을 만들어 저장해라라는 뜻입니다)

str.txt 파일을 열어 프로그램 타이틀에 있는 문자열인 'Authenticate your software'를 검색해보면(Ctrl+F)


시리얼처럼 보이는 문자열이 보인다.

프로그램에 넣어보면


문제를 푼 것을 알수 있다.

(tip : 메시지창이 활성화된 상태에서 Ctrl+C를 누르면 메시지 창의 내용이 다 복사된다)



Dependency Walker, DumpBin :

Dependency Walker 와 DumpBin : 바이너리 형태의 유틸리티로써 COFF 개체 파일, COFF 개체의 표준 라이브러리, 실행 파일 및 DLL(동적 연결 라이브러리)을 검사할 수 있다.
즉, 바이너리 및 DLL에서 사용하고 있거나 외부로 노출시켜 놓은 함수가 어떤 것이 있는지 알아볼 수 있다.


Denpendency Walker :

Denpendency Walker : 프로그램과 dll 상호간 의존성을 검사하는 기능 win32 프로그램 실행시 어떤 오류가 발생했는지, 사용하고 있는 API 함수와 사용자 함수의 이름, 사용하고 있는 DLL의 이름, C++ 같은 경우에는 함수 이름과 return 타입도 알수 있다.


File->Open->실행파일 후 Profile->Start Profiling 하면 된다.



dumpbin :
dumpbin은 콘솔 명령어이다. 옵션은 오션 지정자(대시(-) or 슬래시(/))와 그 다음에 나오는 옵션 이름으로 구성되어 있다. DUMPBIN은 표준 출력으로 정보를 보내지만 출력을 파일로 보내려면 /OUT 옵션을 사용하면 된다.

옵션

/ALL : 코드 디스어셈블리를 제외한 사용 가능한 모든 정보를 표시하며, 디스어셈블리를 표시하려면 /DISASM을 사용해야 한다. /RAWDATA:NOTE을 /ALL과 함께 사용하여 파일의 원시 이진 정보를 생략할 수 있다.

/ARCHIVEMEMBERS : 라이브러리의 멤버 개체에 대한 최소 정보를 표시한다.

/CLRHEADER : 관리되는 모든 프로그램에서 사용하는 .NET 헤더 정보를 표시하며, 출력은
.NET 헤더 및 헤더 섹션의 위치와 크기를 바이트 단위로 보여준다.

/DEPENDENTS : 이미지에서 함수를 가져오는 DLL 이름을 덤프하며, 가져온 함수의 이름은 덤프하지 않는다.

/DIRECTIVES : 컴파일러가 생성한 이미지의 .drective 섹션을 덤프한다.

/DISASM : 파일에 기호가 있는 경우 그 기호를 사용하여 코드 섹션의 디스어셈블리를 표시한다. 관리되는 이미지가 아닌 네이티브 이미지에 대해서만 사용해야 한다.

/EXPORTS : 실행 파일 또는 DLL에서 내보낸 모든 정의(함수)를 표시한다.

/FPO : FPO(프레임 포인터 최적화) 레코드를 표시한다.

/HEADERS : 파일 헤더와 각 섹션의 헤더를 표시하며, 라이브러리와 함께 사용할 경우 각 멤버 개체의 헤더를 표시한다.

/IMPORTS : 표시된 출력은 /EXPORTS와 유사하며 import하여 사용한 함수들을 표시한다.

/LOADCONFIG : Windows NT 로더에서 사용하고 WINNT.H에 정의된 선택적 구조체인
IMAGE_LOAD_CONFIG_DIRECTORY 구조체를 덤프한다.

/OUT : 출력할 filename을 지정할 때 사용한다. 기본적으로 DUMPBIN은 표준 출력에 정보를 표시한다.

/RELOCATIONS : 개체 또는 이미지의 모든 재배치를 표시한다.

/SECTION : 정보 출력을 지정한 section으로 제한한다.

/SUMMARY : 전체 크기를 포함하여 섹션의 최소 정보를 표시하고, 다른 옵션을 지정하지 않은 경우 이 옵션이 기본 값으로 적용된다.

/SYMBOLS : COFF 기호 테이블을 표시하며, 기호 테이블은 모든 개체 파일에 있다. COFF 기호 테이블은 이미지파일이 /DEBUG로 링크된 경우만 이미지 파일에 나타난다.

/TLS : TLS는 TLS 구조체의 필드와 TLS 콜백 함수의 주소를 표시한다.
프로그램에서 스레드 지역 저장소를 사용하지 않는 경우, 해당 이미지에는 TLS 구조체가 포함되지 않는다. IMAGE_TLS_DIRECTORY는 winnt.h에 정의된다.

/UNWINDINFO : exe, dll 같은 프로그램 이미지의 SHE(구조적 예외 처리) 테이블 해제 설명자를 덤프한다. IPF(Itanium Processor Family) 이미지에 대해서만 작동한다.

(참고 : dumpbin을 실행시켰는데 다음과 같은 오류가 뜬다면
mspdb80.dll을 검색한 후 경로를 내컴퓨터->속성->고급->환경 변수->PATH 변수 값에 추가해주면 된다)

winmine.exe가 어떤 함수를 사용하고 있는지 확인해보겠다.


depends.txt 를 열어보면

WINMM.dll
               1001168 Import Address Table
               1004378 Import Name Table
              FFFFFFFF time date stamp
              FFFFFFFF Index of first forwarder reference

dll 파일과 세부 정보가 나타난다.

WINMM.dll 파일이 어떤 기능을 하는 dll인지 export 해보면 된다.

dumpbin/exports winmm.dll > winmm.txt

ordinal hint RVA      name
          3    0 00003894 CloseDriver = _DrvClose@12
          4    1 0000E382 DefDriverProc = _DefDriverProc@20
          5    2 000054A9 DriverCallback = _DriverCallback@28

'Tool' 카테고리의 다른 글

헥스에디터(Hex-Editors)  (1) 2010.01.03
네트워크 모니터링 툴(Network-Monitoring Tool)  (2) 2009.11.26
바이너리 분석  (1) 2009.11.07
메모리 패치(Memory Patch)  (1) 2009.11.07
디컴파일러(Decompliers)  (0) 2009.11.07
아이다(IDA)에 MS 심볼 서버 연동하기  (9) 2009.11.06
Posted by Dakuo
디컴파일러(Decompilers)는 바이너리를 역으로 컴파일해주는 툴이다.

역으로 컴파일을 하여 어셈블리어로 코드가 나타나거나 리소스 파일들이 추출된다.

디컴파일러를 사용하려면 바이너리 분석 툴을 이용하여 바이너리의 컴파일러와 해당 버전을  알아내고, 해당 컴파일러를 지원하는 툴을 찾아서 실행만 하면 된다.

바이너리가 패킹이 되어있으면 언패킹하고 바이너리의 컴파일러가 어떤 것인지를 PEID와 같은 바이너리 분석툴로 확인이 가능한 상태이어야 디 컴파일러를 사용할수 있다.

분석 후 프로그램을 제작한 환경에 맞게 디컴파일러를 사용하면 원래 소스와 비슷한 결과물을 얻을 수 있다.

주요한 디컴파일러들이다.

자바 디컴파일러 :


델파이 디컴파일러 :


플래시 디컴파일러 :
닷넷(.net) 디컴파일러 :





'Tool' 카테고리의 다른 글

바이너리 분석  (1) 2009.11.07
메모리 패치(Memory Patch)  (1) 2009.11.07
디컴파일러(Decompliers)  (0) 2009.11.07
아이다(IDA)에 MS 심볼 서버 연동하기  (9) 2009.11.06
아이다(IDA)에 Hex-Ray 연동  (9) 2009.11.06
아이다(IDA) 사용법  (46) 2009.11.02
Posted by Dakuo