В ниже приведенном коде при срабатывании je nohandle(ecx=0) цикл повторяется. Какие могут быть причины? Код (Text): @loop: invoke CreateFile,addr diskbuf,GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL OR FILE_FLAG_NO_BUFFERING,0 mov ecx,0 inc eax je nohandle dec eax mov hfile,eax . . . . invoke CloseHandle,hfile mov ecx,2 nohandle: loop @loop
В этом и есть причина, что ecx равен нулю. loop сначала выполняет декремент, а потом сравнивает с нулем. Так что повторяться этому циклу еще 2^32 раз. Кстати, почему бы перед тем, как запостить вопрос, не проверить под OllyDbg?
если ты заметил, после выполнения loop ecx станет равным -1. делай выводы, что сначала идёт декремент, а потом сравнение)
Хм... а я, когда запостил, подумал, что мне это моё не оставят за ночь без внимания. Цикл-то бесконечный получается.
мне не понятно с какой целью mov ecx,2 , если сразу же после этого ему присваивается 0?? наверное ст'оит mov ecx,n перед циклом и постараться не использовать ecx в нем, а если уж используеш то сохраняй.
horpis Там не просто нуль ему присваивается, а там вызов апи, который с большой вероятностью по своему усмотрению его изменит. А вообще мы же не знаем, что кроется за точками. Может это полиморф, и там самомодифицирующийся код , который и этот mov ecx,2 тоже во что-то модифицирует. А может стоит перехват на CreateFile, и по состоянию ecx определяется, какой код выполнять в перехвате. Короче, хочу сказать, что в таких случаях лучше не обращать внимания, на то, как выглядит код, а ответить исключительно на вопрос, причем так, чтобы дать при этом автору подумать.
l_inc Ну тут можно много напридумывать. ИМХО просто код, который в точках обрабатывает файл, который сам же и открыл, и причем бесконечно много раз. Если пишешь полиморф должен знать алгортм работы команды loop =)