Прошу, ув. ASM'щики помощь мне советом: Тут будет небольшой код на Delphi пусть он вас не оскорбит, так как вопрос связан с Olly - единственным отладчиком которым иногда пользуюсь. имеем следующий код: //************************** попытка аутетификации на почтовом сервере Код (Text): smtp:=TIdSMTP.Create(nil); smtp.AuthenticationType:=atlogin; smtp.Username:=loginAt; smtp.Password:=s; smtp.Host:= 'smtp.mail.ru'; smtp.Port:=25; smtp.Connect(); // if smtp.Authenticate then // если пароль и логин верны (и есть связи и прочее) begin .....................................// то делаю свои дела на почтовом ящике msg.Free; end; .....................................// прочий код Showmessage(' Не верный пароль/логин/нет связи и т.д.'); //****************************************************************** Приближаюсь к вопросу: мерзопакостный код "if smtp.Authenticate then" это функция библиотеки dll. В отладчике это очень хорошо видно. Но в случае если логин и пароль не совпадает то получим MessageBoxA типа "Incorrect authentication data" - ВНИМАНИЕ: - после этого процедура "как бы" оборватся (то есть Showmessage(' Не верный пароль/логин/нет связи и т.д.') ) уже не произойдет. Вернее произвойдет но только в обратном случае - случае если логин и пароль верны (особо не вдумываться в пример кода - он показательный). Мне бы хотелось зациклить процедуру проверки пароля до тех пор пока программа не обнаружит правильный из некого списка вариантов - но без вмешательства пользователя без щелчков по кнопке каждый раз. Но проблема в том что если пароль не верный то - выход из процедуры, без какой либо возможности организовать цикл - так как последнее что исполнит приложение при неверном пароле это if smtp.Authenticate then... а далее результат функции - "Incorrect authentication data". Когда это обнаружил то решил как-то подправить код в Olly. Загрузил, нашел MessageBoxA и заNOPил его. Но при этом ни о каком цикле речи все равно небыло - бесспорно, сообщение MessageBoxA "Incorrect authentication data" больше не выскакивало - но пролема то не решена, - ничего ниже if smtp.Authenticate then все равно не работало. То есть имеется однозначный выход из процедуры сразу после сверки и отрицательного результата. Почти уже вопрос: Тогда я сразу подумал: ага, а что если вместо заNOP'ленного MessageBoxA jmp'ть обратно на начало процедуры вызываемой при ButtonClick1 ? Наконец САМ ВОПРОС (для тех кто дочитал кхе-кхе): правильно ли я рассуждаю про порядок последующих действий при таком сценарии (и будет ли он работать вообще): а) взять неизмененную программу б) найти адрес входа в процедуру ButtonClick1 в) скопировать в отдельный txt. 'правильное' (естественное) состояние стека + состояние регистров +флагов г) найти MessageBoxA // ****"Incorrect authentication data" д) заNOPить его (либо перепрыгнуть) и перейти на код собсвенного написания в котором сперва 1. восстанавливается "правильный" стек+регистры+флаги 2. JMP на адрес ButtonClick1 "симулируя" якобы "естественное" нажатие на кнопку пользователем тем самым на деле запуская программу в бесконечный цикл единственным вариантом которого является правильное значение логина и пароля. (при этом представим что в самом коде (delphi) я специально организовал неиспользуемую функцию большого размера для того что бы смог впоследствии размесить там нужный код по восстановлению стека и прочего через отладчик) //******** Может у многих возникнет вопрос: - а че ты вообще пишешь сюда если имеется вариант а ты его не пробуешь? Ответ: на входе в ButtonClick1 стек такого мля РАЗМЕРА, что легче сперва спросить у спецов чем потратить день-два на, может быть, совершенно неправильный вариант. Заранее СП.
Снова я (наверное уже достал со своей хирней). Если кто столкнется с такой же проблемой, то вот решение (пришло в голову через пару часов после первого сообщения). Если if smtp.Authenticate then такой вредный и может возвращать как TRUE (всмысле boolean) и MessageBoxA (как false) и при этом "гасит" приложение (а может это, я так подозреваю, специальная защитная функция?) то нужно создать два .exe вместо одного: пусть первое (главное) в цикле вызывает другое, внешнее в котором то и находится код с if smtp.Authenticate. Второй exe - без окон и без дверей - просто процесс. А между ними какой-нибудь промежуточный файл по которому и передаются все наши варианты паролей, а так же проверяется первым приложением правильный ли был предыдущий пароль. Во втором приложении при помощи Olly NOP'им MessageBoxA. Такой вариант будет попроще того что предлагал выше. (хотя сам я ещё не пробовал, опять таки теория - так что если меня и там наломают, то напишу). Но кстати первый вопрос остается актуальным. Если кто пробовал так делать, то прошу написать об ошибках. Буду следить за темой.
Почему у вас возврат в юзермодную процедуру не происходит то? Может он исключение пробрасывает (smtp.Authenticate)? Которое, возможно, отлавливается дефолтным обработчиком (как это там в дельфях?)