Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |
[Win32] Может ли прога под вынь2к модифицировать себя? 08.04.02 07:33 Число просмотров: 1028
Автор: HandleX <Александр М.> Статус: The Elderman
|
> Может ли прога под вынь2к и ХР модифицировать собственный > код с использованием только штатных документированных > возможностей АПИ?
Надо определится, что есть "модифицировать себя".
Изменять свой собственный код в памяти процесса, в котором она запущена, или в файле на диске, из которого она запущена?
Память процесса - определись, по какому адресу и размер памяти, который собираешься модифицировать.
Вызываешь функцию API VirtualProtect и ставишь на страницы памяти тип доступа что-то вроде PAGE_EXECUTE_READWRITE.
Правишь всё что надо.
Вызываешь функцию FlushInstructionCache на всякий случай.
Всё просто…
Файл процесса - переименовываешь файл, из которого запущена твоя прога.
копируешь содержимое этого файла в старое имя.
Правишь ентот файл как нужно.
Запускаешь новый процесс из этого правленного файла.
Завершаешь старый процесс.
Ещё проще…
|
|
<programming>
|
[Win32] Может ли прога под вынь2к модифицировать себя? 08.04.02 04:38
Автор: Zef <Alloo Zef> Статус: Elderman
|
|
Может ли прога под вынь2к и ХР модифицировать собственный код с использованием только штатных документированных возможностей АПИ?
|
 |
[Win32] Может ли прога под вынь2к модифицировать себя? 08.04.02 07:33
Автор: HandleX <Александр М.> Статус: The Elderman
|
> Может ли прога под вынь2к и ХР модифицировать собственный > код с использованием только штатных документированных > возможностей АПИ?
Надо определится, что есть "модифицировать себя".
Изменять свой собственный код в памяти процесса, в котором она запущена, или в файле на диске, из которого она запущена?
Память процесса - определись, по какому адресу и размер памяти, который собираешься модифицировать.
Вызываешь функцию API VirtualProtect и ставишь на страницы памяти тип доступа что-то вроде PAGE_EXECUTE_READWRITE.
Правишь всё что надо.
Вызываешь функцию FlushInstructionCache на всякий случай.
Всё просто…
Файл процесса - переименовываешь файл, из которого запущена твоя прога.
копируешь содержимое этого файла в старое имя.
Правишь ентот файл как нужно.
Запускаешь новый процесс из этого правленного файла.
Завершаешь старый процесс.
Ещё проще…
|
 |  |
[Win32] И у меня вопрос есть. 08.04.02 22:48
Автор: Biasha <Бяша> Статус: Member Отредактировано 08.04.02 22:55 Количество правок: 2
|
> Надо определится, что есть "модифицировать себя". > Изменять свой собственный код в памяти процесса, в котором > она запущена, или в файле на диске, из которого она > запущена? > > Память процесса - определись, по какому адресу и размер > Всё просто… > > Файл процесса - переименовываешь файл, из которого запущена > твоя прога. А так, чтоб сразу, не переименовывая и не перезапуская?
Насколько я помню, этот самый, исполняемый файл, используется, как файл подкачки, для страниц с кодом и инициализированными данными. Но только эти страницы помечены как копируемые при записи - когда в них пишешь, файлом подкачки становится стандартный файл подкачки.
Я ничего не перепутал?
Если нет: как можно снять копирование при записи и т.д., так, чтоб все изменения попадали прямо в исполняемый файл на диске?
Я попробовал, но что-то у меня сходу не вышло, да ещё и рихтеровская утилита для просмотра атрибутов страниц виснуть начала после такого...
Может так кто уже делал? Дайте пример?
P.S.
Драйверы ядра и 9х не предлагать :)
|
 |  |
[Win32] VirtualProtect там работает? Понял! Спасибо 08.04.02 08:33
Автор: Zef <Alloo Zef> Статус: Elderman
|
|
|
|
|