강백호...너..오늘은 말이야...핸들 테이블에 대해서 설명해봐라...
음...너가 아는게 없으니...설명못할거라 안다.ㅋㅋㅋ
이런...난 완전히 무시하는 구먼......이런 상황을 내가 참을 수 없지...
뭐라고 했죠??? 핸들 테이블요???
뭐...그 까짓것....안다고 대게 잘난체 하시네.....
| 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; |
음. 오늘은 ..이놈을에 대해서 자세하게 설명해 드리고 마무리 하겠습니다.
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값이다.
음....
어때요???? 잘난 인간아...
이정도면 되는거야???? 나도 언젠가..너를 따라 잡고 말겠어...ㅋㅋㅋㅎㅎㅎ (이렇게 내가 미쳐가는건가??)
이 내용은 http://www.driveronline.org/clubb/view.asp?tb=WinKernel&gubun=d&GotoPage=1&s_bulu=title&s_key=HANDLE&no=46
이곳에서 긁어온 내용을 강백호가 다시 설명드리는 것입니다.



덧글