Полное удаление вызова процедуры.

Тема в разделе "WASM.BEGINNERS", создана пользователем Ap0k, 17 май 2007.

  1. Ap0k

    Ap0k Артём

    Публикаций:
    0
    Привет всем воинам дZена :) .
    Из-за моих довольно скромных познаний в области программирования на ассемблере столкнулся с такой бедой.
    Имею: библиотека, которая сильно нужна, но просит денег, после дизассемблирования нашел место где она берет данные из реестра. Оказалось достаточно удалить эту ветку перед запуском и вот он вечный триальный период :)
    Всё бы хорошо но добивает nag-скрин. Это обычный MessageBox, поэтому решил поработать HIEW'ом.
    Вот кусочек кода, в котором происходит вызов.
    Код (Text):
    1. .text:10007A6E loc_10007A6E:                           ; CODE XREF: sub_100079E0+76j
    2. .text:10007A6E                 cmp     eax, 82h
    3. .text:10007A73                 jz      short loc_10007A78
    4. .text:10007A75                 mov     [esi+0Ch], ebx
    5. .text:10007A78
    6. .text:10007A78 loc_10007A78:                           ; CODE XREF: sub_100079E0+93j
    7. .text:10007A78                 mov     eax, [esi+4]
    8. .text:10007A7B                 mov     ecx, [esi]
    9. .text:10007A7D                 push    30h             ; uType
    10. .text:10007A7F                 push    eax             ; lpCaption
    11. .text:10007A80                 push    ecx             ; lpText
    12. .text:10007A81                 push    0                ; hWnd
    13. .text:10007A83                 call    ds:MessageBoxA ;собственно вызов
    14. .text:10007A89                 mov     [esi+10h], eax  ;на loc_10007D92 идет проверка того, что я нажал ОК,
    15.                                                   ;примечательно, что ничего другого нажать нельзя  :)
    16. .text:10007A8C                 jmp     loc_10007D92
    17. .text:10007A91 ; ---------------------------------------------------------------------------
    Так вот собственно какие рога получил я...
    1) Простая замена на NOP'ы вызова MessageBoxA не катит..
    2) Поискав по рунету написал что-то вроде
    Код (Text):
    1. move byte [eax],001
    2. nop
    3. nop
    4. nop
    Не знаю правильно ли...

    loc_10007D92 Выглядит так:
    Код (Text):
    1. .text:10007D92 loc_10007D92:                          ; CODE XREF: sub_100079E0+6Ej
    2. .text:10007D92                                               ; sub_100079E0+89j ...
    3. .text:10007D92                 cmp     dword ptr [esi+10h], 1
    4. .text:10007D96                 jnz     short loc_10007DA6
    5. .text:10007D98                 mov     eax, [esi+0Ch]
    6. .text:10007D9B                 test    eax, eax
    7. .text:10007D9D                 jnz     short loc_10007DA6
    8. .text:10007D9F                 mov     ecx, esi
    9. .text:10007DA1                 call    sub_10007DC0
    После такого изменения прогамма рушится, либо зависает, видимо где-то получается AccessViolation, так вот вопрос, как привильно удалить вызов функции, чтобы после этого и стек целым остался и т.д.
     
  2. k3internal

    k3internal New Member

    Публикаций:
    0
    Ap0k
    Ты перед MessageBox 4 пуша нопами забил ? если нет то твой стэк и валится. и кроме того, если вызов в конечном итоге приводит к этому окошку, посмотри по коду выше, кто передаёт сюда управление, во всяком случае тебе не здесь надо заплатку ставить а в другом месте.
     
  3. Ap0k

    Ap0k Артём

    Публикаций:
    0
    Pushes пробовал убирать, все равно рушится...
    Сейчас мне достаточно было бы просто убрать MessageBox, потом буду колупать дальше, как раз опыта наберусь, ибо сейчас я всего третий день как сижу обложенным всеми этими хардкорными тузлами и документацией..
    Стараюсь писать конструктивно, надеясь на быстрый ответ, как написано в трейде с правилами написания постов :)
     
  4. Ap0k

    Ap0k Артём

    Публикаций:
    0
    Вот еще интересный код, пришел к выводу, что можно вообще воковырить весь код где происходит проверка (RegistrationValidate) и .т.д...
    Но опять таже беда программа падает, теперь уже нет и pushes перед вызовом.
     
  5. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Обычно, самый простой способ это не нопить вызов МесседжБокса, а найти перед ним условный переход, который определяет будет ли окно показано или нет.

    Либо, может быть чуть посложнее.
    Смотришь, откуда вызывается процедура loc_10007A6E: (в которой происходит вызов Мессаджа).
    В твоем случае это может быть или CODE XREF: sub_100079E0+76 или CODE XREF: sub_100079E0+93 (это очень удобно смотреть в ИДЕ). И правишь переходы уже по этим адресам.
     
  6. Ap0k

    Ap0k Артём

    Публикаций:
    0
    Насколько я понял помимо того, что происходит показ сообщения происходит некая инициализация и кладутся какие-то значения в регистры.. я немного затрудняюсь в объяснениях, но при смене верхнего условного перехода появляется откуда-то сообщение "Licence key is not valid!"...
    PS: правилами не воспрещается выкладывать сюда сам исполняемый модуль?
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Ap0k
    Если ты написал "что-то вроде move byte [eax],001", то возможно ты сам все и рушишь, т.к. нужно просто mov eax,1 ;)

    Из куска loc_10007D92 видно, что прога пойдет дальше если [esi+10h] == 1 и [esi+0Ch] != 0 , поэтому переход в 10007A73 лучше не трогать, т.к. после него что-то пишется в [esi+0Ch]
     
  8. Ap0k

    Ap0k Артём

    Публикаций:
    0
    leo
    Спасибо большое!, действительно достаточно было поправить mov.
    Не мог бы ты объяснить в чем заключалась ошибка, чтобы впредь её не допускать?
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Ap0k
    MessageBox возвращает в EAX код нажатой кнопки (IDOK = 1). Поэтому mov eax,1 симулирует, что MessageBox был вызван и вернул 1.

    mov byte ptr [eax],1
    Тут 1 помещается не в EAX, как надо, а в байтовую ячейку, адрес которой хранится в EAX. Но т.к. Вы не инициализируете EAX, запись 1 происходит неизвестно куда, но, видимо, на недоступный для записи адрес. В результате происходит исключение.
     
  10. Ap0k

    Ap0k Артём

    Публикаций:
    0
    Категорически приветствую!
    В общем рано я тогда порадовался, разрабатывал потихоньку на своем компе программу на базе этого ActiveX, реши поделиться с друзьями.. и.. тут обжегся.
    Программа на этом коде нагло зависает. Причем немодифицированная работает нормально.
    Поэтому есть некоторая уверенность, что где-то я "скривил". Подскажите пожалуйста.
    Вот код который был:
    Код (Text):
    1. -.10007A7B: 8B0E                         mov       ecx,[esi]
    2. -.10007A7D: 6A30                         push      030
    3. -.10007A7F: 50                           push      eax
    4. -.10007A80: 51                           push      ecx
    5. -.10007A81: 6A00                         push      000
    6. -.10007A83: FF1500E50410                 call      MessageBoxA ;USER32.dll
    7. -.10007A89: 894610                       mov       [esi][00010],eax
    Таким стал:
    Код (Text):
    1. -.10007A7B: 8B0E                         mov       ecx,[esi]
    2. -.10007A7D: 90                           nop
    3. -.10007A7E: 90                           nop
    4. -.10007A7F: 90                           nop
    5. -.10007A80: 90                           nop
    6. -.10007A81: 90                           nop
    7. -.10007A82: B801000000                   mov       eax,000000001 ;"   O"
    8. -.10007A87: 90                           nop
    9. -.10007A88: 90                           nop
    10. -.10007A89: 894610                       mov       [esi][00010],eax
    11. -.10007A8C: E901030000                   jmp      .010007D92   -------- (3)
    12. -.10007A91: 8B4620                       mov       eax,[esi][00020]
    13. -.10007A94: 33FF                         xor       edi,edi
     
  11. crypto

    crypto Active Member

    Публикаций:
    0
    Ap0k
    Батенька, вот это место нельзя забивать ничем:
    Лучше эту конструкцию обойти простым коротким jmp
    Перемести
    mov eax,000000001
    выше и обойди вызов джампом
     
  12. Ap0k

    Ap0k Артём

    Публикаций:
    0
    Сейчас попробую, но ведь это ничего принципиально не меняет.
     
  13. crypto

    crypto Active Member

    Публикаций:
    0
    Ap0k
    Меняет, поскольку в этом месте стоит релок и как-бы ты свою программу ни правил, при загрузке система туда поставит адрес вызываемой процедуры и тут-то ты и падаешь :)
     
  14. Ap0k

    Ap0k Артём

    Публикаций:
    0
    crypto
    Спасибо