Вечно жить не запретишь крис касперски ака мыщъх Хакер, номер #087, стр. 087-064-6 фрагмент структуры, описывающей состояние игрового мира 0000000740: 00 50 05 00 00 30 0E 40 ? FF FF BF 01 00 00 00 00 P? 0?@ ?? 0000000750: 03 26 00 00 68 2E F1 00 ? 00 00 08 00 00 00 08 00 ?& h.е ? ? 0000000760: 09 00 00 00 30 07 00 00 ? 30 0E 40 FF FF BF 38 03 ? 0• 0?@ ?8? 0000000770: 04 00 00 00 01 00 00 00 ? 00 03 20 00 00 34 2F F1 ? ? ? 4/е 0000000780: 00 00 00 08 00 00 00 08 ? 00 0A 00 00 00 E0 06 00 ? ? ? р? 0000000790: 00 50 0D 40 FF FF BF 01 ? 00 00 00 00 03 24 04 00 P?@ ?? ?$? 00000007A0: 00 30 F1 00 00 00 70 00 ? 00 00 70 00 0B 00 00 00 0е p p ? При внимательном осмотре дампа мы обнаружим, что константа FFFFh встречается намного чаще, чем остальные. Это ключ к понимаю структуры файла, но… где тот замок, куда его вставить? Смотрим. Константы расположены на различном расстоянии друг от друга, значит, мы имеем дело со структурой переменного размера или со списком, завершаемым «терминирующим» символом FFFFh. Если это структура, то где-то должен храниться ее размер, выражаемый в байтах, словах или двойных словах. Как найти его в дампе? Возьмем две ближайших константы, расположенные по смещению (748h и 76Bh). Как нетрудно подсчитать, их разделяет 23h байта. Следовательно, размер структуры не может выражаться ни словами, ни двойными словами (23h не кратно двум), а только байтам. Ищем число 23h в окрестности наших констант. Его нет! Поэтому можно предположить, что FFFFh используется в качестве терминирующего символа, то есть служит знаком конца списка. Остается только написать программу, отображающую содержимое списков в удобочитаемом виде, тогда искать различия будет намного проще. Однако это довольно сложная задача, решение которой требует уймы времени и терпения. Зато потом мы сможем «убивать» любых монстров или добавлять новых, подкладывать аптечки и другие артефакты, словом, творить чудеса, но это будет потом. Сейчас же мы ограничимся тем, что пополним запас патронов, здоровья и брони, а также дадим герою все оружие, из которого лично я предпочитаю совсем не BFG, а обыкновенный дробовик, причем одностволку! :) Вместо сравнения сэйвов, мы используем альтернативный подход, называемый «прямым константным поиском». Допустим, у нас сложилась следующая ситуация: здоровье — 68%, броня — 95%, патроны — 73 (200 max), патроны для дробовика — 24 (50 max). Переводим 68 и 95 в шестнадцатеричную систему исчисления и получаем 44h и 5Fh. Отгружаем игру в doomsav.dsg и загружаем этот файл в hiew. Давим <F7> (search) и ищем 44h, где оно есть (внимание! При поиске чисел > 255 необходимо помнить, что младший байт располагается по меньшему адресу и поэтому ищется в обратном порядке, то есть для поиска 1234h в hiew'е необходимо ввести 34 12). Ячейка с искомым значением тут же обнаруживается по смещению B4h. Может, это и не здоровье, но… рядом с ней лежит 5Fh, а это, как мы помним, наша броня: |