2015-11-13 5 views
3

Мне нужно отладить приложение, написанное на C, которое читает и записывает в регистр сегментов FS. Чтобы отладить это приложение, мне нужно увидеть адрес памяти, на который указывает FS.Отладка с регистром сегментов FS

Приложение использует такой код:

mov rdx, fs:[rcx] 
mov fs:[rcx], rsi 

Как получить линейный виртуальный адрес чтения/записи из/в регистры сегмента? Я могу скомпилировать это приложение для Linux или Winodws.

+0

Windows использует FS для переменных «за поток», и несколько раз, когда я смотрел на код сборки, он преобразовывал FS: [...] в обычный виртуальный адрес. Текущее семя для rand() является одной из переменных «на поток», на что я смотрел. – rcgldr

+0

Связанные: http://stackoverflow.com/questions/6611346/how-are-the-fs-gs-registers-used-in-linux-amd64 –

ответ

4

На linux вы можете использовать arch_prctl(ARCH_GET_FS, &fsbase). В окнах, если FS указывает на TEB, как обычно, вы можете прочитать fs:[0x18], чтобы получить базовый адрес или использовать функции вашего отладчика, если они доступны.