1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Избавиться от таймера всплывающего окна

Тема в разделе "WASM.BEGINNERS", создана пользователем Эльвин, 19 фев 2018.

Метки:
  1. Эльвин

    Эльвин New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2018
    Сообщения:
    16
    Всем привет!
    В программе всплывает назойливое окно , у которого необходимо убрать таймер с кнопки окей.То есть, чтобы когда окно очередной раз всплывёт,можно было бы сразу нажать на окей , а не ждать 10 секунд, чтобы можно было нажать на окей и закрыть назойливое окно. Код дизассемблировал и в итоге нашел функцию отвечающую за таймер всплывающего окна
    Код (ASM):
    1. .text:00401590 sub_401590      proc near               ; DATA XREF: .rdata:0040245C↓o
    2. .text:00401590                 push    esi
    3. .text:00401591                 mov     esi, ecx
    4. .text:00401593                 call    ?OnInitDialog@CDialog@@UAEHXZ ; CDialog::OnInitDialog(void)
    5. .text:00401598                 mov     eax, [esi+20h]
    6. .text:0040159B                 push    0               ; lpTimerFunc
    7. .text:0040159D                 push    64h             ; uElapse
    8. .text:0040159F                 push    3               ; nIDEvent
    9. .text:004015A1                 push    eax             ; hWnd
    10. .text:004015A2                 call    ds:SetTimer
    11. .text:004015A8                 push    0               ; int
    12. .text:004015AA                 lea     ecx, [esi+64h]  ; this
    13. .text:004015AD                 mov     dword ptr [esi+60h], 0
    14. .text:004015B4                 call    ?EnableWindow@CWnd@@QAEHH@Z ; CWnd::EnableWindow(int)
    15. .text:004015B9                 mov     eax, 1
    16. .text:004015BE                 pop     esi
    17. .text:004015BF                 retn
    18. .text:004015BF sub_401590      endp
    19. .text:004015BF
    20. .text:004015C0 ; ---------------------------------------------------------------------------
    21. .text:004015C0                 sub     esp, 0Ch
    22. .text:004015C3                 push    esi
    23. .text:004015C4                 mov     esi, ecx
    24. .text:004015C6                 mov     edx, [esi+60h]
    25. .text:004015C9                 inc     edx
    26. .text:004015CA                 mov     eax, edx
    27. .text:004015CC                 mov     [esi+60h], edx
    28. .text:004015CF                 cmp     eax, 64h
    29. .text:004015D2                 jle     short loc_401608
    30. .text:004015D4                 mov     eax, [esi+20h]
    31. .text:004015D7                 push    edi
    32. .text:004015D8                 push    3
    33. .text:004015DA                 push    eax
    34. .text:004015DB                 call    ds:KillTimer
    35. .text:004015E1                 lea     edi, [esi+64h]
    36. .text:004015E4                 push    1
    37. .text:004015E6                 mov     ecx, edi
    38. .text:004015E8                 call    ?EnableWindow@CWnd@@QAEHH@Z ; CWnd::EnableWindow(int)
    39. .text:004015ED                 push    offset unk_403024
    40. .text:004015F2                 mov     ecx, edi
    41. .text:004015F4                 call    ?SetWindowTextA@CWnd@@QAEXPBD@Z ; CWnd::SetWindowTextA(char const *)
    42. .text:004015F9                 pop     edi
    43. .text:004015FA                 mov     ecx, esi
    44. .text:004015FC                 call    ?Default@CWnd@@IAEJXZ ; CWnd::Default(void)
    45. .text:00401601                 pop     esi
    46. .text:00401602                 add     esp, 0Ch
    47. .text:00401605                 retn    4
    48. .text:00401608
    Когда изменяю push 64h на push 0 , то таймер не пропадает, но уменьшается значительно быстрее , но нужно, чтобы таймера сразу не было, то есть как только вылезет окно, можно было сразу нажать на окей и не ждать таймер
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.647
    Очевидно что задержка не в этом месте, так как 64h это 1/10 секунды. Если этот таймер и выполняет задержку, то не в этом месте. Когда таймер сработает, будет окну послано сообщение, нужно смотреть как оно обрабатывается.
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    1.872
    ну так поменять
    Код (ASM):
    1. .text:004015A8 push 0 ; int
    на push 1 и кнопка не будет дисаблиться. Пусть себе считает.
     
  4. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    797
    Адрес:
    Jabber: darksys@sj.ms
    004015A8 - push 1
    004015D2 - jmp
     
  5. Prober

    Prober New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    25
    Например, так:
    0040159D - push 1 ; таймер на 1 мс
    004015CF - cmp eax, 0 ; гасится не через 100 циклов, а при первом срабатывании
     
  6. HESH

    HESH Member

    Публикаций:
    1
    Регистрация:
    20 мар 2008
    Сообщения:
    98
    Можно конечно и таймер запатчить, но, имхо, все равно не приятно лицезреть наг. Не лучше ли совсем это окно выломать ? Выложи софт - взгляну.
     
  7. Эльвин

    Эльвин New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2018
    Сообщения:
    16
    Файл с таким расширение загружать нельзя пишет
     
  8. HESH

    HESH Member

    Публикаций:
    1
    Регистрация:
    20 мар 2008
    Сообщения:
    98
    Зазипуй или на файлообменник залей
     
  9. Эльвин

    Эльвин New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2018
    Сообщения:
    16

    Вложения:

    • nag.rar
      Размер файла:
      3,7 КБ
      Просмотров:
      73
  10. Эльвин

    Эльвин New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2018
    Сообщения:
    16
    Собственно, от таймера в окошке смог избавиться , но теперь осталось убрать само всплывающее окно и понять по какой причине изменял те или иные строчки кода
     
  11. HESH

    HESH Member

    Публикаций:
    1
    Регистрация:
    20 мар 2008
    Сообщения:
    98
    Код (ASM):
    1. 00401344  PUSH 0
    2. 00401346  PUSH 2710
    3. 0040134B  PUSH 1
    4. 0040134D  PUSH ECX
    5. 0040134E  CALL DWORD PTR DS:[<&USER32.SetTimer>]
    Таймер нагскрина. Нет таймера - нет нага. :)
     
  12. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    291
     
    al79, darkdevel и Эльвин нравится это.
  13. Эльвин

    Эльвин New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2018
    Сообщения:
    16
    Почему когда я изменил push 64h на push 0 , то окно перестало появляться
    Код (ASM):
    1. .text:00401150 sub_401150      proc near               ; CODE XREF: .text:0040139D↓p
    2. .text:00401150                                         ; .text:00401520↓p
    3. .text:00401150
    4. .text:00401150 var_10          = dword ptr -10h
    5. .text:00401150 var_C           = dword ptr -0Ch
    6. .text:00401150 var_4           = dword ptr -4
    7. .text:00401150
    8. .text:00401150                 push    0FFFFFFFFh
    9. .text:00401152                 push    offset SEH_401150
    10. .text:00401157                 mov     eax, large fs:0
    11. .text:0040115D                 push    eax
    12. .text:0040115E                 mov     large fs:0, esp
    13. .text:00401165                 push    ecx
    14. .text:00401166                 push    esi
    15. .text:00401167                 push    edi
    16. .text:00401168                 mov     esi, ecx
    17. .text:0040116A                 push    0               ; struct CWnd *
    18. .text:0040116C                 push    64h             ; unsigned int    вот этот push 64h на push 0
    19. .text:0040116E                 mov     [esp+20h+var_10], esi
    20. .text:00401172                 call    ??0CDialog@@QAE@IPAVCWnd@@@Z ; CDialog::CDialog(uint,CWnd *)
    21. .text:00401177                 lea     edi, [esi+64h]
    22. .text:0040117A                 mov     [esp+18h+var_4], 0
    23. .text:00401182                 mov     ecx, edi        ; this
    24. .text:00401184                 call    ??0CWnd@@QAE@XZ ; CWnd::CWnd(void)
    25. .text:00401189                 mov     ecx, [esp+18h+var_C]
    26. .text:0040118D                 mov     dword ptr [edi], offset off_402470
    27. .text:00401193                 mov     dword ptr [esi], offset off_402398
    28. .text:00401199                 mov     eax, esi
    29. .text:0040119B                 pop     edi
    30. .text:0040119C                 pop     esi
    31. .text:0040119D                 mov     large fs:0, ecx
    32. .text:004011A4                 add     esp, 10h
    33. .text:004011A7                 retn
    34. .text:004011A7 sub_401150      endp
    35. .text:004011A7
     
  14. HESH

    HESH Member

    Публикаций:
    1
    Регистрация:
    20 мар 2008
    Сообщения:
    98
    А почему вы его изменили ?
     
  15. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    797
    Адрес:
    Jabber: darksys@sj.ms
    в будущем - мож адреса писать будете а не команды? :)
     
  16. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.647
    Эльвин,

    > Почему когда я изменил push 64h на push 0 , то окно перестало появляться

    Потому что школьник, который это разработал допустил ошибки. Я вам ранее сказал что нужно смотреть, вы это не сделали, а по прежнему тупо меняете параметры таймера, в надежде что это поможет; это глупо :dntknw:

    HESH,

    > Нет таймера - нет нага.

    В штатном случае это должно подвесить всё апп. Так как событие не произошло - небыло доставки сообщения, соотвественно дальнейшая работа апп не выполниться. Но индусы такое дерьмо генерят, что предсказать как оно будет работать просто невозможно.

    ТС изучать отладчик и систему, только так вы сможите резолвить проблему. Иначе как видно её даже корректно описать не получается.
     
  17. Эльвин

    Эльвин New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2018
    Сообщения:
    16
    Тогда куда смотреть ? Вот есть что-то вроде
    Код (ASM):
    1. .text:004015B4                 call    ?EnableWindow@CWnd@@QAEHH@Z ; CWnd::EnableWindow(int)
    логично было бы поставить nop вместо call ? Чем хуже выбрать
    Код (ASM):
    1. .text:00401534                 call    ?DoModal@CDialog@@UAEHXZ ; CDialog::DoModal(void)
    или
    Код (ASM):
    1. .text:0040155F                 call    ??1CDialog@@UAE@XZ ; CDialog::~CDialog(void)
    на что смотреть при выборе вариантов для изменения ?
     
  18. HESH

    HESH Member

    Публикаций:
    1
    Регистрация:
    20 мар 2008
    Сообщения:
    98
    SetTimer вообще-то подписывает окно(тред) на событие(уведомление). Не было подписки - не было уведомления, а значит реакции приложения. Все просто. При чем тут доставка сообщения?
     
  19. Эльвин

    Эльвин New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2018
    Сообщения:
    16
    Почему именно это надо было забивать NOP'ами
    Код (ASM):
    1. .text:00401534                 call    ?DoModal@CDialog@@UAEHXZ ; CDialog::DoModal(void)
    Почему именно этот вызов вызывал всплывающее окно , что вы в нём такого увидели ?
     
  20. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    291