Отладка. Как выйти из Kernell32!Sleep

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

  1. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Здравствуйте!

    Вот решил поковырять одну программку.

    Сначала все было хорошо, логика работы была как на ладони.
    А потом проглядел вызов Sleep на сутки...
    и теперь встал мой отладчик.

    Как ускорить сей процесс?

    отладчик - Olly.
     
  2. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> Как ускорить сей процесс?
    занопить или сам вызов, или подправить параметр которий ложится в стек
     
  3. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Дык это понятно.
    Я так и делал, чтобы время сокращать, просто параметр в стеке менял.

    Но вызов то уже случился, и ждать сутки не хочется.
     
  4. trash_master

    trash_master New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2006
    Сообщения:
    319
    Адрес:
    Україна
    контрол Ф2
     
  5. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Умно...
     
  6. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    Span
    Вызов KiSwapThread будет сложновато вернуть в спять с уровня ring3.
    Боюсь что фокус не получиться.
     
  7. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    Думаю таймер убрать даже в Айсе не так просто:
    Sleep -> NtDelayExecution дёргает KeDelayExecutionThread что работает с очередью ожидания потока, создаёт таймер а дальше переключение контекста KiSwapThread и возврат.
     
  8. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    вот это я тему нашел ))
    по-моему, помогает простая смена времени.. на SP1, по крайне мере
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    У KeDelayExecutionThread0 третий параметр LARGE_INTEGER Interval может принимать и положительные и отрицательные значения. Причем:
    Я думаю теперь ясно, когда достаточно перевести часы, а когда нет.
     
  10. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    думаешь? а по моему теперь вообще ничего не ясно
    Sleep что, вычисляет время, когда он должен закончиться, и указывает абсолютное время вместо относительного?
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    я просто уточнил когда перевод времени влияет на задержку, а когда нет =)
    Sleep указывает положительное время скорее всего, поэтому задержка абсолютная и может быть прервана переводом часов
     
  12. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    может быть.. надо глянуть как-нибудь..
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Глянем прямо сейчас =)

    Sleep():
    Код (Text):
    1. 7C802442 >  8BFF            MOV EDI, EDI                             ; ntdll.7C910738
    2. 7C802444    55              PUSH EBP
    3. 7C802445    8BEC            MOV EBP, ESP
    4. 7C802447    6A 00           PUSH 0
    5. 7C802449    FF75 08         PUSH DWORD PTR [EBP+8]
    6. 7C80244C    E8 4BFFFFFF     CALL kernel32.SleepEx
    7. 7C802451    5D              POP EBP
    8. 7C802452    C2 0400         RET 4
    SleepEx:
    Код (Text):
    1. .text:7C80239C ; DWORD __stdcall SleepEx(DWORD dwMilliseconds,BOOL bAlertable)
    2. .text:7C80239C                 public _SleepEx@8
    3. .text:7C80239C _SleepEx@8      proc near               ; CODE XREF: Sleep(x)+Ap
    4. .text:7C80239C                                         ; Beep(x,x)+13Fp
    5. .text:7C80239C
    6. .text:7C80239C var_3C          = dword ptr -3Ch
    7. .text:7C80239C var_38          = dword ptr -38h
    8. .text:7C80239C var_34          = dword ptr -34h
    9. .text:7C80239C var_28          = dword ptr -28h
    10. .text:7C80239C var_24          = dword ptr -24h
    11. .text:7C80239C var_20          = dword ptr -20h
    12. .text:7C80239C var_1C          = dword ptr -1Ch
    13. .text:7C80239C ms_exc          = CPPEH_RECORD ptr -18h
    14. .text:7C80239C dwMilliseconds  = dword ptr  8
    15. .text:7C80239C bAlertable      = dword ptr  0Ch
    16. .text:7C80239C
    17. .text:7C80239C                 push    2Ch
    18. .text:7C80239E                 push    offset dword_7C802458
    19. .text:7C8023A3                 call    __SEH_prolog
    20. .text:7C8023A8                 mov     [ebp+var_3C], 14h
    21. .text:7C8023AF                 mov     [ebp+var_38], 1
    22. .text:7C8023B6                 xor     eax, eax
    23. .text:7C8023B8                 lea     edi, [ebp+var_34]
    24. .text:7C8023BB                 stosd
    25. .text:7C8023BC                 stosd
    26. .text:7C8023BD                 stosd
    27. .text:7C8023BE                 xor     esi, esi
    28. .text:7C8023C0                 push    esi
    29. .text:7C8023C1                 lea     eax, [ebp+var_3C]
    30. .text:7C8023C4                 push    eax
    31. .text:7C8023C5                 call    ds:__imp__RtlActivateActivationContextUnsafeFast@8 ; RtlActivateActivationContextUnsafeFast(x,x)
    32. .text:7C8023CB                 mov     [ebp+ms_exc.disabled], esi
    33. .text:7C8023CE                 push    [ebp+dwMilliseconds]
    34. .text:7C8023D1                 lea     eax, [ebp+var_28]
    35. .text:7C8023D4                 push    eax
    36. .text:7C8023D5                 call    _BaseFormatTimeOut@8 ; BaseFormatTimeOut(x,x)
    37. .text:7C8023DA                 mov     [ebp+var_1C], eax
    38. .text:7C8023DD                 cmp     eax, esi
    39. .text:7C8023DF                 jz      short loc_7C802412
    40. .text:7C8023E1
    41. .text:7C8023E1 loc_7C8023E1:                           ; CODE XREF: SleepEx(x,x)+86j
    42. .text:7C8023E1                                         ; SleepEx(x,x)+8Fj
    43. .text:7C8023E1                 push    [ebp+var_1C]
    44. .text:7C8023E4                 push    [ebp+bAlertable]
    45. .text:7C8023E7                 call    ds:__imp__NtDelayExecution@8 ; NtDelayExecution(x,x)
    46. .text:7C8023ED                 mov     [ebp+var_20], eax
    47. .text:7C8023F0                 cmp     [ebp+bAlertable], esi
    48. .text:7C8023F3                 jnz     short loc_7C802424
    49. .text:7C8023F5
    50. .text:7C8023F5 loc_7C8023F5:                           ; CODE XREF: SleepEx(x,x)+8Dj
    51. .text:7C8023F5                 or      [ebp+ms_exc.disabled], 0FFFFFFFFh
    52. .text:7C8023F9                 call    sub_7C802432
    53. .text:7C8023FE                 mov     eax, 0C0h
    54. .text:7C802403                 cmp     [ebp+var_20], eax
    55. .text:7C802406                 jz      short loc_7C80240A
    56. .text:7C802408                 xor     eax, eax
    57. .text:7C80240A
    58. .text:7C80240A loc_7C80240A:                           ; CODE XREF: SleepEx(x,x)+6Aj
    59. .text:7C80240A                 call    __SEH_epilog
    60. .text:7C80240F                 retn    8
    61. .text:7C802412 ; ---------------------------------------------------------------------------
    62. .text:7C802412
    63. .text:7C802412 loc_7C802412:                           ; CODE XREF: SleepEx(x,x)+43j
    64. .text:7C802412                 mov     [ebp+var_28], esi
    65. .text:7C802415                 mov     [ebp+var_24], 80000000h
    66. .text:7C80241C                 lea     eax, [ebp+var_28]
    67. .text:7C80241F                 mov     [ebp+var_1C], eax
    68. .text:7C802422                 jmp     short loc_7C8023E1
    69. .text:7C802424 ; ---------------------------------------------------------------------------
    70. .text:7C802424
    71. .text:7C802424 loc_7C802424:                           ; CODE XREF: SleepEx(x,x)+57j
    72. .text:7C802424                 cmp     eax, 101h
    73. .text:7C802429                 jnz     short loc_7C8023F5
    74. .text:7C80242B                 jmp     short loc_7C8023E1
    75. .text:7C80242B _SleepEx@8      endp
    ммм.) ща покопаем
     
  14. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ачнись.. у тя ж сорсы есть
     
  15. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    хотя да.. сорсы не оттуда
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    хм. есть ) только у меня для win2k и nt4. кусками еще wrk лежит, но там почти ничего нету.
    ща гляну в надежде на то, что Sleep не поменялась от 2k до xp
     
  17. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    да на фиг? вопрос упирается в BaseFormatTimeOut - что она делает с миллисекундами? Дебагер есть под рукой?
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Из Windows 2000:

    Код (Text):
    1. VOID
    2. Sleep(
    3.     DWORD dwMilliseconds
    4.     )
    5.  
    6. /*++
    7.  
    8. Routine Description:
    9.  
    10.     The execution of the current thread can be delayed for a specified
    11.     interval of time with the Sleep function.
    12.  
    13.     The Sleep function causes the current thread to enter a
    14.     waiting state until the specified interval of time has passed.
    15.  
    16. Arguments:
    17.  
    18.     dwMilliseconds - A time-out value that specifies the relative time,
    19.         in milliseconds, over which the wait is to be completed.  A
    20.         timeout value of 0 specified that the wait is to timeout
    21.         immediately.  This allows an application to test an object to
    22.         determine if it is in the signaled state.  A timeout value of -1
    23.         specifies an infinite timeout period.
    24.  
    25. Return Value:
    26.  
    27.     None.
    28.  
    29. --*/
    30.  
    31. {
    32.     SleepEx(dwMilliseconds,FALSE);
    33. }
    34.  
    35. DWORD
    36. APIENTRY
    37. SleepEx(
    38.     DWORD dwMilliseconds,
    39.     BOOL bAlertable
    40.     )
    41.  
    42. /*++
    43.  
    44. Routine Description:
    45.  
    46.     The execution of the current thread can be delayed for a specified
    47.     interval of time with the SleepEx function.
    48.  
    49.     The SleepEx function causes the current thread to enter a waiting
    50.     state until the specified interval of time has passed.
    51.  
    52.     If the bAlertable parameter is FALSE, the only way the SleepEx
    53.     returns is when the specified time interval has passed.  If the
    54.     bAlertable parameter is TRUE, then the SleepEx can return due to the
    55.     expiration of the time interval (return value of 0), or because an
    56.     I/O completion callback terminated the SleepEx early (return value
    57.     of WAIT_IO_COMPLETION).
    58.  
    59. Arguments:
    60.  
    61.     dwMilliseconds - A time-out value that specifies the relative time,
    62.         in milliseconds, over which the wait is to be completed.  A
    63.         timeout value of 0 specified that the wait is to timeout
    64.         immediately.  A timeout value of -1 specifies an infinite
    65.         timeout period.
    66.  
    67.     bAlertable - Supplies a flag that controls whether or not the
    68.         SleepEx may terminate early due to an I/O completion callback.
    69.         A value of TRUE allows this API to complete early due to an I/O
    70.         completion callback.  A value of FALSE will not allow I/O
    71.         completion callbacks to terminate this call early.
    72.  
    73. Return Value:
    74.  
    75.     0 - The SleepEx terminated due to expiration of the time interval.
    76.  
    77.     WAIT_IO_COMPLETION - The SleepEx terminated due to one or more I/O
    78.         completion callbacks.
    79.  
    80. --*/
    81. {
    82.     LARGE_INTEGER TimeOut;
    83.     PLARGE_INTEGER pTimeOut;
    84.     NTSTATUS Status;
    85.  
    86.     pTimeOut = BaseFormatTimeOut(&TimeOut,dwMilliseconds);
    87.     if (pTimeOut == NULL) {
    88.         //
    89.         // If Sleep( -1 ) then delay for the longest possible integer
    90.         // relative to now.
    91.         //
    92.  
    93.         TimeOut.LowPart = 0x0;
    94.         TimeOut.HighPart = 0x80000000;
    95.         pTimeOut = &TimeOut;
    96.         }
    97.  
    98. rewait:
    99.     Status = NtDelayExecution(
    100.                 (BOOLEAN)bAlertable,
    101.                 pTimeOut
    102.                 );
    103.     if ( bAlertable && Status == STATUS_ALERTED ) {
    104.         goto rewait;
    105.         }
    106.     return Status == STATUS_USER_APC ? WAIT_IO_COMPLETION : 0;
    107. }
    Правда тут нету вызова RtlActivateActivationContextUnsafeFast, который в дизасм листинге иды есть. Но не суть. Принцип имхо ясен)
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Код (Text):
    1. PLARGE_INTEGER
    2. BaseFormatTimeOut(
    3.     OUT PLARGE_INTEGER TimeOut,
    4.     IN DWORD Milliseconds
    5.     )
    6.  
    7. /*++
    8.  
    9. Routine Description:
    10.  
    11.     This function translates a Win32 style timeout to an NT relative
    12.     timeout value.
    13.  
    14. Arguments:
    15.  
    16.     TimeOut - Returns an initialized NT timeout value that is equivalent
    17.          to the Milliseconds parameter.
    18.  
    19.     Milliseconds - Supplies the timeout value in milliseconds.  A value
    20.          of -1 indicates indefinite timeout.
    21.  
    22. Return Value:
    23.  
    24.  
    25.     NULL - A value of null should be used to mimic the behavior of the
    26.         specified Milliseconds parameter.
    27.  
    28.     NON-NULL - Returns the TimeOut value.  The structure is properly
    29.         initialized by this function.
    30.  
    31. --*/
    32.  
    33. {
    34.     if ( (LONG) Milliseconds == -1 ) {
    35.         return( NULL );
    36.         }
    37.     TimeOut->QuadPart = UInt32x32To64( Milliseconds, 10000 );
    38.     TimeOut->QuadPart *= -1;
    39.     return TimeOut;
    40. }
     
  20. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ну вот, видишь..
    так и хочется сказать.. мастдаай!!! ))