| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Как сохранить процесс |
| Автор: ConstantinXXX 6.6.2006, 00:32 |
| Как можно сохранить процесс. Например вы играете в игру и вам надо сохраниться, а сохраняться нельзя. Вы сворачиваете игру сохраняете процесс. Если вы проиграли, то опять сворачиваете игру запускаете процесс и играете дальше. |
| Автор: jaAlex 6.6.2006, 00:58 |
| Объясни задачу поподробнее, а то я что - то толком непонял, что вообще сделать надо - то? Какой процесс вообще сохранять? |
| Автор: Romikgy 6.6.2006, 08:21 |
| ConstantinXXX, имхо маловероятно это |
| Автор: 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 |
А чё не покластерно? |
| Автор: 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 |
| Про стратегии это одно, а стрелялка это другое. Например, забежал в укромное место, где некого нет. Сохранился таким образом. Например, Хитман во второй части можно сохраняться вроде 7 раз. А если кончились сохранения. Вот тут эта прога и поможет. Артмани сохраняет определенный так сказать блок: например число 1890. Может, в новых версиях че то изменилось. Давно не пользовался. |
| Автор: Sunr1se 6.6.2006, 16:42 |
| Да какая разница, даже если это будет тетрис, все равно возникнет трабла |
| Автор: ConstantinXXX 6.6.2006, 16:45 |
| Может и возникают, но когда ты сидиш в укромном месте т.е. нечего не происходит то можно сохраниться. Впринципе неважно что происходит на улице. В большенстве игр действие востановится после встречи с компьютером. Самое главное оказаться тамже где сохранился. |
| Автор: ivashkanet 6.6.2006, 16:47 |
| Товарищи, ConstantinXXX, проповедует такую идею: --- Сделал слепок процесса (сохранил на диск). --- Убил старый процесс. --- Восстановил полностью весь процесс из слепка в оперативную память. P.S. Вопрос в том, как заморозить исходный процесс, что бы он не изменился во время создания слепки. |
| Автор: ConstantinXXX 6.6.2006, 16:53 | ||
ivashkanet,
Все понятно, но вот как реализовать. |
| Автор: Yanis 6.6.2006, 17:08 | ||
Это как раз самое простое. Поиск по форуму должен помочь... |
| Автор: BinaryEvil 6.6.2006, 17:16 |
| я не знаю, можно так или нет, но есть же artmoney в конце концов, оно так делоет: останавливаешь процесс, копируешь все его переменные, потом можешь запустить процесс и поменять все переменные на сохранённые. кто знает, можно ли такое сделать, и как, расскажите, мне тоже интересно |
| Автор: ivashkanet 6.6.2006, 17:51 | ||
Не должно такого быть Тогда появятся траблы, описанные выше. Нужно, чтобы програмка восстанавливала процесс с нуля |
| Автор: ConstantinXXX 6.6.2006, 18:27 |
| В том весь смысл, с нуля. А не в середине игры когда весь мир изменился. |
| Автор: Mechanic 6.6.2006, 23:18 |
| А стандартный виндовый Hibernate не годится? Только он всю память выгружает.. |
| Автор: 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 | ||
Смотря у кого у нас... (не имею ввиду себя). |
| Автор: 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 --------> Артманя |
| Автор: Yanis 11.6.2006, 14:48 | ||
Да я и с официального сайта скачать могу. Наверное другие тоже. |
| Автор: ConstantinXXX 11.6.2006, 17:41 |
| Yanis, Я какой адрес знаю, то и даю. Че плохова в этом |
| Автор: RA 11.6.2006, 20:20 |
Всёбы логично но перед твоим постом был этот http://forum.vingrad.ru/index.php?showtopic=99278&view=findpost&p=756210 |
| Автор: Ch0bits 11.6.2006, 21:53 |
| asm2 Всё равно тут не наверняка, а на удачу приходится полагаться. |
| Автор: BUGOR 12.6.2006, 12:07 |
| Если сняли дамп всего участка памяти, до экспортируемых библиотек, нужно ещё при этом приатачиться к процессу с аттрибутами DEBUG_PROCESS и запомнить всю структуру Context, после чего снять дамп всех участков памяти, а не от ImageBase и до ImageBase+SizeOfImage, и такой дамп будет занимать немало места, я бы даже сказал очень много typedef struct _SYSTEM_HANDLE { ULONG uIdProcess; UCHAR ObjectType; UCHAR Flags; USHORT Handle; POBJECT pObject; ACCESS_MASK GrantedAccess; } SYSTEM_HANDLE, *PSYSTEM_HANDLE; ) Таким образом мы сможем определить принадлежность хэндла и тип объекта которые принадлежат нашему процессу и опять же сохранить их на диск. Ну вот это был процесс сохранения. Восстановление: как создать процесс и как восстановить дамп я примерно себе представляю, а вот как восстановить таблицу хэндлов этого процесса я не понимаю Бредовая идея короче... |
| Автор: ConstantinXXX 12.6.2006, 20:40 |
| RAdmin, А че плохова в моем Добавлено @ 20:42 BUGOR, Идея хорошая... Если, конечный результат получится тем которым задумали в начале |
| Автор: RA 13.6.2006, 00:08 |
Если я отвечу меня будут неуважать |
| Автор: Dimannn 13.6.2006, 12:27 |
Я что, если хендлы попробовать не закрывать, а мерекинуть на нашу программу, а потом вернуть процессу? |
| Автор: ConstantinXXX 17.6.2006, 05:42 |
| Уже чето получается. Надо еще подумать. И мы напишим сохранятель процессов. |
| Автор: Sunr1se 17.6.2006, 11:53 |
| ConstantinXXX, а что именно получается-то? |
| Автор: ConstantinXXX 18.6.2006, 19:54 |
| Sunr1se, Я немного неправильно вырозился. У нас получается. По всему топику посматри. Если проанализировать, то идея уже более и мение осуществима. |
| Автор: Yanis 19.6.2006, 00:04 |
| Если проанализировать, то можно сделать выводы, что идея не решается в общем случае, путём малых затрат. К тому же, как уже было сказано выше, идея реализована в ArtMoney. И похоже что эта реализация максимально возможная. |
| Автор: ASGDeveloper 21.6.2006, 13:36 |
Угу, только вот если использовать дампинг, то нельзя забывать про игры защищенные протектором. Тогда снять дамп с них можно будет только ручками. Потом восстановить импорт и ... ;) Хотя для незапакованных прог у меня есть чудных исходник для дампинга. |
| Автор: Yanis 21.6.2006, 18:10 |
| Всё что можно сделать ручками можно сделать и програмным образом. В частных случаях. |
| Автор: ASGDeveloper 21.6.2006, 18:34 |
Ну с этой темой лучше на тот же cracklab. Только ИМХО хрен кто программно распакует тот же обс (Obsidium). У меня иногда и руками не получается. |
| Автор: Yanis 21.6.2006, 18:37 |
Обратное не всегда верно. |
| Автор: Sunvas 21.6.2006, 19:39 | ||
Думаю не все. Как программно включить компьютер?
|
| Автор: ivashkanet 22.6.2006, 09:44 |
По таймеру? Запросто |