Сейчас на форуме: UniSoft, laslo, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Команды процессора длиной 15 байт - просто интересно.
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 43.8 (посетитель), 16thx
Активность: 0.020.06
Статус: Участник

Создано: 22 ноября 2010 03:55
· Личное сообщение · #1

При чтении всяческой литературы по ассемблеру постоянно попадается фраза, мол опкод может занимать до 15-ти байт памяти.
Интересно было бы посмотреть на эту монструозную команду длиной 15 байт (или команды - скорее всего их несколько).
Ну а для практики можно будет скормить эту команду всяким ассемблерам (fasm masm nasm и т.д.), вдруг какой-нибудь спотыкаться начнёт )




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 22 ноября 2010 09:32
· Личное сообщение · #2

Избыточными префиксами можно добить до любой длины. Только ассемблеры умные их повыкидывают скорее всего.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 22 ноября 2010 10:24 · Поправил: PE_Kill
· Личное сообщение · #3

bartolomeo читай про префиксы: http://www.exelab.ru/f/action=vthread&forum=12&topic=16993

PS Ну а так, если интересно вот например long nop недокументированная инструкция:

66 0F 1F 84 00 00 00 00 00

-----
Yann Tiersen best and do not fuck




Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 22 ноября 2010 11:22
· Личное сообщение · #4

PE_Kill пишет:
Ну а так, если интересно вот например long nop недокументированная инструкция

поясни немного, что это за long nop? чё делает? заранее спасибо.



Ранг: 65.4 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 22 ноября 2010 11:39 · Поправил: V0ldemAr
· Личное сообщение · #5

Такие нопы можно встретить в wow64:

Code:
  1. 00000000`78B62DC3: CC                             int         3
  2. 00000000`78B62DC4: CC                             int         3
  3. 00000000`78B62DC5: 6666660F1F840000000000         nop         [rax][rax][0]
  4. 00000000`78B62DD0: 4189ADB8000000                 mov         [r13][0000000B8],ebp
  5. 00000000`78B62DD7: 0F05                           syscall
  6. 00000000`78B62DD9: C3                             retn ; -^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-
  7. 00000000`78B62DDA: CC                             int         3





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 22 ноября 2010 11:47
· Личное сообщение · #6

MasterSoft пишет:
что это за long nop? чё делает? заранее спасибо.

Nop - No OPeration соотвественно ее предназначение - ничего не делать.

V0ldemAr пишет:
акие нопы можно встретить в wow64

А работают они и в x86. А в 64 битном режиме видимо удобно ими выравнивать код.

-----
Yann Tiersen best and do not fuck




Ранг: 65.4 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 22 ноября 2010 11:59
· Личное сообщение · #7

PE_Kill пишет:
А в 64 битном режиме видимо удобно ими выравнивать код.


Угу, что весьма странно ведь можно было и СС выровнать, компилятор должен знать сколько нужно записать байтов чтобы выровнать.



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 22 ноября 2010 11:59
· Личное сообщение · #8

PE_Kill пишет:
Nop - No OPeration соотвественно ее предназначение - ничего не делать.

...меня интересуется чо делает команда long nop, тоже самое только длиннее?



Ранг: 65.4 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 22 ноября 2010 12:00
· Личное сообщение · #9

тоже что и xchg eax, eax только длиннее




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 22 ноября 2010 12:42
· Личное сообщение · #10

Поинтересовался у чела, кто писал дизасм. Сходу смог выдать только на 9 байтов mov [12345678],12345678, где по 4 байта на disp и imm и 1 байт на опкод. Он же выразил подозрение, что на 15 байтов скорее всего в чистом виде инструкции нет. А ограничение растёт из разбиения: 4 байта на префиксы, 3 байта на опкод, по 4 байта на imm и disp, в итоге 15 байтов.



Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 22 ноября 2010 14:01
· Личное сообщение · #11

Archer пишет:
3 байта на опкод


Скорее: 1 - на опкод, 1 - ModRM, 1 - SIB

Вот на 14:





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 22 ноября 2010 15:10
· Личное сообщение · #12

rmn пишет:
Вот на 14

Это не чистая инструкция, а с префиксами. И к тому же невалидная, LOCK даст исключение.

rmn пишет:
Скорее: 1 - на опкод

В SIMD инструкциях может быть 3 байта на опкод.

-----
Yann Tiersen best and do not fuck





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 22 ноября 2010 15:15
· Личное сообщение · #13

Есть инструкции с 3-байтовыми опкодами без мод и сиб, так что всё же 3. К тому же МОД и СИБ включаются в опкод как бы. Что касается твоей инструкции, то LOCK неприменим к mov, вывалит исключение, но на 11 байтов в SIB можно нагородить, это да, типа mov [reg32+X*reg32+12345678],12345678, это я прозевал.



Ранг: 43.8 (посетитель), 16thx
Активность: 0.020.06
Статус: Участник

Создано: 22 ноября 2010 15:21
· Личное сообщение · #14

Ольга говорит что команда на 14 байт не валидная.
Похоже что среди 32-битных инструкций такого опкода нет - скорее всего он (они) 64-битный.

55a2_22.11.2010_CRACKLAB.rU.tgz - opcode.JPG




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 22 ноября 2010 15:44
· Личное сообщение · #15

bartolomeo олька говорит что для этой инструкции недопустим префикс LOCK о чем я уже выше написал, а сама инструкция вполне валидна.

-----
Yann Tiersen best and do not fuck




Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 22 ноября 2010 20:09
· Личное сообщение · #16

PE_Kill пишет:
Это не чистая инструкция, а с префиксами.

Как будто, префиксы не являются частью инструкции...

Вот валидная для 16-ти битного режима на 15 байт.






Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 22 ноября 2010 22:38
· Личное сообщение · #17

Для 16-битного режима? Откуда там тогда все константы и регистры 32-битные?
И префиксы 66/67 должны были поменять явно размер операндов. Выкинь эту генерилку, она хлам генерит.
И префиксы избыточные к тому же.



Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 22 ноября 2010 22:54
· Личное сообщение · #18

Archer пишет:
Для 16-битного режима? Откуда там тогда все константы и регистры 32-битные?
И префиксы 66/67 должны были поменять явно размер операндов. Выкинь эту генерилку, она хлам генерит.
И префиксы избыточные к тому же.


Читайте маны, сэр




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 22 ноября 2010 23:32
· Личное сообщение · #19

Аргументированный ответ на достаточно аргументированные претензии. Не буду злоупотреблять положением и стирать столь "полезный" пост.



Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 22 ноября 2010 23:39
· Личное сообщение · #20

Archer

ок, если нужны аргументы...

Что делают префиксы 66h и 67h в 16-ти разрядном режиме?




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 23 ноября 2010 02:30
· Личное сообщение · #21

объяснения лонг нопа в пдфке внизу ...

0F 1F имеет разную длинну нопа , в зависимости от того , что стоит после него


Например

Code:
  1. ===================================================
  2.           =================   Schkodik =)  ==================
  3.           ===================================================
  4.           $RESULT: INC ESP
  5.           $RESULT: 44
  6.           $RESULT: 00000001
  7.           $RESULT: ADD BYTE PTR DS:[EAX],0
  8.           $RESULT: 8000 00
  9.           $RESULT: 00000003
  10.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  11.           $RESULT: 0000
  12.           $RESULT: 00000002
  13.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  14.           $RESULT: 0000
  15.           $RESULT: 00000002
  16.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  17.           Nommer_commandi: 00000045
  18.           Lenght of jmp
  19.           eip: 00401005
  20.           Dlinna: 00000003
  21.           Command Mnemonik vs OPCode
  22.           address: 00401005
  23.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  24.           $RESULT: 0000
  25.           $RESULT: 00000002
  26.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  27.           $RESULT: 0000
  28.           $RESULT: 00000002
  29.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  30.           $RESULT: 0000
  31.           $RESULT: 00000002
  32.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  33.           ===================================================
  34.           =================   Schkodik =)  ==================
  35.           ===================================================
  36.           $RESULT: INC EBP
  37.           $RESULT: 45
  38.           $RESULT: 00000001
  39.           $RESULT: ADD BYTE PTR DS:[EAX],0
  40.           $RESULT: 8000 00
  41.           $RESULT: 00000003
  42.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  43.           $RESULT: 0000
  44.           $RESULT: 00000002
  45.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  46.           $RESULT: 0000
  47.           $RESULT: 00000002
  48.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  49.           Nommer_commandi: 00000046
  50.           Lenght of jmp
  51.           eip: 00401004
  52.           Dlinna: 00000002
  53.           Command Mnemonik vs OPCode
  54.           address: 00401004
  55.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  56.           $RESULT: 0000
  57.           $RESULT: 00000002
  58.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  59.           $RESULT: 0000
  60.           $RESULT: 00000002
  61.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  62.           $RESULT: 0000
  63.           $RESULT: 00000002
  64.           $RESULT: ADD BYTE PTR DS:[EAX],AL


Например тут 2 варианта с длинной в 2 и 3 , а вот пример с длинной в 5 и 6

Code:
  1. ===================================================
  2.           =================   Schkodik =)  ==================
  3.           ===================================================
  4.           $RESULT: TEST BYTE PTR DS:[EAX],AL
  5.           $RESULT: 8480 00000000
  6.           $RESULT: 00000006
  7.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  8.           $RESULT: 0000
  9.           $RESULT: 00000002
  10.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  11.           $RESULT: 0000
  12.           $RESULT: 00000002
  13.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  14.           $RESULT: 0000
  15.           $RESULT: 00000002
  16.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  17.           Nommer_commandi: 00000085
  18.           Lenght of jmp
  19.           eip: 00401008
  20.           Dlinna: 00000006
  21.           Command Mnemonik vs OPCode
  22.           address: 00401008
  23.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  24.           $RESULT: 0000
  25.           $RESULT: 00000002
  26.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  27.           $RESULT: 0000
  28.           $RESULT: 00000002
  29.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  30.           $RESULT: 0000
  31.           $RESULT: 00000002
  32.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  33.           ===================================================
  34.           =================   Schkodik =)  ==================
  35.           ===================================================
  36.           $RESULT: TEST DWORD PTR DS:[EAX],EAX
  37.           $RESULT: 8580 00000000
  38.           $RESULT: 00000006
  39.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  40.           $RESULT: 0000
  41.           $RESULT: 00000002
  42.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  43.           $RESULT: 0000
  44.           $RESULT: 00000002
  45.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  46.           $RESULT: 0000
  47.           $RESULT: 00000002
  48.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  49.           Nommer_commandi: 00000086
  50.           Lenght of jmp
  51.           eip: 00401007
  52.           Dlinna: 00000005
  53.           Command Mnemonik vs OPCode
  54.           address: 00401007
  55.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  56.           $RESULT: 0000
  57.           $RESULT: 00000002
  58.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  59.           $RESULT: 0000
  60.           $RESULT: 00000002
  61.           $RESULT: ADD BYTE PTR DS:[EAX],AL
  62.           $RESULT: 0000
  63.           $RESULT: 00000002
  64.           $RESULT: ADD BYTE PTR DS:[EAX],AL

Как правило имеет роль стоящая после комманда , а не операнд сам по себе , а так в процах еще столько всего интересного

9b61_22.11.2010_CRACKLAB.rU.tgz - Method of modifying an instruction set architecture of a computer processor to maintain backward compatibility.pdf

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 23 ноября 2010 02:47
· Личное сообщение · #22

Интересно то что вторая ольга определяет отдельный

Code:
  1. db 0fh, 1fh


как

Code:
  1. CPU Disasm
  2. Address   Hex dump          Command                                  Comments
  3. 00401000   .  0F1F00        NOP DWORD PTR DS:[EAX]
  4. 00401003      0000          ADD BYTE PTR DS:[EAX],AL


в тоже время проблема тут не видна , но видна будет например в этом примере простой мессаги ... хотя иногда ольга показывает странные вещи , раз через раз.

70e9_22.11.2010_CRACKLAB.rU.tgz - Anomalies.exe

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 39.6 (посетитель), 21thx
Активность: 0.020
Статус: Участник

Создано: 23 ноября 2010 05:50
· Личное сообщение · #23

bartolomeo пишет:
Интересно было бы посмотреть

в байтах легко! 3E3E3E3E3E3E3E3E3E3E3E3E3E3E90
в виде строки для ассемблера чтобы было 15 байтов 'на выходе'..., вряд ли, префиксы передерутся

Archer пишет:
ограничение растёт из разбиения: 4 байта на префиксы, 3 байта на опкод, по 4 байта на imm и disp, в итоге 15 байтов.

из разбиения вытекает 17 байтов (18 для x64)
4 prefix + 3 opcode + 1 modrm + 1 sib + 4 disp + 4 immed
только 'честной' команды такой длины нет

могу ошибаться за давностью лет, но ограничение в 15 байтов историческое и было еще в 16 битных процессорах




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 23 ноября 2010 07:07
· Личное сообщение · #24

rmn пишет:
Как будто, префиксы не являются частью инструкции

Ну а что тогда делаешь невалидные инструкции? Забей 14 раз 66 префиксы и 1 опкод и вот тебе 15 байт инструкция.

mak пишет:
0F 1F имеет разную длинну нопа , в зависимости от того , что стоит после него

Потому что long nop имеет mod rm и может иметь sib и всё остальное от этого и разная длинна, как и у других инструкций.

-----
Yann Tiersen best and do not fuck





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 23 ноября 2010 11:47
· Личное сообщение · #25

PE_Kill пишет:
mak пишет:
0F 1F имеет разную длинну нопа , в зависимости от того , что стоит после него
Потому что long nop имеет mod rm и может иметь sib и всё остальное от этого и разная длинна, как и у других инструкций.


Да , по сути это был пробел в домыслах , рассматривая это раньше не было инфы по этому поводу , а цель была найти ошибки в процессоре и скрытые возможности , на фоне ошибок кэша , эйфория не давала четко думать

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 23 ноября 2010 12:17
· Личное сообщение · #26

Для 16-битного режима? Откуда там тогда все константы и регистры 32-битные?
И префиксы 66/67 должны были поменять явно размер операндов. Выкинь эту генерилку, она хлам генерит.


Archer ты чего?
Режим 16-разрядный, операнды и адреса по умолчанию 16-разрядные.
Префиксы меняют размер операнда и размер адреса на 32-битный, отсюда и 32-битные регистры с константами.
Единственное REP там не в тему, но инструкция всё равно валидная.



Ранг: 6.7 (гость)
Активность: 0=0
Статус: Участник

Создано: 23 ноября 2010 16:18
· Личное сообщение · #27

sen
вы написали
3E3E3E3E3E3E3E3E3E3E3E3E3E3E90

пробую собрать таким образом

Code:
  1. d  label dword
  2.          
  3. db 3Eh, 3Eh, 3Eh, 3Eh,3Eh, 3Eh,3Eh,3Eh,3Eh, 3Eh,3Eh,3Eh,3Eh,3Eh, 90h
  4.  


компилируется в хрень вида

Code:
  1. 00401128 > $  3E:           prefix ds:                               ; Superfluous prefix
  2. 00401129   .  3E:           prefix ds:                               ; Superfluous prefix
  3. 0040112A   .  3E:           prefix ds:                               ; Superfluous prefix
  4. 0040112B   .  3E:           prefix ds:                               ; Superfluous prefix
  5. 0040112C   .  3E:           prefix ds:                               ; Superfluous prefix
  6. 0040112D   .  3E:           prefix ds:                               ; Superfluous prefix
  7. 0040112E   .  3E:           prefix ds:                               ; Superfluous prefix
  8. 0040112F   .  3E:           prefix ds:                               ; Superfluous prefix
  9. 00401130   .  3E:           prefix ds:                               ; Superfluous prefix
  10. 00401131   .  3E:           prefix ds:                               ; Superfluous prefix
  11. 00401132   .  3E:           prefix ds:                               ; Superfluous prefix
  12. 00401133   .  3E:           prefix ds:                               ; Superfluous prefix
  13. 00401134   .  3E:           prefix ds:                               ; Superfluous prefix
  14. 00401135   .  3E:90         nop                                      ; Superfluous prefix


как long nop собрать?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 23 ноября 2010 16:21
· Личное сообщение · #28

vw_ пишет:
как long nop собрать?

Эмм, вот так?:
Code:
  1. d  label dword
  2. db 66h,  0Fh, 1Fh, 84h, 00h, 00h, 00h, 00h, 00h


-----
Yann Tiersen best and do not fuck





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 23 ноября 2010 22:11
· Личное сообщение · #29

Это и есть лонг ноп, просто олька показывает по-тупому.
Что касается 16-битного режима и префиксов 66 и 67 в нём, я ступил, мой косяк, был неправ, мало работал в 16 битах.




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 09 февраля 2011 13:35
· Личное сообщение · #30

А что это такое, олька кажет чушь, а выполняется нормально:
Code:
  1. 0045EC59      33            DB 33                                    ; CHAR '3'
  2. 0045EC5A      D2            DB D2
  3. 0045EC5B      8D            DB 8D
  4. 0045EC5C      41            DB 41                                    ; CHAR 'A'
  5. 0045EC5D      14            DB 14
  6. 0045EC5E      42            DB 42                                    ; CHAR 'B'
  7. 0045EC5F      F0            DB F0
  8. 0045EC60   .  0FC110        XADD DWORD PTR DS:[EAX],EDX
  9. 0045EC63   .  8D41 08       LEA EAX,DWORD PTR DS:[ECX+8]
  10. 0045EC66   .  C3            RETN


-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh



. 1 . 2 . >>
 eXeL@B —› Программирование —› Команды процессора длиной 15 байт - просто интересно.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати