DLL и стек

Тема в разделе "WASM.BEGINNERS", создана пользователем paralvic, 17 мар 2011.

  1. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Удобная вещь стек для того, чтобы побродить по лабиринтам с данными.
    Никогда не заблудишся. Перед поворотом записал, идёшь назад читаешь. Что-то типа клубка Ариадны.


    Столкнулся с малюсенькой проблемкой. Но сам решал её несколько дней :) с перерывами :)
    Суть:
    Как увеличить стек у программы.
    Код (Text):
    1. ;goto assemble
    2. ; #########################################################################
    3. ;  Задача немного увеличить стек у программы. Очень удобно с ним работать.
    4. ; #########################################################################
    5. ; #########################################################################
    6.       .586
    7.       .model flat, stdcall  ; 32 bit memory model
    8.       option casemap :none  ; case sensitive
    9.       include \MASM32\INCLUDE\windows.inc
    10.       include \MASM32\INCLUDE\masm32.inc
    11.       include \MASM32\INCLUDE\gdi32.inc
    12.       include \MASM32\INCLUDE\gdiplus.inc
    13.       include \MASM32\INCLUDE\user32.inc
    14.       include \MASM32\INCLUDE\kernel32.inc
    15.       includelib \MASM32\LIB\masm32.lib
    16.       includelib \MASM32\LIB\gdi32.lib
    17.       includelib \MASM32\LIB\gdiplus.lib
    18.       includelib \MASM32\LIB\user32.lib
    19.       includelib \MASM32\LIB\kernel32.lib
    20. ; #########################################################################
    21.     m2m MACRO M1, M2
    22.      push M2
    23.      pop  M1
    24.     ENDM
    25. .data
    26.     Prg db "BPP_Orientir.dll",0 ;"Ориентир.exe", 0
    27.     hPrg dd 0
    28.     _dd dd 0
    29.     material dd 0
    30.     material_len dd 0
    31.     hMemory dd 0
    32. ;-------------------------------------------------------------------------------------------------------------
    33. ; Это данные заплаток --->
    34.     MyName db "  (с) Пархоменко   Александр ", 10 dup(" "), 0dh, 0ah, "$", 0
    35.  
    36.     NewStackReserv  dd 08000000h
    37.     NewStackSize    dd 04000000h
    38. ;-------------------------------------------------------------------------------------------------------------
    39. .code
    40. ;--------------------------------------------------------------------------------------------------------------------------------
    41. start:
    42.  
    43.         invoke CreateFileA, addr Prg, 10000000h, FILE_SHARE_READ, 0,  OPEN_EXISTING, 0, 0
    44.     mov hPrg, eax
    45.     invoke GetFileSize, hPrg, addr _dd ;возвращает в еах а если графика более 4-х гигов то и сюда, будет ли это когда-нибудь ;-)
    46.     mov material_len, eax
    47.    
    48.     invoke GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, material_len ;MEMSIZE
    49.     mov   hMemory,eax
    50.     invoke GlobalLock, hMemory
    51.     mov   material, eax
    52.  
    53.     invoke ReadFile, hPrg, material, material_len, addr _dd, 0   ;_dd = возврат сколько прочитано
    54.    
    55.     mov esi, material
    56. ;   mov dword ptr [esi+04eh], " !iH"
    57.     mov eax, esi
    58.     add eax, 04eh
    59.     invoke lstrcpyA, eax, addr MyName
    60.  
    61.     mov dword ptr eax, [esi+03ch]
    62.     add eax, esi
    63.     .if word ptr [eax] == "EP"
    64.     m2m dword ptr [eax+060h], NewStackReserv
    65.     m2m dword ptr [eax+064h], NewStackSize
    66.    
    67.     ;invoke MessageBox, 0, addr Prg, addr Prg, 0
    68.     .endif
    69.  
    70.     invoke SetFilePointer, hPrg, 0, 0, 0
    71.     invoke WriteFile, hPrg, material, material_len, addr _dd, 0   ;_dd = возврат сколько прочитано
    72.     invoke CloseHandle, hPrg
    73.  
    74.     invoke ExitProcess,eax
    75. end start
    76. ;:assemble
    77. ;@echo off
    78. ;call \masm32\BIN\BLDALLMY.BAT StackPatch
    79. ;exit
    Просто записываем новые значения размера стека в PE-заголовок.
    Да можно с памятью подругому разобраться, например выделить хип.
    Но это не суть важно.
     
  2. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Как видите из исходника, работаем с DLL-кой.
    И у меня появлялась прелесть типа такого

    [​IMG]

    РЕШЕНИЕ:
    РАЗМЕР СТЕКА DLL НЕ МОЖЕТ БЫТЬ БОЛЬШЕ РАЗМЕРА СТЕКА ВЫЗЫВАЮЩЕЙ ПРОГРАММЫ

    Правим стек программы и наслаждаемся результатами.
    :)
     
  3. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Шо такое "стек DLL"? Стек есть у потока, а больше ни у кого стека не бывает.
    Вообще, топик ни о чём. Стек увеличивается автоматически операционкой по мере того, как поток пихает туда новые фреймы.
    Никаких операций с PE заголовком не требуется.
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Ursus
    Стек увеличивается не больше величины поля SizeOfStackReserve из заголовка исполняемого файла. Хотя не спорю, что выводы paralvic — чепуха.
     
  5. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    l_inc
    привет
    поясни(я не знаю)
    что точно значит StackReserve и StackCommit, HeapReserve и HeapCommit
    получится?
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    edemko
    Это шуточный вопрос? Что там пояснять-то? Ну ладно... поиграем, посмотрим:
    SizeOfStackReserve — размер пространства адресов, который будет зарезервирован загрузчиком под стек первичного потока (а также дальнейших потоков в случае выбора дефолтного значения при вызове CreateThread) в виртуальном АП процесса. В случае превышения размера стека этого значения приложение будет закрыто по необработанному исключению доступа к невыделенной памяти.

    SizeOfStackCommit — объём реальной (сохраняемой и управляемой системой) памяти, которая будет выделена загрузчиком под стек первичного потока (а также дальнейших потоков в случае выбора дефолтного значения при вызове CreateThread) в момент его создания. В случае превышения размера стека этого значения произойдёт исключение доступа к сторожевой странице и в обработчике память будет довыделена и отображена в ранее зарезервированное пространство виртуальных адресов.

    SizeOfHeapReserve и SizeOfHeapCommit аналогично указывают на зарезервированный и выделенный объём памяти для дефолтной кучи процесса. Сходный механизм, отличающийся в трёх пунктах от вышеописанного:
    1) При создании процесса (дефолтная) куча создаётся для всего процесса, а не локально для первичного потока.
    2) При создании дальнейших куч, значения по умолчанию не берутся из заголовка исполняемого файла.
    3) Расширение объёма памяти, выделенной для (дефолтной) кучи, происходит не по механизму обработки исключения доступа к сторожевой странице (как это сделано для стека), а в случае, если очередной HeapAlloc запросил объём памяти, превышающий объём памяти, выделенный для кучи на момент вызова HeapAlloc.
     
  7. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    получилось
     
  8. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Три ха-ха
    Ниодна Винда точно не увеличивает.
    Для каждого создаёт, но фиксированный.
     
  9. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Если вам не требуется зачем комментировать того, с чем не сталкивался?
     
  10. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
  11. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Да. Тема проще неуда.
    Но этот факт ограничения размера адресного пространства стека неплохо учитывать,
    равно как и то чем ограничено адресное пространство, когда подключаешься к процессу, который разрабатывал не ты.
    Никто ведь не будет спорить, что DLL подключить к инородному процессу проще всего.
    Или будем настраивать свои релоки и стараться не попасть под чужие.
     
  12. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    .
    Там:
    полстатьи обсуждение С++ параметра компилятора,
    ДОС безобразно работал с памятью,
    а защита сторожевой страницей ограничена и приводит к тому, что мы видим.