2013-04-23 36 views
8

我讀FastMM4的源代碼,並發現了這個有趣的功能GetThreadID組裝

function GetThreadID: Cardinal; 
{$ifdef 32Bit} 
asm 
    mov eax, FS:[$24] 
end; 
{$else} 
begin 
    Result := GetCurrentThreadID; 
end; 
{$endif} 

我測試過它,和它的作品,所以我的問題是,爲什麼它的工作原理任何解釋?

+2

關於TEB的另一個[必須看到鏈接](http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Thread/TEB.html)。 [MS文檔](http://msdn.microsoft.com/library/windows/desktop/ms686708)對此主題沒有用處。 – OnTheFly 2013-04-23 16:12:39

+0

相反,MS文檔非常好。由於這是私人實施,所以私人實施細節的正確文檔策略是保持私密性。 – 2013-04-23 20:04:04

+0

@DoctorLai,我很好奇,你爲什麼稱**閱讀記憶與**魔術**流離失所「有效」? – OnTheFly 2013-04-23 20:04:24

回答

8

x86的寄存器FS指向Thread Information Block Windows中的信息。地址FS + 0x24處的TIB中的值包含當前線程的ID。通過將該值移至用於傳遞函數返回值的eax,GetThreadID返回當前線程ID。

+0

所以,這意味着我可以使用FS + 0x20來返回進程ID。這必須比Windows單元中定義的效率更高。 – 2013-04-23 16:17:18

+3

它可能稍微更高效,但我在這裏告訴你,提取PID和TID不是程序中的瓶頸。 – 2013-04-23 17:30:23

+1

@David,從OP讀其他帖子,我不認爲OP有瓶頸。他更喜歡極端的優化......也許:) – kobik 2013-04-23 19:04:32

1

此方法使用存儲在Thread Environment Block

+1

漏洞利用不是正確的術語imho – Remko 2013-04-23 20:02:47

+0

@Remko謝謝,更改 – MBo 2013-04-24 03:07:42