Привет всем воинам дZена . Из-за моих довольно скромных познаний в области программирования на ассемблере столкнулся с такой бедой. Имею: библиотека, которая сильно нужна, но просит денег, после дизассемблирования нашел место где она берет данные из реестра. Оказалось достаточно удалить эту ветку перед запуском и вот он вечный триальный период Всё бы хорошо но добивает nag-скрин. Это обычный MessageBox, поэтому решил поработать HIEW'ом. Вот кусочек кода, в котором происходит вызов. Код (Text): .text:10007A6E loc_10007A6E: ; CODE XREF: sub_100079E0+76j .text:10007A6E cmp eax, 82h .text:10007A73 jz short loc_10007A78 .text:10007A75 mov [esi+0Ch], ebx .text:10007A78 .text:10007A78 loc_10007A78: ; CODE XREF: sub_100079E0+93j .text:10007A78 mov eax, [esi+4] .text:10007A7B mov ecx, [esi] .text:10007A7D push 30h ; uType .text:10007A7F push eax ; lpCaption .text:10007A80 push ecx ; lpText .text:10007A81 push 0 ; hWnd .text:10007A83 call ds:MessageBoxA ;собственно вызов .text:10007A89 mov [esi+10h], eax ;на loc_10007D92 идет проверка того, что я нажал ОК, ;примечательно, что ничего другого нажать нельзя :) .text:10007A8C jmp loc_10007D92 .text:10007A91 ; --------------------------------------------------------------------------- Так вот собственно какие рога получил я... 1) Простая замена на NOP'ы вызова MessageBoxA не катит.. 2) Поискав по рунету написал что-то вроде Код (Text): move byte [eax],001 nop nop nop Не знаю правильно ли... loc_10007D92 Выглядит так: Код (Text): .text:10007D92 loc_10007D92: ; CODE XREF: sub_100079E0+6Ej .text:10007D92 ; sub_100079E0+89j ... .text:10007D92 cmp dword ptr [esi+10h], 1 .text:10007D96 jnz short loc_10007DA6 .text:10007D98 mov eax, [esi+0Ch] .text:10007D9B test eax, eax .text:10007D9D jnz short loc_10007DA6 .text:10007D9F mov ecx, esi .text:10007DA1 call sub_10007DC0 После такого изменения прогамма рушится, либо зависает, видимо где-то получается AccessViolation, так вот вопрос, как привильно удалить вызов функции, чтобы после этого и стек целым остался и т.д.
Ap0k Ты перед MessageBox 4 пуша нопами забил ? если нет то твой стэк и валится. и кроме того, если вызов в конечном итоге приводит к этому окошку, посмотри по коду выше, кто передаёт сюда управление, во всяком случае тебе не здесь надо заплатку ставить а в другом месте.
Pushes пробовал убирать, все равно рушится... Сейчас мне достаточно было бы просто убрать MessageBox, потом буду колупать дальше, как раз опыта наберусь, ибо сейчас я всего третий день как сижу обложенным всеми этими хардкорными тузлами и документацией.. Стараюсь писать конструктивно, надеясь на быстрый ответ, как написано в трейде с правилами написания постов
Вот еще интересный код, пришел к выводу, что можно вообще воковырить весь код где происходит проверка (RegistrationValidate) и .т.д... Но опять таже беда программа падает, теперь уже нет и pushes перед вызовом.
Обычно, самый простой способ это не нопить вызов МесседжБокса, а найти перед ним условный переход, который определяет будет ли окно показано или нет. Либо, может быть чуть посложнее. Смотришь, откуда вызывается процедура loc_10007A6E: (в которой происходит вызов Мессаджа). В твоем случае это может быть или CODE XREF: sub_100079E0+76 или CODE XREF: sub_100079E0+93 (это очень удобно смотреть в ИДЕ). И правишь переходы уже по этим адресам.
Насколько я понял помимо того, что происходит показ сообщения происходит некая инициализация и кладутся какие-то значения в регистры.. я немного затрудняюсь в объяснениях, но при смене верхнего условного перехода появляется откуда-то сообщение "Licence key is not valid!"... PS: правилами не воспрещается выкладывать сюда сам исполняемый модуль?
Ap0k Если ты написал "что-то вроде move byte [eax],001", то возможно ты сам все и рушишь, т.к. нужно просто mov eax,1 Из куска loc_10007D92 видно, что прога пойдет дальше если [esi+10h] == 1 и [esi+0Ch] != 0 , поэтому переход в 10007A73 лучше не трогать, т.к. после него что-то пишется в [esi+0Ch]
leo Спасибо большое!, действительно достаточно было поправить mov. Не мог бы ты объяснить в чем заключалась ошибка, чтобы впредь её не допускать?
Ap0k MessageBox возвращает в EAX код нажатой кнопки (IDOK = 1). Поэтому mov eax,1 симулирует, что MessageBox был вызван и вернул 1. mov byte ptr [eax],1 Тут 1 помещается не в EAX, как надо, а в байтовую ячейку, адрес которой хранится в EAX. Но т.к. Вы не инициализируете EAX, запись 1 происходит неизвестно куда, но, видимо, на недоступный для записи адрес. В результате происходит исключение.
Категорически приветствую! В общем рано я тогда порадовался, разрабатывал потихоньку на своем компе программу на базе этого ActiveX, реши поделиться с друзьями.. и.. тут обжегся. Программа на этом коде нагло зависает. Причем немодифицированная работает нормально. Поэтому есть некоторая уверенность, что где-то я "скривил". Подскажите пожалуйста. Вот код который был: Код (Text): -.10007A7B: 8B0E mov ecx,[esi] -.10007A7D: 6A30 push 030 -.10007A7F: 50 push eax -.10007A80: 51 push ecx -.10007A81: 6A00 push 000 -.10007A83: FF1500E50410 call MessageBoxA ;USER32.dll -.10007A89: 894610 mov [esi][00010],eax Таким стал: Код (Text): -.10007A7B: 8B0E mov ecx,[esi] -.10007A7D: 90 nop -.10007A7E: 90 nop -.10007A7F: 90 nop -.10007A80: 90 nop -.10007A81: 90 nop -.10007A82: B801000000 mov eax,000000001 ;" O" -.10007A87: 90 nop -.10007A88: 90 nop -.10007A89: 894610 mov [esi][00010],eax -.10007A8C: E901030000 jmp .010007D92 -------- (3) -.10007A91: 8B4620 mov eax,[esi][00020] -.10007A94: 33FF xor edi,edi
Ap0k Батенька, вот это место нельзя забивать ничем: Лучше эту конструкцию обойти простым коротким jmp Перемести mov eax,000000001 выше и обойди вызов джампом
Ap0k Меняет, поскольку в этом месте стоит релок и как-бы ты свою программу ни правил, при загрузке система туда поставит адрес вызываемой процедуры и тут-то ты и падаешь