PDA

Просмотр полной версии : 23 способа получить в регистре единицу.


0x0c0de
03.10.2007, 18:19
23 способа получить в регистре единицу.
От самых простых до самых извратных. Хорошая разминка для мозгов.

1. непохек

mov eax,1.

Просто положить в регистр единицу

2.
sub eax,eax /xor eax,eax (по отдельности не рассматриваю)
inc eax

Красиво, довольно коротко. Обнуляем, инкрементируем....

3. imul eax,0
inc eax

Тоже красиво. Обнуляем, инкрементируем

4. Сопроцессор, но тут нужна дополнительная переменная. mem dword ?

finit
fld1
fist mem
mov eax,mem

в eax - теперь 1
Сначала мы инициализируем сопроцессор (finit), потом загружаем в st0 1, потом отправляем
содержимое st0 в mem, mem ложим в eax )

5. Еще сопроцессор ( mem dword ?)

finit
fldpi
fcos
fchs
fist mem
mov eax,mem


То есть ложим в st0 число пи, находим косинус пи (-1), меняем знак, сохраняем значение

6. А теперь больше тригонометрии

finit
fldz
fcos
fist mem
mov eax,mem

Ищем косинус от нуля))))) А это 1)))

7. А еще можно так

sub eax,eax
sub al,-1

это 4 байта.

8. Самый мой любимый способ

sub eax,eax
bfs eax,0

В нулевой бит ложим 1=)

9. lea eax,[1]

Длинно, но все же....

10. Разновидность 5 метода, но беру модуль

finit
fldpi
fcos
fabs
fist mem
mov eax,mem

11.
sub eax,eax
dec eax
imul eax,eax

Ну это всем наверное ясно -1*(-1)=1

12. Этот способ я тоже люблю.
Делим двоичный логарифм 10 сам на себя.Аналогичный способ с любым др. числом (например с натуральным логарифмом 2 -
оба способа рассматриваются)

finit
fld2t
fld2t
fdiv st0,st1
fist mem
mov eax,mem


и соответственно


finit
fldln2
fldln2
fdiv st0,st1
fist mem
mov eax,mem


а можно еще с числом пи и десятичным логарифмом 2

finit
fldpi
fldpi
fdiv st0,st1
fist mem
mov eax,mem

и


finit
fldlg2
fldlg2
fdiv st0,st1
fist mem
mov eax,mem

13. Тригонометрия. Что-то меня тригонометрия в последнее время вдохновляет. Вариация на тему основного тригонометрического
тождества.

finit
fldln2 ; натуральный логарифм 2
fcos ; получаем косинус
fldln2
fcos
fmul st,st(1) ; (cos(ln2))^2
fldln2
fsin ; теперь синус
fldln2
fsin
fmul st(1),st ; (sin(ln2))^2
fincstp
fadd st,st(1) ; st0+st1=1 по основному тригонометрическому тождеству
fist mem


14. Красивый способ

stc ; установка флага переноса в 1
sbb eax,eax ; вычитание с заемом
neg eax ; -(-1)=1

15. В еax будет true, то есть 1

sub eax,eax
cmp eax,eax
sete al

16. Еще извратный способ

sub eax,eax
sub ecx,ecx
dec eax
mov cx,1fh
m1:
btc eax,ecx ; фишка в этой команде. инвертируем все биты, кроме последнего, тогда в самом регистре будет 1
loop m1

17.А еще можно так

sub eax,eax
stc ; установка флага переноса в 1
adc eax,eax ; сложнение с учетом флага переноса CF

18.Простенько, но со вкусом

sub eax,eax
or eax,1

19. Почти тоже самое

xor eax,eax
xor eax,1

20.Обалденный способ. 4 bsr над -1 и получаем 1)

sub eax,eax
dec eax
bsr eax,eax
bsr eax,eax
bsr eax,eax
bsr eax,eax

21. Тоже вариант

sub eax,eax
dec eax
shr eax,1fh ; логический сдвиг вправо

22. Скушный метод, но результат тот же

xor eax,eax
dec eax
and eax,1

23. Довольно неинтересно.. но все же

xor eax,eax
dec eax
neg eax

Пока на этом все......

Ni0x
03.10.2007, 18:39
Это все конечно круто, только зачем мне куча каких-то извращенных способов, если обычно используются 3-4 способа из списка? Причем по размеру они выигравают все остальные. Честно говоря, похоже на детское хвастовство, теперь сделай 23 способа как получить -1 в регистре. Без обид, но лучше вкладывать свой потенциал во что-то более серьезное.

0x0c0de
03.10.2007, 18:45
Ну цель вообще другая была... А именно

Хорошая разминка для мозгов


Выйти за рамки стандартных команд так сказать. Я таким образом после дня напряженной учебы расслабляюсь


теперь сделай 23 способа как получить -1 в регистре


думаю их больше... тоже мысль.

ЗЫ Ясное дело, что лучше всего


sub eax,eax
inc eax


это всего 3 байта. Но юзают-то в основном mov eax,1
а это 5 байт=\\\\ Так что материал полезен для общего развития)

Xserg
04.10.2007, 10:43
Пока на этом все......
+7 до 30

тоже 3 байта (константа до 255 для W32)
push 1
pop eax

с использованием API, которая обязательно возвратит 0
invoke IsWindow,-1
inc eax

; неудобный метод
push 1
push esp
pop esi
lodsd
pop esi

способ с исчезновением стека
stc ;<- 1
pushfd
xchg esi,esp
lodsd
xchg esi,esp
and eax,1

мешает отладке
call @1
dd 1
@1: pop eax
mov eax,[eax]

всего 11 байт запутанное зануление EAX
movzx ebx,ax
xchg ebx,eax
bswap eax
movzx ebx,ax
xchg ebx,eax
inc eax

полное извращение, но прикольно
call @2
@2: pop esi
push esi
std
lodsb
sub [esp],esi
cld
pop eax

dmnt
16.11.2007, 21:29
вы таки шеллкодесов не писали
тут есть таки разница что использовать

nerezus
16.11.2007, 22:01
это всего 3 байта. Но юзают-то в основном mov eax,1
а это 5 байт=\\\\ Так он понятнее. Понятность кода намного важнее размера и скорости ) Есть конечно пара исключений, но это редкость.

Piflit
16.11.2007, 22:26
Понятность кода намного важнее размера и скорости )
-1. для понятности существуют комментарии

Hellsp@wn
16.11.2007, 23:15
ещё так... тока мсысл всего этого? =) нету...

Xor eax,eax
Mov Al,1

Forcer
16.11.2007, 23:15
А я наоборот, полностью согласен с nerezus. Скорость, быстродействие - зависит от скила кодера в данный момент времени. А вот понятность кода, возможность его модернизации - это, так сказать, на все времена! Но это отнюдь не означает, что надо писать медленный и алгоритмически неправильный код в ушерб понятности. надо знать меру : ). По теме: асм не знаю, заметил лишь одно: не "ложим", а "кладем" - рус.яз. рулит : )

0x0c0de
16.11.2007, 23:27
Клево. "Кладем"... Важное замечание такое)))))))))
В чем смысл? Я уже писала в чем смысл.... в далеком октябре. Читаем пост номер 1 вторая строка второе предложение. Читаем пост номер три. ЦЕЛИКОМ.


ещё так... тока мсысл всего этого? =) нету...

Xor eax,eax
Mov Al,1


нууууууу))))))) ну ладно... пусть будет. 31-й.

Jes
17.11.2007, 00:19
Мой код эффективнее :D :D :D
.386
.model flat, stdcall
ExitProcess PROTO ,:DWORD
MessageBoxA PROTO ,:DWORD, :DWORD, :DWORD, :DWORD
.data
MsgBoxCaption db "Внимание",0
MsgBoxText db "Нажмите пожалуйста клавишу A(обязательно с шифтом, а то прога заглючит нах)",0
.const
NULL equ 0
MB_OK equ 0
.code
Main:
INVOKE MessageBoxA, NULL, ADDR MsgBoxText, ADDR MsgBoxCaption, MB_OK

h
AX=0168 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0ABD ES=0ABD SS=0ABD CS=0ABD IP=0102 NV UP EI PL NZ NA PO NC
0ABD:0102 96 XCHG SI,AX
-
INVOKE ExitProcess, NULL
end Main

DWORD
17.11.2007, 22:54
Так он понятнее. Понятность кода намного важнее размера и скорости ) Есть конечно пара исключений, но это редкость.
Для этого есть "высокоуровневый ассемблер" - лучший язык в мире С. Ассемблер нужно использовать только там, где без него нельзя обойтись и можно использовать для оптимизации кода, ни о какой понятности кода речь не идет.

desTiny
20.01.2008, 22:34
а зачем писать fdiv st0,st1 когда проще fdivp?

0x0c0de
20.01.2008, 23:09
>> а зачем писать fdiv st0,st1 когда проще fdivp?

а вы предлагайте новые способы, не стесняйтесь. Следуйте примеру Xserg) Здесь я и не думала писать, что проще. Просто рассмотрела пару десятков извратных способов. mov eax,1 - это было весьма скушно.
Приятно, что тема не умерла и кому-то это еще интересно.

Delimiter
21.01.2008, 01:38
либо ослеп .... либо туплю!
не увидел банального
...
mov ax,256
xchg ah,al
...

zl0y
21.01.2008, 01:59
xor ecx,ecx
jecxz m
@m:
inc ecx

:)

вот только что еще пришло в голову

с loop

.....
@m:
loop m
.....
суть в том,что если надо обнулить ecx,то как раз будет цикл пока в ecx не будет 0,после чего можно inc ecx по желанию :)

Delimiter
21.01.2008, 02:35
хммммммм..... лупы пошли 8)))

mov ecx,3
mov eax,7
a: sub ax,cx
loop a

ZaCo
21.01.2008, 03:19
я теперь понял еще одно отличие кодера с античата (хэкера) от программиста: программист не будет искать еще один способ получить в регистре 1, и тем более через жопу, тогда как кодер с античата следуя манифесту хэкера задействует все самые бесполезные инструкции. что ж вы еще системные вызовы не подключили, по-моему супер это записать 1 на диск и считать ее же в регистр. 0x0c0de бездельник и тунеядец! эхх...

zl0y
21.01.2008, 03:20
Еще боюсь,что можно shr,shl

Схема команды: shl операнд,количество_сдвигов
Назначение: логический сдвиг операнда влево.
идея пришла вобще то давно )
shr eax,33 - 1 байт 8 бит - макс значение в 32 битном регистре(DWORD = 4 байтам или 32 бита),следовательно сдвинув регистр на 33 мы получим 0 :)

KEZ
21.01.2008, 04:11
Ещё можно сделать так. Запустить netcat на удаленном unix-хосте взломаном, приконектится со своего компа туда telnet'ом и послать единицу, а там руткит перехватит её в траффике, преобразует в число и засунет в регистр. Заодно потом в консоли можно на ascii-порнуху подрочить, за заслуги, как все настоящии хакеры по манифесту (вместо стандарта).

Talisman
21.01.2008, 14:36
обфусикатор для асма в студию!

krypt3r
21.01.2008, 15:13
По идее, математика не ограничивает получение единички в регистре 23 способами (или скока там уже). Способов десятки, сотни и тыщи :) Другое дело их реализация на асме =) А вообще, мой любимый способ, хоть он и заезженный до дыр

xorl %eax,%eax
incb %al

GlOFF
21.01.2008, 15:16
23 способа ;)
Нужно взять на вооружение. Для полиморфных технологий )))

gevara
21.01.2008, 20:40
Никто не задумывался что таких способов в принципе бесконечно много? чем вам не нравится, скажем:


xor edx,edx
lea eax,[edx+1]

xor eax,eax
lea eax,[eax-1]
neg eax

и ещё 10 миллионов способов используя всевозможные решистры, адреса памяти... Если на то пошло то и SEH можно раскрутить, зная что второе DWORD последней структуры -1 и взять от него neg.

desTiny
25.01.2008, 20:31
Жёсткий способ под дос:

.MODEL TINY
.CODE
org 0h
start:
push cs
pop ds
mov al, 10b
out 21h, al
shr ax; ax=1, клава заблокирована
...
mov ax, 4C00h
int 21h
end start