首页
社区
课程
招聘
[旧帖] [求助]请教一下高手 0.00雪花
发表于: 2008-3-10 11:37 3618

[旧帖] [求助]请教一下高手 0.00雪花

2008-3-10 11:37
3618
经常会在一些壳里发现诸如  
         MOV EAX,FS:[18]
             MOV  XXX,[EAX+X]
             ................
             或者
         MOV EAX,FS:[30]  
             MOV XXXX,[EAX+X]
            ..................
           接着就是一些对比运算和条件跳转之类指令,如果你调试器对这些代码直接调试则必死无疑.所以我想知道WINDOWS都在FS:[]这个地方都放了些什么东西(当然FS:[0]就不用再多讲了),请用中文说明列举一下,谢谢了.

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 2384
活跃值: (766)
能力值: (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;
2008-3-10 11:46
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
又是英文.........................
2008-3-10 11:48
0
雪    币: 2384
活跃值: (766)
能力值: (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]的作用是一样的,只是这里将上面两条指令简化成一条指令而已。
2008-3-10 12:24
0
雪    币: 200
活跃值: (10)
能力值: ( 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指向地址内容应该没问题吧。
2008-3-10 12:32
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
6
没问题,OD的隐藏插件就是改写那个地址内容为零的。
2008-3-10 12:34
0
游客
登录 | 注册 方可回帖
返回