2015-05-23 2 views
2

Я хочу найти шаблон в память текущего процесса. Я запрашиваю страницы памяти с помощью VirtualQuery для извлечения интересующих диапазонов. Проблема заключается в том, что после 5 минут непрерывного цикла программа вылетает из stackoverflow. Размер выделенной памяти по процессу становится больше.инструкция lodsb вызывает переполнение стека

Проблема заключается в этом цикле:

valid_range: 
    pushad 
    mov eax, [ebp] 
    mov esi, [eax] ; memory range start 
    mov ecx, [eax + 12] ; memory range size 
    xor eax, eax 

loopmem: 
    lodsb ; this causes stackoverflow after certain time ???? 
    dec ecx 
    cmp ecx, 0 ; we loop trough memory until we finish it 
; reduced the code to minimum 
     je finish_range 
     jmp loopmem 


finish_range: 
    popad 
    ret 
+0

если я закомментировать LODSB все идет гладко – opc0de

+0

Это немного странно, вы получите переполнение стека, но вы можете убедиться, что вы только прикоснуться к страницам, которые совершаются и не установлен атрибут PAGE_GUARD. –

+0

Да выглядит так, что диапазон памяти был неправильным, но все еще не может объяснить, почему чтение памяти увеличивает его. – opc0de

ответ

0

Вы, вероятно, зондировании страниц, которые зарезервированы для стека. Это может привести к тому, что новые страницы стека будут распределены и, в конечном итоге, приведут к переполнению стека. От Microsoft Support:

В операционной системе Microsoft Windows NT переполнение стека обнаруживается аппаратным и программным обеспечением, работающим вместе, используя механизмы защиты страниц. Каждый новый процесс Windows NT имеет максимальный размер зарезервированного стека и начальное выделение стека. Фиксированная память физически выделена для процесса и поддерживается файлом страницы; это относительно «дорогой» ресурс. Зарезервированная память - это адресное пространство, которое не отображается в реальную память; это относительно «дешевый» ресурс.

По мере роста стека он перемещается из зафиксированной части памяти стека в зарезервированную или незафиксированную память. Когда это происходит, возникает ошибка страницы, и операционная система фиксирует другую страницу памяти в стеке. Если ошибка страницы возникает, когда стек уже вырос до максимального указанного размера, система сообщает об исключении переполнения стека.

Этот автоматический метод роста использует защитную страницу, зарезервированную, незафиксированную страницу памяти, которая смежна с фиксированной частью памяти. Когда приложение касается страницы защиты, операционная система фиксирует эту страницу, а следующая незафиксированная страница становится новой страницей защиты. Автоматический рост стека работает только для защитной страницы, а память стека должна увеличиваться на 4 КБ или на одну страницу. Если приложение касается другой зарезервированной, но незафиксированной страницы памяти стека, прежде чем она коснется страницы защиты, возникает обычное исключение ошибки страницы и может возникнуть непредсказуемое поведение.

Смежные вопросы