21 СПОСОБ ОБНУЛИТЬ РЕГИСТР ~~~~~~~~~~~~~~~~~~~~~~~~~~ Как-то ночью, от нехуй делать был написан это текст. Здесь приводятся всякие способы обнуления регистров - от простых и до самых изощренных, но вот чего тут нет - так это полных извращений, типа обнуления по одному биту, автогенерируемого кода и т.п. 1. Обнуление MOV-ом mov r, 0 2. Заменяем MOV на эквивалентные ему PUSH и POP push <something-equal-to-0> pop r 3. Самый хакерский способ: вычитаем регистр сам из себя. sub r, r 4. Ксорим (тоже неплохой способ... но... как-то не то...) Попутно (c) на название картины: "арвихакер, ксорящий ворды в уме" xor r, r 5. Тоже неплохой способ, правда нахуй никому не нужный. and r, 0 6. Более хитро: умножим на 0. imul r, 0 7. Сдвиг (не путать со спрыгом). X1+X2 в сумме больше/равно размера регистра в битах, по отдельности меньше. Меньше потому, что берется по модулю. shr/shl/sal r, X1 ; X1<=31, X2<=31, X1+X2>=32 shr/shl/sal r, X2 ; 8. Более извратный сдвиг. clc rcr/rcl, X1 clc rcr/rcl, X2 9. Не совсем честный способ, но... or reg, -1 inc/not reg 10. Обнулим (E)CX. (хотя так можно и охуеть) loop $ 11. Обнулим EDX. shr eax,1 cdq 11. Обнулим AL. (AH=AL,AL=0) aam 1 12. Обнулим AH aad 0 13. Опять AL clc setalc ; opcode: 0xD6 14. Более хитро: прочитаем 0 из порта (например порт 81h) mov dx, <some-port-number> in al, dx 15. Опять AL stc setnc al 16. А тут кто-нибудь в доку полезет. 5 раз bsf либо bsr. bsf r, r bsf r, r bsf r, r bsf r, r bsf r, r 17. Воспользуемся нулевым дескриптором из GDT sgdt [esp-6] mov r, [esp-4] mov r, [r] 18. Считаем ноль из сегмента FS (PE файл) mov r, fs:[10h] ; константа по вкусу, был бы ноль 19. Цикл (повторюсь: здесь главное не охуеть) inc/dec r ; это несколько долго jnz $-1 20. Вызовем какую-нить функцию с кривыми параметрами (вернется NULL в EAX) call GetCurrentObject 21. Используем сопроцессор fldz fistp dword ptr [esp-4] mov eax, [esp-4] 22, 23, 24, ... Предлагаются также следующие варианты обнуления регистра: - сканирование цепочки обработчкиков SEH до победного нуля - сканирование цепочки хендлов файлов до нуля (для этого надо сначала положить в регистр хендл открытого файла нулевого кольца, а перед этим перейти в ноль и открыть этот файл) - считывание нуля из случайного файла (потребуется генератор случайных чисел) - вычисление синуса от Pi * n (умножать командой FMUL) - сортировка памяти и поиск нуля как минимального элемента - определение нуля как константы (в исходнике) - создание специального макроса для генерации нуля - запуск вируса и подсчет количества оставшихся файлов ...