всем привет. во время медитации меня отвлекло от созерцания следующее. fasm Code (Text): format PE GUI 4.0 entry start include 'win32a.inc' section '.idata' import data readable writeable library kernel32,'KERNEL32.DLL' include 'apia\kernel32.inc' section '.data' data readable writeable findMask db '*.exe',0x00 section '.code' code readable executable start: ;кладем на стек много всякой фигни, ;общий размер которой заранее неизвестен mov ecx, sizeof.FINDDATA sub esp, ecx mov edi, esp xor eax, eax rep stosb push ebp mov ebp, esp findData equ (ebp + 0x04) lea ecx, [findData] lea edx, [findMask] stdcall [FindFirstFile], edx, ecx смотрю в olly. после call: <ul type=disc> <li>eax = -1, т.е. хрен мне, а не поиск <li>LastErr = ERROR_NOACCESS (000003E6) </ul> попробовал в качестве параметра сунуть адрес структуры не в стеке, а в секции данных. заработала гадина. это что за ботва? как мне локальные структуры объявлять?
Code (Text): mov ecx, sizeof.FINDDATA Здесь ты смещаешь стек. Он ведь в 32-битном режиме должен быть кратен четырём. Размер FINDDATA - 013Eh. Ну и прибавь два байта для выравнивания. Вот так будет работать: Code (Text): mov ecx, 140h ЗЫ Надеюсь, я не помогаю создавать очередной вирусы, коих и так как грязи. :/
Прошу прощения за свое невежество. Только учусь. Вирус как раз и пишу. В учебных целях - лабо надо сделать. К тому же неплохая практика в асме. Распространять и что-то портить не вижу смысла. Еще вопросы. Я же могу сделать pushw ax. esp уменьшится на 2. К тому же очистка 13e байт работает. Правильно ли я думаю, что гадкая api проверяет esp на кратность 4? Если так, то все ли api так поступают?
Да, пожалуй, выше я неверно выразился. Лучше сразу учится разделять возможности процессора и требования других программ (в том числе ОСи). Если что-то не запрещено, это не значит, что оно совместимо. =) Нет. Допустим, той же GetCommandLine по барабану до значений стека (она состоит из одной полезной команды =) ). И вообще, ни одна API-функция, насколько я знаю, не проверяет подобных вещей. Почти все API в своём коде вызывают ядро, а там свой стек и видимо к стеку ring3 идут обращения в расчёте на кратность четырём от дна. Хотя это только догадка, если не лень – проверяй в SoftIce.