바닥....

Snap 2011. 3. 6. 22:06

Posted by hazeyun
,
Posted by hazeyun
,
숨겨진 드라이버 Kernel Memory Scanning으로 구현...
Posted by hazeyun
,

Posted by hazeyun
,
간단히 10진수에서 16진수로, 16진수에서 10진수로 바꿔 주는 프로그램이다.
분석할때 계산기 켜두고 Hex, Dec클릭하면서 하기 귀찮아서 만든 프로그램임.

기능 hex->dec, dec->hex
hot key적용, alt + shift키로 포커스 얻음.
Posted by hazeyun
,

무슨 프로그램을 만들던지 Thread는 아주 유용한 도구(?)가 될 수 있다.
WIN32/MFC에서는 CreateThread함수 하나만 알아도 Thread를 생성해서 사용하는 큰 지장이 없다. bool값만 적절히 조정해 주면 Thread종료에도 큰 문제가 없다.

하지만 Kernel에서 Thread를 생성하고, 종료 시키는데는 약간의 유의가 필요한듯 하다.
계속 되는 삽질과 블루스크린과의 조우로 깨달았다... 어리석게도...
<Thread 생성>

<Thread 종료>

<Thread Routine>

Thread의 생성에는 크게 문제가 없는데 Thread를 종료 시킬 때.. PsTerminateThread함수를 Thread Routine 내에서 호출해 줘야 한다. 그리고 ObDereferenceObject함수를 호출하여 Thread참조 카운트를 줄여주기 전에 KeWaitForSingleObject를 이용하여 Thread의 종료를 확인 해줘야 한다.

P.S. Thread Object는 Thread가 완전히 종료(terminated)되었을 때 Signaled 상태가 되고 스레드가 실행중인 때에는 Non-Signaled 상태이다.
Posted by hazeyun
,

lkd> dt _HANDLE_TABLE
nt!_HANDLE_TABLE
   +0x000 TableCode        : Uint4B
   +0x004 QuotaProcess     : Ptr32 _EPROCESS
   +0x008 UniqueProcessId  : Ptr32 Void
   +0x00c HandleLock       : _EX_PUSH_LOCK
   +0x010 HandleTableList  : _LIST_ENTRY
   +0x018 HandleContentionEvent : _EX_PUSH_LOCK
   +0x01c DebugInfo        : Ptr32 _HANDLE_TRACE_DEBUG_INFO
   +0x020 ExtraInfoPages   : Int4B
   +0x024 Flags            : Uint4B
   +0x024 StrictFIFO       : Pos 0, 1 Bit
   +0x028 FirstFreeHandle  : Int4B
   +0x02c LastFreeHandleEntry : Ptr32 _HANDLE_TABLE_ENTRY
   +0x030 HandleCount      : Int4B
   +0x034 NextHandleNeedingPool : Uint4B
lkd> _dt HANDLE_TABLE_ENTRY
     ^ Syntax error in '_dt HANDLE_TABLE_ENTRY'
lkd> _dt _HANDLE_TABLE_ENTRY
     ^ Syntax error in '_dt _HANDLE_TABLE_ENTRY'
lkd> _dt nt!_HANDLE_TABLE_ENTRY
     ^ Syntax error in '_dt nt!_HANDLE_TABLE_ENTRY'
lkd> dt nt!_HANDLE_TABLE_ENTRY
   +0x000 Object           : Ptr32 Void
   +0x000 ObAttributes     : Uint4B
   +0x000 InfoTable        : Ptr32 _HANDLE_TABLE_ENTRY_INFO
   +0x000 Value            : Uint4B
   +0x004 GrantedAccess    : Uint4B
   +0x004 GrantedAccessIndex : Uint2B
   +0x006 CreatorBackTraceIndex : Uint2B
   +0x004 NextFreeTableEntry : Int4B
Posted by hazeyun
,


Image Base Relocation

기준재배치..(exe파일은 예외)

pe파일이 메모리에 로드될 경우 .exe파일의 경우 가장 먼저 로드될 것이기 때문에 원하는 번지(0x00400000)에 로드될 수 있다.
하지만 .dll일 경우 하나의 실행파일에 여러개의 dll이 로드될 수 있으므로 원하는 번지(0x01000000)에 로드되긴 어렵다.
그럴때를 위해 pe파일에는 relocation정보를 담아두고 로드되기 원하는 번지와 실제 로드된 번지의 차이인 delta를 기준으로
재배치를 수행하게 된다.

이 재배치 정보는 IMAGE_OPTIONAL_HEADER의 Data Directory에 존재하고 인덱스값은 winnt.h에
#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 라고 정의되어 있다.
또한 재배치섹션의 처음 시작정보를 담을 구조체는 아래와 같이 정의되어 있고
//
// Based relocation format.
//
typedef struct _IMAGE_BASE_RELOCATION {
    DWORD   VirtualAddress;
    DWORD   SizeOfBlock;
//  WORD    TypeOffset[1];
} IMAGE_BASE_RELOCATION;
typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;

위의 구조체 이후에 word데이터가 뒤따라 오게된다. 뒤따라 오는 word데이터는 상위 4bit는 타입정보를 하위 12bit는 오프셋값을 가진다.
VirtualAddress는 Rva를 담고있다. 따라서 재배치가 필요한 데이터는 (VirtualAddress + 오프셋) 한 값이 가리키는 데이터가 재배치가 필요한 값이다. (((VirtualAddress + 오프셋 이 가리키는값) - imageSize) + 실제 로드된 베이스번지) 를 하게 되면 재배치 정보고 완성되게 된다.

위의 이미지에서 빨간줄이 쳐진 부분이 바로 재배치가 필요한 부분이라 할수 있다.
예를 들자면 (앞의 주소부분+1)한 값이 재배치가 필요한 데이터를 가르키는 부분이 되겠고, 거기에 있는값이 재배치가 필요한 데이터가 되겠다.

Posted by hazeyun
,
파일의 Access Time 이란 것이 존재한다.
당연하게도 이것은 파일이 Access된 시간을 가지고 있게된다.

그럼 이 Access Time을 얻어오려면 ...
CreateFile함수로 파일을 열어 파일의 Handle을 얻고, 얻어온 핸들을 통해서 GetFileInformationByHandle함수를 통해서 파일정보를 얻어올 수 있다.
하지만 CreateFile 하는 순간 벌써 파일에 접근하게 된다. 그럼 당연히 Access Time이 갱신 될 것이고 얻으려고 하는 Access Time을 얻어올 수 없다. 하지만 CreateFile의 두번째 인자로 FILE_READ_ATTRIBUTES속성을 주게되면 Access Time을 변경하지 않고 핸들만 얻어와서 파일 정보를 얻오 올 수 있게 된다.

아래는 테스트 코드이다.


Posted by hazeyun
,

png -> ico convert.....

Tip 2009. 3. 5. 10:37

ico  -> png로
png -> ico변환 해주는 사이트
http://converticon.com/

Posted by hazeyun
,