Аналоги инструкций

Тема в разделе "WASM.ASSEMBLER", создана пользователем in_ject, 10 авг 2008.

  1. in_ject

    in_ject New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    34
    злобные асмодеи, напишите пожалуйста как можно больше аналогов к каждой инструкции из нижеприведённого списка. Заранее благодарен всем кто откликнется :)

    push reg

    push val

    push [reg]

    mov reg, reg

    mov reg, [reg+val]

    add reg, reg

    add reg, val

    add [reg+val], val

    call reg

    jmp reg

    jmp rel

    call rel
     
  2. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Каких аналогов ???
    Сгугли на таблицу опкодов.
     
  3. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    in_ject Что за rel?
     
  4. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    2FED
    RELative offset :)
     
  5. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Видимо пишется морфер, вот и ищется что на что менять.
     
  6. in_ject

    in_ject New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    34
    CrystalIC, я имел ввиду не это, а то каким макаром можно заменить инструкцию, на другую или несколько других, но чтобы в результате давало тот же самый результат что и оригинал
     
  7. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    push можно заменить на

    sub esp,4
    mov [esp], ...

    call можно заменить на

    push адрес возврата
    jmp ...

    если надо сложить два регистра, например add eax,ecx можно сделать так

    lea eax,[eax+ecx] или lea eax,[eax+val]

    jmp можно заменить на

    push .... addr
    ret


    Та дофига чо можно напридумывать :)
     
  8. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    2FED
    ;)
    Код (Text):
    1. push адрес_возврата
    2. ret
     
  9. in_ject

    in_ject New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    34
    2FED, спасибо
     
  10. in_ject

    in_ject New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    34
    больше что то никто помогать не желает :)
     
  11. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    jCronuz ну так это совсем разные вещи, по рету просто происходит джамп, а в случае аналога call адрес должен указывать туда куда надо вернутся, тоесть на следующию инструкцию
     
  12. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    если учесть флаги то много явных замен отпадает
     
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    mov reg1, reg2 эквивалентно lea reg1,[reg2]
    mov reg1, reg2 эквивалентно xchg reg1,reg2 если значение в reg2 можно менять
    эквивалент xchg reg1,reg2 при условии, что reg1 ≠reg2
    xor reg1,reg2/xor reg2,reg1/xor reg1,reg2
    mov reg1,reg2 эквивалентно push reg2/pop reg1
    add reg1,reg2 эквивалентно mov ecx,reg2/a1: inc reg1/loop a1
    add reg1,reg2 эквивалентно xadd reg2,reg1
    add reg, val эквивалентно val раз комбинация из not reg/neg reg
    add reg, val эквивалентно sub reg,-val
    add esi,val можно заменить на lodsd,lodsw или lodsb если можно менять eax/ax/al
    add edi,val можно заменить
    на rep scas или rep stos или rep movs
    Для того чтобы спрятать сумму X и Y от посторонних глаз, помните, что ее эквивалентами являются:
    1) (X xor Y)+2*(X and Y)
    2) (X or Y)+(X and Y)
    3) 2*(X xor Y)–(X or Y)
    можно часть вычислений спрятать в сопроцессор add -> fadd
    jmp rel эквивалентно mov reg,0EB rel/jmp $-4
    аналоги jmp a
    1) push offset a/retn
    2) mov eax,offset a; более изощренная загрузка адреса перехода
    mov dword ptr [esp],eax
    retn
    3) call a
    ...
    a: pop ecx; удаляем из стека адрес возврата
    4) loop a; если до метки a ±127 байт и ecx ≠0
    5) jnc a; если в результате логической или арифметической операции CF не изменялся а до этого СF=0
    6) push seg a/push offset a/retf ;аналог jmp far a
     
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    аналоги mov reg,reg
    test ecx,ecx | test ecx,ecx
    jne a | cmoveq eax,ebx
    mov eax,ebx |
    a: ... |
    jmp a аналог xor ecx,ecx/jecxz a
    при умелом использовании аналогом mov reg,reg можно сделать cmpxchg reg,reg и cmpxchg8b [mem]
     
  15. in_ject

    in_ject New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    34
    Ого, Mikl___ спасибо))
     
  16. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Возникает вопрос, если это будет морфер, то с замена одной инструкции на несколько прийдётся как то раздвигать файл, тоесть там где была одна инструкция две или три не поместятся, а как быть с относительными переходами и т.д. у них же не обсолютный адрес прописан в опкоде а смещение которое поменяется при раздвижке. Всегда мучал этот вопрос, просветите.
     
  17. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    2FED
    Относительные переходы как раз не проблема -- мы знаем на сколько сдвинулся код, и дизассемблировав его можем выловить и пересчитать значения в Jcc.
     
  18. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    тоесть есть проблеммы по серьёзней?
     
  19. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Я не спец в этих вопросах, но для меня самое сложное -- отделить код от данных. Т.е. если мы пишем "внешний" метаморфер, который работает с уже готовыми исполняемыми, сделанными не тобой, то надо уметь понять, где код, а где данные -- данные не трогать, а код менять.
     
  20. in_ject

    in_ject New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    34
    Mika0x65, тоже самое хотел написать :)