Очень странный код...

Тема в разделе "WASM.RESEARCH", создана пользователем Velheart, 11 авг 2009.

  1. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Код (Text):
    1.  push    ebp
    2. .text:00401062                 mov     ebp, esp
    3. .text:00401064                 push    0FFFFFFFFh
    4. .text:00401066                 push    offset aGetprocaddress ; "GetProcAddress"
    5. .text:0040106B                 push    401E92h
    6. .text:00401070                 mov     eax, large fs:0
    7. .text:00401076                 push    eax
    8. .text:00401077                 mov     large fs:0, esp
    9. .text:0040107E                 sub     esp, 58h
    10. .text:00401084                 mov     [ebp-18h], esp
    11. .text:00401087                 call    ds:GetVersion
    12. .text:0040108D                 xor     edx, edx
    13. .text:0040108F                 mov     dl, ah
    14. .text:00401091                 mov     dword_4036D1, edx
    15. .text:00401097                 mov     ecx, eax
    16. .text:00401099                 and     ecx, 0FFh
    17. .text:0040109F                 mov     dword_4036CD, ecx
    18. .text:004010A5                 shl     ecx, 8
    19. .text:004010A8                 add     ecx, edx
    20. .text:004010AA                 mov     dword_4036C9, ecx
    21. .text:004010B0                 shr     eax, 10h
    22. .text:004010B3                 mov     dword_4036C5, eax
    23. .text:004010B8                 push    7B2Dh
    24. .text:004010BD                 call    ds:CloseHandle
    25. .text:004010C3                 xor     eax, eax
    26. .text:004010C5                 int     2Eh             ; DOS 2+ internal - EXECUTE COMMAND
    27. .text:004010C5                                         ; DS:SI -> counted CR-terminated command string
    28. .text:004010C7                 sub     eax, -40001FC7h
    29. .text:004010CC                 push    eax
    30. .text:004010CD                 add     edx, [esp]
    31. .text:004010D0                 add     esp, 4
    32. .text:004010D3                 call    edx
    33. .text:004010D5                 push    1136h
    34. .text:004010DA                 call    ds:CloseHandle
    В зверьке. С точки входа. До .text:004010C3 не доходит, по адресу 401E92h -- нули. Кто-нить понимает что происходит тут?)
     
  2. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    извиняюсь, забыл спрятать отладчик..
     
  3. holld

    holld New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    39
    бывает
     
  4. Killer

    Killer New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2008
    Сообщения:
    316
    А чего странного? Передача чего то ядру (смотреть подробнее влом)
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Простой антиотладочный механизм(совокупность механизмов) - адрес процедуры защищён два раза ядром, первый раз - генерацией сепшина при подключённом отладосном порте, второй - зависимость адреса от TF.
    У всякого входа в ядро существует определённая модель вызова и возврата.
    0x2e шлюз требует в регистре Eax номер сервиса, в Edx указатель на параметры в стеке.
    Контекст при возврате зависит от флажка TF(ветвление после проверки, если процессор поддерживает быстрый возврат(Sysexit)), при трассировке значения будут абсолютно другими в Ecx и Edx, в регистре Eax возвращается NTSTATUS код ошибки.
    При входе в сервис посредством 0x2e шлюза модель возврата:
    - Edx содержит адрес следующей за Int инструкции.
    - Ecx содержит указатель на стек.
    Модель возврата довольно сложна, изза множетсва нюансов. Если вход выполнен при взведённом TF, ядро загружает в регистры Ecx и Edx значения, которые были в ядерном стеке для очистки его(маркер последнего сех-фрейма и слово содержащее предыдущий режим, см. макро EXIT_ALL).

    Предположим что процессор поддерживает пару инструкций Sysenter/Sysexit:
    CloseHandle() с хэндлом 0x7B2D. Столь большой хэндл не валидный(врядтле открыто стока описателей). В этом случае если к процессу подключен отладчик(имеется отладочный порт) генерируется програмный сепшин и тред входит в обработку пользовательской ошибки при закрытии хэндла(KiRaiseUserExceptionDispatcher()). В большинстве апи после вызова сервиса следует конверсия ядерного кода ошибки в пользовательский последовательностью функций BaseSetLastNTError -> RtlNtStatusToDosError -> RtlNtStatusToDosErrorNoTeb. Последняя загружает в регистр Edx разность кода ошибки и табличного. Для XP при коде ошибки STATUS_INVALID_HANDLE возвращается 7. Это крайне плохой код, привязка к версии операционной системы, автору следовало вызвать вместо апи сервис NtClose. Если отладочный порт не подключен сервис вернёт в регистре Edx не валидный указатель, далее для 0x2e шлюза это эвляется указателем на стек, так как он не валидный сервис возвратит STATUS_ACCESS_VIOLATION. Далее это значение служит основой для определения адреса процедуры - регистр Edx содержит текущий адрес кода, что и является определением дельта-смещения. Разумеется под отладчиком этот адрес будет другим(Edx = -1..). Тоесть смещение относительно адреса 0x4010C5 будет 0C0000005(STATUS_ACCESS_VIOLATION) - (-0x40001FC7) = 0x1FCC, тоесть адрес 0x403091.
     
  6. Killer

    Killer New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2008
    Сообщения:
    316
    Clerk

    Рука мастера:)
    5+
     
  7. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Clerk
    Сенкс, очень познавательно)