Grom-Skynet Опубликовано 27 декабря, 2011 Поделиться Опубликовано 27 декабря, 2011 Делаем скорострельность.rpmПервые два шага такие же как и в статье про высокий прыжок.Ссылка на статью про высокий прыжок3-Приступим к поиску и взлому.Подробнее об этом:И снова игра Metro2033 на этот раз делаем скорострельность всего оружия...Как и в предыдущих статьях искали текстовую метку.. так и в этой стартовой точкой будет текстовая метка только она выглядит вот так "rpm" так в играх помечается скорострельность оружия..Нашли ее... двойной щелчок по ней что бы перейти в код, ставим на нее бряк и загружаем игру...Сработал бряк... отлично .. вроде все тоже самое как и всегда.. но давайте разберемся что происходит вот в этом куске кода....Давайте попробуем помять что тут происходит...0074BE9B 68 DC2F9900 push 992FDC ; ASCII "rpm" // Строчка в этом документе.0074BEA2 E8 19591600 call 008B17C0 ; metro203.008B17C0 // Получить параметр.0074BE96 68 980D9600 push 960D98 ; ASCII "fp32" // Ссылка на текстовый документ.С этим понятно идем дальше...используя клавишу ( F8 ) и вот тут что то интересноеВ регистр FP xmmo помешается что то из адреса 009CDA6C скажу сразу это статический адрес со значением 60 ( и это 60 секунд которые в дальнейшем будут использованы )Проходим по коду вниз через ( F8 ) и вот тут инструкция деления.. интересно... divss xmm0,[esp+30] и тут делится xmm0 на [esp+30] а в данный момент в [esp+30] находится 600.. расскажу чуть позже почему именно 600..Проходим еще ниже и вот тут что то из xmmo (в xmm0 находится число после операции деления ) помещается в [esi+98][esi+98] это адрес 15C12B88 смотрим дамп там еще ноль.. нужно выполнить инструкция movss [esi+98],xmm0 один раз нажимаем ( F8 ) смотрим что получилось..В дампе по адресу 15C12B88 находится 0.10000 float... скажу сразу это значения таймера.. а если быть точнее это время между выстрелами.. то есть одна пуля вылетела следующая вылетит через 0.1 секунды.. как то так))))Это значение не меняется его и будем использовать... чуть не забыл про число 600.. от куда оно взялось... и что значит...600 это скорострельность оружия АК-74.. как узнали ну вдруг если не знаем...в любом поисковике задаем АК-74 характеристики.Ответ.Что получается этот участок кода читает из конфигов скорострельность всего оружия в игре... и последовательно обрабатывает ее.. то есть получает время между выстрелами ... записывает его в структуры данного оружия и потом игра его использует...Как пример оружие скорострельность 400 выстрелов в минуту.. (60/400=0.15сек) а АК-74 (60/600=0.1сек)0074BE9B 68 DC2F9900 push 992FDC ; ASCII "rpm"0074BEA0 8BC5 mov eax,ebp0074BEA2 E8 19591600 call 008B17C0 ; metro203.008B17C00074BEA7 8B45 18 mov eax,[ebp+18]0074BEAA 8B4D 14 mov ecx,[ebp+14]0074BEAD 8B1401 mov edx,[ecx+eax]0074BEB0 F3:0F1005 6CDA9>movss xmm0,[9CDA6C]0074BEB8 03C8 add ecx,eax0074BEBA 83C0 04 add eax,40074BEBD 5F pop edi0074BEBE 8945 18 mov [ebp+18],eax0074BEC1 895424 30 mov [esp+30],edx0074BEC5 F3:0F5E4424 30 divss xmm0,[esp+30]0074BECB 5D pop ebp0074BECC F3:0F1186 98000>movss [esi+98],xmm00074BED4 5B pop ebx0074BED5 83C4 24 add esp,240074BED8 C2 0400 ret 40074BE96 68 980D9600 push 960D98 ; ASCII "fp32"Ставим на этот адрес 15C12B88 точку остановки на чтение и заходим в игру и пробуем стрельнуть... сразу сработал бряк...Получили нужную инструкцию.. можно написать скрипт..)))4-Пишем скриптыПодробнее об этом:Скорострельность всего оружия...alloc(newmem,2048)label(returnhere)globalalloc(rpm,4)newmem:mov [rpm],(float)0.05// Время между выстрелами.. 0.05 секунды...movss xmm1,[rpm]jmp returnheremetro2033.exe+33E135:jmp newmemnopnopnopreturnhere:[DISABLE]metro2033.exe+33E135:movss xmm1,[eax+00000148]dealloc(newmem)[ENABLE]Скрипт пишется именно так.. потому что если изменить [eax+00000148] то в стандарт привести его сможет тока загрузка игры...Поставленная задача выполнена... оружие стреляет в два а некоторое и в 3-4 раза быстрее))))Спс Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения