Вечно жить не запретишь крис касперски ака мыщъх Хакер, номер #087, стр. 087-064-3 После создания первого дампа побегай немного и задампись еще раз, получив файл dump_2.exe. Затем сделай выстрел и создай еще один дамп - dump_3, постреляй еще немного и сделай dump_4.exe. После всех операций у тебя под рукой будет четыре файла: dump_1.exe, dump_2.exe с 50 патронами и dump_3.exe, dump_3.exe с 49 и 48 патронами, соответственно. Теперь мы должны сравнить все четыре файла и найти такие ячейки, которые совпадают в dump_1.exe и dump_2.exe, но отличаются у всех остальных. Переменные, отвечающие за хранение количества патронов будут где-то среди них. Для решения этой задачи мыщъх написал небольшую утилиту, исходный код и готовый бинарник которой можно найти на диске. Возьми с диска файл fck.exe и запусти утилиту: fck dump_1.exe dump_2.exe dump_3.exe dump_4.exe>o Полученный результат (перенаправленный в файл с именем «o») должен выглядеть примерно так: результат сравнения дампов raw offset d_2 d_3 d_4 000A2FFCh: FCh 00h 6Eh 000CFBA0h: FEh FDh FFh 00152262h: A1h 60h 00h 001523E2h: A1h 60h 00h Выделить жирным 00166574h: 32h 31h 30h 001666B4h: 32h 31h 30h 00168F28h: 32h 31h 30h 001772A5h: 65h 64h FFh 00177538h: CCh 4Ah FFh 001775ECh: C7h 26h FFh 00177A10h: 08h 04h FFh Здесь мы получили результат сравнения дампов памяти, снятых с программы. Ячейки, предположительно содержащие патроны, выделены полужирным шрифтом. В глаза сразу же бросается стройная цепочка 32h, 31h, 30h, соответствующая следующим десятичным числам: 50, 49, 48. Ага, это же количество патронов! Эта переменная встречается в дампе трижды по смещениям 00166574h, 001666B4h, 00168F28h. Одна из них настоящая, остальные — тени. Как найти нужную? Для начала переведем «сырые» файловые смещения в виртуальные адреса. Проще всего это сделать с помощью hiew. Грузим dumped_1.exe, давим <F5> (goto), вводим «сырое» смещение 166574 и нажимаем <enter> — hiew тут же показывает в верхней строке соответствующий виртуальный адрес (PE.00568574), а значение байта под курсором равно 32h, значит, все правильно! беремся за отладчик Загружаем soft-ice (подопытная игрушка при этом уже должна быть запущена), нажимаем <Ctrl-D> и говорим «addr legacy», заставляя отладчик переключиться на контекст нужного процесса (в данном случае legacy.exe – главный исполняемый файл игрушки). Вводим «wd», чтобы появилось окно дампа и пишем «g 568574», где 568574 — виртуальный адрес предполагаемой ячейки памяти с патронами. Отладчик показывает в дампе содержимое памяти. Команда «e» позволяет его редактировать в интерактивном режиме. Как вариант, можно написать «e 568574 66», где 66 – количество патронов в шестнадцатеричном исчислении. Захачив предполагаемую ячейку с патронами, выходим из отладчика по <Ctrl-D> и смотрим, добавили нам патронов или нет (в некоторых играх изменения отображаются только после следующего выстрела). Ни хрена! Патроны продолжают убывать, а враги напирают, и долго мы так не продержимся! Сурово! Пробуем вторую ячейку — 1666B4h, лежащую, как утверждает hiew, по виртуальному адресу 5686B4h, но количество патронов по-прежнему остается неизменным. А вот на третий раз нам действительно везет, и патроны послушно увеличиваются до нужного значения. Следовательно, искомая переменная - это 168F28h с виртуальным адресом 56AF28h. В любой момент мы можем вызвать отладчик, набрать «addr legacy <enter> e 56AF28 FF», пополняя запас патронов до максимального значения, вот только постоянно лазить в soft-ice слишком напряжно, да и не у всех он есть. Мы поступим проще: напишем программу, которая будет висеть в бэкграунде и подкидывать нам новые патроны каждые несколько секунд, даже несколько раз в секунду. Вот это действительно «подарок свыше»! :) Программа очень проста, ее код легко укладывается в пару строк – в этом легко убедиться, посмотрев на соответствующую врезку. Программа принимает идентификатор процесса (PID) в качестве аргумента командной строки, который можно определить с помощью виндового «Диспетчера задач». После завершения игрушки, наш автопатчер завершается автоматически. Он также может быть применен для хака других игрушек — необходимо лишь скорректировать AMMO_ADDR на адрес нужной ячейки, AMMO_VALUE – на желаемое значение, а AMMO_SIZE - на размер переменной. Запускаем нашу утилиту и оттягиваем монстров по полной, то есть не по-детски. При быстрой стрельбе патроны слегка убывают, но тут же вновь восстанавливаются в исходное значение. Красота! |