Всем привет. Есть программа (в архиве) у которой идёт отчёт времени от 0 и до 600 сек. Потом идёт завершение. Ну вот я её открыл через OllyDbg и начал искать где там этот таймер тикает... Нашёл участок кода таймера.. нашёл: 0048E715 FF05 3C3C4900 INC DWORD PTR DS:[493C3C] Оно.... смотрю на 493C3C... ага, туда счётчик пишет свои циферки. Нуплю этот INC и радостный сохраняю. Но потом оказалось, что ничего не получилось.... прога всёравно закрывается через свои 600 сек o.O Вобщем два дня смотрю на таймер и ничего понять не могу.. Непойму что там ещё. Потом я написал на Делфи похожую прогу... в ней спокойно всё нашёл и прервал. Вобщем кто может подскажет чево там такое?.... Зарание спасибо.
sopromat Счётчики не обязательно использовать непосредственно, хотя их довольно много. Можно использовать функции ожидания, указав таймаут. Необходимо изучить механизм подсчёта, или простым перебором известных механизмов определить счётчик.
Код (Text): 0042B536 |. 6A 00 PUSH 0 ; /Timerproc = NULL 0042B538 |. 56 PUSH ESI ; |Timeout 0042B539 |. 6A 01 PUSH 1 ; |TimerID = 1 0042B53B |. 8B43 34 MOV EAX,DWORD PTR DS:[EBX+34] ; | 0042B53E |. 50 PUSH EAX ; |hWnd 0042B53F |. E8 E0BAFDFF CALL <JMP.&user32.SetTimer> ; \SetTimer
Спасибо. Поковырявшись остаток этого дня я понял только что там 2 таймера.. Один с интервалом 1 сек. ведёт отчёт и выводит время в Caption формы, а другой таймер с интервалом 300 сек. закрывает прогу. Единственное что я смог сделать, так это в ходе отладке редактировать рег. ESI и вбивать туда свой интервал. И всё... гы. Так и не смог больше ничего понять )
Хочется както "помягче" сделать а не нупить этот вызов. Я вобще думал както найти где находятся параметры этих таймеров и во время создания указать свойство Enable = false. Но чтото я не понял как там это свойство передаётся при создании. Интервал вижу... какойто id и ещё чтото.. Вобщем надо будет поковырять этот код: Код (Text): 0042B500 /$ 55 PUSH EBP 0042B501 |. 8BEC MOV EBP,ESP 0042B503 |. 6A 00 PUSH 0 0042B505 |. 53 PUSH EBX 0042B506 |. 56 PUSH ESI 0042B507 |. 8BD8 MOV EBX,EAX 0042B509 |. 33C0 XOR EAX,EAX 0042B50B |. 55 PUSH EBP 0042B50C |. 68 7FB54200 PUSH VRI-cnc-.0042B57F 0042B511 |. 64:FF30 PUSH DWORD PTR FS:[EAX] 0042B514 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP 0042B517 |. 6A 01 PUSH 1 ; /TimerID = 1 0042B519 |. 8B43 34 MOV EAX,DWORD PTR DS:[EBX+34] ; | 0042B51C |. 50 PUSH EAX ; |hWnd 0042B51D |. E8 9AB9FDFF CALL <JMP.&user32.KillTimer> ; \KillTimer 0042B522 |. 8B73 30 MOV ESI,DWORD PTR DS:[EBX+30] 0042B525 |. 85F6 TEST ESI,ESI 0042B527 |. 74 40 JE SHORT VRI-cnc-.0042B569 0042B529 |. 807B 40 00 CMP BYTE PTR DS:[EBX+40],0 0042B52D |. 74 3A JE SHORT VRI-cnc-.0042B569 0042B52F |. 66:837B 3A 00 CMP WORD PTR DS:[EBX+3A],0 0042B534 |. 74 33 JE SHORT VRI-cnc-.0042B569 0042B536 |. 6A 00 PUSH 0 ; /Timerproc = NULL 0042B538 |. 56 PUSH ESI ; |Timeout 0042B539 |. 6A 01 PUSH 1 ; |TimerID = 1 0042B53B |. 8B43 34 MOV EAX,DWORD PTR DS:[EBX+34] ; | 0042B53E |. 50 PUSH EAX ; |hWnd 0042B53F |. E8 E0BAFDFF CALL <JMP.&user32.SetTimer> ; \SetTimer 0042B544 |. 85C0 TEST EAX,EAX 0042B546 |. 75 21 JNZ SHORT VRI-cnc-.0042B569 0042B548 |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4] 0042B54B |. A1 040E4900 MOV EAX,DWORD PTR DS:[490E04] 0042B550 |. E8 8FACFDFF CALL VRI-cnc-.004061E4 0042B555 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] 0042B558 |. B2 01 MOV DL,1 0042B55A |. A1 A0234100 MOV EAX,DWORD PTR DS:[4123A0] 0042B55F |. E8 C80AFEFF CALL VRI-cnc-.0040C02C 0042B564 |. E8 5B8BFDFF CALL VRI-cnc-.004040C4 0042B569 |> 33C0 XOR EAX,EAX 0042B56B |. 5A POP EDX 0042B56C |. 59 POP ECX 0042B56D |. 59 POP ECX 0042B56E |. 64:8910 MOV DWORD PTR FS:[EAX],EDX 0042B571 |. 68 86B54200 PUSH VRI-cnc-.0042B586 0042B576 |> 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4] 0042B579 |. E8 0A91FDFF CALL VRI-cnc-.00404688 0042B57E \. C3 RETN Бряк показал что он отрабатывает и при создании таймеров и при их удалении. Только вот мне кажется что это не совсем то. В идеале мнеб найти кусок кода когда интервал уже весь прошёл и программа смотрит на инструкции которые в "теле" таймера. Тоесть там тупо должен быть Application.Terminate. Исследуемая программа написанна на Делфи, значит там должно быть чтото такое: Код (Text): procedure TForm1.Timer1Timer(Sender: TObject); begin // Вот сюда мне надо. Application.Terminate; end;
Фух... остановил ) Вот то что мне надо было: Код (Text): 0048E6F0 . A1 980C4900 MOV EAX,DWORD PTR DS:[490C98] 0048E6F5 . 8B00 MOV EAX,DWORD PTR DS:[EAX] 0048E6F7 . E8 9C62FDFF CALL VRI-cnc-.00464998 0048E6FC . C3 RETN кол на 00464998 ведёт сюда: Код (Text): 00464998 /$ E8 FF8CFAFF CALL VRI-cnc-.0040D69C 0046499D |. 84C0 TEST AL,AL 0046499F |. 74 07 JE SHORT VRI-cnc-.004649A8 004649A1 |. 6A 00 PUSH 0 ; /ExitCode = 0 004649A3 |. E8 8C25FAFF CALL <JMP.&user32.PostQuitMessage> ; \PostQuitMessage 004649A8 \> C3 RETN