всем привет. отлаживаю ща одну программку в ОЛЛИ и записал свой код ей в хвост(это пространство, как я выяснил , не используется программой) чтобы она вместо проверки на правильность ключа записывала его в сообщение (бывшее сообщение об ошибке). вместо процедуры проверки я пишу ДЖАМП на мою процедуру, в ней я (ессесно сделав предварительно pushad & pushfd) заставляю программу писать правильный ключ в память на место "Ключ не верный!",затем делаю ПОПФД,ПОПАД и вызываю оригинальную процу проверки(если ее не вызывать, то все работает нормально, но я сразу попадаю на поздравления с регистрацией, т.к. мой код возвращает Z=1 и JNZ прохожу какбудто код правильный. мне же надо попасть на "не правильное" сообщение(и падчить ее не хочу : моя цель - правильная работа моего кода, а не регистрация программы!), да и малоли что полезное делает та проца помимо проверки) и вот во время этой процедуры проверки вся прога виснет(искл. ситуация). подскажите пожалуйста мож ПУШАД не все регистры сохраняет и чтото надо самому сохранять, мож со стэком че надо делать...?
мой код: 0 pushad 1 pushfd 2 mov esi,dword ptr ss:[ebp-10] ; туда пишется правильный ключ 3 mov edi,00465EB0 ; по этому адресу лежит "Ключ не верный!" 4 mov al, byte ptr ss:[esi] 5 cmp al,0 6 je 11 7 mov byte ptr ds:[edi],al 8 inc esi 9 inc edi 10 jmp 4 11 inc edi 12 mov byte ptr ds:[edi],0 13 popfd 14 popad 15 call 004043CB ; оригинальная процедура проверки , в ней вся проблема: в какой та момент в ней происходит исключительная ситуация. 16 retn ; до него дело ваще не доходит, если вызвать эту процедуру. писал по памяти ,поэтому адреса могут не совпадать
Честно говоря так вроде все ок. Тебе надо по трасировать оригинал процедуру и самому глянуть где происходить исключение! А так ничего не видно!
goga2007 заставляю программу писать правильный ключ Afaik inc edi перед mov byte ptr ds:[edi],0 лишний. Получается, что завершающий ноль записывается не после последнего символа, а еще через символ. Поясни: зачем использовать сегментные регистры, разве не справедливо, что es == ss == ds?
Да не вроде нормально а про сегментные регистры может с отладчика переписывал Код (Text): 0 pushad 1 pushfd 2 mov esi,dword ptr [ebp-10] ; туда пишется правильный ключ 3 mov edi,00465EB0 ; по этому адресу лежит "Ключ не верный!" 4 mov al, byte ptr [esi] 5 cmp al,0 6 je 11 7 mov byte ptr [edi],al 8 inc esi 9 inc edi 10 jmp 4 11 mov byte ptr [edi],al ; в al все равно уже ноль! 12 popfd 13 popad 14 call 004043CB ; оригинальная процедура проверки , в ней вся проблема: в какой та момент в ней происходит исключительная ситуация. 15 retn ; до него дело ваще не доходит, если вызвать эту процедуру. во как!
Тут поподробнее, пожалуйста. Вместо call 004043CB где-то в коде программы Вы вставили jmp xxx, где xxx - это адрес патча? В принципе, тут может быть ошибка. Вы совершенно уверены, что ключ, который проверяет процедура, лежит именно там? Может, он там просто дублируется...
Комментарии от чайника: А еще, наверное, процедуру проверки неплохо бы. А не может случиться так, что Вы своим циклом, перезаписывая "Ключ неверный!", вылезли по размеру за эту надпись и записали всякую бяку на место данных, используемых процедурой проверки?
дааа, давно меня тут небыло. спасибо всем. проблему я уже решил: оказалось, что код не работал потомучто я писал джамп на свою процу, а на выходе из нее писал RET ,а он(как я потом понял(спасибо Юрову и его справочнику)) работает в паре с CALL. и как дело доходило до ret ,у меня,видимо, в стеке находилась всякая лажа, и возврат совершался черт знает куда. после того как я заменил RET to JMP на следующую инструкцию (после прыжка на мою процу) все стало работать,но только в отладчике. без отладчика она сообщала мне, что она инфицирована и ща закрывается(я думаю, что это была проверка CRC с файла на диске). для тех ,у кого такая же проблема: пишите свой код не в хвост проги( это мои наблюдения, не более того, да и опыта мало), а гденить в серединку, т.к. в этой программе всестало прекрасно работать, после того ,как я переместил свой код в пустое место в середине проги.