Kdyby fungovalo to procházení pamětí, o kterým píšeš, tak by to byla pohoda. Jenže ne na všech adresách je alokovaná paměť, takže by to házelo exceptions, a to si asi nemůžeš dovolit.
FS se určitě nemění s tím, jak je binárka zkompilovaná. Přečti si něco o segmentaci v protected módu
Při vytváření threadu systém vytvoří segment a
segment selector dá do FS. Myslel bych si, že pro main thread bude tenhle selector vždycky stejnej, ale nedaří se mi to vygooglit. Třeba u CS je to jasný, ten je na x86 vždycky 0x23.
Získání té hodnoty by se dalo možná udělat trikově. Všechny segmenty kromě toho, na kterej ukazuje FS, mají limit 0xFFFFFFFF (je to vidět třeba v OllyDbg). Takže by se dalo zkusit:
mov eax, 0x23 ; 0x23 je CS selector, FS selector bude nejspíš vyšší hodnota
next:
inc eax
cmp eax, nejaka_rozumna_max_hodnota
ja fail ; nenalezeno
lsl ecx, eax ; Load Segment Limit
jnz next ; selector neexistuje
cmp ecx, 0xFFFFFFFF
je next ; nejde o FS selector
; teď je v eax FS selector
Takže takhle by šla do EAX získat hodnota FS bez toho, abys musel dělat
mov eax, fs.
EDIT: tímhle kódem by ses možná dostal k selektoru jinýho threadu, než svojeho, ale to by ti asi nevadilo.
Dál by šlo udělat třeba:
mov gs, eax
mov eax, gs:[18h]
nebo
push ds
mov ds, eax
mov eax, ds:[18h]
pop ds