SYSENTER

Тема в разделе "WASM.ASSEMBLER", создана пользователем dr_dred, 3 авг 2005.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ykidia
    Хорошо, значит ты понимаешь что ntvdm это эмулятор и
    можно проигнорировать.
    Да.
    STATUS_INVALID_SYSTEM_SERVICE возвращается если несущестующий сервис вызван, тоесть при вызове сервиса указан его номер, индексирующий дескриптор, находящейся за пределами sst/shadow sst. Не вижу смысла юзоть это.
    Бред какойто. Регистр Eip увеличится на 2, указывая на следующую за Int2e инструкцию.
    Нужно соблюдать модель вызова, ты хотябы понимаешь как укозать номер вызываемого сервиса ?
    Конечно, ведь входные параметры случайны.
     
  2. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Clerk
    Где именно случайны? EAX я задаю раньше, т.е. EAX тоже задан. А EDX=0, потому что по вышеуказанной ссылке говорится, что если EDX=0, тогда никакие параметры не берутся, а возвращается STATUS_ACCESS_VIOLATION. Это так?
    Наверное плохо сформулировал, я имел в виду, что EAX я задаю вполне осознанным значением номера функции.
    Да, это автор статьи как-то перемудрил :)
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ykidia
    Edx указывает на параметры сервиса в стеке, ты его обнулил вот и возвращаетсо STATUS_ACCESS_VIOLATION.
     
  4. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Clerk
    Дык в том-то и дело, что не возвращается! Должно возвратиться либо STATUS_INVALID_SYSTEM_SERVICE (при отсутствии функции), либо STATUS_ACCESS_VIOLATION (при наличии функции), но ничего этого нет, а приходит какая-нибудь лажа, например на одной машине это 0x800000XX (точно не помню) для любого номера функции, на другой - 0x00000004, на третьей - еще один вариант... Я об этом. Что не так делаю?
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ykidia
    хз нужно в сурцы лезть смотреть, я никогда не юзол дос. Правильно вызов составь и вызывай, хотя наверно сегментные регистры надо подрихтовать.
     
  6. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    Не пашет int2E в NTVDM!!!11
    Проверял на реверсировоной ф-кцеи Sleep
    кернела32, который в свю очередь делает хинт в Ntdll (NtDelayExecution), и уже оно юзает Int 2E
    Так вот... Win32 версия работает и делает задержку, а вот скажем после обработки WDOSx-ом - нифига...
    Код (Text):
    1. program sleepNT;
    2.  
    3. procedure NtDelayExecution;
    4. //ZwDelayExecution proc near        //; CODE XREF: sub_77F89D5D+3Dp
    5. //                  //; .text:77F8A02Fp ...
    6. const
    7. arg_0       = {byte ptr}  4;
    8. asm
    9.         mov eax, 32h    //; NtDelayExecution
    10.         lea edx, [esp+arg_0]
    11.         int 2Eh     //; DOS 2+ internal - EXECUTE COMMAND
    12.                     //; DS:SI   -> counted CR-terminated command string
    13.         ret 8
    14. end;
    15. //ZwDelayExecution endp
    16.  
    17.  
    18.  
    19. procedure sub_77F82890;//   proc near       ; CODE XREF: _allmul+Ej
    20. const
    21. arg_0       = {dword ptr}  4;
    22. arg_C       = {dword ptr}  $10;
    23. asm
    24.         push    ebx
    25.         mul ecx
    26.         mov ebx, eax
    27.         mov eax, [esp+4+arg_0]
    28.         mul [esp+4+arg_C]
    29.         add ebx, eax
    30.         mov eax, [esp+4+arg_0]
    31.         mul ecx
    32.         add edx, ebx
    33.         pop ebx
    34.         ret 10h
    35. end;
    36. //sub_77F82890  endp
    37.  
    38.  
    39. procedure _allmul;
    40. //_allmul       proc near       ; CODE XREF: sub_77F83340+4Dp
    41. //                  ; sub_77F89C22+88p ...
    42. const
    43. arg_0       = {dword ptr}  4;
    44. arg_4       = {dword ptr}  8;
    45. arg_8       = {dword ptr}  $0C;
    46. arg_C       = {dword ptr}  $10;
    47. asm
    48.         mov eax, [esp+arg_4]
    49.         mov ecx, [esp+arg_C]
    50.         or  ecx, eax
    51.         mov ecx, [esp+arg_8]
    52.         jnz sub_77F82890
    53.         mov eax, [esp+arg_0]
    54.         mul ecx
    55.         ret 10h
    56. end;
    57. //_allmul       endp
    58.  
    59.  
    60. procedure sub_77E86740;//   proc near       ; CODE XREF: SleepEx+Ep
    61.             //      ; WaitForSingleObjectEx+46p ...
    62. const
    63. arg_0       = {dword ptr}  4;
    64. arg_4       = {dword ptr}  8;
    65.  
    66. //; FUNCTION CHUNK AT 77E8695A SIZE 00000007 BYTES
    67. asm
    68.         cmp [esp+arg_4], 0FFFFFFFFh
    69.         jz  @@loc_77E8695A
    70.         push    0
    71.         push    2710h
    72.         push    0
    73.         push    [esp+0Ch+arg_4]
    74.         call    _allmul
    75.         mov ecx, [esp+arg_0]
    76.         mov [ecx], eax
    77.         mov [ecx+4], edx
    78.         mov eax, [ecx]
    79.         neg eax
    80.         adc edx, 0
    81.         mov [ecx], eax
    82.         neg edx
    83.         mov [ecx+4], edx
    84.         mov eax, ecx
    85.  
    86. @@locret_77E86776:          //; CODE XREF: sub_77E86740+21Cj
    87.         ret 8
    88. @@loc_77E8695A:             //; CODE XREF: sub_77E86740+5j
    89.         xor eax, eax
    90.         jmp @@locret_77E86776
    91. end;
    92. //sub_77E86740  endp
    93.  
    94.  
    95.  
    96. //; DWORD   __stdcall SleepEx(DWORD dwMilliseconds, BOOL bAlertable)
    97. procedure SleepEx;
    98. //SleepEx       proc near       ; CODE XREF: Sleep+6p Beep+143p
    99. const
    100. var_8       = {dword ptr} -8;
    101. var_4       = {dword ptr} -4;
    102. dwMilliseconds  = {dword ptr}  8;
    103. bAlertable  = {dword ptr}  $0C;
    104.  
    105. //; FUNCTION CHUNK AT 77EA0894 SIZE 00000010 BYTES
    106. //; FUNCTION CHUNK AT 77EB8533 SIZE 00000024 BYTES
    107. asm
    108.         push    ebp
    109.         mov ebp, esp
    110.         push    ecx
    111.         push    ecx
    112.         push    esi
    113.         push    edi
    114.         push    [ebp+dwMilliseconds]
    115.         lea eax, [ebp+var_8]
    116.         push    eax
    117.         call    sub_77E86740
    118.         mov edi, eax
    119.         test    edi, edi
    120.         jz  @@loc_77EB8533
    121.  
    122. @@loc_77E867A4:             //; CODE XREF: SleepEx+31DB9j
    123. //      mov esi, ds:NtDelayExecution
    124.         push    edi
    125.         push    [ebp+bAlertable]
    126.         call    NtDelayExecution
    127.         cmp [ebp+bAlertable], 0
    128.         jnz @@loc_77EA0894
    129.  
    130. @@loc_77E867BA:             //; CODE XREF: SleepEx+1A112j
    131.         mov ecx, 0C0h
    132.         cmp eax, ecx
    133.         jz  @@loc_77EB8550
    134.         xor eax, eax
    135.  
    136. @@loc_77E867C9: //          ; CODE XREF: SleepEx+31DCBj
    137.         pop edi
    138.         pop esi
    139.         leave
    140.         ret 8
    141.  
    142.  
    143. @@loc_77EB8533:             //; CODE XREF: SleepEx+17j
    144.         and [ebp+var_8], eax
    145.         mov [ebp+var_4], 80000000h
    146.         lea edi, [ebp+var_8]
    147.         jmp @@loc_77E867A4
    148.  
    149.  
    150. @@loc_77EA0894:             //; CODE XREF: SleepEx+2Dj
    151.                     //; SleepEx+31DC4j
    152.         cmp eax, 101h
    153.         jnz @@loc_77E867BA
    154.         jmp @@loc_77EB8545
    155.  
    156. @@loc_77EB8550:             //; CODE XREF: SleepEx+3Aj
    157.         mov eax, ecx
    158.         jmp @@loc_77E867C9
    159.  
    160.  
    161. @@loc_77EB8545:             //; CODE XREF: SleepEx+1A118j
    162.         push    edi
    163.         push    [ebp+bAlertable]
    164.         call    NtDelayExecution
    165.         jmp @@loc_77EA0894
    166.  
    167. end;
    168. //SleepEx       endp
    169.  
    170.  
    171. //; void __stdcall Sleep(DWORD dwMilliseconds)
    172. //      public Sleep
    173. //Sleep     proc near
    174. procedure Sleep;
    175. const dwMilliseconds    = {dword ptr}  4;
    176. asm
    177.         push    0//     ; bAlertable
    178.         push    [esp+4+dwMilliseconds]// ; dwMilliseconds
    179.         call    SleepEx
    180.         ret 4
    181. //Sleep     endp
    182. end;
    183.  
    184. // Начало програмы
    185. asm  
    186.      push 1000
    187.      Call Sleep
    188. end.
    Cудя по тому что творицо в коде, (казалось бы простейшей функции!!), м$ не привыкли искать лёгких и быстрых путей...
     
  7. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    Ykidia
    Верно. Номера зависят от версии винды. И похоже номера ф-ий в пределах WinVer.Major - WinVer.Minor не меняются.
    Номер ф-ии для каждого варианта Major-Minor легко узнать: берём ntdll.dll от каждой версии окошек и скармливаем их ИДЕ. Смотрим интересующие нас ф-ии и определеяем их системные номера.
    У меня была как то идея определения версии Major-Minor вот таким способом:
    Код (Text):
    1. function i2SysCall(sysfunc: DWORD): DWORD; assembler;
    2. // EAX = sysfunc
    3. asm
    4.     xor     ecx, ecx
    5.     push    ecx            // 3C
    6.     push    ecx            // 38
    7.     push    ecx            // 34
    8.     push    ecx            // 30
    9.     push    ecx            // 2C
    10.     push    ecx            // 28
    11.     push    ecx            // 24
    12.     push    ecx            // 20
    13.     push    ecx            // 1C
    14.     push    ecx            // 18
    15.     push    ecx            // 14
    16.     push    ecx
    17.     push    ecx
    18.     push    ecx
    19.     push    ecx
    20.     db $E8, 02, 00, 00, 00       // call $+7
    21.     jmp   @next
    22.     lea     edx, dword ptr ss:[esp+4]
    23.     int     $2E                  // sys call
    24.     db $C2, $3C, $00             // retn $3C
    25. @next:
    26. end;
    27.  
    28. var
    29.   i, res: Cardinal;
    30.   winver: Byte;
    31. begin
    32.   winver := 0;
    33.   for i:=$0190 downto $00F7 do begin
    34.     res := i2SysCall(i);
    35.     if res <> STATUS_INVALID_SYSTEM_SERVICE then begin
    36.       if i > $018D then winver := 61 else     // 0190 = последняя команда в win61 6801
    37.       if i > $011B then winver := 60 else     // 018D = последняя команда в win60 SP0
    38.       if i > $00F7 then winver := 51 else     // 011B = последняя команда в win51 SP1 SP2 SP3
    39.       if i = $00F7 then winver := 50;         // 00F7 = последняя команда в win50 SP4
    40.       if winver > 0 then Break;
    41.     end;
    42.   end;
    43.   Writeln('winver = ', winver);
    44. end;
    Но так и не решился заюзать такое "определение" версии окошек. Слишком стрёмно.
     
  8. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    А.. соори, не розобралсо... Как выеснелос венда делает подмену IDT в режиме работы подсистемы NTVDM, в принципе это не мешает юзать SYSENTER в 32-битных NTVDM прогах (для связи напр. с дровом предоставляющим дополнительные возможности)...
    Хоть вкусняшка, и свободно доступна в win2к, однако Sice 4.05, уходит на ней в синьку :dntknw:
    Старые добрые Int-ы получше будут.. да.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ykidia
    Чудесно, лучше и не придумать... Если дурак то это пожизни)
     
  10. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Предлагаю проверять наличие папки C:\Windows :)