При написании программы столкнулся с интересной проблемой.

Тема в разделе "WASM.BEGINNERS", создана пользователем yuran666666, 5 мар 2010.

  1. yuran666666

    yuran666666 New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2009
    Сообщения:
    22
    Не могли бы объяснить почему так получается?
    Есть код такого вида (см. ниже). При работе под Олли и под системой возвращаемое количество символов в eax функцией lstrlen различно, при подсчете символов с помощью инструкции lodsb (см. приаттаченный архив со скринами экрана и исходниками) ситуация повторяется. Так же в архиве небольшой пример, в котором копируемый файл определен заранее и функция lstrlen уже возвращает правильное количество символов под системой и под отладчиком.

    .386
    .model flat,stdcall
    option casemap:none
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\masm32.inc
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\masm32.lib
    .data
    real_path db 256 dup (?)
    new_file db "C:\lumpy.exe"
    .code
    start:
    invoke GetCommandLine
    invoke lstrcpy,addr real_path,eax
    invoke lstrlen,eax
    ;mov byte ptr [real_path+eax-1], 0 ;отладчик
    mov byte ptr [real_path+eax-2], 0 ; система
    ;int 03
    invoke CopyFile,addr real_path+1,addr new_file,0
    invoke MessageBox,0, addr real_path+1, addr new_file, 0
    ret
    end start
     
  2. yuran666666

    yuran666666 New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2009
    Сообщения:
    22
    архив тут
    http://depositfiles.com/files/irx0xr0mj
     
  3. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    "...\lodsb.asm":

    yuran666666, вы переписываете часть скопированной строки:
    Код (Text):
    1.         ;...
    2.         xchg    eax,esi             ; [esi] = "...\lodsb.exe",0,???
    3.   @1:   lodsb
    4.         test    al,al
    5.         jnz     @1                  ; if flagz.zf=1 then [esi] = ???
    6.         mov     byte ptr[esi-3],00h ; [esi-3] = "x","e",0,???
    7.         mov     byte ptr[esi-2],00h ; [esi-3] = "e",0,???
     
  4. yuran666666

    yuran666666 New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2009
    Сообщения:
    22
    ну там в коде одна из инструкций закомментирована вообще то, и после нее идет еще комментарий под системой или под отладчиком будет корректно работать
     
  5. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Для простоты вызова OllyDbg при неустранимых ошибках или в целях отладки: \меню Options\подменю Options...\вкладка Just-in-time\нажмите кнопку Set OllyDbg. Для генерации исключения используйте hlt вместо int: писать короче :)и
     
  6. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Я забыл: кавычки могут быть, а могут и нет, что зависит от среды. В некоментированном коде вы точно перепишете последнюю букву.
     
  7. yuran666666

    yuran666666 New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2009
    Сообщения:
    22
    вы попробуйте потрассировать коды из архивов.. или запустить под системой с int 03 (он там закомментирован) и аттачем к процессу - кавычки есть во всех случаях, а вот количество посчитанных символов под отладчиком (если трассировать программу с начала) и системой (про аттаче к процессу) будет различаться
     
  8. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    cmd.exe, lodsb.exe <- нет кавычек
     
  9. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    При выполнении под олли можно заметить, что в конце командной строки приписан один пробел. lstrlen возвращает длину правильно.
     
  10. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    ASCIIZ строки положено заканчивать нулем:
    new_file db "C:\lumpy.exe", 0
     
  11. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Чтобы убрать кавычки обычно используют PathUnquoteSpaces из shlwapi.
     
  12. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Буковка переписывается, смотрите фотку.
     
  13. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    KeSqueer, мне о-очень трудно говорить по-русски, но я это делаю исключительно с уважения к вам, пренебрегая английским z)
     
  14. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    edemko
    Цитирую ваш скрин:
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Бактрейс:
    Код (Text):
    1. SHELL32.ReplaceParameters
    2. SHELL32.SetCommand@CShellExecute@@IAEHXZ
    3. SHELL32.DoExecCommand@CShellExecute@@IAEXXZ
    4. SHELL32.TryInvokeApplication@CShellExecute@@IAE
    5. SHELL32.ExecuteNormal@CShellExecute@@QAEXPAU_SHE
    6. SHELL32.ShellExecuteNormal@4
    7. SHELL32.ShellExecuteExW
    ReplaceParameters() ищет строку "%1" %* и форматирует имя, переданное в ShellExecute(), собственно она пробел и дописывает, а затем имя передаётся в CreateProcess(), которая запустит процесс и сформирует среду окружения(в частности коммандную строку). Олли не использует функционал оболочки, а сама запускает процесс средствами CreateProcess(), поэтому и пробелов нет, в отличие от проводника.
     
  16. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    По "...\lodsb.exe" сквозь Olly: 0x20 точно нет.
     
  17. yuran666666

    yuran666666 New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2009
    Сообщения:
    22
    Clerk
    сэр, спасибо вам)
    вы поняли вопрос и дали валидный ответ.. я бы наверное голову поломал, хотя пробел уже тоже успел заметить)