откуда берется ERROR_NOACCESS

Тема в разделе "WASM.ASSEMBLER", создана пользователем Artemy, 17 окт 2005.

  1. Artemy

    Artemy New Member

    Публикаций:
    0
    Регистрация:
    18 май 2005
    Сообщения:
    48
    Адрес:
    Russia
    всем привет. во время медитации меня отвлекло от созерцания следующее.

    fasm
    Код (Text):
    1.  
    2. format PE GUI 4.0
    3. entry start
    4.  
    5. include 'win32a.inc'
    6.  
    7. section '.idata' import data readable writeable
    8.  
    9.   library kernel32,'KERNEL32.DLL'
    10.  
    11.   include 'apia\kernel32.inc'
    12.  
    13. section '.data' data readable writeable
    14.         findMask            db '*.exe',0x00
    15.  
    16. section '.code' code readable executable
    17. start:
    18.         ;кладем на стек много всякой фигни,
    19.         ;общий размер которой заранее неизвестен
    20.         mov     ecx, sizeof.FINDDATA
    21.         sub     esp, ecx
    22.         mov     edi, esp
    23.         xor     eax, eax
    24.     rep stosb
    25.         push    ebp
    26.         mov     ebp, esp
    27.         findData            equ (ebp + 0x04)
    28.  
    29.         lea     ecx, [findData]
    30.         lea     edx, [findMask]
    31.         stdcall [FindFirstFile], edx, ecx
    32.  


    смотрю в olly.

    после call:

    <ul type=disc>

    <li>eax = -1, т.е. хрен мне, а не поиск

    <li>LastErr = ERROR_NOACCESS (000003E6)

    </ul>



    попробовал в качестве параметра сунуть адрес структуры не в стеке, а в секции данных. заработала гадина.

    это что за ботва? как мне локальные структуры объявлять?
     
  2. Bitfry

    Bitfry New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2004
    Сообщения:
    54
    Адрес:
    Россия, Санкт-Петербург
    Код (Text):
    1.  mov ecx, sizeof.FINDDATA


    Здесь ты смещаешь стек. Он ведь в 32-битном режиме должен быть кратен четырём.

    Размер FINDDATA - 013Eh. Ну и прибавь два байта для выравнивания.

    Вот так будет работать:
    Код (Text):
    1.  mov ecx, 140h




    ЗЫ Надеюсь, я не помогаю создавать очередной вирусы, коих и так как грязи. :/
     
  3. Artemy

    Artemy New Member

    Публикаций:
    0
    Регистрация:
    18 май 2005
    Сообщения:
    48
    Адрес:
    Russia


    Прошу прощения за свое невежество. Только учусь. Вирус как раз и пишу. В учебных целях - лабо надо сделать. К тому же неплохая практика в асме. Распространять и что-то портить не вижу смысла.



    Еще вопросы.

    Я же могу сделать pushw ax. esp уменьшится на 2.

    К тому же очистка 13e байт работает.

    Правильно ли я думаю, что гадкая api проверяет esp на кратность 4? Если так, то все ли api так поступают?
     
  4. Bitfry

    Bitfry New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2004
    Сообщения:
    54
    Адрес:
    Россия, Санкт-Петербург


    Да, пожалуй, выше я неверно выразился.

    Лучше сразу учится разделять возможности процессора и требования других программ (в том числе ОСи).





    Если что-то не запрещено, это не значит, что оно совместимо. =)





    Нет.

    Допустим, той же GetCommandLine по барабану до значений стека (она состоит из одной полезной команды =) ).

    И вообще, ни одна API-функция, насколько я знаю, не проверяет подобных вещей.



    Почти все API в своём коде вызывают ядро, а там свой стек и видимо к стеку ring3 идут обращения в расчёте на кратность четырём от дна.

    Хотя это только догадка, если не лень – проверяй в SoftIce.