首页
社区
课程
招聘
[求助]ring3下是否无法从线程HANDLE取得线程ID?
发表于: 2009-7-28 16:29 5609

[求助]ring3下是否无法从线程HANDLE取得线程ID?

2009-7-28 16:29
5609
GetThreadId只有2003能用,其他系统是否无法从HANDLE取得线程ID?
现在程序中会开启一个多线程的处理模块,并且为每一个线程保存一个HANDLE,结束这个处理模块时会用WaitForMultipleObjects等待线程自己退出。
现在的问题是,某些情况下会在这些处理线程里面调用结束处理模块的函数,这样就会WaitForMultipleObjects等待自身退出,结果陷入死锁。
如果没有办法通过HANDLE取得线程ID,就只能在创建时多保存一个线程ID了。或者有没有办法判断两个HANDLE是否是属于同一个线程的句柄呢?

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
2
NtQueryInformationThread
ThreadBasicInformation

THREAD_BASIC_INFORMATION->ClientId
2009-7-28 16:40
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
谢谢,不过似乎是未公开的函数,最后一个参数的结构也查不到。
看来还是多保存一份线程Id保险一点。
2009-7-28 17:07
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
查Native API大全嘛~
2009-7-28 17:31
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
用Native API 没什么问题的    2K开始  一直到WIN7    没发现什么改动  
以后应该也不会有 MS 的强项就是向下兼容

到是内核结构不要乱用是真的
2009-7-28 19:25
0
雪    币: 60
活跃值: (670)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
你看这个枚举 TIB 有没用

#define                TIB_SIZE                        0x1000
#define                MIN_TIB_BASE                0x7FF00000
#define                MAX_TIB_BASE                0x7FFE0000

typedef        struct _TIB
{
        PVOID        pvExcept;
        PVOID        pvStackUserBase;
        PVOID        pvStackUserTop;
       
        struct
        {
                PVOID        SubSystemTib;
                ULONG        FilberData;
        }TIB_UNION1;

        PVOID        pvArbitrary;
        struct        _TIB *pSelf;

        struct
        {
                DWORD        dwUnknow1;
                DWORD        dwProcessID;
                DWORD        dwThreadID;
                DWORD        dwUnknow2;
        }TIB_UNION2;

        PVOID        *pvTLSArray;

        PVOID        *pProcess;

}TIB;

TIB                        ThreadArray[0x20]        =        {0};
//0012FFD4   805522FA
//0012FFD8   0012FFC8
//0012FFDC   89158530
//0012FFE0   FFFFFFFF  End of SEH chain
//0012FFE4   7C839AC0  SE handler
//0012FFE8   7C817070  kernel32.7C817070
//0012FFEC   00000000
//0012FFF0   00000000
//0012FFF4   00000000
//0012FFF8   004DECA2  MySelfHo.<ModuleEntryPoint>
//0012FFFC   00000000

// 从原始文件中获取 OEP 地址
static        DWORD                GetOEPOffsetFromRaw(char *szRawFile)
{
        DWORD        dwOEPOffset = 0;
        HANDLE        hFile        =        CreateFileA(szRawFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL) ;

        if(hFile == INVALID_HANDLE_VALUE)
                return 1;

        DWORD        dwReadBytes = 0;
        char *pReadBuffer =  (char *)malloc(0x1000);
        memset(pReadBuffer, 0, 0x1000);

        BOOL bRead = ReadFile(hFile, pReadBuffer, 0x1000, &dwReadBytes, 0);

        if(bRead)
        {
                DWORD        dwELF = *(PDWORD)(pReadBuffer + 0x3C);

                if(dwELF > 0 && dwELF < 0x1000)
                {
                        DWORD        dwPESign = *(PDWORD)(pReadBuffer + dwELF);

                        if(dwPESign == 0x4550)
                        {
                                dwOEPOffset = *(PDWORD)(pReadBuffer + dwELF + 0x28);

                               
                        }
                }
        }
        CloseHandle(hFile);

        free(pReadBuffer);

        return dwOEPOffset;
}

//  传入TIB 起始地址, 判断 pvStackUserBase - 4  
static        BOOL                CheckMainThreadId(DWORD        dwAddress, DWORD        dwOEP)
{

        if(*(PDWORD)(dwAddress - 0x8) != 0 && *(PDWORD)(dwAddress - 0x8) == dwOEP)
        {                               
                return        1; //此为主线程ID
        }

        return        0;
}

// Tib(Thread Info Block) 特征, offset 0x18  value = base, 0x24 tid
static        DWORD                CheckTIB(DWORD        dwAddress, PDWORD        pdwPEB)
{
        if(dwAddress == *(PDWORD)(dwAddress + 0x18))
        {
                if(*pdwPEB == *(PDWORD)(dwAddress + 0x30) && *(PDWORD)(dwAddress + 0x30) != 0)
                        return        *(PDWORD)(dwAddress + 0x24);
                else if(*pdwPEB        == 0 && *(PDWORD)(dwAddress + 0x30) != 0)
                {
                        *pdwPEB        =        *(PDWORD)(dwAddress + 0x30);

                        return        *(PDWORD)(dwAddress + 0x24);
                }
        }
        return        0;
}

static        DWORD                EnumProcssTIB()
{

        EnableDebugPrivilege( TRUE);

        HANDLE                hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
        DWORD                nTibCnt        =        0;
        DWORD                dwPEB        =        0;
        MEMORY_BASIC_INFORMATION mbi ;
        ZeroMemory(&mbi,sizeof(MEMORY_BASIC_INFORMATION));
        BOOL bLoop = TRUE;
        BOOL bIsFind = FALSE;

        mbi.BaseAddress        =        (LPVOID)MIN_TIB_BASE;
        mbi.RegionSize        =        0;
        while(bLoop)
        {
                bLoop = VirtualQueryEx(hProcess,(LPCVOID)((DWORD)mbi.BaseAddress+(DWORD)mbi.RegionSize),&mbi,sizeof(MEMORY_BASIC_INFORMATION));
                if(bLoop)
                {
                        if(mbi.RegionSize == TIB_SIZE && mbi.Protect == PAGE_READWRITE && mbi.Type == MEM_PRIVATE)
                        {
                                DWORD        dwTID = CheckTIB((DWORD)mbi.BaseAddress,        &dwPEB);
                                if(dwTID != 0)
                                {
                                        memcpy(&ThreadArray[nTibCnt++], mbi.BaseAddress, sizeof(ThreadArray));/*        =        dwTID*/
                                }
                        }
                }
                else if((DWORD)mbi.BaseAddress+(DWORD)mbi.RegionSize > MAX_TIB_BASE)
                        break;
                else
                {
                        bLoop        =        TRUE;
                        mbi.BaseAddress        =
                                (PVOID)((DWORD)mbi.BaseAddress + (DWORD)TIB_SIZE);
                        continue;
                }
        }

        return        nTibCnt;

}
2009-7-28 22:59
0
游客
登录 | 注册 方可回帖
返回
//