Теоретический вопрос №2

Тема в разделе "WASM.BEGINNERS", создана пользователем hopi_indian, 6 апр 2011.

  1. hopi_indian

    hopi_indian New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2011
    Сообщения:
    4
    Прошу, ув. ASM'щики помощь мне советом:
    Тут будет небольшой код на Delphi пусть он вас не оскорбит, так как вопрос связан с Olly - единственным отладчиком которым иногда пользуюсь.

    имеем следующий код:
    //************************** попытка аутетификации на почтовом сервере
    Код (Text):
    1. smtp:=TIdSMTP.Create(nil);
    2. smtp.AuthenticationType:=atlogin;
    3. smtp.Username:=loginAt;
    4. smtp.Password:=s;
    5. smtp.Host:= 'smtp.mail.ru';
    6. smtp.Port:=25;
    7. smtp.Connect(); //
    8.  if smtp.Authenticate then // если пароль и логин верны (и есть связи и прочее)
    9.   begin
    10.     .....................................//  то делаю свои дела на почтовом ящике
    11.     msg.Free;
    12.    end;
    13.    .....................................// прочий код
    14.   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 стек такого мля РАЗМЕРА, что легче сперва спросить у спецов чем потратить день-два на, может быть, совершенно неправильный вариант. Заранее СП.
     
  2. hopi_indian

    hopi_indian New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2011
    Сообщения:
    4
    Снова я (наверное уже достал со своей хирней). Если кто столкнется с такой же проблемой, то вот решение (пришло в голову через пару часов после первого сообщения).
    Если if smtp.Authenticate then такой вредный и может возвращать как TRUE (всмысле boolean) и MessageBoxA (как false) и при этом "гасит" приложение (а может это, я так подозреваю, специальная защитная функция?) то нужно создать два .exe вместо одного: пусть первое (главное) в цикле вызывает другое, внешнее в котором то и находится код с if smtp.Authenticate. Второй exe - без окон и без дверей - просто процесс. А между ними какой-нибудь промежуточный файл по которому и передаются все наши варианты паролей, а так же проверяется первым приложением правильный ли был предыдущий пароль. Во втором приложении при помощи Olly NOP'им MessageBoxA. Такой вариант будет попроще того что предлагал выше. (хотя сам я ещё не пробовал, опять таки теория - так что если меня и там наломают, то напишу).
    Но кстати первый вопрос остается актуальным. Если кто пробовал так делать, то прошу написать об ошибках. Буду следить за темой.
     
  3. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Поучите спецификацию на протокол SMTP, что ли...
     
  4. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    hopi_indian
    Используйте API вместо TIdSMTP и не парьтесь.
     
  5. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Почему у вас возврат в юзермодную процедуру не происходит то? Может он исключение пробрасывает (smtp.Authenticate)? Которое, возможно, отлавливается дефолтным обработчиком (как это там в дельфях?)