Командная строка

Тема в разделе "WASM.BEGINNERS", создана пользователем allex7, 19 мар 2009.

  1. allex7

    allex7 New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    20
    Здраствуйте. Программа получает параметры из коммандной строки. Отделяю параметры поиском пробела (20Н). Почему там оказывается два пробела. В первой программе из-за этого возникала ощибка, долго не мог понять где она.
    Пишем: program.exe test.txt
    В памяти: program.exe test.txt
    OllyDbg показывает один пробел. Ошибку удалось выявить используя TD32.exe из поставки BTASM5. Он правильно отобразил 2 пробела в дампе памяти. Для написания программы использую masm32. OS Vista
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    allex7
    Там может оказаться и 10 пробелов подряд (у набиравшего рука дрогнула), поэтому используя связку из lodsb/stosb исключаешь из командной строки все "лишние" пробелы, а заодно приводишь имена команд, файлов и другие аргументы командной строки к верхнему или нижнему регистру -- реальная жизнь сложнее, чем вам преподают в университете...
     
  3. allex7

    allex7 New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    20
    Я 5 лет назад университет закончил.
    Повторяю - пишем с одним пробелом, в памяти два:
    Поэтому для указанных команд после:
    cmp al, 20h
    необходимо esi увеличить на еденицу:
    inc esi
    только тогда получаем адрес параметра командной строки.
    Вопрос - почему?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    allex7
    Так может он один там ?
    program.exe это outpost.exe ?
     
  5. allex7

    allex7 New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    20
    нет программа берет большой текстовой файл и режет на маленькие. Имя файла из командной строки. В OllyDbg при задании параметров программа работает правильно. Но при запуске в коммандной строке параметры искажаются. После добавления inc esi получаем правильный адрес. Ошибка проявилась еще в маленькой программе Sleep, которая используя одноименную АПИ получала время из коммандной строки. Логически, при найденном 20Н, в esi адрес параметра. Однака программа не делала паузы на нужное время, пока после найденного 20Н не поставил inc esi.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    В RtlCreateProcessParameters() 5-й параметр в студию.
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    allex7
    Пробел мог появиться по всяким причинам. Логически говоря, программа не должна полагать, что пробел там только один. Кроме того, коммандная строка может иметь элементы заключённые в двойные кавычки. Например: "C:\Program Files" - там есть пробел, но он не является разделителем параметров, а он просто часть ОДНОГО параметра.