Как-то ночью, от нехуй делать был написан это текст. Здесь приводятся
всякие способы обнуления регистров - от простых и до самых изощренных, но
вот чего тут нет - так это полных извращений, типа обнуления по одному
биту, автогенерируемого кода и т.п.
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
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)
- сортировка памяти и поиск нуля как минимального элемента
- определение нуля как константы (в исходнике)
- создание специального макроса для генерации нуля
- запуск вируса и подсчет количества оставшихся файлов
...
Z0MBiE
Статья для журнала Top Device
|