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

Skyrim: Аномалия С Инструкцией Или Кривые Руки


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

Всем привет!

 

Решил сделать вторую свою работу. Подопытного решил взять из свежих игр, в которые еще кто-то играет :) В общем это Skyrim.

Для начала, взломал отмычки. Теперь при обращении к случаю уменьшения отмычек - они увеличиваются на 75 и уменьшаются на 1 )))

Дальше - сложнее. Захотел взломать золото. В инвентаре такого параметра не оказалось (что довольно странно, еще год назад когда я играл, это параметр был в инветаре)

Пришлось идти в таверну. Зашел. Нашел значение. Нашел инструкцию (бряк на запись ставил)

И эта инструкция... Слегка странная. Я попробовал "прервать и трассировать адреса" и эта инструкция работает лишь с одним адресом денег - с нашим. И ни с чьим больше.

Начал писать скрипт на инъекцию. Вот он:

alloc(newmem,2048)label(returnhere)label(originalcode)label(exit)newmem:mov [edi+58],1000000mov ebx,00000003originalcode:mov [edi+58],eaxmov ebx,00000003exit:jmp returnhere"TESV.exe"+442E55:jmp newmemnopnopnopreturnhere:[DISABLE]"TESV.exe"+442E55:mov [edi+58],eaxmov ebx,00000003dealloc(newmem)

Собственно, это не единственный вариант, который я перепробывал.

Было и 

newmem:add [edi+58],1000000//дальше оригинальная инструкция

(поставил бряк на инструкцию, выяснил местоположение edi и в анализе структур перешел по смещению 58. значение совпадало со значением денег)

и пробовал через регистр eax - все бестолку.

Значение даже не думает увеличиваться или хоть как-то изменятся (кроме естественных команд)

В чем дело? Может я что-то делаю не так?

 

P.s. значение денег и в 2 byte и в 4 byte  одинаковое... Странно, правда?

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

Ну смотрю ты конечно с юмором :-)

Ты скрипт немного неправильно написал.

 

Ты написал так:

 

newmem:


mov [edi+58],1000000
mov ebx,00000003

originalcode:
mov [edi+58],eax

mov ebx,00000003

 

а надо где-то так:

 


// здесь вообще ничего не надо

newmem:

originalcode:
mov [edi+58],#1000000 // здесь твоя ошибка, так-как она перезаписывала значение которое было в еах(оригинальная инструкция mov [edi+58],eax )

mov ebx,00000003

 

 

P.s. значение денег и в 2 byte и в 4 byte  одинаковое... Странно, правда?

 

Не странно вообще!!! Объясню. Тип 2 байта целое имеет диапазон значений от 0 до 65535, а тип 4 байта целое от 0 до 4294967295. То-есть если ты выберешь в типе адреса вместо 4 байт целое 2 байта целое, то они будут равны ТОЛЬКО до значения 65535, а дальше будут числа не соответствовать друг другу.

 

Да и на будущее НЕХ числа типов 4 байта целое и 4 байта с плавающей точкой(тип float) при одинаковых значениях НЕХ числа означают СОВСЕМ разные числа в 10-ной системе счисления.

 

Кстати Xipho тоже может быть прав. Может ты действительно экранное значение нашел.

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

Там значение действительное и значение экранное отличаются. Ищи неизвестное, так как то, что ты нашел, скорее всего, экранное

 

Нет, я искал по неизвестному и дальше по "увеличилось-уменьшилось"

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

Я помню, что в ранних версиях игры у меня действительное значение денег отличалось на 140, только не помню, в большую, или меньшую сторону.

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

Нет, я искал по неизвестному и дальше по "увеличилось-уменьшилось"

Пробуй по "Изменилось" и "Не изменилось", т.к. как показывает практика - все чаще метод поиска по "Увеличилось" и "Уменьшилось" - приводит к экранному значению :)
Ссылка на комментарий
Поделиться на другие сайты

Ну смотрю ты конечно с юмором :-)

Ты скрипт немного неправильно написал.

 

Ты написал так:

 

newmem:

mov [edi+58],1000000

mov ebx,00000003

originalcode:

mov [edi+58],eax

mov ebx,00000003

 

а надо где-то так:

 

newmem:

// здесь вообще ничего не надо

originalcode:

mov [edi+58],#1000000 // здесь твоя ошибка, так-как она перезаписывала значение которое было в еах(оригинальная инструкция mov [edi+58],eax )

mov ebx,00000003

 

 

 

Не странно вообще!!! Объясню. Тип 2 байта целое имеет диапазон значений от 0 до 65535, а тип 4 байта целое от 0 до 4294967295. То-есть если ты выберешь в типе адреса вместо 4 байт целое 2 байта целое, то они будут равны ТОЛЬКО до значения 65535, а дальше будут числа не соответствовать друг другу.

 

Да и на будущее НЕХ числа типов 4 байта целое и 4 байта с плавающей точкой(тип float) при одинаковых значениях НЕХ числа означают СОВСЕМ разные числа в 10-ной системе счисления.

 

Кстати Xipho тоже может быть прав. Может ты действительно экранное значение нашел.

 

Ты был прав. Значение, которое я нашел - действительно стало 100000, но почему-то не в игре... Видимо это было экранное значение.

 

Я помню, что в ранних версиях игры у меня действительное значение денег отличалось на 140, только не помню, в большую, или меньшую сторону.

Да! Точно! Ведь правда! Я когда находил отмычки - там же они отличались на 10 единиц! На самом деле - 175, а в значении 165!

Skyrim, не знаю кто тебя писал - но у меня есть веские основания для отправки твоих разработчиков в нарко-диспансер!

Я помню, что в ранних версиях игры у меня действительное значение денег отличалось на 140, только не помню, в большую, или меньшую сторону.

 

Xipho и NullAlex были правы. Количество денег и в правду отличается на 140 вниз. Т.е. реальное значение денег на 140 меньше того, что на экране.

И я его нашел методом "изменилось не изменилось"

Спасибо вам :)

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

Да! Точно! Ведь правда! Я когда находил отмычки - там же они отличались на 10 единиц! На самом деле - 175, а в значении 165!

Skyrim, не знаю кто тебя писал - но у меня есть веские основания для отправки твоих разработчиков в нарко-диспансер!

 

Может такое случилось после установки патчей в игру.  o_0

А также желаю удачного взлома этой игры.  :)

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

Дела идут, контора пишет) 

Нашел адрес очков способностей. Его тип - byte. Я хочу чтобы значение очков способностей было всегда 100 (максимальное значение), но как это сделать с byte?

P.s. вот так это выглядит:

originalcode:mov [ecx+000006E1],al
Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

 

Дела идут, контора пишет) 

Нашел адрес очков способностей. Его тип - byte. Я хочу чтобы значение очков способностей было всегда 100 (максимальное значение), но как это сделать с byte?

P.s. вот так это выглядит:

originalcode:mov [ecx+000006E1],al

 Самое простое решение выглядит так:

mov [ecx+000006E1],64

Но можно поискать в памяти по соседству ячейку со значением 100, если такая имеется, то считывать это значение в al. Смотря как выглядит код считывания значения.

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

mov [ecx+000006E1],#100

Повезло, что сработало, хотя, по идее, могло заглючить основательно.

При записи числа в память размерность указывать обязательно, чтобы избежать возможных проблем. То есть, нужно писать так:

mov byte ptr [ecx+000006E1],(byte)100 // 64 (если hex)

В противном случае вместо нормальной записи существует вероятность вылета игры.

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

Повезло, что сработало, хотя, по идее, могло заглючить основательно.

При записи числа в память размерность указывать обязательно, чтобы избежать возможных проблем. То есть, нужно писать так:

mov byte ptr [ecx+000006E1],(byte)100 // 64 (если hex)

В противном случае вместо нормальной записи существует вероятность вылета игры.

 

Да, при переходе в другой город у меня крашнулась игра... Перепишу, пожалуй, на нормальный лад )

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

Ну и, конечно же, нужно убедиться, что данная инструкция работает только с одним адресом, в противном случае нужен будет фильтр и анализ структур.

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

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

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

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