能力值:
(RANK:410 )
2 楼
下面的结构从fs:[0]-fs:[30]结构存放的内容。
typedef struct _TIB
{
PEXCEPTION_REGISTRATION_RECORD pvExcept; // 00h Head of exception record list
PVOID pvStackUserTop; // 04h Top of user stack
PVOID pvStackUserBase; // 08h Base of user stack
union // 0Ch (NT/Win95 differences)
{
struct // Win95 fields
{
WORD pvTDB; // 0Ch TDB
WORD pvThunkSS; // 0Eh SS selector used for thunking to 16 bits
DWORD unknown1; // 10h
} WIN95;
struct // WinNT fields
{
PVOID SubSystemTib; // 0Ch
ULONG FiberData; // 10h
} WINNT;
} TIB_UNION1;
PVOID pvArbitrary; // 14h Available for application use
struct _tib *ptibSelf; // 18h Linear address of TIB structure
union // 1Ch (NT/Win95 differences)
{
struct // Win95 fields
{
WORD TIBFlags; // 1Ch
WORD Win16MutexCount; // 1Eh
DWORD DebugContext; // 20h
DWORD pCurrentPriority; // 24h
DWORD pvQueue; // 28h Message Queue selector
} WIN95;
struct // WinNT fields
{
DWORD unknown1; // 1Ch
DWORD processID; // 20h
DWORD threadID; // 24h
DWORD unknown2; // 28h
} WINNT;
} TIB_UNION2;
PVOID* pvTLSArray; // 2Ch Thread Local Storage array
union // 30h (NT/Win95 differences)
{
struct // Win95 fields
{
PVOID* pProcess; // 30h Pointer to owning process database
} WIN95;
} TIB_UNION3;
} TIB, *PTIB;
能力值:
( LV2,RANK:10 )
3 楼
又是英文.........................
能力值:
(RANK:410 )
4 楼
mov eax,fs:[18] ; 取得tib结构地址。
mov eax,[eax+30h] ;取得tib->pProcess指向的pProcess
movzx eax,BYTE ptr [eax+2] ; 判断pProcess指向的地址是否为0,如果不为0,则被调试状态。
test al,al
jnz IsDebugger
ret
IsDebugeer:
MessaegBox(0,"你正使用调试器调试我!",NULL,MB_OK)
mov eax,fs:[30] ;这一句和上面的mov eax,fs:[18],mov eax,[eax+30]的作用是一样的,只是这里将上面两条指令简化成一条指令而已。
能力值:
( LV2,RANK:10 )
5 楼
[QUOTE=小虾;426306]mov eax,fs:[18] ; 取得tib结构地址。
mov eax,[eax+30h] ;取得tib->pProcess指向的pProcess
movzx eax,BYTE ptr [eax+2] ; 判断pProcess指向的地址是否为0,如果不为0,则被调试状态。
test ...[/QUOTE]
非常感谢,原来是这样,那如果强行改写那个PPROCESS指向地址内容应该没问题吧。
能力值:
(RANK:410 )
6 楼
没问题,OD的隐藏插件就是改写那个地址内容为零的。