青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 54, comments - 32, trackbacks - 0, articles - 0
在一個(gè)線程出現(xiàn)異常行為時(shí),比如說(shuō)CPU占用率過(guò)高,拋出異常等,你一定想知道這個(gè)線程是由哪個(gè)模塊創(chuàng)建的。因此無(wú)論在哪個(gè)操作系統(tǒng)上,獲取線程名稱(chēng)是診斷線程相關(guān)問(wèn)題的重要一步。

從線程ID獲取線程名稱(chēng)通常的方法是,先獲取該線程的入口地址,然后枚舉進(jìn)程內(nèi)所有已加載模塊,最后判斷線程入口地址落在哪個(gè)加載模塊范圍內(nèi)。枚舉進(jìn)程內(nèi)已加載模塊可用Win32標(biāo)準(zhǔn)的CreateToolhelp32Snapshot/Module32First/Module32Next系列ToolHelp API得到。獲取線程入口地址則沒(méi)有線程的Win32 API可用。不過(guò)在Windows NT based操作系統(tǒng)上(包括Windows NT 4.0/2000/XP/2003,等),有一個(gè)未公開(kāi)的Native API可用:NtQueryInformationThread。其聲明如下:

DWORD WINAPI NtQueryInformationThread(
                HANDLE ThreadHandle,
                THREAD_INFORMATION_CLASS ThreadInformationClass,
                PVOID ThreadInformation,
                ULONG ThreadInformationLength,
                PULONG ReturnLength
                );

獲取線程入口地址可用:

 

DWORD GetThreadStartAddress(DWORD dwThreadId)
{
    HANDLE hThread 
= OpenThread(THREAD_ALL_ACCESS, FALSE, dwThreadId);
    DWORD retaddr, len, error;
    retaddr 
= len = 0;
    error 
= NtQueryInformationThread( hThread, 9&retaddr, sizeof(retaddr), &len );
    CloseHandle(hThread);
    
if( error != 0 )
        retaddr 
= 0;
    
return retaddr;
}

在Windows CE上就沒(méi)這么幸運(yùn)了,沒(méi)有任何現(xiàn)成的API可用。官方Windows CE Base Team的blog對(duì)這個(gè)問(wèn)題的回答是可以用Remote Kernel Tracker,不過(guò)這需要你build一個(gè)特殊的kernel image,enable一些profiler功能-這在顯示的問(wèn)題診斷中顯然是不實(shí)際的。那么有沒(méi)有辦法不需要什么特殊的配置就可像Windows桌面操作系統(tǒng)那樣獲得入口地址呢?有是有的,不過(guò)需要一些hack手段。仔細(xì)研究CE下的Thread內(nèi)核數(shù)據(jù)結(jié)構(gòu),就會(huì)發(fā)現(xiàn)Thread結(jié)構(gòu)中有一項(xiàng)是記錄線程入口地址的。

 

typedef struct Thread {
    DWORD _1[
3];
    PPROCESS pProc; 
/* 0C: pointer to current process */
    PPROCESS pOwnerProc; 
/* 10: pointer to owner process */
    DWORD _2[
18];
    DWORD dwStartAddr; 
/* 5c: thread PC at creation, used to get thread name */
    DWORD _3[
10];
}
THREAD, *PTHREAD; /* Thread */

因此要做的就是想辦法根據(jù)線程ID或handle得到這個(gè)數(shù)據(jù)。再研究,發(fā)現(xiàn)線程的Thread內(nèi)核數(shù)據(jù)結(jié)構(gòu)可通過(guò)句柄得到:

 

PTHREAD pTh = HandleToThread(ThreadHandle);

而且,在Windows CE下,線程ID和其handle的值是一樣的!!因此我們可以寫(xiě)一個(gè)這樣的函數(shù)從線程ID拿到入口地址:

 

 

DWORD GetThreadStartAddress(DWORD dwThreadId)
{
    DWORD dwStartAddress 
= 0;
    BOOL fOldMode 
= SetKMode(TRUE);
    PTHREAD pTh 
= HandleToThread((HANDLE)dwThreadId);
    
if (pTh)
    
{
        dwStartAddress 
= (DWORD)MapPtrToProcess((LPVOID)pTh->dwStartAddr, pTh->pOwnerProc->hProc);
    }

    
return dwStartAddress;
}

為了使用這些內(nèi)核數(shù)據(jù)結(jié)構(gòu),我們還需要另外一些輔助結(jié)構(gòu)和函數(shù),比較完整的代碼如下。當(dāng)然,官方肯定是不建議這么做的,但是重要的是解決問(wèn)題,你說(shuō)呢。

 

typedef struct Process {
    DWORD _1[
2];
    HANDLE hProc; 
/* 08: handle for this process, needed only for SC_GetProcFromPtr */
}
PROCESS, *PPROCESS;
typedef 
struct Thread {
    DWORD _1[
3];
    PPROCESS pProc; 
/* 0C: pointer to current process */
    PPROCESS pOwnerProc; 
/* 10: pointer to owner process */
    DWORD _2[
18];
    DWORD dwStartAddr; 
/* 5c: thread PC at creation, used to get thread name */
    DWORD _3[
10];
}
THREAD, *PTHREAD; /* Thread */

typedef 
struct cinfo {
    
char acName[4]; /* 00: object type ID string */
    uchar disp; 
/* 04: type of dispatch */
    uchar type; 
/* 05: api handle type */
    
ushort cMethods; /* 06: # of methods in dispatch table */
    
const PFNVOID *ppfnMethods;/* 08: ptr to array of methods (in server address space) */
    
const DWORD *pdwSig; /* 0C: ptr to array of method signatures */
    PPROCESS pServer; 
/* 10: ptr to server process */
}
 CINFO; /* cinfo */
typedef CINFO 
*PCINFO;

typedef 
struct _HDATA HDATA, *PHDATA;
struct _HDATA {
    DWORD _1[
2]; /* 00: links for active handle list */
    HANDLE hValue; 
/* 08: Current value of handle (nonce) */
    DWORD 
lock/* 0C: access information */
    DWORD 
ref/* 10: reference information */
    
const CINFO *pci; /* 14: ptr to object class description structure */
    PVOID pvObj; 
/* 18: ptr to object */
    DWORD dwInfo; 
/* 1C: extra handle info */
}
/* 20: sizeof(HDATA) */

#ifdef x86
struct KDataStruct {
    LPDWORD lpvTls; 
/* 0x000 Current thread local storage pointer */
    HANDLE ahSys[NUM_SYS_HANDLES]; 
/* 0x004 If this moves, change kapi.h */
    DWORD _1[
4];
    
ulong handleBase; /* 0x094 base address of handle table */
}
/* KDataStruct */
#endif
#ifdef ARM
struct KDataStruct {
    LPDWORD lpvTls; 
/* 0x000 Current thread local storage pointer */
    HANDLE ahSys[NUM_SYS_HANDLES]; 
/* 0x004 If this moves, change kapi.h */
    DWORD _1[
6];
    
ulong handleBase; /* 0x09c handle table base address */
}
/* KDataStruct */
#endif

#define HandleToThread(h) ((THREAD *)GetObjectPtrByType((h),SH_CURTHREAD))
#define HANDLE_ADDRESS_MASK 0x1ffffffc

void h2p(HANDLE h, PHDATA& phdRet)
{
    
if ((ulong)h < NUM_SYS_HANDLES+SYS_HANDLE_BASE && (ulong)h >= SYS_HANDLE_BASE)
        h 
= ((KDataStruct*)PUserKData)->ahSys[(uint)h-SYS_HANDLE_BASE];
    
if (h)
    
{
        phdRet 
= (PHDATA)(((ulong)h & HANDLE_ADDRESS_MASK) + ((KDataStruct*)PUserKData)->handleBase);
        
if (phdRet->hValue != h)
            phdRet 
= 0;
    }

    
else
        phdRet 
= 0;
}


PVOID GetObjectPtrByType(HANDLE h, 
int type)
{
    PHDATA phd;
    h2p(h, phd);
    
return (phd && phd->pci && phd->pci->type==type) ? phd->pvObj : 0;
}


extern "C" LPVOID WINAPI MapPtrToProcess(LPVOID lpv, HANDLE hProc);
extern "C" BOOL WINAPI SetKMode(BOOL fMode);

DWORD GetThreadStartAddress(DWORD dwThreadId)
{
    DWORD dwStartAddress 
= 0;
    BOOL fOldMode 
= SetKMode(TRUE);
    PTHREAD pTh 
= HandleToThread((HANDLE)dwThreadId);
    
if (pTh)
    
{
        dwStartAddress 
= (DWORD)MapPtrToProcess((LPVOID)pTh->dwStartAddr, pTh->pOwnerProc->hProc);
    }

    
return dwStartAddress;
}

Feedback

# re: [轉(zhuǎn)載]Hacking Windows CE: 如何從線程ID獲取線程名稱(chēng)   回復(fù)  更多評(píng)論   

2014-12-17 10:30 by 獵頭招聘
這篇文章我找了很久,很實(shí)用,收下了。

只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区三区视频在线看| 国产精品久久久久久久久动漫| 国产精品一区一区三区| 亚洲女与黑人做爰| 亚洲一区二区四区| 国产亚洲成年网址在线观看| 久久精品中文字幕一区| 久久先锋影音| 日韩午夜av在线| 99精品视频一区二区三区| 国产精品日韩欧美综合| 久久精品国产亚洲精品| 久久亚洲综合色| 洋洋av久久久久久久一区| 中国成人亚色综合网站| 国产一区二区视频在线观看| 欧美成人在线免费视频| 欧美色欧美亚洲另类二区| 欧美中文字幕在线观看| 欧美91视频| 午夜影院日韩| 免费成人小视频| 亚洲欧美中日韩| 久久影院午夜片一区| 亚洲视频免费看| 久久精品首页| 亚洲欧美另类久久久精品2019| 欧美中文日韩| 亚洲午夜一二三区视频| 久久久国产亚洲精品| 在线亚洲欧美视频| 久久大综合网| 欧美人交a欧美精品| 久久久国产午夜精品| 欧美少妇一区| 欧美华人在线视频| 国产一区二区在线观看免费播放 | 亚洲三级性片| 亚洲女ⅴideoshd黑人| 亚洲欧洲一区二区三区久久| 亚洲欧美一区二区三区久久| 一区二区三区蜜桃网| 美女精品国产| 久久精品亚洲热| 国产精品视频免费在线观看| 亚洲精品美女在线观看播放| 国产精品久久久久国产a级| 欧美黄色小视频| 伊人成年综合电影网| 亚洲综合二区| 亚洲欧美日韩久久精品 | 午夜精品久久| 亚洲一本视频| 欧美日韩精品在线观看| 亚洲福利国产| 亚洲国产婷婷香蕉久久久久久| 欧美一区免费视频| 欧美影院在线| 国产日韩欧美在线一区| 亚洲专区在线视频| 亚洲欧美视频| 国产精品午夜春色av| 亚洲一级黄色| 性欧美xxxx大乳国产app| 国产精品卡一卡二| 这里只有精品视频在线| 亚洲免费在线视频| 国产精品无码永久免费888| 一区二区三区四区五区精品视频| 亚洲精品小视频| 欧美激情亚洲激情| 亚洲美女中出| 午夜精品久久99蜜桃的功能介绍| 国产精品毛片大码女人| 亚洲欧美国产77777| 久久久91精品国产一区二区精品| 国产亚洲观看| 美女日韩在线中文字幕| 亚洲人成欧美中文字幕| 国产精品99久久久久久久女警 | 欧美日韩国产在线播放| 亚洲精品一区二区三区在线观看| 亚洲天堂av电影| 国产美女诱惑一区二区| 久久精品国产999大香线蕉| 蜜桃久久精品乱码一区二区| 91久久中文| 国产精品久久久久久影视| 欧美一级艳片视频免费观看| 欧美 日韩 国产 一区| 一区二区欧美亚洲| 国产精品日韩在线观看| 久久久久久日产精品| 亚洲自拍都市欧美小说| 国产日韩一区二区| 久热综合在线亚洲精品| 一区二区三区三区在线| 久久综合激情| 亚洲视频免费看| 伊人男人综合视频网| 欧美日韩伊人| 久久一区二区三区av| 亚洲视频每日更新| 欧美成人免费视频| 亚洲一区在线观看免费观看电影高清| 国产丝袜一区二区| 欧美日产一区二区三区在线观看| 亚洲欧美激情精品一区二区| 亚洲高清电影| 久久99伊人| 亚洲社区在线观看| 在线成人小视频| 国产精品天美传媒入口| 你懂的网址国产 欧美| 午夜在线精品偷拍| 日韩视频在线观看一区二区| 老妇喷水一区二区三区| 亚洲欧美日韩视频一区| 亚洲精品国产精品久久清纯直播| 国产精品试看| 欧美视频在线观看一区| 久久综合国产精品| 欧美一区二区三区久久精品| 日韩午夜免费| 亚洲国产天堂久久综合| 久久只精品国产| 欧美制服丝袜第一页| 亚洲午夜视频在线观看| 亚洲最新色图| 亚洲国产天堂久久国产91| 国产在线视频欧美| 国产伦精品一区二区三区在线观看 | 香蕉亚洲视频| 亚洲一区二区在线播放| 在线视频欧美日韩| 亚洲精品在线三区| 91久久视频| 亚洲日韩第九十九页| 亚洲国产小视频在线观看| 一区免费观看| 一区国产精品| 亚洲人成人一区二区在线观看| 尤物视频一区二区| 亚洲大胆av| 亚洲国产91色在线| 亚洲人www| 亚洲美女黄网| 亚洲素人在线| 亚洲自拍偷拍视频| 欧美怡红院视频| 久久久久久久综合色一本| 欧美在线一二三区| 久久理论片午夜琪琪电影网| 久久裸体视频| 欧美成人精品在线| 亚洲电影毛片| 在线亚洲成人| 久久国产精品久久国产精品| 久久精品成人| 欧美华人在线视频| 欧美视频国产精品| 国产欧美一区二区三区在线老狼 | 久久夜色精品| 欧美丰满高潮xxxx喷水动漫| 亚洲国内在线| 欧美一区二区三区视频在线 | 亚洲欧美日韩国产综合在线| 欧美一区二区三区喷汁尤物| 麻豆国产va免费精品高清在线| 欧美韩国在线| 中国日韩欧美久久久久久久久| 亚洲欧美日韩在线观看a三区| 久久国产精品99国产精| 欧美成人一区二区三区| 国产精品久久久久久久午夜片| 国产在线一区二区三区四区| 亚洲破处大片| 欧美一区二区精品在线| 欧美不卡激情三级在线观看| 亚洲精品视频在线观看免费| 性欧美在线看片a免费观看| 蜜桃久久精品一区二区| 国产精品美女| 亚洲国产乱码最新视频 | 国产综合色在线| 亚洲精品少妇网址| 久久黄色级2电影| 亚洲国产精品久久精品怡红院| 亚洲一区二区在线视频 | 亚洲综合色噜噜狠狠| 蜜桃av一区二区三区| 国产日本欧美一区二区| 9国产精品视频| 美女视频黄 久久| 亚洲视频一二| 欧美精品福利在线| 在线不卡免费欧美| 久久精品99| 亚洲午夜一二三区视频| 欧美激情一区二区三区在线视频|