Уничтожить буфер

Тема в разделе "WASM.BEGINNERS", создана пользователем TOLSTOPUZ, 15 дек 2008.

  1. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    В процессе кода по условию создаю буфер

    buf db 10 dup (?) ; для dwtoa , но не суть...

    После выполнения кода его можно уничтожить?
     
  2. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    NtFreeVirtualMemory||NtUnmapViewOfSection.
     
  3. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    TOLSTOPUZ
    Что-то я не совсем понял, как он так создается?
    Это же статический буфер.
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    TOLSTOPUZ
    1) В процессе кода - это как? Примерно, как в процессе кирпичной стены?
    2) В процессе исполнения кода нельзя создать буфер buf db 10 dup (?). Этот буфер создаётся либо загрузчиком, либо компилятором. Зависит от того, как рассматривается вопрос. В любом случае освобождение памяти, содержащей этот буфер, хоть и возможно, но чревато. Причём степень чреватости зависит от того, что ещё находится в одной секции с этим буфером.
    P.S. Слегка опоздал.
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    TOLSTOPUZ
    можно, я делаю так
    Код (Text):
    1.     sub esp,64; создаю временный буфер из 64 байт (обязательно кратно 4)
    2.     mov ebp,esp; запоминаю указатель на временный буфер (можно ebp, ebx, edi или esi)
    3.     push eax; число которое преобразую в hex-формат функцией wsprintf
    4.     call @f
    5.     db 'eax=%Xh',0 ;передаю формат
    6. @@: push ebp;передаю указатель на временный буфер
    7.     call _imp__wsprintfA
    8.     push MB_OK
    9.     call @f
    10.     db "MessageBox",0;заголовок MsgBox'а
    11. @@: push ebp;указатель на временный буфер
    12.     push 0
    13.     call _imp__MessageBoxA@16; вывожу значение в eax на экран
    14.     add esp,64+12; выравниваю стек после wsprintf и удаляю временный буфер
     
  6. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Может я не так выразился...
    Я имел ввиду по условию...
    Вроде этого.

    .code
    ...................
    cmp eax , 0
    jne @F
    .data
    buf db 10 dup (?)
    .code
    invoke dwtoa , addr buf
    .......................
    @@

    Т.е. буфер я создаю. Но после использования его наличие меня раздражает.
    Вот я и спросил, можно ли его уничтожить?

    P.S. Ага... Буфер с константой dup создаётся в любом случае, да?
    А можно сделать чтобы... Ну, только если условие вынуждает?
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    TOLSTOPUZ
    Код (Text):
    1. cmp eax , 0
    2. jne @F
    3. .data
    4. buf db 10 dup (?)
    супер !!! совет один - учить матчасть, разобраться что такое сегмент данных и понять что db в него попадают на этапе компиляции, а не в процессе работы программы ;)
    для создания временных буферов см. совет Mikl___, токо он там лишного намудрил и недзенный call вместо push + jmp приплёл, но это мелочи - ключевые слова:
    Код (Text):
    1. sub esp,64; создаю временный буфер из 64 байт (обязательно кратно 4)
    2. mov ebp,esp; запоминаю указатель на временный буфер (можно ebp, ebx, edi или esi)
    3. ...
    4. add esp,64+12; выравниваю стек после wsprintf и удаляю временный буфер
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    TOLSTOPUZ
    +1 к тому, что сказал Y_Mur. Единственное что...
    ... лучше сразу разбираться с секциями PE, чем сегментами данных. А то потом трудно будет понять, причём же всё таки были эти самые сегменты данных (кстати, ИМХО не причём).
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    по-подробнее пожалуйста, я записываю :) а как коротко (в байтах) втолкнуть в стек содержимое строки и указатель на неё? push <'abc',0> / push esp ?
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Mikl___
    call без ret нарушает работу предсказателя адресов возврата и на больших уровнях вложенности это уакнется тормозами всей вышестощей цепочки ret ;) а хочешь краткости - вынеси db из исполнимой части кода :) не обязательно даже в сегмент данных ;)
     
  11. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Mikl___
    Дзенно и коротко - не всегда одно и то же. :)
    В точку. Для коротких строк сам так иногда делаю. ИМХО неплохой метод скрыть строки в коде. Благо fasm позволяет (про masm не в курсе). А если учесть, что младший байт по младшему адресу, то можно и нуль не писать:
    push 'ing'
    push ' str'
    push 'tack'
    push 'My s'
    push esp
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    l_inc
    masm тоже позволяет, только придется "перевернуть" слово (Mikl --> lkiM)
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    звезда в шоке _)
     
  14. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    "По условию" память можно через VirtualAlloc выделять (но не менее 4096 байт по-моему).
     
  15. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    С памятью у меня вообще напряжённые отношения.
    Активно друг друга не любим.

    Выделяю память:
    invoke VirtualAlloc, 0 , 10*1024*1024, MEM_RELEAS+MEM_TOPDOWN короче

    mov memaddr, eax

    invoke VirtualAlloc , memaddr , 64*1024, мем_коммит короче

    всё это работает только до какого-то предела. (В размере). Стоит поместить в эту память больше чем скажем 5 kb, какая-то непонятка перезаписывает некоторые байты в этом участке. и нет никакой возможности защитить этот участок кода. Почему такая фигня и что может перезаписать участок памяти. ставил даже NO_ACCESS но ноль эмоций.

    И переписывает не чем попало, а всякими db-строками из этой же программы.

    Вот если бы отойти от начала моей программы подальше. Но я не знаю, как можно узнать начальный адрес моей программы в памяти. Где это прячется?
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    MEM_RELEASE это весело)))) MEM_RESERVE было бы гораздо лучше
     
  17. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Да, конечно MEM_RESERVE
    Запарился просто
     
  18. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Так ты же указал начальный адрес memaddr

    VirtualAlloc(<начальный адрес>,<размер в байтах>,<флаги>);

    Указывай 0 и всё будет в порядке.
     
  19. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Ааааааааа..... Попробую щас...
    Хотя вроде бы в своих статьях Y_MUR рекомендует резервировать память
    с начальным адресом ноль (типа система сама подберёт)
    а уже реально выделять
    VirtualAlloc , memaddr , и т.д.
    Наверное я что-то не так понял. щас попробую. Хорошо бы....
     
  20. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    TOLSTOPUZ
    Можно и сразу MEM_COMMIT с нулевым адресом - система сама подберёт ;)
    Резервировать адресное пространство нужно если ты "резиновый буфер" делаешь или свой менеджер блоков памяти ;) Просто похоже ты напутал флаги как уже отметил Great ;)
    И что-то мне подсказывает, что для твоей задачи HeapAlloc лучше будет ;)
    А если буфер <4кБ и совсем временный (чуть-чуть попользовался и на выброс) то его имхо лучше в стеке как у Mikl___