Консультация № 51744
10.08.2006, 14:47
0.00 руб.
0 6 3
Подскажите пожалуйста, мне нужно чтобы переход в точку входа происходил несразу, а через определенное время. Как мне это реализовать, и если можно приведите пожалуйста пример!

Обсуждение

Неизвестный
10.08.2006, 14:54
общий
В смысле, чтобы программа стартовала с задержкой?
Неизвестный
10.08.2006, 15:07
общий
это ответ
Здравствуйте, Ilya_Ivanov!
Вы бы уточнили...
1. Что понимается под точкой входа - запуск приложения, вызов подпрограммы, создание потока (для многозадачных ОС).
2. Какая платформа (ДОС, Виндоус...)
3. Что значит не сразу (определенная временная задержка? а чем простая пауза в начале не подойдет?).
4. Что Вы понимаете под переходом в точку входа (в т.ч. 1).

Как реализовать паузу думаю не проблема, есть много решений в зависимости от платформ ;)
Если нужен запуск программ в определенное время, то в Винде есть такое понятие как таймеры ожидания, а также, в принципе, есть планировщик...
Неизвестный
10.08.2006, 15:46
общий
Точка входа для запуска программы! Тоесть 1-я точка делает редирект на оригинальную, и мне нужно чтобы 1-я точка делал переход с задержкой! Желательно чтобы использовалась функция SetTimer/Sleep
Неизвестный
10.08.2006, 20:27
общий
это ответ
Здравствуйте, Ilya_Ivanov!
Все равно вопрос не совсем понятен. Если реализация через Masm то в начале кода пишем invoke Sleep,100 Второй параметр задержка в милисек.
..............................
start:
invoke Sleep,100
invoke GetModuleHandle, NULL
mov mhInst, eax
..........................

Если необходимо работать прямо под асемблером то можно сделать следующее.
Грузимся в отладчике и оказываемся на EP (Entry Point -точка входа) (В качестве отладчика я юзаю OllyDbg)
Проматываем код вниз. Там всегда располагаются нули. Делаем туда JMP. И замещаем то, что стерли когда ставили JMP. В контекстном меню отладчика выбираем search for->All intermodular calls. Если там есть в списке Sleep то просто делаем двойной клик по нему. переходим к коду типа такого:

0040262A . 68 F4010000 PUSH 1F4 ; /Timeout = 500. ms
0040262F . E8 30A10000 CALL <JMP.&KERNEL32.Sleep> ; \Sleep

копируем этот кусок и вставляем куда надо. Заменяя Timeout на необходимый.



Приложение:
До:00401219 MOV EAX,DWORD PTR FS:[0] / /EP0040121F PUSH EBP00401220 MOV EBP,ESP00401222 PUSH -1............................................................................0040CD54 00 DB 000040CD55 00 DB 000040CD56 00 DB 000040CD57 00 DB 000040CD58 00 DB 000040CD59 00 DB 000040CD5A 00 DB 000040CD5B 00 DB 000040CD5C 00 DB 000040CD5D 00 DB 00после:00401219 JMP unpacked.0040CD54 //EP0040121E NOP0040121F PUSH EBP00401220 MOV EBP,ESP.............................................................................0040CD54 MOV EAX,DWORD PTR FS:[0]0040CD5A PUSH 1000040CD5F CALL <JMP.&KERNEL32.Sleep>0040CD64 JMP unpacked.0040121F //возвращаемся0040CD69 00 DB 000040CD6A 00 DB 000040CD6B 00 DB 00
Неизвестный
10.08.2006, 23:34
общий
это ответ
Здравствуйте, Ilya_Ivanov!

Простите, откуда вы собираетесь переходить в точку входа?
Если вы хотите, чтобы программа после двойного клика на EXE-файле запускалась не сразу, то это невозможно. Разве что добавить вызов процедуры задержки после точки входа (см. ниже)
Если переход осуществляется из программы, то перед ним вызовите следующую процедуру:

Delay PROC NEAR ;Бездельничает одну секунду
PUSH ECX
MOV ECX,1600000000 ; Частота процессора в Гц
SHR ECX,1 ;Разделить на количество тактов для выполнения команды LOOPD
;т.е. на 2 для Pentium 4
NOP ;Умножить на количество секунд задержки (здесь на 1 умножать не надо)
POP ECX
@1: LOOPD @1 ;Пустой цикл, который тянет время
RET
Delay ENDP

Надеюсь, я вам помог. Счастливо!
Неизвестный
11.08.2006, 10:40
общий
В 1-й точке делаете паузу, а после нее прыжок на оригинальную не подойдет?
Форма ответа