'컴퓨팅'에 해당되는 글 15건

  1. 2009/09/06 [펌] CRT 이야기
  2. 2008/11/06 XP에서 관리용 원격 데스크톱 MMC 스냅인 사용하기
  3. 2008/07/23 HEAP CORRUPTION DETECTED
  4. 2008/07/14 델파이에서 VC++ DLL 사용시 주의사항
  5. 2008/07/02 MFC DLL 내부에서 wmemcpy 사용시 Heap 해제 에러
  6. 2008/05/28 _DRIVER_OBJECT / 심볼릭 링크로 Driver Object 얻어오기
  7. 2008/05/28 Ring3에서 드라이버 로드를 위한 2가지 방법 - 1/2
  8. 2008/05/28 WinDBG 디스크립터 덤프
  9. 2008/05/27 InstDrv - 드라이버 로딩 도구
  10. 2008/05/27 작업관리자(taskmgr) 변경하기
  11. 2008/05/27 Visual Studio 2008 / WDK 연동
  12. 2008/05/25 후킹관련서적 (도서관일련번호) (2)
  13. 2008/05/25 Photoshop에서 ICO파일로 저장하는 법
  14. 2008/05/25 API 후킹 간략한 정리
  15. 2008/05/23 VMware를 이용한 커널 디버깅 설정법

[펌] CRT 이야기

컴퓨팅/프로그래밍 2009/09/06 13:25
신입 개발자를 위한
CRT 이야기
영진 pop@jiniya.net

 
CRT
C Runtime Library 말한다. C Runtime Library 각종 C언어의 표준 함수들을 포함하고 있는 거대한 라이브러리다. printf, scanf, atoi, fgets등의 C언어를 처음 익힐 배웠던 함수들이 라이브러리에 모두 포함되어 있다. 기본적으로 Visual C++에는 가지 종류의 CRT 포함되어 있다. 단일 스레드(ML), 다중 스레드(MT), 다중 스레드 DLL(MD) 그것이다. 가지도 각각 릴리즈 버전과 디버그 버전이 존재하기 때문에 정확하게는 여섯 가지가 있는 셈이다.

동일한 함수를 구현하고 있는 라이브러리를 여섯 가지나 만들어둔 이유는 베스킨라빈스에 아이스크림이 서른 가지가 넘게 있는 이유와 동일하다. 그때그때 상황에 맞게 골라서 쓰기 위해서이다. 당연히 베스킨라빈스의 아이스크림이 모두 맛이 틀리듯이 CRT들도 종류에 따라서 미묘한 차이가 있다. < 1>에는 CRT 종류별 특징이 나와있다. 디버그 CRT 경우는 ASSERT 경고문이 포함되어 컴파일 되었다는 특징을 추가적으로 가지고 있다.
 

1 CRT 종류별 특징

CRT

라이브러리

특징

단일 스레드

libc.lib

단일 스레드 전용으로 설계된 CRT. 멀티 스레드에 비해서 빠르다. 스레드에 포함된 일부 함수들은 멀티 스레드에서는 정상적으로 동작하지 않는다. Visual Studio 2005부터는 이상 단일 스레드 CRT 지원하지 않는다.

멀티 스레드

libcmt.lib

포함된 모든 함수가 멀티 스레드 환경에서도 정상적으로 동작한다.

멀티 스레드 DLL

msvcrt.lib

멀티 스레드 CRT 동일하고 함수들이 별도의 DLL 존재한다. 따라서 CRT 공유하는 모듈이 많을 경우 용량을 줄일 있다. 별도의 DLL CRT 함수가 존재하기 때문에 프로그램을 배포할 CRT DLL 같이 배포해야 한다.


독립된
별도의 프로그램이라면 < 1> 나와있는 특징대로 프로그램의 특성에 맞는 CRT 사용하면 된다. 프로젝트의 옵션 대화상자에 있는 C/C++ 탭에서 코드 생성 부분의 런타임 라이브러리에서 적절한 CRT 선택한 다음 새로 컴파일, 링크하면 된다.

반면에 하나로 묶여서 실행되는 모듈이라면 문제는 조금 복잡해진다. 이러한 모듈의 대표적인 예로는 DLL 정적 라이브러리가 있다. DLL 실행 시간에, 정적 라이브러리는 링크 시간이 바인딩 되어서 결국은 프로그램(exe) 동일한 주소 공간에서 실행된다. 이러한 모듈의 경우 CRT 섞어서 사용하면 문제가 되는 경우가 많다.

가장 흔히 발생하는 문제는 라이브러리 충돌 문제다. 서로 다른 CRT 버전을 사용했기 때문에 링크 단계에서 라이브러리 간에 기호 충돌 문제가 발생한다. 경우에는 CRT 모두 일치하도록 라이브러리를 새로 구성한 다음 컴파일 하도록 한다. 라이브러리를 자신이 만들지 않은 경우에는 또한 여의치 않다. 경우에는 프로젝트 설정 대화상자에서 링크 부분에서 라이브러리 무시에 충돌이 나는 라이브러리를 추가한 다음 컴파일 하도록 한다. 종종 링크 순서 때문에 문제가 발생하기도 한다. 경우에는 무시 라이브러리에 모두 추가한 다음 링크 순서대로 추가 종속성에 적어두면 된다.

DLL 때문에 가장 많이 겪는 문제 중에 하나는 new/delete 문제다. DLL EXE 서로 각각 CRT 링크한 경우(싱글 스레드, 멀티 스레드)에는 서로 다른 힙을 사용한다. 따라서 DLL에서 new 것을 EXE에서 delete하거나, 반대로 EXE에서 new 것을 DLL에서 delete하는 경우에 문제가 생긴다. 경우엔 new/delete 위치가 동일하도록 프로그램 구조를 고치거나 아니면 DLL EXE 모두 멀티 스레드 DLL 사용하도록 설정해야 한다.

이러한 복잡한 문제들을 사전에 방지하기 위해서는 CRT 되도록 통일해서 사용하고, DLL 경계에서 new/delete 하지 않도록 프로그램을 작성하는 것이 좋다.

크리에이티브 커먼즈 라이선스
Creative Commons License
tags : c++, CRT
Trackback 0 : Comment 0

XP에서 관리용 원격 데스크톱 MMC 스냅인 사용하기

컴퓨팅 2008/11/06 15:29
Windows 2003 SP2 용 원격관리도구.

MMC 스냅인을 이용하여, 다중 원격 데스크톱 접속이 가능해짐


adminpak.msi 다운로드 : http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=86b71a4f-4122-44af-be79-3f101e533d95
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

HEAP CORRUPTION DETECTED

컴퓨팅/프로그래밍 2008/07/23 10:58
HEAP CORRUPTION DETECTED!!

dbgheap.c 파일안에 다음과 같은 상수들이 선언되어있다

static unsigned char _bNoMansLandFill = 0xFD;   /* 메모리 상태 채크를 위해
                                                   쓰이는 값*/
static unsigned char _bDeadLandFill   = 0xDD;   /* 삭제된 메모리에 쓰이는 값 */
static unsigned char _bCleanLandFill  = 0xCD;   /* 새로 할당된 메모리에 쓰이는 값 */
static unsigned char _bAlignLandFill  = 0xBD;   /* fill no-man's land for
                                                   aligned routines */

힙에 메모리 할당시 디버그 모드에서는
_CrtMemBlockHeader 구조체 + _bNoMansLandFill(2바이트) + 실제 메모리( _bCleanLandFill 로 채워짐 ) + _bNoMansLandFill(2바이트) 로 구성되며
릴리즈모드에서는 널영역(2바이트) + _CrtMemBlockHeader 의 일부분 + 실제 메모리 (쓰레기 값) + 널영역(2바이트) 로 구성되며 _bNoMansLandFill 는 포함되지 않는다

디버그 모드에서 메모리 삭제시 _bNoMansLandFill 의 메모리 영역을 검사하게 되는데
여기 다른 메모리가 침범해 있을때 발생하는 에러가 바로 힙 커럽션이다
문제는 이 에러의 원인이되는 메모리침범이 당시에는 나오지 않고 delete 할때
나온다는거다

잘하자

참고 링크
http://www.docsultant.com/site2/articles/debug_codes.html
http://www.codeguru.com/Cpp/W-P/win32/tutorials/article.php/c9535
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsdebug/html/_core_Memory_Management_and_the_Debug_Heap.asp

크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

델파이에서 VC++ DLL 사용시 주의사항

컴퓨팅/프로그래밍 2008/07/14 09:08
출처 : http://wwwi.tistory.com/tag/Runtime

델파이에서 VC 8.0(VS 2005)에서 작성한 DLL을 사용하는데
개발환경이 셋업되어있지않은 곳에서 사용하는데 문제가 있어서 몇일간 삽질한 내용을
정리하고자한다.

테스트 환경
  우선 Visual C++ Ver 8.0에서 DLL을 만들었다.
  그리고 그것을 Delphi 2005에서 만든 실행 파일에서 불러서 쓰려했다.

  실행파일을 실행한 OS는 Windows XP Professional SP2로
  개발환경이 전혀 깔려있지않은 상태였다.
 


첫번째 삽질
델파이라 만든 실행파일을 실행하면 아래의 메세지가 떴다.
"응용 프로그램을 제대로 초기화하지 못했습니다(0xc0150002)."

→ 문제는 Visual C++ Ver 8.0에서 DLL을 만들 때 Debug 모드로 빌드를 해서
    Debug용 DLL로 테스트를 했었다.
    Release 모드로 바꾸어서 빌드 해봤지만 에러는 뜨지 않았지만
    dll이 제대로 동작하지 않았다.

두번째 삽질
VC 8.0(VS 2005)으로 DLL을 만들면 DLL만 카피한다고 DLL이 제대로 동작하지 않는다.
자세한 내용은 옆의 링크 참조 배포(C++)
여하튼 가장 편한 방법은 아래의 패키지를 설치하는 것이 가장 편한 것같다.
Microsoft Visual C++ 2005 재배포 가능 패키지(x86)
(무엇이 좋아졌는지는 잘 모르겠지만 왜 더 불편하게 만들어졌는지가 잘 이해가 안간다.)

세번째 삽질
호출 규칙이란 것을 모르고 DLL을 작성하였다.
(아직도 제대로 이해하지 못하고 있지만...)
Visual C++ 2005의 호출규칙(컴파일 옵션) 에는 아래와 같은 것들이 있다.
    __cdecl
    __fastcall
    __stdcall  

__cdecl, __pascal, __stdcall의 차이점 (구글검색)
위 링크를 보면 자세한 내용 있는 홈페이지를 볼 수 있다.
(주로 한 글이 계속 펌되어져있다.)

가변매개인자를 꼭 사용해야만 한다면 반드시 cdecl을 사용해야된다고 한다.
이런 위의 사실들을 모르고 dll을 만들었기 때문에 제대로 dll을 인식하지 못했다.

Visual C++ 2005의 호출규칙 컴파일 옵션을 설정하는 방법은
메뉴의 프로젝트(P)에서 속성(P)[Alt+F7]을 선택하면 속성 페이지가 선택된다.

구성에서 활성(Release)를 선택하고
구성 속성 밑의 C/C++를 선택하고 그 밑의 고급을 선택한다.
그러면 호출규칙이 표시된다.

물론 델파이에서 DLL 함수 선언할 때도 Visual C++ 2005에서 선택한
호출 규칙과 동일하게 선언해야 된다.

이런 것들을 제대로 파악을 못해서 몇일동안 정말 삽질을 했다.
왜 안돌아갈까 왜 안돌아갈까?
많이 고민했다.

시간이 지나서 또 삽질할까봐 적어둔다.

크리에이티브 커먼즈 라이선스
Creative Commons License
tags : DLL, import, vc++, 델파이
Trackback 0 : Comment 0

MFC DLL 내부에서 wmemcpy 사용시 Heap 해제 에러

컴퓨팅/프로그래밍 2008/07/02 10:42
MFC DLL 작성시, DLL 파일 내부에서 Unicode 문자를 memory copy 작업을 진행하게 된다면,
후에 DLL이 Unload될때 copy된 공간을 해제하려고 할 때 Access Violation 이 발생한다.

해당 에러를 제거하려면 memory copy 보다는 string copy 류의 작업으로 대체할 것을 권고.

변경전)
wmemcpy(_Dest, (LPCTSTR)varResult.vt, 10 * sizeof(TCHAR));

변경후)
_tcsncpy(_Dest, (LPCTSTR)varResult.vt, 10 * sizeof(TCHAR));
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

_DRIVER_OBJECT / 심볼릭 링크로 Driver Object 얻어오기

컴퓨팅/드라이버 2008/05/28 23:32
typedef struct _DRIVER_OBJECT {
    CSHORT Type;
    CSHORT Size;

    PDEVICE_OBJECT DeviceObject;
    ULONG Flags;

    PVOID DriverStart; // 드라이버가 보관된 메모리 시작위치 포인터
    ULONG DriverSize;
    PVOID DriverSection;
    PDRIVER_EXTENSION DriverExtension; // 확장, 컴포마이징 

    UNICODE_STRING DriverName;
    PUNICODE_STRING HardwareDatabase; // 드라이버가 등록된 서비스키
    PFAST_IO_DISPATCH FastIoDispatch;

    PDRIVER_INITIALIZE DriverInit;  // DriverEntry 함수주소
    PDRIVER_STARTIO DriverStartIo;
    PDRIVER_UNLOAD DriverUnload;
    PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
// 드라이버가 처리하는 IRP 명령어를 위한 dispatch routines } DRIVER_OBJECT; typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT; // ntndis


레런스 문서 : http://www.reactos.org/generated/doxygen/d6/d72/struct__DRIVER__OBJECT.html

심볼릭 링크에 대한 드라이버 오브젝트를 구하는 함수:

PVOID SearchObject(PUNICODE_STRING pUni)
{
   NTSTATUS st;
   HANDLE Handle;
   UNICODE_STRING Uni;
   OBJECT_ATTRIBUTES ObjectAttributes;
   PVOID Object;   InitializeObjectAttributes
      (&ObjectAttributes,
      pUni,
      OBJ_CASE_INSENSITIVE,
      NULL,
      NULL);
 
   st = ObOpenObjectByName
      (&ObjectAttributes,
             0L,
             0L,
             0L,
             0L,
             0L,
             &Handle);
 
   if(st!= STATUS_SUCCESS)
   {
      DbgPrint(( "ObOpenObjectByName - ObOpenObjectByName failed \n"));
      return (PVOID)0;
   }
     
   st = ObReferenceObjectByHandle
      (Handle,
      0x80000000,
      NULL,
      0,
      &Object,
      NULL); // Handle을 object로 변환
 
   if(st != STATUS_SUCCESS)
   {
      DbgPrint(( "ObReferenceObjectByHandle - ObReferenceObjectByHandle failed \n"));
      ZwClose(Handle);
      return (PVOID)0;
   }   ZwClose(Handle);
   ObDereferenceObject(Object);

}

위 함수를 응용해 심볼릭 링크만으로 드라이버 오브젝트를 구해낼 수 있다.
그 방법은 다음과 같다:

PDRIVER_OBJECT pClass;
   UNICODE_STRING nameString;
   RtlInitUnicodeString( &nameString, L"\\Driver\\pClass" ); // pClass의 심볼릭 링크명
   pClass = (PDRIVER_OBJECT)SearchObject(&nameString);    


위와 같은 방법으로 pClass에 해당 드라이버 오브젝트를 얻어 올 수 있다.
SearchObject 함수 내의 ObOpenObjectByName() 를 사용하기 위해서는 헤더 파일에 다음과 같은 구문을 넣어줘야 한다:

extern "C"{
#include <ntddk.h>
 
NTSTATUS ObOpenObjectByName(
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
 IN POBJECT_TYPE  ObjectType,
 IN OUT PVOID  ParseContext  OPTIONAL,
 IN KPROCESSOR_MODE  AccessMode,
 IN ACCESS_MASK  DesiredAccess,
 IN PACCESS_STATE  PassedAccessState,
 OUT PHANDLE  Handle);
}
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

Ring3에서 드라이버 로드를 위한 2가지 방법 - 1/2

컴퓨팅/드라이버 2008/05/28 03:38

SCM(Service Control Manager)를 이용해 드라이버를 등록하고 실행합니다.
잘알려진 InstDrv.exe도 이 방법을 이용한 것입니다.

기본적인 드라이버 로드를 위한 함수 구조

void load_driver(char* driverName) {
   ...
   SC_HANDLE openHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
   ...
   SC_HANDLE handle = CreateService( openHandle,
                                    driverName,
                                     driverName,
                                     SERVICE_ALL_ACCESS,
                                    SERVICE_KERNEL_DRIVER,
                                     SERVICE_DEMAND_START,
                                     SERVICE_ERROR_NORMAL,
                                     로드될 .sys파일의 path정보,
                                    NULL,
                                    NULL,
                                     NULL,
                                     NULL,
                                     NULL);
   ...
   StartService(handle, 0, NULL);
   ...
   CloseServiceHandle(openHandle);
   CloseServiceHandle(handle);
}

위와 같이 아주 간단하게 드라이버를 ring3 프로그램에서 등록시키고 실행할 수 있습니다.
정석적인 방법이기에 좀더 은밀(?)하게 드라이버를 로드하고 싶으신 분은 다른 방법을 찾아야합니다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

WinDBG 디스크립터 덤프

컴퓨팅 2008/05/28 01:19
다음의 확장 DLL을 WinDBG의 폴더에 복사합니다.
C:\Program Files\Debugging Tools for Windows (x86)\winxp

첨부된 ProtMode.dll 은 윈도우XP에서 정상작동합니다.


사용방법:

사용자 삽입 이미지
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

InstDrv - 드라이버 로딩 도구

컴퓨팅/드라이버 2008/05/27 19:29

한번님이 개발하신 파일다이얼로그가 포함된 InstDrv 버전입니다.
서핑하던 차에 발견해서 아주 유용하게 쓰고 있습니다.
전체경로의 귀차니즘에서 벗어나 보아요. ㅎㅎ.

사용자 삽입 이미지


다운로드

크리에이티브 커먼즈 라이선스
Creative Commons License
tags : instdrv
Trackback 0 : Comment 0

작업관리자(taskmgr) 변경하기

컴퓨팅 2008/05/27 03:31
윈도우 기본 작업관리자를 레지스트리의 Image File Execution Option을 이용해서 다른 프로그램(여기서는 Process Explorer)을 띄우는 방법입니다.

이 방법을 쓰면 기존의 작업관리자는 taskmgr.exe을 따로 실행시켜도 실행되지 않습니다.
주의하시기 바랍니다.

사용자 삽입 이미지

여기서는 procexp.exe를 c:\windows\system32에 복사한 상태입니다.

이 레지스트리 항목을 이용해서 윈도우에서 제공되는 여러 시스템 프로그램을 다른 프로그램으로 Mapping하는 것이 가능해집니다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

Visual Studio 2008 / WDK 연동

컴퓨팅/드라이버 2008/05/27 02:58
연동환경
Visual Studio 2008 Prefessional
Windows Driver Kit 6001.18001 Build
Windows XP SP2



우선, 다음의 작업을 수행합니다.

1. VS2008 실행
2. 도구->옵션->프로젝트 및 솔루션->VC++ 디렉터리
3. 오른쪽 위의 "다음 파일의 디렉터리 표시(S):"에서 "포함 파일" 선택
4. {WDK Installation Path}\{Build Number}\inc 을 추가합니다.
5. {WDK Installation Path}\{Build Number}\lib 을 추가합니다.


사용자 삽입 이미지


이제 VC++에서 드라이버 개발에 관련된 인텔리전스 기능을 사용할 수 있게 되었습니다.

하지만 드라이버 제작을 위해서는
makefile
sources
2가지의 파일이 더 필요합니다.

makefile은 다음과 같이 만들면 됩니다. Windows 98이상의 환경이라면 모두 같은 형태의 makefile을 써야합니다.

# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
# file to this component. This file merely indirect to the real make file
# that is shared by all the driver components of the Windows NT DDK
!INCLUDE $(NTMAKEENV)\makefile.def

sources 파일은 일반적으로 드라이버를 제작할 때와 마찬가지로 만들면 됩니다.
sources의 기본 형태는 다음과 같습니다.

TARGETNAME=Wdm1
TARGETTYPE=DRIVER
DRIVERTYPE=WDM
TARGETPATH=OBJ
BROWSER_INFO=1

INCLUDES=..\inc       // include 디렉터리 설정
LIBS=..\lib            // lib 디렉터리 설정

SOURCES=main.c    
         send.c        
         recv.c  
         ...

위의 sources 파일은,
드라이버의 목적명이 Wdm1.sys 라는 것,
Wdm1.sys가 WDM드라이버 라는 것,
OBJ 서브디렉터리에 구성할 것,
소스 브라우저 정보를 생성할 것등의 정보를 가지고 있습니다.
그리고 INCLUDES, LIBS는 각각의 디렉터리를 설정하면 됩니다.
SOURCES=에는 컴파일 할 파일 목록을 지정합니다.
그리고 sources 매크로와 등호(=)사이에 공간이 들어가면 안됩니다.


그 외에 DDKBuild를 이용한 연동이나 더 많은 정보를 원하면 다음의 링크를 참조하세요
보러가기
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0

후킹관련서적 (도서관일련번호)

컴퓨팅/후킹 2008/05/25 15:21
MICROSOFT WINDOWS INTERNALS 제4판 상세보기
MARK E. RUSSINOVICH 지음 | 정보문화사 펴냄
WINDOWS 내부 안내 전문번역서. 이 책은 마이크로소프트 WINDOWS 제품 개발팀과 공동으로 개발한 안내서로 64비트 확장을 포함하여 WINDOWS Server 2003, WINDOWS XP, 그리고 WINDOWS 2000의 운영체제 아키텍처와 내부를 설명한다. 또한 WINDOWS를 구성하고 제어하는 핵심 메커니즘 이해액세스, WINDOWS 보안 모델 탐구커널 디버거와 알고리즘검사Windo ws 가상 메모리와 물리 메모리 관리 방법NTFS의 동작 및 포맷의 이해와 파일

651.26 R969mKg


루트킷: 윈도우 커널 조작의 미학(에이콘 해킹 보안 시리즈 15) 상세보기
그렉 호글런드 지음 | 에이콘출판 펴냄
윈도우 커널 조작의 미학! '에이콘 해킹ㆍ보안' 시리즈, 제15권 『루트킷』. 해커들이 공격하고자 하는 시스템에 지속적이면서도 탐색되지 않은 채로 교묘히 접근할 수 있는 최고의 백도어인 '루트킷(ROOTKITS)'에 대한 전문서다. 이 책은 '루트킷'에 대해 세세하게 설명하면서, 그것을 제작하는 방법, 작동하는 방법 등에 대해 가르쳐준다. '루트킷'에 관한 최고의 전문가라고 할 수 있는 두 저자가 현재까지 쌓아온 기술을

  006 H716rKy


WDF: 윈도우를 위한 차세대 통합 드라이버 개발 모델 상세보기
PENNY ORWICK 지음 | 에이콘출판 펴냄
윈도우를 위한 차세대 통합 드라이버 개발 모델! 윈도우를 위한 차세대 통합 드라이버 개발 모델인 윈도우 드라이버 파운데이션(WDF) 안내서. WDF를 개발자들이 직접 저술한 것이다. 짧은 시간 안에 고품질의 드라이버를 개발할 수 있도록 도와준다. 이 책은 WDF를 사용한 커널 모드나 유저 모드 드라이버를 개발할 수 있도록 구성되어 있다. 최소의 코드로 플러그 앤 플레이 등이 가능한 드라이버를 만들고, I/O 핸들링 코드

 651.26 C229wKb
크리에이티브 커먼즈 라이선스
Creative Commons License

'컴퓨팅 > 후킹' 카테고리의 다른 글

후킹관련서적 (도서관일련번호)  (2) 2008/05/25
API 후킹 간략한 정리  (0) 2008/05/25
Trackback 0 : Comments 2

Photoshop에서 ICO파일로 저장하는 법

컴퓨팅 2008/05/25 15:05

간단히 서핑하면서 얻은 정보.
Photoshop에서 파일 -> 다른이름으로 저장에 가면 아래와 같이 ICO 파일이 추가된다.

사용자 삽입 이미지


해당 플러그인 다운로드 (무료)
http://www.telegraphics.com.au/sw/#icoformat

해당 플러그인 저장위치
포토샵설치폴더\플러그인\파일 형식
(CS3기준)
크리에이티브 커먼즈 라이선스
Creative Commons License
tags : ICO, 포토샵
Trackback 0 : Comment 0

API 후킹 간략한 정리

컴퓨팅/후킹 2008/05/25 01:16

API Hooking은 크게 유저모드와 커널모드 두가지로 나뉜다.

User-Mode Hooking

  • IAT(Import Address Table) Hooking: IAT 에 적혀있는 API 의 주소를 자신의 함수주소로 바꾸고 자신의 함수 끝에 다시 원래 API 주소로 돌려주는 방식. 가장 일반적으로 바이러스에서 사용하는 기법.

  • Inline Function Hooking (Detour Hooking): 사용할 API 의 첫 5바이트를 자신의 함수주소로 Jmp 하는 코드로 바꾸고 자신의 코드에서 다시 원래 API 의 바뀐 코드를 수정해주고 API 시작위치로 돌려주는 방식. IAT 후킹보다 지능적이여서 찾아내기가 쉽지 않다. 요새 많이 등장한다.


Kernel-Mode Hooking (루트킷)

  • SSDT(System Service Descriptor Table Modification): SSDT 가 가리키는 주소를 후킹 함수의 주소로 바꾸고 그 함수 호출후 다시 원래 커널 API 의 주소로 돌려주는 기법. 50% 이상의 루트킷이 사용하는 기법. 이런 기법은 프로세스, 파일의 은폐에 많이 사용됨.

  • DKOM(Direct Kernel Object Modification): 커널 Object 를 직접 조작해서 실행되는 프로세스, 스레드, 서비스, 포트, 드라이버 및 핸들의 Entry 를 실행리스트(PsActiveProcessHead, PsActiveModuleHead....)에서 감추는 기법.

  • SYSENTER: 유저모드에서 시스템 호출로 넘어갈때 INT 2E(for Windows 2000)/ SYSENTER 를 사용하게 되는데 호출후 시스템 서비스의 핸들러는 IA32_SYSENTER_EIP 라는 레지스터리에 저장된다. 커널 드라이버를 설치하여 해당 값을 수정하여 루트킷을 호출하고 다시 원래 값으로 돌려주는 기법.

  • Filter Device Drivers: 시큐리티 제품의 하단에 filter device driver 로 등록하는 기법이다. 부트 타임에 로드됨으로써 다른 어떤 안티바이러스 제품보다 먼저 실행된다.

  • Runtime Detour Patching: 커널 메모리를 직접 조작함으로써 그 메모리의 포인터가 루트킷을 가르키게 함으로써 커널 함수들을 후킹하는 기법. 예를 들면 Exception 을 일으키고 Exception Handle 을 컨트롤하는 IDT 레지스터를 자신을 가리키는 주소로 써줌으로써 후킹목적을 달성한다.

  • IRP table Modification: 디바이스 드라이버가 네트웍 패킷을 처리하거나 파일을 쓸때 사용하는 I/O Request Packets 을 제어하는 Dispatch Routine 은 DEVICE_OBJECT 구조체에 저장된다. 바이러스에서 사용하는 루트킷은 IoGetDeviceObjectPointer 란 API를 사용하여 DEVICE_OBJECT 구조체에서 DRIVER_OBJECT 의 위치를 선정해줄수 있다.
    즉 다른 Original Driver Call 이 일어나기 전에 자신의 루트킷을 먼저 실행하여 Call 결과를 조작한다.

     

크리에이티브 커먼즈 라이선스
Creative Commons License

'컴퓨팅 > 후킹' 카테고리의 다른 글

후킹관련서적 (도서관일련번호)  (2) 2008/05/25
API 후킹 간략한 정리  (0) 2008/05/25
tags : 후킹
Trackback 0 : Comment 0

VMware를 이용한 커널 디버깅 설정법

컴퓨팅 2008/05/23 23:31

커널 디버깅 하기

 

 

디버깅을 당하는 PC를 타겟 PC 또는 디버기(debuggee)라고 하고 디버깅을 행하는 PC를 호스트 PC 또는 디버거(debugger)라고 합니다

windbg1.png


TARGET컴퓨터 구성하기

먼저 TARGET가 디버그 모드로 부팅할수 있도록 C:\에 위치한 boot.ini파일에 아래 내용을 추가 하도록하지요

multi(0)disk(0)rdisk(0)partition(1)₩WINDOWS="Windows Server 2003 (COM1)" /fastdetect /debug /debugport=COM1 /baudrate=115200

주의 : 위의 내용 그대로 치면 부팅 시 hal.dll에서 에러가 생길 확률이 높다. 가장 안전한 방법은 이미 설정되어 있는 위의 내용을 그대로 복사한뒤 /debug /debugport=COM1 /baudrate=115200 부분만 추가한다.



커널 디버깅을 위해 COM1 포트를 사용하고, 속도는 115200 을 사용한다는 것을 나타냄 한줄

windbg2.png


boot.ini 파일의 속성을 지정해 주도록하자 (시스템 파일이기 때문에 읽기 전용이고 시스템 속성이 설정되어 있다.보통 저장하면 기존 설정을 유지하고 있다, 않해줘도 문제는 없음)

c:₩>attrib +s +h +r boot.ini

이제 부팅시 TARGET 컴퓨터가 디버그 모드로 부팅할 수 있도록 설정을 완료

windbg3.png


 

HOST컴퓨터 준비하기

먼저 WinDbg를 설치하여야 겠지요?

다운로드 경로 Windbg 32Bit

http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.8.4.0.msi

 

다운로드 경로 Windbg 64Bit

http://msdl.microsoft.com/download/symbols/debuggers/dbg_ia64_6.8.4.0.msi

 

그리고 File->Symbol Path(심볼 경로)를 경로를 지정하도록 합시다~

windbg4.png


Symbol Search Path에 심볼 경로를 아래와 같이 입력해 주세요

windbg5.png


심볼 경로

srv*c:\symbols.pub*http://msdl.microsoft.com/download/symbols

 

이렇게 설정을 하면 WinDbg는 먼저 c:\symbols.pub 에 타겟 PC의 운영 체제에 맞는 심볼 파일이 있는지 검사하고 없으면 심볼 서버에서 다운받아 c:\symbols.pub 에 보관해 놓습니다.

 

주의 : c:\symbols.pub 디렉토리는 WinDbg가 만들어 주지 않습니다.

 

 

이제 File -> Kernel Debug를 선택합니다.

windbg6.png

 

 

TARGET과 연결된 Null Modem CableCOM Port와 설정한 속도를 확인후 아래 확인을 누릅니다.

windbg7.png


그럼 아래와 같이 대기 상태가 되며, 이제 HOST 컴퓨터의 준비 단계는 끝입니다.

 주의 : HOST 컴퓨터를 먼저 대기 시키고 TARGET컴퓨터을 디버그 모드로 부팅하셔야 합니다.

 

windbg8.png

TARGET컴퓨터를 재부팅하고 boot.ini에 만들어둔 Windows Server 2003 (COM1)모드로 TARGET컴퓨터를 부팅하면 커널 디버깅 화면을 보실수 있습니다. 수고하셨습니다 ^^

 

VM (Virtual Machine)으로 구성 하기

커널 모드 디버깅을 실제 머신으로 한다면 얼마나 불편할지 귀차니즘이 하늘을 찌르네요

다행이 VM 머신으로 구성할수 있는 방법이 존재합니다.

 

TEST할 하나의 Virtual Machine을 선택 후 마우스 오른쪽을 눌려 구성(setting) 선택합니다.

 

그리고 COM1 Named pipe로 설정후 원하시는 이름을 지정하여 줍니다.
 
여기서는 \\.\pipe\vm_com으로 하였어요

 

 

windbg9.png

 

다음 TARGET 컴퓨터도 boot.ini 파일을 수정후 재부팅하여 아래와 같은 부팅 메뉴에서 엔터를 누르지말고 그대로 두고, 이제 HOST 컴퓨터를 설정합니다.

 

windbg10.png

 

파이프로 연결되기 위해서는 WinDbg에 단축아이콘을 하나 만들어 실행시 아래 옵션을 붙여 주도록 합시다.

-k com:pipe,port=\\.\pipe\vm_com

 

windbg11.png

 

위와 같이 단축아이콘을 설정후 실행하면 아래와 같은 화면이 나오며 대기하게 됩니다.

이제 VM머신을 디버그 모드로 부팅을 해보도록 합시다. (모드 선택에서 [디버거 사용 가능] 확인)

windbg12.png


 

부팅을 하게 되면 아래와 같은 메시지가 나오며 TARGET 컴퓨터에 연결이 됩니다.

Ctrl+Break 키를 누르면 TARGET 컴퓨터가 정지하며 TARGET 컴퓨터를 커널 디버깅을 할수 있습니다.

몇가지 명령을 실행해 보로록 하겠습니다. 

windbg13.png


 

.sympath를 설정된 심볼경로를 보여주는데, 로컬경로인 C:\symbols.pub 디렉토리는 수동으로 만들어 주서야 합니다. 만들어 주지 않으시면 아래와 같은 메시지를 확인할수 있습니다.

WARNING: Whitespace at end of path element

windbg14.png


 

lm명령을 통해 로드된 심볼이 무언인지 확인해 보도록 하죠, 여기서 다른 모듈들이 (deferred)라고 나오는데요, 이것은 모듈은 로드되었지만 그에 해당하는 심볼은 로드되지 않았다는 것을 뜻합니다. 사용자가 필요한 심볼이 있다면 ld 명령을 통해 로드 시킬수 있습니다.

windbg15.png


 

 

Srv를 로드해 봅시다

정상적으로 잘 로드가 되었네요

 

windbg16.png


windbg17.png


어떤 심볼이 들어있는지 x 명령을 통해 확인해 보도록 하죠

 

windbg18.png

이정도로 여기서는 마치도록 하겠습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 : Comment 0