Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как сохранить процесс


Автор: ConstantinXXX 6.6.2006, 00:32
Как можно сохранить процесс. Например вы играете в игру и вам надо сохраниться, а сохраняться нельзя. Вы сворачиваете игру сохраняете процесс. Если вы проиграли, то опять сворачиваете игру запускаете процесс и играете дальше. smile  

Автор: jaAlex 6.6.2006, 00:58
Объясни задачу поподробнее, а то я что - то толком непонял, что вообще сделать надо - то? Какой процесс вообще сохранять? 

Автор: Romikgy 6.6.2006, 08:21
ConstantinXXX, имхо маловероятно это smile 

Автор: Snowy 6.6.2006, 09:18
Никак. Это вам не DOS. 

Автор: skyboy 6.6.2006, 10:07
написать виртуальную машину. из-под которой и будет исполняться код.
 

Автор: Sunvas 6.6.2006, 13:18
Нужно читать память где происходит процесс и записывать побитно в файл! 

Автор: Yanis 6.6.2006, 13:20
Цитата(Sunvas @  6.6.2006,  14:18 Найти цитируемый пост)
побитно в файл! 

А чё не покластерно? smile 

Автор: Snowy 6.6.2006, 13:28
Цитата(Sunvas @  6.6.2006,  13:18 Найти цитируемый пост)
Нужно читать память где происходит процесс и записывать побитно в файл! 
А что это даст?
Указатели меняются в течении работы программы неоднократно.
Что уж говорить о разных запусках.
Я создаю TList, заполняю 1000 элементов.
Затем ты проиграл. Лист уничтожаю. Все указатели теряются.
Создаю заново. Указатели указывают уже в совсем другие места.
А вы мне будете лепить на старые места, в которых уже неизвестно что лежит.
В лучшем случае программа начнет глючить. 

Автор: Yanis 6.6.2006, 13:41
К стати, в ArtMoney есть такая возможность - сохранение процесса. Но там тоже накладываются ограничения из-за некоторых обстоятельств. Одно из них описал Snowy. 

Автор: ConstantinXXX 6.6.2006, 14:48
А если нажать на паузу в игре выйти и полностью скопировать из оперативки весь процесс на винт. При этом проследить все изменения в папке с игрой и их тоже сохранить в другое место. При восстановлении процесса восстановить все изменения до сохранения процесса в папке с игрой. Естественно не на всех играх такое пройдет, но все-таки...
Артманя сохраняет процесс, но определенное значение.
 

Автор: Snowy 6.6.2006, 15:12
угу. Представь. Стратегия.
Ты атакуешь вражескую базу.
Тебе вырезали всю армю.
Указатели на юниты и их параметры исчезли.
А ты пытаешься туда восстановить значения.
Тут никакая пауза не поможет.
Откат невозможен, хоть что в память пиши.
Мы конечно и указатели восстановим. Вот только память уже освобождена и нам не принадлежит. 

Автор: ConstantinXXX 6.6.2006, 16:36
Цитата(Snowy @  6.6.2006,  15:12 Найти цитируемый пост)
Тебе вырезали всю армю.
Про стратегии это одно, а стрелялка это другое. 
Например, забежал в укромное место, где некого нет. Сохранился таким образом.
Например, Хитман во второй части можно сохраняться вроде 7 раз. А если кончились сохранения. Вот тут эта прога и поможет.

Артмани сохраняет определенный так сказать блок: например число 1890. Может, в новых версиях че то изменилось. Давно не пользовался. smile
  

Автор: Sunr1se 6.6.2006, 16:42
Да какая разница, даже если это будет тетрис, все равно возникнет трабла smile 

Автор: ConstantinXXX 6.6.2006, 16:45
Может и возникают, но когда ты сидиш в укромном месте т.е. нечего не происходит то можно сохраниться. Впринципе неважно что происходит на улице. В большенстве игр действие востановится после встречи с компьютером. Самое главное оказаться тамже где сохранился. 

Автор: ivashkanet 6.6.2006, 16:47
Товарищи, ConstantinXXX, проповедует такую идею:
--- Сделал слепок процесса (сохранил на диск).
--- Убил старый процесс.
--- Восстановил полностью весь процесс из слепка в оперативную память.


P.S. Вопрос в том, как заморозить исходный процесс, что бы он не изменился во время создания слепки.
 

Автор: ConstantinXXX 6.6.2006, 16:53
ivashkanet, 
Цитата(ivashkanet @  6.6.2006,  16:47 Найти цитируемый пост)
Сделал слепок процесса (сохранил на диск).
--- Убил старый процесс.
--- Восстановил полностью весь процесс из слепка в оперативную память.

Все понятно, но вот как реализовать. smile 
 

Автор: Yanis 6.6.2006, 17:08
Цитата(ivashkanet @  6.6.2006,  17:47 Найти цитируемый пост)
Вопрос в том, как заморозить исходный процесс, что бы он не изменился во время создания слепки.

Это как раз самое простое. Поиск по форуму должен помочь... 

Автор: BinaryEvil 6.6.2006, 17:16
я не знаю, можно так или нет, но есть же artmoney в конце концов, оно так делоет: останавливаешь процесс, копируешь все его переменные, потом можешь запустить процесс и поменять все переменные на сохранённые. кто знает, можно ли такое сделать, и как, расскажите, мне тоже интересно 

Автор: ivashkanet 6.6.2006, 17:51
Цитата(BinaryEvil @  6.6.2006,  17:16 Найти цитируемый пост)
потом можешь запустить процесс и поменять все переменные на сохранённые

Не должно такого быть  smile 
Тогда появятся траблы, описанные выше.
Нужно, чтобы програмка восстанавливала процесс с нуля 

Автор: ConstantinXXX 6.6.2006, 18:27
В том весь смысл, с нуля. А не в середине игры когда весь мир изменился.  

Автор: Mechanic 6.6.2006, 23:18
А стандартный виндовый Hibernate не годится?    smile 
Только он всю память выгружает.. 

Автор: Sunvas 7.6.2006, 00:24
Snowy, Yanis, давайте вспомним хорошую функцию винды "спящий режим". Как это ни странно, но эта функция позволяет выключить компьютер даже когда запущена игрушка типа Red Alert и полностью восстановить ее после включения. В даном случае
ConstantinXXX хочет сделать что-то подобное за принципом, а вы говорите что это невозможно! 

Автор: Snowy 7.6.2006, 08:51
Принцип действия спящего режима:
Винда прекращает выдавать процессорное время тредам. Сбрасывает память в файл, вырубается.
При включении компьютера, загрузчик загрушает не все с нуля, а подгружает память из файла.
Почему нельзя сделать это програмно:
Мы не можем остановить все треды одновременно. Хотя можем попробовать заморозить нужные.
Самое главное. Почему в DOS это делалось легко, а в WinNT невозможно?
Потому что нужно сохранять не только память программы, но и код, и объекты системы, хэндлы, выданные системой и т.д, к чему у нас просто нет доступа. А даже, если бы и был, то при восстановлении эти хэндлы преврашаются просто в числа - они уже не работают.
В DOS'e небыло никаких объектов, хэндлов и етц. Была память, были прерывания системы. Всё.
Доступ к коду был свободен. Скинули дамп, подгрузили в то же место. Программа работает, как небывало.
Для DOS программ - ради бога.
Для эмуляторов - ради бога. Пишите свою WMVare, делайте там хибернэйт, меняйте файл, запускайте снова...
А тут вам просто винда не позволит ковыряться там, где не положено. 

Автор: asm2 7.6.2006, 12:41
ArtMoney Pro сохраняет память процесса, некоторые системные объекты и хендлы на них, явно не все и не всегда успешно, сам проверял, но в принципе работает). У кого нет ArtMoney, искать тут http://www.artmoney.ru/rus.htm 

Автор: Dimannn 7.6.2006, 14:56
Сохранить и восстановить все хендлы(среди кот. динамически загружемые библиотеки, все окна и куча всякой совершенно неожиданной гадасти) у нас врядли пулучится. 

А что, если действительно написать виртуальную машину? В качестве жёсткого использовать текущий жёсткий, а запись на него фильтровать. Хотя это тоже не легче... 

Автор: Yanis 7.6.2006, 15:00
Цитата(Dimannn @  7.6.2006,  15:56 Найти цитируемый пост)
Сохранить и восстановить все хендлы(среди кот. динамически загружемые библиотеки, все окна и куча всякой совершенно неожиданной гадасти) у нас врядли пулучится. 

Смотря у кого у нас... (не имею ввиду себя). 

Автор: ConstantinXXX 8.6.2006, 13:23
По всем рассуждения получается надо переходить на DOS. вернее возвращаться. 

Автор: Ch0bits 8.6.2006, 20:26
Snowy прав, это 99.9% невозможно сделать прикладным программированием, только на уровне ядра ОС.

Аrtmoney прошаривает всю память процесса и определяет байты (или последовательности байт) удовлетворяющие заданному критерию, потом сохраняет эти адреса, например ищет int32 (4 байта) с заданным числом. Желательно предварительно указывать тип данных, а потом в ходе процесса отсеивать левые переменные методом сравнения. Естественно ни о каких хендлах и дескрипторах речи не идёт.
При следующем запуске artmoney тыкается по этим адресам, но не факт что там будут те же переменные. Это в первую очередь зависит от организации программы, её управлению памятью. Для облегчения таких замарочек можно достоверно найти одну переменную, а остальные вычислить по смещению адресов, что тоже не даёт никаких гарантий (но обычно работает).
Основано всё на функциях ReadProcessMemory и WriteProcessMemory (Описание смотрите в Platform SDK). 

Автор: asm2 9.6.2006, 17:48
из справки ArtMoney
"Сохранение и загрузка процесса"

Требования:
Windows 2000/XP/2003

Ограничения:
Нельзя перезапускать процесс. Для больших игр действует только внутри 
одного уровня. Пока работает не на всех играх, может повесить игру. 

Описание:
Данная функция может использоваться для сохранения игр, где это не предусмотрено. ArtMoney сохраняет память процесса и его системное окружение. Windows всячески пытается сопротивляться, поэтому возможны сбои в процессе. Если произошел сбой, то обычно процесс просто закрывается. 

Имеются три дополнительных режима работы (устанавливаются в настройках). При включении каждого, ArtMoney начинает вмешиваться в работу процесса с момента сохранения, чтобы увеличить вероятность успешной загрузки. Однако, не все процессы переживают такое вмешательство. В случае, если обычным способом не получилось загрузить, можно пытаться тогда использовать эти режимы, перебирая их по очереди: 

Режим 1 - Отвечает за управление виртуальной памятью. 
Режим 2 - Отвечает за управление кучей памяти. 
Режим 3 - Отвечает за управление системными объектами. 

Внимание! Запомните следующее:


 - Больше шансов на успешную загрузку, если отключить музыку и звуки. 
 - Для полноэкранных игр, горячие клавиши использовать только если вы уверены, что процесс загружается правильно. То есть, до этого пробовали грузить без клавиш. 
 - Если вы сохраняетесь, когда игра свернута, то и грузитесь только тогда, когда она свернута. 

Присылайте нам название игр, в которых не получилось сохраниться, и в которых получилось тоже. Обязательно пишите версию Windows и настройки режимов. 
 

Автор: ConstantinXXX 11.6.2006, 14:05
Каму нужна Артманя  заходите на        http://constantinxxx.narod.ru/   --------->   Download   -------->   Артманя       smile  

Автор: Yanis 11.6.2006, 14:48
Цитата(ConstantinXXX @ 11.6.2006,  15:05)
Каму нужна Артманя  заходите на        http://constantinxxx.narod.ru/   --------->   Download   -------->   Артманя       smile

Да я и с официального сайта скачать могу. Наверное другие тоже. 

Автор: ConstantinXXX 11.6.2006, 17:41
Yanis, Я какой адрес знаю, то и даю. Че плохова в этомsmile. Восновном реч пошла об Артмани вот и кинул адресок. smile  

Автор: RA 11.6.2006, 20:20
Цитата(ConstantinXXX @  11.6.2006,  17:41 Найти цитируемый пост)
Я какой адрес знаю, то и даю.


Всёбы логично но перед твоим постом был этот http://forum.vingrad.ru/index.php?showtopic=99278&view=findpost&p=756210

 

Автор: Ch0bits 11.6.2006, 21:53
asm2
Всё равно тут не наверняка, а на удачу приходится полагаться.  smile  

Автор: BUGOR 12.6.2006, 12:07
Если сняли дамп всего участка памяти, до экспортируемых библиотек, нужно ещё при этом приатачиться к процессу с аттрибутами DEBUG_PROCESS и запомнить всю структуру Context, после чего снять дамп всех участков памяти, а не от ImageBase и до ImageBase+SizeOfImage, и такой дамп будет занимать немало места, я бы даже сказал очень многоsmile После этого надо каким образом перечислить все хэндлы приналлежащие этому процессу(при перечислении нам поможет структура:
typedef struct _SYSTEM_HANDLE
{
    ULONG       uIdProcess;
    UCHAR       ObjectType; 
    UCHAR       Flags;
    USHORT      Handle;
    POBJECT     pObject;
    ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE, *PSYSTEM_HANDLE;
) Таким образом мы сможем определить принадлежность хэндла и тип объекта которые принадлежат нашему процессу и опять же сохранить их на диск.
Ну вот это был процесс сохранения. Восстановление: как создать процесс и как восстановить дамп я примерно себе представляю, а вот как восстановить таблицу хэндлов этого процесса я не понимаюsmile
Бредовая идея короче...  

Автор: ConstantinXXX 12.6.2006, 20:40
RAdmin, 
Цитата(RAdmin @  11.6.2006,  20:20 Найти цитируемый пост)
Всёбы логично но перед твоим постом был этот 

А че плохова в моем

Добавлено @ 20:42 
BUGOR, Идея хорошая... Если, конечный результат получится тем которым задумали в начале smile .
 

Автор: RA 13.6.2006, 00:08
Цитата(ConstantinXXX @  12.6.2006,  20:40 Найти цитируемый пост)
А че плохова в моем

Если я отвечу меня будут неуважать  smile  

Автор: Dimannn 13.6.2006, 12:27
Цитата(BUGOR @  12.6.2006,  12:07 Найти цитируемый пост)
а вот как восстановить таблицу хэндлов этого процесса я не понимаю

Я что, если хендлы попробовать не закрывать, а мерекинуть на нашу программу, а потом вернуть процессу? 

Автор: ConstantinXXX 17.6.2006, 05:42
Уже чето получается. Надо еще подумать. И мы напишим сохранятель процессов. smile  

Автор: Sunr1se 17.6.2006, 11:53
ConstantinXXX, а что именно получается-то? smile Рассказал бы об успехах. 

Автор: ConstantinXXX 18.6.2006, 19:54
Sunr1se, Я немного неправильно вырозился. У нас получается. По всему топику посматри. Если проанализировать, то идея уже более и мение осуществима. smile  

Автор: Yanis 19.6.2006, 00:04
Если проанализировать, то можно сделать выводы, что идея не решается в общем случае, путём малых затрат. К тому же, как уже было сказано выше, идея реализована в ArtMoney. И похоже что эта реализация максимально возможная. 

Автор: ASGDeveloper 21.6.2006, 13:36
Цитата(ConstantinXXX @  18.6.2006,  19:54 Найти цитируемый пост)
то идея уже более и мение осуществима.

Угу, только вот если использовать дампинг, то нельзя забывать про игры защищенные протектором. Тогда снять дамп с них можно будет только ручками. Потом восстановить импорт и ... ;)

Хотя для незапакованных прог у меня есть чудных исходник для дампинга. 

Автор: Yanis 21.6.2006, 18:10
Всё что можно сделать ручками можно сделать и програмным образом. В частных случаях. 

Автор: ASGDeveloper 21.6.2006, 18:34
Цитата(Yanis @  21.6.2006,  18:10 Найти цитируемый пост)
Всё что можно сделать ручками можно сделать и програмным образом.

Ну с этой темой лучше на тот же cracklab. Только ИМХО хрен кто программно распакует тот же обс (Obsidium). У меня иногда и руками не получается. 

Автор: Yanis 21.6.2006, 18:37
Цитата(Yanis @  21.6.2006,  19:10 Найти цитируемый пост)
Всё что можно сделать ручками можно сделать и програмным образом.

Обратное не всегда верно.
smile 

Автор: Sunvas 21.6.2006, 19:39
Цитата(Yanis @  21.6.2006,  18:10 Найти цитируемый пост)
Всё что можно сделать ручками можно сделать и програмным образом.

Думаю не все. Как программно включить компьютер?


M
Girder
Не оффтопте!
 

Автор: ivashkanet 22.6.2006, 09:44
Цитата(Sunvas @  21.6.2006,  19:39 Найти цитируемый пост)
Думаю не все. Как программно включить компьютер?

По таймеру? Запросто  smile Любой нормальный БИОС это поддерживает smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)