월별 글 목록: 2005년 5월월

Win2000에서 137 이상 하드 인식

오늘 Win2000 Server SP4 에 200G 하드를 설치했는데, 디스크 관리자에서 128G로 인식을 하더군요.
찾아봤더니..

…………

일단 전제조건으로 윈2000의경우 서비스팩3 이상,
윈XP는 서비스팩1이 설치되어있어야한다

시작->실행->regedit->
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\atapi\Parameters
항목으로 이동후 우측패널에 REG_DWORD형의 EnableBigLba를 추가-> 데이타 값을 1로 설정한다~~ 그리고 저장후 재부팅하면 137기가 이상의 대용량하드의 인식이 가능해진다~~

(물론 바이오스에서 137G 이상을 인식한다는 전제 조건은 당연한 것이겠지요)

ZwSetSystemInformation 로 드라이버 로드…

ZwSetSystemInformation 로 드라이버를 로드하는 방법이 있습니다.

루트킷에서 사용되는 방법인데… 위의 방법으로 로드하면 레지스트리의 키에도 기록되지 않을 뿐더러… 소아에서도 잡히지 않고… 드라이버를 숨기고 동작 시킬 수 있습니다.

#include
#include

typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
#ifdef MIDL_PASS
[size_is(MaximumLength / 2), length_is((Length) / 2) ] USHORT * Buffer;
#else // MIDL_PASS
PWSTR Buffer;
#endif // MIDL_PASS
} UNICODE_STRING, *PUNICODE_STRING;

typedef unsigned long NTSTATUS;
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)

typedef NTSTATUS (__stdcall *ZWSETSYSTEMINFORMATION)(
IN DWORD SystemInformationClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformationLength
);
typedef VOID (__stdcall *RTLINITUNICODESTRING)(
IN OUT PUNICODE_STRING DestinationString,
IN PCWSTR SourceString
);

NTSTATUS (__stdcall *ZwSetSystemInformation)(
IN DWORD SystemInformationClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformationLength
);

VOID (__stdcall *RtlInitUnicodeString)(
IN OUT PUNICODE_STRING DestinationString,
IN PCWSTR SourceString
);

typedef struct _SYSTEM_LOAD_AND_CALL_IMAGE
{
UNICODE_STRING ModuleName;
} SYSTEM_LOAD_AND_CALL_IMAGE, *PSYSTEM_LOAD_AND_CALL_IMAGE;

#define SystemLoadAndCallImage 38

void main(void)
{
///////////////////////////////////////////////////////////////
// Why mess with Drivers?
///////////////////////////////////////////////////////////////
SYSTEM_LOAD_AND_CALL_IMAGE GregsImage;
WCHAR daPath[] = L”\\??\\E:\\MyProjects\\AFDMJHook\\AFDMJHK\\Debug\\AFDHK.sys”;

//////////////////////////////////////////////////////////////
// get DLL entry points
//////////////////////////////////////////////////////////////
if( !(RtlInitUnicodeString =
(RTLINITUNICODESTRING) GetProcAddress( GetModuleHandle(“ntdll.dll”),
“RtlInitUnicodeString” )) )
exit(1);

if( !(ZwSetSystemInformation =
(ZWSETSYSTEMINFORMATION) GetProcAddress( GetModuleHandle(“ntdll.dll”),
“ZwSetSystemInformation” )) )
exit(1);

RtlInitUnicodeString( &(GregsImage.ModuleName),
daPath );

if(0 <= ZwSetSystemInformation( SystemLoadAndCallImage, &GregsImage, sizeof(SYSTEM_LOAD_AND_CALL_IMAGE)) ){
printf(“Driver Loaded.\n”);
} else {
printf(“Driver not loaded.\n”);
}
}

그런데…ㅜㅜ

2K 까지만 동작하는거 같습니다…ㅜㅜ
2003 에서 테스트를 해보니… 안되더군요… MS에서 패치해버린거 같습니다…흑…ㅜㅜ

빠르면 빠를수록???

시나리오 1:
김과장 : 이대리, 이 기획안 정리해서 제출하도록 해
이대리 : 예, 알겠습니다.

시나리오 2:
김과장 : 이대리, 이 기획안 정리해서 제출하도록 해
이대리 : 예, 그런데 언제까지 제출합니까?
김과장 : 빠르면 빠를수록 좋아

시나리오 3:
김과장 : 이대리, 이 기획안 정리해서 제출하도록 해
이대리 : 예, 그런데 언제까지 제출합니까?
김과장 : 이번주까지 제출하도록 해

시나리오 4:
김과장 : 이대리, 이 기획안 정리해서 제출하도록 해
이대리 : 예, 그런데 언제까지 제출합니까?
김과장 : 이번주 목요일 오후 4시까지 보고하도록

시나리오 5:
김과장 : 이대리, 이 기획안 정리해서 제출하도록 해
이대리 : 예, 그런데 언제까지 제출합니까?
김과장 : 빠르면 빠를수록 좋아
이대리 : 예, 우선 이번주 수요일 오후 5시 까지 1차 가안 만들고 보고 드리고, 목요일 오후 4시까지 완성본을 제출하겠습니다.

주변에서 볼 수 있는 흔한 대화내용에 대해서 5가지 시나리오를 가정해 보았다. 위 시나리오의 문제점들을 살펴보자
– 시나리오 1: 언제까지라는 기한이 없다.
– 시나리오 2: 빠르면 빠를수록이란 말은 느리면 느릴수록이랑 틀린말이 아닌다.
– 시나리오 3: 기한은 정해졌지만 정확한 시간이 정해지지 않았다. 퇴근시간 전이라는 것인지, 밤 12시 전이라는 것인지

흔히들 일에 대한 시간 개념이 부족한 위와 같은 대화들을 가끔 볼수가 있는것 같다. 회사는 시간과의 싸움임을 감안해 보면, 위와 같은 대화는 되면 되는데로, 말면 마는데로 와 같은 안일한, 수동적인 자세인 것이다. 조금더 적극적일 필요가 있는데도 말이다. 특히 빠르면 빠를수록이란 말을 많이 하는 경우가 있는데, 이는 늦어도 상관없다는 의미와 무엇이 다른가?

– 시나리오 4: 김과장은 시간 개념이 있는 사람처럼 보인다.
– 시나리오 5: 이대리가 시간 개념이 있는 사람처럼 보인다.
일을하면서 커뮤니케이션은 팀원들간의 가장 중요한 요소중 하나이다. 서로의 의사를 정확히 전달하고, 들어야 할 의무가 있는것이다. 자세하면 자세할 수록, 분명하면 분명할 수록 커뮤니케이션은 그 효과를 발휘하고, 팀원간의 불화를 없앨수 있을 것이다.

자기를 함 뒤돌아 보자. 자기가 시나리오 1,2,3에 포함되지 않는지를…

게임 삼국지에서는…

일본 KOEI 에서 나온 삼국지라는 PC용 게임을 해본 사람이 있을것이다.
필자도 삼국지 1에서부터 최근의 삼국지 10 까지 꾸준이 계속해서 해온 마니아 중의 한 사람이다. 이겜은 전략 시뮬레이션 게임으로 삼국지 소설을 바탕으로 군주나 장군, 또는 일반인으로 시작하여 국가를 세우고 전국 통일을 한다는 것을 기본 모티브로 삼고 있다.
이 게임에 관해서 많은 마니아 층이 국내에도 많이 형성되어 있는 것으로 알고 있다.(근래에는 역사왜곡 문제로 조금 시끄러운 문제도 있었지만)

삼국지 자체가 인생, 기업, 국가 운영에 많은 전략 전술을 제공하고 있으며, 이 게임또한 그러한 원작을 바탕으로 하였기 때문에 그러한 것을 곳곳에서 느낄수 있다.
필자가 이 게임을 하면서 느꼈던 것중 하나는 초창기 세력이 약했을때 다른 세력과의 전쟁을 하기 위해서는 내정을 튼튼히 하고 군사력을 키우며, 유능한 인재를 포섭하는 것이 중요하다는 것이다.
특히 그 중에서도 처음에는 휘하에 많은 장수나 내정인이 모자라서 일일이 군주가 이것저것을 신경 써야 한다는 것이다. 그러한 초기 약점을 극복하기 위해서는 인재를 탐색하고 등용하는 것이다.
물론 초기에는 인재를 찾기도 어려울 뿐더러 능력치가 좋은 인재가 별로 없다는 것이다.게임에서 각 부문 최고 능력치는 100 이며 초창기에는 60정도의 인재들만을 찾을 수 밖에 없다.
하지만 그들조차도 등용하지 않을 수 없다. 여기서 군주는 등용후에 그들에게 많은 일거리(?)를 주면서 그들의 능력을 키워내여 나라에 힘이될 인재로 만들어야 하며, 이를 통해서 전국 통일이 가능해 질 발판이 계기가 되는 것이다.

결국, 나라운영이든, 기업운영이든, 필요한 인재를 찾는것이 중요하다는 것을 말하고 싶다. 그렇다고 무작정 사람을 끌어들이라는 것은 아니다. 인재를 찾을 때는 그가 미래에 투자할 가치가 있는 열정적인 사람인지가 가장 중요한 요소임을 간과해서는 안되며, 처음부터 제갈공명 같은 사람은 없다는 것이다.

CreateToolhelp32Snapshot

App 에서 프로세스 정보 얻기.. (MSDN CreateToolhelp32Snapshot 샘플 참조)

#include “Tlhelp32.h”

void GetProcessInfo()
{
HANDLE hProcessSnap;
PROCESSENTRY32 pe32;

hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if(hProcessSnap == INVALID_HANDLE_VALUE )
{
return;
}

pe32.dwSize = sizeof(PROCESSENTRY32);

if(!Process32First(hProcessSnap, &pe32))
{
CloseHandle(hProcessSnap);
return;
}

do
{
TRACE1(“ProcessID : [%d]\n”, pe32.th32ProcessID);
TRACE1(“ProcessName : [%s]”, pe32.szExeFile);
} while(Process32Next(hProcessSnap, &pe32));

CloseHandle( hProcessSnap );

return;
}

GMT 타임을 로컬 타임으로..

커널 모드에서 현재 타임을 얻는 함수는
KeQuerySystemTime 함수이다. 여기서 얻어지는 타임은 GMT 타임이므로, 로컬 타임으로 바꿀 필요가 있다.
근데… 이게 함수로 지원되고 있는 것을 오늘 알았다.. (T_T)
ExSystemTimeToLocalTime 함수는 GMT 타임을 로컬 타임으로 변경해 주는 함수이다.

예제)
LARGE_INTEGER CurrentGMTTime;
LARGE_INTEGER CurrentLocalTime;
TIME_FIELDS CurrentLocalTimeField;

KeQuerySystemTime(&CurrentGMTTime);
ExSystemTimeToLocalTime(&CurrentGMTTime, &CurrentLocalTime);
RtlTimeToTimeFields(&CurrentLocalTime, &CurrentLocalTimeField);

DbgPrint(“%d:%d:%d:%d\n”, CurrentLocalTimeField.Hour,
CurrentLocalTimeField.Minute,
CurrentLocalTimeField.Second,
CurrentLocalTimeField.Milliseconds);

pool tag

메모리 할당 삭제 등을 확인 하기 위해서 ExAllocatePoolWithTag 함수등을 이용해서 할당하게 된다.
이때 PoolTag는 시스템에서 유일한 값이어야 한다.

잘 알려진 PoolTag 정보는 %WinDbg%\triage\poolmon.tx 나 %WinDDK%\tools\other\i386\poolmon.txt 에 적혀 있다.

시스템에 설치된(.. System32\Drivers) 에 있는 드라이버들의 PoolTag 정보를 확인하기 위해서는 poolmon.exe -c 를 사용하면 된다.

[WinHEC 2005 Kernel Mode Basics Tip 중에서]

What does DO_DEVICE_INITIALIZING really do?

DO_DEVICE_INITIALIZING 플래그는 대체 뭘하는 거야??
일반적으로 드라이버에서 장치객체를 생성한 후 장치객체의 플래그에서 DO_DEVICE_INITIALIZING 를 클리어 해주는데…
왜? 무엇때문에??? [WinHEC 2005 Kernel Mode Basics Tip 중에서]

– IoCreateDevice 함수가 장치 객체를 생성하는 순간 I/O Manager 는 이 장치 객체의 플래그(flags) 필드를 DO_DEVICE_INITIALIZING으로 설정한다. 이는 장치객체가 생성되는 과정 동안 이 장치로의 I/O가 일어나는 것을 막기 위해서이다.

– DO_DEVICE_INITIALIZING 플래그가 설정되면 I/O Manager는 다른 윈도우 컴포넌트들(다른 드라이버나 App 등)이 그 장치에 대한 CreateFile, OpenFile, IoGetDeviceObjectPointer 를 막는다. 단, Plug & Play Request 나 상위 레벨 드라이버의 Request를 막지는 않는다.

– DriverEntry에서 생성한 장치 객체의 DO_DEVICE_INITIALIZING 플래그는 I/O Manager가 클리어 하지만, 다른 루틴(AddDevice 루틴 등)에서 생성한 것은 드라이버가(개발자가) 클리어 해 주어야 한다.

– Legacy Driver(Non Plug & Play)는 장치객체를 DriverEngry 에서 생성하지만, Plug & Play Driver는 보통 AddDevice 루틴에서 생성한다.(여기서 장치객체는 Device Stack 상에 Attach 할 장치 객체를 말함). 참고로 Plug & Play Driver도 Control Device Object(Application 과 통신을 위한 장치 객체)는 DriverEntry 에서 생성한다

tdi log 저장 쓰레드 함수

영자님이 준 tdi hook 드라이버에 로그 저장 루틴으로 추가한 것입니다.
tdi hook 드라이버 소스는 영자님이 공개를 할 수 없기 때문에(회사자료이므로) 제가 추가한 모듈만 올립니다.

함수는 보시면 대충 아실 겁니다.
쓰레드 돌면서 db(연결리스트)에 데이타가 입력되면 이벤트를 받아서 파일로 저장하는 것입니다.

다운로드

디카폰 끄적거리다가…

어떻게 이런사진이 내 디카에 찍혔는지 모르겠다.
언제 동필이를 만났는지… 언제 술을 마셨는지.. 어디서 마셨는지..
기억은 안나든데.. 다정하게 찍힌 사진이라니..
동필이는 더더군다나 맨정신에 사진 안찍히는데