Остановить таймер (дизассемблирование)

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

  1. sopromat

    sopromat New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2010
    Сообщения:
    4
    Всем привет.

    Есть программа (в архиве) у которой идёт отчёт времени от 0 и до 600 сек. Потом идёт завершение.
    Ну вот я её открыл через OllyDbg и начал искать где там этот таймер тикает... Нашёл участок кода таймера.. нашёл:

    0048E715 FF05 3C3C4900 INC DWORD PTR DS:[493C3C]

    Оно.... смотрю на 493C3C... ага, туда счётчик пишет свои циферки.
    Нуплю этот INC и радостный сохраняю.

    Но потом оказалось, что ничего не получилось.... прога всёравно закрывается через свои 600 сек o.O
    Вобщем два дня смотрю на таймер и ничего понять не могу.. Непойму что там ещё.

    Потом я написал на Делфи похожую прогу... в ней спокойно всё нашёл и прервал.

    Вобщем кто может подскажет чево там такое?....

    Зарание спасибо.
     
  2. Clerk

    Clerk Забанен

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

    GL New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2010
    Сообщения:
    5
    Код (Text):
    1. 0042B536  |. 6A 00          PUSH 0                                   ; /Timerproc = NULL
    2. 0042B538  |. 56             PUSH ESI                                 ; |Timeout
    3. 0042B539  |. 6A 01          PUSH 1                                   ; |TimerID = 1
    4. 0042B53B  |. 8B43 34        MOV EAX,DWORD PTR DS:[EBX+34]            ; |
    5. 0042B53E  |. 50             PUSH EAX                                 ; |hWnd
    6. 0042B53F  |. E8 E0BAFDFF    CALL <JMP.&user32.SetTimer>              ; \SetTimer
     
  4. sopromat

    sopromat New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2010
    Сообщения:
    4
    Спасибо. Поковырявшись остаток этого дня я понял только что там 2 таймера.. Один с интервалом 1 сек. ведёт отчёт и выводит время в Caption формы, а другой таймер с интервалом 300 сек. закрывает прогу.

    Единственное что я смог сделать, так это в ходе отладке редактировать рег. ESI и вбивать туда свой интервал.
    И всё... гы. Так и не смог больше ничего понять )
     
  5. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    занопь созданий и удаление таймера
     
  6. sopromat

    sopromat New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2010
    Сообщения:
    4
    Хочется както "помягче" сделать а не нупить этот вызов.

    Я вобще думал както найти где находятся параметры этих таймеров и во время создания указать свойство Enable = false. Но чтото я не понял как там это свойство передаётся при создании. Интервал вижу... какойто id и ещё чтото..

    Вобщем надо будет поковырять этот код:

    Код (Text):
    1. 0042B500  /$ 55             PUSH EBP
    2. 0042B501  |. 8BEC           MOV EBP,ESP
    3. 0042B503  |. 6A 00          PUSH 0
    4. 0042B505  |. 53             PUSH EBX
    5. 0042B506  |. 56             PUSH ESI
    6. 0042B507  |. 8BD8           MOV EBX,EAX
    7. 0042B509  |. 33C0           XOR EAX,EAX
    8. 0042B50B  |. 55             PUSH EBP
    9. 0042B50C  |. 68 7FB54200    PUSH VRI-cnc-.0042B57F
    10. 0042B511  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
    11. 0042B514  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
    12. 0042B517  |. 6A 01          PUSH 1                                   ; /TimerID = 1
    13. 0042B519  |. 8B43 34        MOV EAX,DWORD PTR DS:[EBX+34]            ; |
    14. 0042B51C  |. 50             PUSH EAX                                 ; |hWnd
    15. 0042B51D  |. E8 9AB9FDFF    CALL <JMP.&user32.KillTimer>             ; \KillTimer
    16. 0042B522  |. 8B73 30        MOV ESI,DWORD PTR DS:[EBX+30]
    17. 0042B525  |. 85F6           TEST ESI,ESI
    18. 0042B527  |. 74 40          JE SHORT VRI-cnc-.0042B569
    19. 0042B529  |. 807B 40 00     CMP BYTE PTR DS:[EBX+40],0
    20. 0042B52D  |. 74 3A          JE SHORT VRI-cnc-.0042B569
    21. 0042B52F  |. 66:837B 3A 00  CMP WORD PTR DS:[EBX+3A],0
    22. 0042B534  |. 74 33          JE SHORT VRI-cnc-.0042B569
    23. 0042B536  |. 6A 00          PUSH 0                                   ; /Timerproc = NULL
    24. 0042B538  |. 56             PUSH ESI                                 ; |Timeout
    25. 0042B539  |. 6A 01          PUSH 1                                   ; |TimerID = 1
    26. 0042B53B  |. 8B43 34        MOV EAX,DWORD PTR DS:[EBX+34]            ; |
    27. 0042B53E  |. 50             PUSH EAX                                 ; |hWnd
    28. 0042B53F  |. E8 E0BAFDFF    CALL <JMP.&user32.SetTimer>              ; \SetTimer
    29. 0042B544  |. 85C0           TEST EAX,EAX
    30. 0042B546  |. 75 21          JNZ SHORT VRI-cnc-.0042B569
    31. 0042B548  |. 8D55 FC        LEA EDX,DWORD PTR SS:[EBP-4]
    32. 0042B54B  |. A1 040E4900    MOV EAX,DWORD PTR DS:[490E04]
    33. 0042B550  |. E8 8FACFDFF    CALL VRI-cnc-.004061E4
    34. 0042B555  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
    35. 0042B558  |. B2 01          MOV DL,1
    36. 0042B55A  |. A1 A0234100    MOV EAX,DWORD PTR DS:[4123A0]
    37. 0042B55F  |. E8 C80AFEFF    CALL VRI-cnc-.0040C02C
    38. 0042B564  |. E8 5B8BFDFF    CALL VRI-cnc-.004040C4
    39. 0042B569  |> 33C0           XOR EAX,EAX
    40. 0042B56B  |. 5A             POP EDX
    41. 0042B56C  |. 59             POP ECX
    42. 0042B56D  |. 59             POP ECX
    43. 0042B56E  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
    44. 0042B571  |. 68 86B54200    PUSH VRI-cnc-.0042B586
    45. 0042B576  |> 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]
    46. 0042B579  |. E8 0A91FDFF    CALL VRI-cnc-.00404688
    47. 0042B57E  \. C3             RETN
    Бряк показал что он отрабатывает и при создании таймеров и при их удалении.

    Только вот мне кажется что это не совсем то. В идеале мнеб найти кусок кода когда интервал уже весь прошёл и программа смотрит на инструкции которые в "теле" таймера. Тоесть там тупо должен быть Application.Terminate.

    Исследуемая программа написанна на Делфи, значит там должно быть чтото такое:

    Код (Text):
    1. procedure TForm1.Timer1Timer(Sender: TObject);
    2. begin
    3. // Вот сюда мне надо.
    4. Application.Terminate;
    5. end;
     
  7. sopromat

    sopromat New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2010
    Сообщения:
    4
    Фух... остановил )

    Вот то что мне надо было:

    Код (Text):
    1. 0048E6F0   . A1 980C4900    MOV EAX,DWORD PTR DS:[490C98]
    2. 0048E6F5   . 8B00           MOV EAX,DWORD PTR DS:[EAX]
    3. 0048E6F7   . E8 9C62FDFF    CALL VRI-cnc-.00464998
    4. 0048E6FC   . C3             RETN
    кол на 00464998 ведёт сюда:

    Код (Text):
    1. 00464998  /$ E8 FF8CFAFF    CALL VRI-cnc-.0040D69C
    2. 0046499D  |. 84C0           TEST AL,AL
    3. 0046499F  |. 74 07          JE SHORT VRI-cnc-.004649A8
    4. 004649A1  |. 6A 00          PUSH 0                                   ; /ExitCode = 0
    5. 004649A3  |. E8 8C25FAFF    CALL <JMP.&user32.PostQuitMessage>       ; \PostQuitMessage
    6. 004649A8  \> C3             RETN