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

Discussion in 'WASM.BEGINNERS' started by hopi_indian, Apr 6, 2011.

  1. hopi_indian

    hopi_indian New Member

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

    имеем следующий код:
    //************************** попытка аутетификации на почтовом сервере
    Code (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

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

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

    Blog Posts:
    8
    Joined:
    Jun 4, 2007
    Messages:
    1,610
    Location:
    г. Санкт-Петербург
    Поучите спецификацию на протокол SMTP, что ли...
     
  4. qwe8013

    qwe8013 New Member

    Blog Posts:
    0
    Joined:
    May 28, 2009
    Messages:
    198
    hopi_indian
    Используйте API вместо TIdSMTP и не парьтесь.
     
  5. Vilco

    Vilco Vitaly

    Blog Posts:
    0
    Joined:
    Mar 5, 2007
    Messages:
    190
    Location:
    Nsk, Russia
    Почему у вас возврат в юзермодную процедуру не происходит то? Может он исключение пробрасывает (smtp.Authenticate)? Которое, возможно, отлавливается дефолтным обработчиком (как это там в дельфях?)