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

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

  1. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Данны eax и ebx . Надо add eax,ebx заменить.

    Цель заменить обычный вид на что-либо другое и не используя следующие алгоритмы:

    lea eax,[eax+ebx]

    mov ecx,ebx
    @@:
    inc eax
    loop @B

    Пока не нашел, чем бы еще можно было заменить, любые команды допусаются, но не связанные с обычным сложением и циклическим инкрементом
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    a-(-b) не годится?
     
  3. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    А через сдвиги и умножение можно ли? Я пробовал, но не получилось
     
  4. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    если a и b 16-разрядные:

    imul b,-10000h
    sub a,b
    imul a,10001h
    shr a,16
     
  5. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    имею право умножить на imul a, 2*16 ?
     
  6. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    имеешь, только 2^16 должно быть в регистре, A должно быть в eax, а на edx нужно наложить маску 0FFFFh
     
  7. EvilsInterrupt

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

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

    Не пойму только, если ты говоришь что должны 16 разрядные, то этим разве ты не сдвинишь вообще в "никуда" число?
     
  8. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Я так понял, ты хочешь замаскировать эту операцию? Тогда можно сделать так:

    mov edi, offset Add
    mov al, ADD_COP ;Код операции add
    stosb
    ...
    Add:
    xor eax, ebx
    ...
    mov edi, offset Add
    mov al, XOR_COP ;Код операции xor
    stosb


    Или вообще сформировать по адресу Add нужную тебе команду.
     
  9. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Ты правильно понял, что мне надо! Но формировать маш.команду, это конечно мысль, но где? В той задаче что я себе поставил кроме стека ничего не подойдет, А на стек иногда ставят защиту от выполнения и вызывать VirtalAlloc из-за правки до нужной атрибутины мне как-то влом!
     
  10. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Формировать можно в самом коде (например, в незанятом месте). Стек можно переназначить. Тебе нужно кокретную команду выполнить или выполнить последовательно несколько команд? Уточни ситуацию.
     
  11. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    A и В 16-разрядные, а вот результаты всех операций 32-разрядные, там должны быть eax и ebx, А и В изначально в младших половинах.
     
  12. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Жаль что не всегда бывают 16 разрядные :dntknw: бывают и 32х разрядные, что чаще!
     
  13. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    побитово складывай просто, будет точно непонятно :)
    Таким же образом можно все остальные команды заделать.
    К тому же, размер операнда значения иметь не будет
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    > "бывают и 32х разрядные"
    Код (Text):
    1.   ;a+b=(a+1)*(b+1)-a*b-1
    2.   mov ecx,eax
    3.   mul ebx
    4.   xchg eax,ecx
    5.   inc eax
    6.   inc ebx
    7.   mul ebx
    8.   sub eax,ecx
    9.   dec eax
     
  15. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    a+b=ln(exp(a)*exp(b))
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    green
    Это 1) FPU и 2) намного дольше, чем цикл inc, приведенный автором
    Может просто выполнить сложение на FPU, MMX или XMM ?

    В связи с чем вопрос к автору: EvilsInterrupt, а от кого маскируем операцию ?
    Если от дизасма, то стандартный прием - переход в "середину инструкции", т.е. дописывание байтиков в начало add eax,ebх = 03 C3, чтобы получилась правдоподобная инструкция + переход на 03 С3 (лучше косвенный)
     
  17. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    leo
    Смысл в том, что я уже вряд ли смогу отказаться от программирования! Мы, люди, всегда ищем себе задачу, кто-то заработать денег, кто-то взломать то, что неломал никто другой, кто-то просто выращивать овощи и балдеть, как пахнет летом огород. Моя же цель:
    "Добиться чувства гордости за сына у отца в его последний час".
    Очень надеюсь,что и у сына, если он у меня будет, будет такая же цель, как и у меня.


    Ну да ладно к делу, я пишу обфускатор x86, в инэте я нашел, только один, но он мне не понравился, хотя я и взял от него несколько мыслей. Сейчас я думаю как же заменить сложение так, чтобы было много сложней разобраться после обфускации. Очень бы хотелось заменить сложение рядом инструкций с применением xor,and, div, imul все что угодно но не сложение или вычитание.
     
  18. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    EvilsInterrupt
    Ну и как ты думаешь, что простому смертному проще понять - набор всем известных операций xor,and,div,imul или прыжок в середину инструкции ? Или те же MMX\SSE ?
     
  19. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    leo
    А что думаешь применение MMX/sse будет выгодней? Если да, то может я путаю чего но когда работаешь с MMX почему то юзается FPU регистры! Следовательно надо и о их сохранении заботиться, а это не так просто, выход просты xor, and, imul etc но не add,sub лучше всего подходят
     
  20. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    EvilsInterrupt
    Действительно при работе с MMX юзаются FPU регистры, но по правилам хорошего тона в этих регистрах ничего длительное время не хранят - каждая процедура должна чистить за собой эти регистры. Во-вторых, ХMM регистры живут сами по себе и специальной чистки не требуют, и всевозможных "малоизвестных" операций с ними достаточно много. Ну и наконец, я ж не спорю насчет обычных целочисленных операций - берешь листочек бумаги и пишешь всевозможные варианты, заглядывая в учебник алгебры за 5-й класс, потом переводишь на асм ;)