Сейчас на форуме: jinoweb (+4 невидимых) |
![]() |
eXeL@B —› Программирование —› Программа под отладчиком работает не так как без отладчика. Магия? |
Посл.ответ | Сообщение |
|
Создано: 27 марта 2016 04:32 · Личное сообщение · #1 Code:
Прога запускается в консоли. Получает параметр. Если параметр не передать, то выводится "Укажите имя файла". Если параметр передан, то прога должна вывести "Нет такого файла" в том случае, если параметр не является именем существующего файла. Если же параметр является именем существующего файла, то никакого вывода не должно быть, прога просто отрабатывает и завершается. Но! Если я не передаю параметр, то всё происходит правильно, и прога выдаёт "Укажите имя файла". А вот если я передаю ей параметр, то она в любом случае выдаёт "Нет такого файла", даже если параметр является именем существующего файла. Но если запустить прогу под отладчиком и передать правильный параметр, то она завершается правильно (если проследить за поиском строки, то видно, что название параметра обрабатывается верно, и в регистре EAX действительно передаётся верный адрес.. и прога переходит на нужную ветку исполнения, и завершается верно). В качестве отладчика использую OllyDbg. ![]() |
|
Создано: 27 марта 2016 06:42 · Личное сообщение · #2 |
|
Создано: 27 марта 2016 06:53 · Личное сообщение · #3 |
|
Создано: 27 марта 2016 07:01 · Поправил: plutos · Личное сообщение · #4 Да, с параметрами в отладчике все правильно. Хотел пробежаться по коду в той же ollyDbg, но меня почему-то AVG anti-virus на вашу программу сильно ругается: Downloader Tibs Summary Downloader Tibs is a malicious application that allows hackers to remotely access you computer system letting them modify files, steal personal information and install more unwanted software. These kinds of threats, called Trojan horse, must be sent to you by someone or carried by another program. They may also arrive thanks to unwanted downloads on infected websites or installed with online games or other internet-driven applications. Most Trojan horses can be detected and removed by AVG. ----- Give me a HANDLE and I will move the Earth. ![]() |
|
Создано: 27 марта 2016 07:22 · Личное сообщение · #5 |
|
Создано: 27 марта 2016 07:47 · Поправил: plutos · Личное сообщение · #6 philimonix пишет: выдаёт "Нет такого файла", даже если параметр является именем существующего файла Добавьте вот такой код сразу после вызова CreateFile. Может вы посылаете имя файла, который действительно существует, но что-то не срабатывает как надо в CreateFile. Скажем, у одного процесса нет достаточных привилегий (to OPEN_EXISTING), а у другого есть, и т.д. Ведь "под отладчиком" это один процесс, а "без отладчика" уже совсем другой. Code:
----- Give me a HANDLE and I will move the Earth. ![]() |
|
Создано: 27 марта 2016 08:10 · Личное сообщение · #7 plutos пишет: Добавьте вот такой код сразу после вызова CreateFile. Что-то много ругани от компилятора из-за этих строчек. ![]() ![]() |
|
Создано: 27 марта 2016 08:22 · Личное сообщение · #8 |
|
Создано: 27 марта 2016 08:37 · Поправил: plutos · Личное сообщение · #9 philimonix пишет: Что-то много ругани от компилятора из-за этих строчек. уберите директиву dwLastErr :DWORD, szError[1024] :BYTE находятся в секции .data. Code:
----- Give me a HANDLE and I will move the Earth. ![]() |
|
Создано: 27 марта 2016 08:52 · Поправил: philimonix · Личное сообщение · #10 plutos пишет: dwLastErr :DWORD, szError[1024] :BYTE На такие строчки тоже ругается.. Я вот так ещё попробовал: Code:
.. тогда перестал ругаться на эти строчки и стал ругаться на print.. ![]() ![]() |
|
Создано: 27 марта 2016 09:17 · Поправил: plutos · Личное сообщение · #11 А что касается print, то можно обойтись и без нее (иначе мы еще больше запутаемся). уберите 3 строчки print str$(dwLastErr)," " print ADDR szError,13,10 и посмотрите, что будет в регистре eax после вызова GetLastError. Там должен быть код ошибки. потом посмотрите, какой именно ошибке этот код соответствует вот на этой странице: https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx ----- Give me a HANDLE and I will move the Earth. ![]() |
|
Создано: 27 марта 2016 11:56 · Поправил: philimonix · Личное сообщение · #12 plutos пишет: и посмотрите, что будет в регистре eax после вызова GetLastError. Там должен быть код ошибки. Убрал всё непонятное, просто добавил вызов GetLastError() после вызова CreateFile(). В EAX оказался ноль. Я так понимаю, это означает, что CreateFile() отработала без нареканий. Специально потом вызвал программу с неправильным аргументом, тогда GetLastError поместила в EAX двойку, что значит "файл не найден". Получается, что CreateFile работает верно. Ещё нюанс. Добавил вот такой код в секцию .data Code:
И вот такой код в секцию .code Code:
В консоль выводится двойка, что означает "файл не найден", а если запускать в отладчике, то в EAX оказывается ноль. Prober пишет: Запустите её из-под CMD, а потом в отладчике, сразу увидите разницу. Видимо, всё дело в том, что хоть программа одна и та же, но процессы разные.. получается, что одна и та же прога выполняется в разных контекстах, потому и результаты различны. Но, даже если так, хотелось бы всё-таки разобраться во всех нюансах. Если всё так, то тогда должна быть ошибка в коде, которая почему-то исправляется отладчиком. Короче, я совсем уже запутался))) ![]() |
|
Создано: 27 марта 2016 12:20 · Поправил: dosprog · Личное сообщение · #13 philimonix пишет: Короче, я совсем уже запутался))) Не надо путаться. Просто так неаккуратно разбор строки не делают. Это путь к трудноустранимым глюкам. OllyDbg вставляет перед аргументом ОДИН символ пробела, тогда как в реальности система вставляет ДВА символа пробела. Отсюда и плясать. Вот это будет работать, но название этому говнокод, уж сорри: Code:
Ото и вся магия.. ![]() |
|
Создано: 27 марта 2016 12:36 · Личное сообщение · #14 dosprog пишет: Просто так неаккуратно разбор строки не делают. Это путь к трудноустранимым глюкам. Это я уже понял)) Просто это пример из книги. А я такой человек, что если столкнулся с такой ерундой, то у меня всё зудит до тех пор пока не пойму в чём дело)) Забавненько)) Ваш код правильно работает в консоли, но неправильно под отладчиком)) Теперь всё наоборот) Но теперь уже видно, что отладчик "съедает" первый символ параметра. Полегчало немного)) Спасибо)) ![]() |
|
Создано: 27 марта 2016 12:38 · Поправил: dosprog · Личное сообщение · #15 philimonix пишет: Это я уже понял)) Просто это пример из книги. Тогда понятно. . philimonix пишет: что отладчик "съедает" первый символ параметра. Программа кривая его съедает, а не отладчик.. philimonix пишет: Ваш код правильно работает в консоли, но неправильно под отладчиком)) Поправил. Теперь всё в порядке в обоих случаях (сравнительно..) ![]() |
|
Создано: 27 марта 2016 12:40 · Личное сообщение · #16 philimonix пишет: Но теперь уже видно, что отладчик "съедает" первый символ параметра. отладчики ничего не сьедают. это или руки кривые.. или понимание процесса отсутсвует.. все что может сьесть отладчик.. это эксепшены. ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
|
Создано: 27 марта 2016 12:51 · Поправил: philimonix · Личное сообщение · #17 VodoleY пишет: это или руки кривые.. или понимание процесса отсутсвует.. Ну, я только начинаю учиться)) Конечно же, понимание процесса пока оставляет желать лучшего. Но, думаю, это просто дело времени) dosprog пишет: Тогда понятно. . Учебники с ошибками в исходниках ещё полезнее чем правильные и грамотные)) Пока ковыряешься с такой ерундой, поучаешь больше опыта и понимания, чем если бы разбирал сразу правильно написанные программы)) Добавлено спустя 17 часов 37 минут Если кому интересно, есть ещё один вариант решения. Подсказали на другом форуме. Процедура GetFName() ищет первый пробел в строке, хотя надо бы искать последний. И тогда никаких проблем не возникает. Вот так надо переписать эту процедуру: Code:
![]() |
|
Создано: 28 марта 2016 08:49 · Поправил: VodoleY · Личное сообщение · #18 philimonix встает вопрос.. отладчик тут причем? ошибки в коде не надо на дебагер валить ЗЫ GetFName() .. вы не путайте теплое с мягким.. спецификацию 8+3 еще никто не отменял.. если вы путь к файлу в формате лонг нейм указываете.. будьте добры его в ковычки запердолить. и хватить бороться с мельницами ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
|
Создано: 30 марта 2016 02:28 · Поправил: dosprog · Личное сообщение · #19 philimonix пишет: Процедура GetFName() ищет первый пробел в строке, хотя надо бы искать последний. См. фрагмент кода из прошлого поста, он этим и занимается: Code:
philimonix пишет: Если кому интересно, есть ещё один вариант решения. Не интересно, если честно. Эта процедура однозначно не на десять строчек, такие костыльные варианты лучше не использовать. Что могу порекомендовать - найти какую-то утиль, где нормально реализован разбор строки, и вынуть его оттуда. Не надо изобретать - всё уже давно изобретено до нас, как написал VodoleY. ![]() |
![]() |
eXeL@B —› Программирование —› Программа под отладчиком работает не так как без отладчика. Магия? |