Получить размер и смещение стека для треда.

Тема в разделе "WASM.BEGINNERS", создана пользователем Drag0N, 2 янв 2009.

  1. Drag0N

    Drag0N New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2008
    Сообщения:
    19
    Как получить размер и смещение стека на какойто конкретный момент для текущего потока?

    В общем случае стоит задача определения, является ли указатель "стековым".
    Я хочу определить это по формуле (Who >= StackBase) and (Who - StackBase < StackSize). Но для этого мне нужно получить смещение и размер стека. Как это можно сделать? Как ещё можно определить "стековость" указателя?
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    NtQueryInformationThread(... ThreadBasicInformation...) получишь структуру THREAD_BASIC_INFORMATION из которой получишь указатель на TEB, там по смещению 0 структура NT_TIB, в ней то что тебе надо
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Какой стек, юзермодный ?
    Чтоб ядерный получить нужно заюзоть SystemExtendedProcessesAndThreadsInformation.
    Если юзермодный, то для текущего потока смысла нет юзоть сервис для определения TEB, он адресуется сегментным регистром Fs. TEB работает в идеальном случае. Для любого потока следует получать его контекст, брать значения регистров Esp/Ebp и юзоть NtQueryVirtualMemory.
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    для текущего тож тогда можно еsp + NtQueryVirtualMemory...
    дык стек мог быть перенесен, тогда часть указателей на стек, указанный в ТЕБ, часть - в одном куске памяти с esp.
     
  5. Drag0N

    Drag0N New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2008
    Сообщения:
    19
    Решил пока сделать так:

    Код (Text):
    1. Function InStack(Who: ptr): Bool;
    2. var
    3.     StackBase, StackLimit: DWord;
    4. begin
    5.   asm
    6.     // Uses Windows NT_TIB, see: WinNT.h
    7.     // StackBase := GetStackBase;
    8.     mov eax, fs:[4];
    9.     mov StackBase, eax;
    10.     // StackLimit := GetStackLimit;
    11.     mov eax, fs:[8];
    12.     mov StackLimit, eax;
    13.     // StackSize := StackBase - StackLimit;
    14.   End;
    15.   // Так как стек растёт в сторону младших адресов, формула получилась вот такая:
    16.   // (странновато конечно, но что поделать: адрес может равняться лимиту, но не может равняться базе)
    17.   Result := (DWord(Who) >= StackLimit) and (DWord(Who) < StackBase);
    18. End;
    Заработало. В принципи для моей задачи ничего более сложного наверное не понадобится. Потому что стек я никуда не переношу, и ничего экзотического не делаю.

    А через NtQueryVirtualMemory - это как, можно чуть подробнее?
    что значит "TEB работает в идеальном случае"?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Drag0N
    Это когда никаких махинаций со стеком, TEB и прочим нет, довольно часто подобное реализуется в целях защиты приложения. NtQueryVirtualMemory - чтобы границы региона памяти выделенной под стек определить.
     
  7. Drag0N

    Drag0N New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2008
    Сообщения:
    19
    Clerk
    Всё понятно. А есть под рукой пару ссылок на примеры такой защиты и описание NtQueryVirtualMemory?
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    http://msdn.microsoft.com/en-us/library/aa366907(VS.85).aspx
    Про защиту тут на форуме по топикам Flasher'а пройдись посмотри.
     
  9. Drag0N

    Drag0N New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2008
    Сообщения:
    19
    Спасибо :)

    Интересно, а винда апдейдит TIB, если стек был переполнен и расширен автоматом?
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Да, при расширении стека также обновляется поле StackLimit в TEB.
     
  11. Drag0N

    Drag0N New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2008
    Сообщения:
    19
    Здорово :) Значит мой способ будет работать правильно и в таком случае :)

    P.S. Дальше можно не читать...