Перейти к содержанию

Скорострельность


Рекомендуемые сообщения

Делаем скорострельность.

rpm


Первые два шага такие же как и в статье про высокий прыжок.

Ссылка на статью про высокий прыжок

3-Приступим к поиску и взлому.

Подробнее об этом:

И снова игра Metro2033 на этот раз делаем скорострельность всего оружия...Как и в предыдущих статьях искали текстовую метку.. так и в этой стартовой точкой будет текстовая метка только она выглядит вот так "rpm" так в играх помечается скорострельность оружия..

post-117-1325005437,86_thumb.jpg

Нашли ее... двойной щелчок по ней что бы перейти в код, ставим на нее бряк и загружаем игру...

post-117-1325005641,94_thumb.png

Сработал бряк... отлично .. вроде все тоже самое как и всегда.. но давайте разберемся что происходит вот в этом куске кода....

post-117-1325005966,64_thumb.png

Давайте попробуем помять что тут происходит...


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 секунд которые в дальнейшем будут использованы )

post-117-1325006629,04_thumb.png

Проходим по коду вниз через ( F8 ) и вот тут инструкция деления.. интересно... divss xmm0,[esp+30] и тут делится xmm0 на [esp+30] а в данный момент в [esp+30] находится 600.. расскажу чуть позже почему именно 600..

post-117-1325007397,05_thumb.jpg

Проходим еще ниже и вот тут что то из xmmo (в xmm0 находится число после операции деления ) помещается в [esi+98]

post-117-1325007974,78_thumb.jpg

[esi+98] это адрес 15C12B88 смотрим дамп там еще ноль.. нужно выполнить инструкция movss [esi+98],xmm0 один раз нажимаем ( F8 ) смотрим что получилось..

post-117-1325008475,81_thumb.jpg

В дампе по адресу 15C12B88 находится 0.10000 float... скажу сразу это значения таймера.. а если быть точнее это время между выстрелами.. то есть одна пуля вылетела следующая вылетит через 0.1 секунды.. как то так))))

Это значение не меняется его и будем использовать... чуть не забыл про число 600.. от куда оно взялось... и что значит...600 это скорострельность оружия АК-74.. как узнали ну вдруг если не знаем...в любом поисковике задаем АК-74 характеристики.

Ответ.

post-117-1325009225,63_thumb.jpg

Что получается этот участок кода читает из конфигов скорострельность всего оружия в игре... и последовательно обрабатывает ее.. то есть получает время между выстрелами ... записывает его в структуры данного оружия и потом игра его использует...

Как пример оружие скорострельность 400 выстрелов в минуту.. (60/400=0.15сек) а АК-74 (60/600=0.1сек)


0074BE9B 68 DC2F9900 push 992FDC ; ASCII "rpm"
0074BEA0 8BC5 mov eax,ebp
0074BEA2 E8 19591600 call 008B17C0 ; metro203.008B17C0
0074BEA7 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,eax
0074BEBA 83C0 04 add eax,4
0074BEBD 5F pop edi
0074BEBE 8945 18 mov [ebp+18],eax
0074BEC1 895424 30 mov [esp+30],edx
0074BEC5 F3:0F5E4424 30 divss xmm0,[esp+30]
0074BECB 5D pop ebp
0074BECC F3:0F1186 98000>movss [esi+98],xmm0
0074BED4 5B pop ebx
0074BED5 83C4 24 add esp,24
0074BED8 C2 0400 ret 4
0074BE96	68 980D9600	 push	960D98						   ; ASCII "fp32"

Ставим на этот адрес 15C12B88 точку остановки на чтение и заходим в игру и пробуем стрельнуть... сразу сработал бряк...

post-117-1325010445,76_thumb.png

Получили нужную инструкцию.. можно написать скрипт..)))

4-Пишем скрипты

Подробнее об этом:

Скорострельность всего оружия...


alloc(newmem,2048)
label(returnhere)
globalalloc(rpm,4)

newmem:
mov [rpm],(float)0.05// Время между выстрелами.. 0.05 секунды...
movss xmm1,[rpm]
jmp returnhere

metro2033.exe+33E135:
jmp newmem
nop
nop
nop
returnhere:

[DISABLE]
metro2033.exe+33E135:
movss xmm1,[eax+00000148]
dealloc(newmem)
[ENABLE]

Скрипт пишется именно так.. потому что если изменить [eax+00000148] то в стандарт привести его сможет тока загрузка игры...

Поставленная задача выполнена... оружие стреляет в два а некоторое и в 3-4 раза быстрее))))

Спс

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.