RockHammer Опубликовано 27 октября, 2014 Поделиться Опубликовано 27 октября, 2014 (изменено) Всем привет! Решил сделать вторую свою работу. Подопытного решил взять из свежих игр, в которые еще кто-то играет В общем это 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 одинаковое... Странно, правда? Изменено 27 октября, 2014 пользователем RockHamer Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 27 октября, 2014 Поделиться Опубликовано 27 октября, 2014 Там значение действительное и значение экранное отличаются. Ищи неизвестное, так как то, что ты нашел, скорее всего, экранное Ссылка на комментарий Поделиться на другие сайты Поделиться
Bromvol Опубликовано 27 октября, 2014 Поделиться Опубликовано 27 октября, 2014 Ну смотрю ты конечно с юмором :-)Ты скрипт немного неправильно написал. Ты написал так: newmem:mov [edi+58],1000000mov ebx,00000003originalcode:mov [edi+58],eaxmov 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 27 октября, 2014 Автор Поделиться Опубликовано 27 октября, 2014 Там значение действительное и значение экранное отличаются. Ищи неизвестное, так как то, что ты нашел, скорее всего, экранное Нет, я искал по неизвестному и дальше по "увеличилось-уменьшилось" Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 27 октября, 2014 Поделиться Опубликовано 27 октября, 2014 Я помню, что в ранних версиях игры у меня действительное значение денег отличалось на 140, только не помню, в большую, или меньшую сторону. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 27 октября, 2014 Поделиться Опубликовано 27 октября, 2014 Нет, я искал по неизвестному и дальше по "увеличилось-уменьшилось"Пробуй по "Изменилось" и "Не изменилось", т.к. как показывает практика - все чаще метод поиска по "Увеличилось" и "Уменьшилось" - приводит к экранному значению Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 27 октября, 2014 Автор Поделиться Опубликовано 27 октября, 2014 Ну смотрю ты конечно с юмором :-)Ты скрипт немного неправильно написал. Ты написал так: newmem:mov [edi+58],1000000mov ebx,00000003originalcode:mov [edi+58],eaxmov 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 меньше того, что на экране.И я его нашел методом "изменилось не изменилось"Спасибо вам Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 27 октября, 2014 Поделиться Опубликовано 27 октября, 2014 Молодец, продолжай взлом, не останавливайся на достигнутом ) Ссылка на комментарий Поделиться на другие сайты Поделиться
krocki Опубликовано 27 октября, 2014 Поделиться Опубликовано 27 октября, 2014 Да! Точно! Ведь правда! Я когда находил отмычки - там же они отличались на 10 единиц! На самом деле - 175, а в значении 165!Skyrim, не знаю кто тебя писал - но у меня есть веские основания для отправки твоих разработчиков в нарко-диспансер! Может такое случилось после установки патчей в игру. А также желаю удачного взлома этой игры. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 27 октября, 2014 Автор Поделиться Опубликовано 27 октября, 2014 (изменено) Дела идут, контора пишет) Нашел адрес очков способностей. Его тип - byte. Я хочу чтобы значение очков способностей было всегда 100 (максимальное значение), но как это сделать с byte?P.s. вот так это выглядит:originalcode:mov [ecx+000006E1],al Изменено 27 октября, 2014 пользователем RockHamer Ссылка на комментарий Поделиться на другие сайты Поделиться
A1t0r Опубликовано 27 октября, 2014 Поделиться Опубликовано 27 октября, 2014 Дела идут, контора пишет) Нашел адрес очков способностей. Его тип - byte. Я хочу чтобы значение очков способностей было всегда 100 (максимальное значение), но как это сделать с byte?P.s. вот так это выглядит:originalcode:mov [ecx+000006E1],al Самое простое решение выглядит так:mov [ecx+000006E1],64Но можно поискать в памяти по соседству ячейку со значением 100, если такая имеется, то считывать это значение в al. Смотря как выглядит код считывания значения. Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 27 октября, 2014 Поделиться Опубликовано 27 октября, 2014 Попробуй так.mov byte ptr [ecx+000006E1],64 Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 27 октября, 2014 Автор Поделиться Опубликовано 27 октября, 2014 Помогло mov [ecx+000006E1],#100 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 27 октября, 2014 Поделиться Опубликовано 27 октября, 2014 Помогло mov [ecx+000006E1],#100100 (DEC) = 64 (HEX)Соответственно:mov [ecx+000006E1],#100И:mov [ecx+000006E1],64Равны Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 27 октября, 2014 Автор Поделиться Опубликовано 27 октября, 2014 100 (DEC) = 64 (HEX)Соответственно:mov [ecx+000006E1],#100И:mov [ecx+000006E1],64Равны Точно, спасибо) Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 28 октября, 2014 Поделиться Опубликовано 28 октября, 2014 mov [ecx+000006E1],#100Повезло, что сработало, хотя, по идее, могло заглючить основательно.При записи числа в память размерность указывать обязательно, чтобы избежать возможных проблем. То есть, нужно писать так:mov byte ptr [ecx+000006E1],(byte)100 // 64 (если hex)В противном случае вместо нормальной записи существует вероятность вылета игры. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 28 октября, 2014 Автор Поделиться Опубликовано 28 октября, 2014 Повезло, что сработало, хотя, по идее, могло заглючить основательно.При записи числа в память размерность указывать обязательно, чтобы избежать возможных проблем. То есть, нужно писать так:mov byte ptr [ecx+000006E1],(byte)100 // 64 (если hex)В противном случае вместо нормальной записи существует вероятность вылета игры. Да, при переходе в другой город у меня крашнулась игра... Перепишу, пожалуй, на нормальный лад ) Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 28 октября, 2014 Поделиться Опубликовано 28 октября, 2014 Ну и, конечно же, нужно убедиться, что данная инструкция работает только с одним адресом, в противном случае нужен будет фильтр и анализ структур. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения