Чем можно заменить сложение вида a+b ?

Тема в разделе "WASM.A&O", создана пользователем EvilsInterrupt, 6 июл 2006.

  1. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Так пойдет?
    Код (Text):
    1.  mov eax,a
    2.  mov ebx,b
    3.  
    4.  mov ecx,32
    5.  @@pp:
    6.  mov edx,eax
    7.  xor edx,ebx
    8.  and ebx,eax
    9.  shl ebx,1
    10.  mov eax,edx
    11.  loop @@pp
    12.  mov r,eax
    Сразу не заметил, что для 32 надо.
     
  2. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Pavia
    Кааак.. говорит the Svin :))) Вобщем, я конечно приведу к 32битному коду, но зачем долго мучиться, что бы понять то, что ты хотел высказать?

    А в принципе, очень даже, я его еще громадной кучей esp применения разбавлю и будет неплохо :)
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Думаю мне бы MMX еще доконца понять, а ты уж XMM.
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    EvilsInterrupt
    Все просто. Сначало думал что тебе нужно для 16 разрядных оперендов, затем переправил на 32 разрядные оперенды. Цикл по 32 разрядом XOR это сложение по модулю 2. AND нужен, чтобы получить переполнение при сложении разрядов.
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    А нельзя ли попроще, типа
    Код (Text):
    1.   mov ecx,eax
    2.   xor ecx,ebx ;сложение mod 2
    3.   and eax,ebx ;переносы
    4.   shl eax,1   ;добавляем переносы
    5.   add eax,ecx
    Или add вообще нельзя использовать ?
     
  6. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Спасибо вам всем!
     
  7. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    EvilsInterrupt

    Еще так можно:
    Код (Text):
    1. test eax, 2EBD801h
    2. jmp $-4
    jmp $-4 подает управление на двойное слово 2EBD801h, что является
    Код (Text):
    1. add eax, ebx
    2. jmp $+4
    То есть упарвление в итоге получает код, следующий за инструкцией jmp $-4
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    mix_mix
    Вот-вот, причем вместо test eax,imm32 можно использовать любые операции r32,imm32 и двойное слово можно заменить на 2EBC303h. О подобных вариантах я автору пару раз намекал, но он почему-то упорно держится за "арифметику" :)
     
  9. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    leo
    У тебя мыло, есть?

    и не прозрачно намекал! :) Личные сообщения на кой икс нужны?
     
  10. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    leo
    Ну не совсем любые: всякие xor eax... add eax... mov ebx... в данном случае нельзя, ибо значение в eax/ebx изменится, а нам этого не надо.
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    mix_mix
    Ну я конечно утрированно сказал, имея ввиду, что при всяких хитрых арифметических операциях могут и другие регистры понадобиться, поэтому и здесь в принципе можно использовать ecx, edx и т.п.
     
  12. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    leo
    Pavia
    Ваши примеры не годятся,по простой причине, поясню кодом:

    sub ecx,edx

    как вы думаете, что будет если я заменю эту команду вашими примерами?

    Хотя из кода leo можно извлечь довольно интересные идеи :)
     
  13. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Если a + b < 32, то можно так:
    Код (Text):
    1. mov edx, 1
    2. mov ecx, eax
    3. shl edx, cl
    4. mov ecx, ebx
    5. shl edx, cl
    6. bsf eax, edx
    :)
     
  14. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    green
    Поставлю задачу по другому, вот работает обфускатор и видит он команду add reg1,reg2, причем reg1 , reg2 это любой регистр!!! может быть и eax,ebx,ecx etc!

    Следовательно код, который заменяет команду должен менять те регистры которые указаны в исходных регистрах и только!

    Что же в твоем коде? Я вижу что меняеется целых 3 регистра, а должно 2!
     
  15. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    EvilsInterrupt
    не ужели чёго то типа XenoCode 2005 хочешь написать
     
  16. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    EvilsInterrupt
    ну, тогда уж должно меняться не 2, а целый 1 регистр. :)
    И флаги соотв. тоже устанавливать.
    push/pop не катит?
     
  17. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    угадал! :) Несколько спецефично и для своих нужд!

    green
    этих push/pop уже весь код засрали! Я понимаю обфускация, но блин, когда много к памяти обращений, производительней приложение не становится.

    + ты прав, 1! :)
     
  18. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    EvilsInterrupt
    Нда, тогда имитация add с учётом флагов на входе/выходе и использованием 1 регистра будет весьма нетривиальной. :)
    А может не стоит вообще подвергать обфускации add, а сосредоточиться на более изолированных инструкциях ?
    Или работать не с одной, а с цепочкой инструкций? Особенно, если код написан на ЯВУ.
     
  19. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    2EvilsInterrupt

    Я вижу что меняеется целых 3 регистра, а должно 2

    А что в этом страшного? Ты же ассемблерный код собираешься превратить в фарш, непонятный для исследователя? Сохраняй регистры для увренности, потом восстанавливай их. Можно для каждой команды ассемблера сваять параметрические макросы (нескольких совершенно различных видов) и подставлять их вместо команд.

    Был такой пакет MacQuad, в который входили различные утилиты для работы с дискетами (кстати, с ее помощью можно было создавать всякие хитрые сектора или анализировать защищенные дискеты). Вот в ней было много фокусов в коде - понять было трудновато.
     
  20. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Кстати, есть хороший способ превращения кода в фарш, используется давно, можешь попробовать. Суть в перемешивании инструкций, разбрасывании их по телу программы и связывании посредством jmp, при этом активно используется переходы внутрь других инструкций (о чем тебе уже говорили).
    Например, вот такой кусок
    push ebp
    mov ebp, esp
    xor ecx, ecx
    push ecx
    xor eax, eax
    push eax
    call @1
    mov edx, eax
    ...

    превращается в
    push ebp
    jmp @2
    ...
    @4:
    call @1
    mov edx, eax
    jmp @5
    ...
    @2:
    mov ebp, esp
    xor ecx, ecx
    jmp @3
    ...
    @3:
    xor eax, eax
    push eax
    jmp @4
    ...
    @5:
    ...