강백호 핸들 테이블을 설명할수 있겠냐??? by 미친감자

img1.gif강백호...너..오늘은 말이야...핸들 테이블에 대해서 설명해봐라...
음...너가 아는게 없으니...설명못할거라 안다.ㅋㅋㅋ
img2.gif 이런...난 완전히 무시하는 구먼......이런 상황을 내가 참을 수 없지...

뭐라고 했죠??? 핸들 테이블요???

뭐...그 까짓것....안다고 대게 잘난체 하시네.....
 

PHANDLE_TABLE GetObjectTable(DWORD Pid)
{
  NTSTATUS status;
  PEPROCESS Process;
  PHANDLE_TABLE ObjectTable;

status = PsLookupProcessByProcessId(Pid,&Process);
if(NT_SUCCESS(status))
{
  ObjectTable = (PHANDLE_TABLE)(*(ULONG*)((ULONG)Process + 0xC4));
  DbgPrint("Pid : %X PEPROCESS : %X ObjectTable :
                      %X ",Pid,Process,ObjectTable);
   ObDereferenceObject(Process);
   return ObjectTable;
}
else
{
  DbgPrint("PsLookup error ");
}
  ObDereferenceObject(Process);
  return 0;
}

이게 어제 제가 설명한...아니 듀얼님이 강의한 내용 배낀 내용입니다.

이곳에서 보면. PID에서 .. PsLookupProcessByProcessId을 호출해서

EPROCESS를 얻어오잖아요......
그리고 나서..중요한것!!!!

(PHANDLE_TABLE)(*(ULONG*)((ULONG)Process + 0xC4))

0XC4 를 해주면...이곳이...핸들 테이블 이라고 한다.

맞나?????
ㅋㅋㅋ 암튼...


 

typedef struct _HANDLE_TABLE
{
  ULONG TableCode;  //PHANDLE_TABLE_ENTRY**
  PEPROCESS QuotaProcess;
  PVOID UniqueProcessId;
  EX_PUSH_LOCK HandleTableLock [4];
  LIST_ENTRY HandleTableList;
  EX_PUSH_LOCK HandleContentionEvent;
  PHANDLE_TRACE_DEBUG_INFO DebugInfo;
  LONG ExtraInfoPages;
  ULONG FirstFree;
  ULONG LastFree;
  ULONG NextHandleNeedingPool;
  LONG HandleCount;
  ULONG Flags;
} HANDLE_TABLE, *PHANDLE_TABLE;


이놈은...뭐냐??? 위에서 0Xc4를 더해 얻은 ...음..핸들 테이블의 포인터라 이거죠~~!
음. 오늘은 ..이놈을에 대해서 자세하게 설명해 드리고 마무리 하겠습니다.

TableCode :
HADLE_TABLE_ENTRY의 주소를 갖는다.
이 ENTRY에 해당 Process들이 사용하고 있는
Object들이 있다.

QuotaProcess :  쿼터 프로세스
System의 경우 0을 가지며,
그외의 Process들은 자신의
PEPROCESS값을 갖는다.

UniqueProcessId :
이 HANDLE_TABLE의 소유주
ProcessId값이다.

HandleTableLock :
EX_PUSH_LOCK 4개가 연결된 배열로 되어 있다.
EX_PUSH_LOCK은 다음과 같은 형태를 갖는다.

typedef struct _EX_PUSH_LOCK
{
  union
  {
       struct
       {
       ULONG Waiting:1;
       ULONG Exclusive:1;
       ULONG Shared:30;
       };
       ULONG Value;
       PVOID Ptr;
  };

} EX_PUSH_LOCK, *PEX_PUSH_LOCK;

HandleTableList :
그 다음
HandleTable로 연결되 있는 ListEntry이다.

PHANDLE_TRACE_DEBUG_INFO :
해당 HANDLE_TABLE의 HANDLE Trace Debug정보를 갖는 구조체의 포인터이다.
Windows가 Debug모드로 시작되었을때만 사용하는 듯 하다.
HANDLE_TRACE_DEBUG_INFO는 다음과 같은 형태를 갖는다.

typedef struct _HANDLE_TRACE_DB_ENTRY
//HANDLE_TRACE_DEBUG_INFO가 사용하는 구조체
{
  CLIENT_ID    ClientId;
  HANDLE       Handle;
  ULONG        Type;
  PVOID        StackTrace[16];

} HANDLE_TRACE_DB_ENTRY; *PHANDLE_TRACE_DB_ENTRY;

typedef struct _HANDLE_TRACE_DEBUG_INFO
{
  ULONG CurrentStackIndex;
  HANDLE_TRACE_DB_ENTRY TraceDb[4096];

} HANDLE_TRACE_DEBUG_INFO, *PHANDLE_TRACE_DEBUG_INFO;


ExtraInfoPages :
부가적인 정보에 대한 Page의 Offset값을 갖는것으로 보이나,
주로 0으로 Set되어 있다.

FirstFree :
HandleTable에서
가장 처음으로 사용가능한(비어있는) Entry의 주소이며,
이 값이 바로 다음으로 생성될 HANDLE이다.

LastFree :

NextHandleNeedingPool :
다음번 핸들이 필요로 하는 Pool의 Size값이다.

HandleCount :
이 HandleTable에서 사용하고 있는 Handle의 총갯수이다.

Flags :
이 HandleTable의 Flag값이다.

음....
img3.gif어때요???? 잘난 인간아...
이정도면 되는거야???? 나도 언젠가..너를 따라 잡고 말겠어...ㅋㅋㅋㅎㅎㅎ (이렇게 내가 미쳐가는건가??)



이 내용은
http://www.driveronline.org/clubb/view.asp?tb=WinKernel&gubun=d&GotoPage=1&s_bulu=title&s_key=HANDLE&no=46
이곳에서 긁어온 내용을 강백호가 다시 설명드리는 것입니다.


덧글

  • 마로 2008/01/10 12:52 # 삭제 답글

    흐음~ 이거 슬램덩크 씨리즈 모아서 책한권내세요 :)
  • 미친감자 2008/01/10 13:15 # 답글

    마로님 // 고맙습니다. 마로님의 덧글이 저에게는 큰힘이 됩니다.^^ 좋은 하루 되세요^^
  • suban 2008/01/10 17:06 # 삭제 답글

    퍼가요 ㅎㅎ
  • chpie 2008/01/10 21:05 # 삭제 답글

    미친감자님은 언제나 열심히시군요 ㅎㅎ, 전 학생인데도 놀고먹는데, 이러다 뭐가될런지 orz....
  • 웃헝 2008/01/11 00:04 # 삭제 답글

    ㅋㅋㅋㅋㅋ 재미있어여 감자님.
  • n0fate 2008/01/11 11:13 # 삭제 답글

    미친감자님의 블로그는 언제나 새로운 글이 저를 기다리고 있어요^^
  • 미친감자 2008/01/11 12:13 # 답글

    n0fate 님// 웃헝님 // 감사 감사 합니다.
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.