Всем привет! В программе всплывает назойливое окно , у которого необходимо убрать таймер с кнопки окей.То есть, чтобы когда окно очередной раз всплывёт,можно было бы сразу нажать на окей , а не ждать 10 секунд, чтобы можно было нажать на окей и закрыть назойливое окно. Код дизассемблировал и в итоге нашел функцию отвечающую за таймер всплывающего окна Код (ASM): .text:00401590 sub_401590 proc near ; DATA XREF: .rdata:0040245C↓o .text:00401590 push esi .text:00401591 mov esi, ecx .text:00401593 call ?OnInitDialog@CDialog@@UAEHXZ ; CDialog::OnInitDialog(void) .text:00401598 mov eax, [esi+20h] .text:0040159B push 0 ; lpTimerFunc .text:0040159D push 64h ; uElapse .text:0040159F push 3 ; nIDEvent .text:004015A1 push eax ; hWnd .text:004015A2 call ds:SetTimer .text:004015A8 push 0 ; int .text:004015AA lea ecx, [esi+64h] ; this .text:004015AD mov dword ptr [esi+60h], 0 .text:004015B4 call ?EnableWindow@CWnd@@QAEHH@Z ; CWnd::EnableWindow(int) .text:004015B9 mov eax, 1 .text:004015BE pop esi .text:004015BF retn .text:004015BF sub_401590 endp .text:004015BF .text:004015C0 ; --------------------------------------------------------------------------- .text:004015C0 sub esp, 0Ch .text:004015C3 push esi .text:004015C4 mov esi, ecx .text:004015C6 mov edx, [esi+60h] .text:004015C9 inc edx .text:004015CA mov eax, edx .text:004015CC mov [esi+60h], edx .text:004015CF cmp eax, 64h .text:004015D2 jle short loc_401608 .text:004015D4 mov eax, [esi+20h] .text:004015D7 push edi .text:004015D8 push 3 .text:004015DA push eax .text:004015DB call ds:KillTimer .text:004015E1 lea edi, [esi+64h] .text:004015E4 push 1 .text:004015E6 mov ecx, edi .text:004015E8 call ?EnableWindow@CWnd@@QAEHH@Z ; CWnd::EnableWindow(int) .text:004015ED push offset unk_403024 .text:004015F2 mov ecx, edi .text:004015F4 call ?SetWindowTextA@CWnd@@QAEXPBD@Z ; CWnd::SetWindowTextA(char const *) .text:004015F9 pop edi .text:004015FA mov ecx, esi .text:004015FC call ?Default@CWnd@@IAEJXZ ; CWnd::Default(void) .text:00401601 pop esi .text:00401602 add esp, 0Ch .text:00401605 retn 4 .text:00401608 Когда изменяю push 64h на push 0 , то таймер не пропадает, но уменьшается значительно быстрее , но нужно, чтобы таймера сразу не было, то есть как только вылезет окно, можно было сразу нажать на окей и не ждать таймер
Очевидно что задержка не в этом месте, так как 64h это 1/10 секунды. Если этот таймер и выполняет задержку, то не в этом месте. Когда таймер сработает, будет окну послано сообщение, нужно смотреть как оно обрабатывается.
ну так поменять Код (ASM): .text:004015A8 push 0 ; int на push 1 и кнопка не будет дисаблиться. Пусть себе считает.
Например, так: 0040159D - push 1 ; таймер на 1 мс 004015CF - cmp eax, 0 ; гасится не через 100 циклов, а при первом срабатывании
Можно конечно и таймер запатчить, но, имхо, все равно не приятно лицезреть наг. Не лучше ли совсем это окно выломать ? Выложи софт - взгляну.
Собственно, от таймера в окошке смог избавиться , но теперь осталось убрать само всплывающее окно и понять по какой причине изменял те или иные строчки кода
Код (ASM): 00401344 PUSH 0 00401346 PUSH 2710 0040134B PUSH 1 0040134D PUSH ECX 0040134E CALL DWORD PTR DS:[<&USER32.SetTimer>] Таймер нагскрина. Нет таймера - нет нага.
Почему когда я изменил push 64h на push 0 , то окно перестало появляться Код (ASM): .text:00401150 sub_401150 proc near ; CODE XREF: .text:0040139D↓p .text:00401150 ; .text:00401520↓p .text:00401150 .text:00401150 var_10 = dword ptr -10h .text:00401150 var_C = dword ptr -0Ch .text:00401150 var_4 = dword ptr -4 .text:00401150 .text:00401150 push 0FFFFFFFFh .text:00401152 push offset SEH_401150 .text:00401157 mov eax, large fs:0 .text:0040115D push eax .text:0040115E mov large fs:0, esp .text:00401165 push ecx .text:00401166 push esi .text:00401167 push edi .text:00401168 mov esi, ecx .text:0040116A push 0 ; struct CWnd * .text:0040116C push 64h ; unsigned int вот этот push 64h на push 0 .text:0040116E mov [esp+20h+var_10], esi .text:00401172 call ??0CDialog@@QAE@IPAVCWnd@@@Z ; CDialog::CDialog(uint,CWnd *) .text:00401177 lea edi, [esi+64h] .text:0040117A mov [esp+18h+var_4], 0 .text:00401182 mov ecx, edi ; this .text:00401184 call ??0CWnd@@QAE@XZ ; CWnd::CWnd(void) .text:00401189 mov ecx, [esp+18h+var_C] .text:0040118D mov dword ptr [edi], offset off_402470 .text:00401193 mov dword ptr [esi], offset off_402398 .text:00401199 mov eax, esi .text:0040119B pop edi .text:0040119C pop esi .text:0040119D mov large fs:0, ecx .text:004011A4 add esp, 10h .text:004011A7 retn .text:004011A7 sub_401150 endp .text:004011A7
Эльвин, > Почему когда я изменил push 64h на push 0 , то окно перестало появляться Потому что школьник, который это разработал допустил ошибки. Я вам ранее сказал что нужно смотреть, вы это не сделали, а по прежнему тупо меняете параметры таймера, в надежде что это поможет; это глупо HESH, > Нет таймера - нет нага. В штатном случае это должно подвесить всё апп. Так как событие не произошло - небыло доставки сообщения, соотвественно дальнейшая работа апп не выполниться. Но индусы такое дерьмо генерят, что предсказать как оно будет работать просто невозможно. ТС изучать отладчик и систему, только так вы сможите резолвить проблему. Иначе как видно её даже корректно описать не получается.
Тогда куда смотреть ? Вот есть что-то вроде Код (ASM): .text:004015B4 call ?EnableWindow@CWnd@@QAEHH@Z ; CWnd::EnableWindow(int) логично было бы поставить nop вместо call ? Чем хуже выбрать Код (ASM): .text:00401534 call ?DoModal@CDialog@@UAEHXZ ; CDialog::DoModal(void) или Код (ASM): .text:0040155F call ??1CDialog@@UAE@XZ ; CDialog::~CDialog(void) на что смотреть при выборе вариантов для изменения ?
SetTimer вообще-то подписывает окно(тред) на событие(уведомление). Не было подписки - не было уведомления, а значит реакции приложения. Все просто. При чем тут доставка сообщения?
Почему именно это надо было забивать NOP'ами Код (ASM): .text:00401534 call ?DoModal@CDialog@@UAEHXZ ; CDialog::DoModal(void) Почему именно этот вызов вызывал всплывающее окно , что вы в нём такого увидели ?
Эльвин, > Почему именно этот вызов вызывал всплывающее окно По определению https://msdn.microsoft.com/en-us/library/619z63f5(v=vs.120).aspx