stdcall & FD (EFLAGS)

Discussion in 'WASM.WIN32' started by n0hack, Jul 20, 2008.

  1. n0hack

    n0hack New Member

    Blog Posts:
    0
    Joined:
    Jun 3, 2008
    Messages:
    71
    Вопрос знатокам.
    У меня windows 2000 sp4 со всеми заплатками. Сегодня обратил внимание, что функция lstrlen в моей системе использует инструкцию rep scasb без проверки/установки флага FD. Вопрос: в соглашении вызова stdcall как-то оговаривается состояние EFLAGS в момент вызова подпрограммы?
    и небольшая программа-тест для ленивых:
    Code (Text):
    1. ; (c) n0hack
    2. .386
    3. .model flat, stdcall
    4. option casemap: none
    5.  
    6. includelib kernel32.lib
    7. includelib user32.lib
    8.  
    9. include windows.inc
    10. include kernel32.inc
    11. include user32.inc
    12.  
    13. .data?
    14.     szBuff db 128 dup (?)
    15.  
    16. .data
    17.     szStr0 db "abc" ; никакого терминатора!
    18.     szStr1 db "def", 0
    19.  
    20.     szCaption db "lstrlen() bug tester", 0
    21.     szFormat db "lstrlen(", 022h, "%s", 022h, ") == %u", 0
    22. .code
    23.  
    24. start:
    25.     std
    26.     push offset szStr1
    27.     call lstrlen ; в win2k со всеми заплатками и сервис-паками возвращает 4
    28.    
    29.     cld ; wsprintf() и MessageBox() FD == 1 тоже башню срывает
    30.    
    31.     push eax
    32.     push offset szStr1
    33.     push offset szFormat
    34.     push offset szBuff
    35.     call wsprintf
    36.     add esp, 16
    37.    
    38.     push MB_ICONINFORMATION
    39.     push offset szCaption
    40.     push offset szBuff
    41.     push 0
    42.     call MessageBox
    43.  
    44.     push 0
    45.     call ExitProcess
    46.    
    47. end start
     
  2. wsd

    wsd New Member

    Blog Posts:
    0
    Joined:
    Aug 8, 2007
    Messages:
    2,824
    n0hack
    ага 0
     
  3. n0hack

    n0hack New Member

    Blog Posts:
    0
    Joined:
    Jun 3, 2008
    Messages:
    71
    весь eflags? 0o
     
  4. wsd

    wsd New Member

    Blog Posts:
    0
    Joined:
    Aug 8, 2007
    Messages:
    2,824
    нет
    твой флаг
     
  5. n0hack

    n0hack New Member

    Blog Posts:
    0
    Joined:
    Jun 3, 2008
    Messages:
    71
    меня просто немного смущает, что Visual Studio 2005 его не обнулет
     
  6. n0hack

    n0hack New Member

    Blog Posts:
    0
    Joined:
    Jun 3, 2008
    Messages:
    71
    wsd
    Большое спасибо за оперативный ответ :)
     
  7. wsd

    wsd New Member

    Blog Posts:
    0
    Joined:
    Aug 8, 2007
    Messages:
    2,824
    n0hack
    всегда готов!
    а другие темы стоило бы подчистить компетентным людям :dntknw:
     
  8. Magnum

    Magnum New Member

    Blog Posts:
    0
    Joined:
    Dec 29, 2007
    Messages:
    925
    я может не в теме
    а с какой целью обнулять флаг, если на каждой итерации цикла устанавливается значение флага в зависимости от результата сравнения??
     
  9. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    О_о благодарю за идею. Инструкция Int не изменяет DF, тоесть от инструкции Int2E до входа в сервис этот флаг не изменяется.
     
  10. 2FED

    2FED New Member

    Blog Posts:
    0
    Joined:
    Feb 20, 2008
    Messages:
    1,002
    Magnum что устанавливается, Direction Flag?
     
  11. n0hack

    n0hack New Member

    Blog Posts:
    0
    Joined:
    Jun 3, 2008
    Messages:
    71
    Clerk
    Пожалуйста.
    Я еще так подозреваю, сабж можно использовать против всяких Bit Defender'ов.

    Magnum
    Учите мат часть. Например, у Барри Брэя параграф "4.4 строковые инструкции" находится на 175-ой странице (в книге ~1300 страниц), то есть это самые основы.
    http://www.ozon.ru/context/detail/id/2479533/
    Очень полезная книжка, очень советую.