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

imul шифрование


Antonshka

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

Пытаюсь понять принцип работы инструкции, но пока безрезультатно:

imul eax,[rcx+00000198],B05C6C43

Статичное значение адреса [rcx+00000198] = (4 bytes hex) BCF2465F

После исполнения инструкции "eax" содержит значение - (float )188.4955597 или что тоже (4 bytes hex)433C7EDD.

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

 

Из Cheat Engine Wiki, принцип работы imul

https://wiki.cheatengine.org/index.php?title=Assembler:Commands:IMUL

imul ecx,edx,2 // ecx = edx * 2

BCF2465F * B05C6C43 = 822AC75A433C7EDD

822AC75A_433C7EDD - вот вторая часть значения оригинальное расшифрованное значение 188.4955597. Но теперь нужно его изменить и зашифровать обратно.

--------------------- На этом этапе я остановился -----------------------

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

  • Ответов 69
  • Создана
  • Последний ответ

Топ авторов темы

  В 10.03.2019 в 08:30, partoftheworlD сказал:

 

(new_val * 0xB05C6C43)

Показать  

?:blink:

  В 10.03.2019 в 06:52, Antonshka сказал:

На этом этапе я остановился

Показать  

А в самой игре не пробовал найти участок с зашифровкой.

Интересный способ - ни разу не видел.

Подписался - жду развития.

Сам покопался. но тоже встрял. 

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

  В 10.03.2019 в 08:46, Garik66 сказал:

А в самой игре не пробовал найти участок с зашифровкой.

Показать  

Значение заносится в адрес командой "repe". Данные берутся из файла игры, в котором это значение уже зашифровано.  188.4955597  - это частота вращения коленвала на холостом ходу.

 

Можно использовать инструкцию чтения адреса

imul eax,[rcx+00000198],B05C6C43
mov [rsp+08],eax

таким образом

mov eax,[my_new_value]
mov [rsp+08],eax

my_new_value:
dd (float)100

тогда мне не придется пытаться расшифровывать значение.

 

Но инструкций на чтение одного адреса бывает очень много, плюс это не единственный адрес значение которого я бы хотел изменить. Словом такой обход занимает много времени. Также мне просто интересно как это шифрование работает.

 

 

  В 10.03.2019 в 08:30, partoftheworlD сказал:

(new_val * 0xB05C6C43)

Показать  

Если этот способ будет работать, то я премного буду тебе благодарен. Но я не понял как его использовать, чтобы получилось новое значение. Возможно я не совсем понятно объяснил суть вопроса.

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

  В 10.03.2019 в 09:26, Antonshka сказал:

B05C6C43

Показать  

А это константа? или все же переменная?

 

  В 10.03.2019 в 09:26, Antonshka сказал:

Но инструкций на чтение одного адреса бывает очень много

Показать  

ЗЫ: Ты имеешь ввиду, что придется передавать в регистр новое значение на каждой инструкции.

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

  В 10.03.2019 в 09:29, Garik66 сказал:

А это константа? или все же переменная?

 

Показать  

Это константа. При перезапусках игры всегда такое значение.

Вот кстати видео где один человек написал программу для расшифровки зашифровки значения, именно для этой игры и для этой инструкции

  Показать контент

 

  В 10.03.2019 в 09:29, Garik66 сказал:

ЗЫ: Ты имеешь ввиду, что придется передавать в регистр новое значение на каждой инструкции.

Показать  

Да, именно так. Плюс возможно придется делать фильтр в каждой инструкции.

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

  В 10.03.2019 в 09:32, Antonshka сказал:

Это константа. При перезапусках игры всегда такое значение.

Показать  

 

Если так, то единственный вариант это вытащить все константы, найти для каждого из них их собственный ключ (B05C6C43) и брутфорсить с новыми значениями. Так как найти формулу по которой они рассчитывали константы будет дольше, ведь значения не большие.

 

Что-то типа того

  Показать контент

 

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

  В 10.03.2019 в 09:49, partoftheworlD сказал:

Что-то типа того

  Показать контент

 

Показать  

Тоже проскакивала мысль сделать методом перебора. Логика подразумевалась быть такой -

1 - имеем оригинал BCF2465F * B05C6C43 = 822AC75A433C7EDD (822AC75A_433C7EDD)

2 - придумываем любое новое значение во float (например 188.4955597) и переводим его в hex (433C7EDD)

3 - создаем число X равное нулю - это будет левая часть числа (822AC75A_433C7EDD),

4 - увеличиваем число X на единицу (в hex) и приставляем к нему справа наше 433C7EDD, то есть получаем X433C7EDD

5 - делим X433C7EDD на ключ B05C6C43 и получаем число Y

6 - умножаем число Y на ключ B05C6C43, и полученный результат сравниваем с X433C7EDD

7 - если полученный результат равен X433C7EDD , то выводим это X433C7EDD как финишное значение, если же не равен, то повторяем шаги 4, 5, 6

 

Но мысль так и не осуществил.

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

 

 

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

  В 10.03.2019 в 11:03, Antonshka сказал:

Нужно попробовать написать

Показать  

И сколько по твоему это будет занимать времени?
я уже это в СЕ-ASM давно реализовал. пока нету результата.

думаю будет долго 

  Показать контент

 

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

  В 10.03.2019 в 11:20, Garik66 сказал:

думаю будет долго 

Показать  

 

4294967295 комбинаций, и только несколько из них подойдут.

 

  В 10.03.2019 в 11:03, Antonshka сказал:

1 - имеем оригинал BCF2465F * B05C6C43 = 822AC75A433C7EDD (822AC75A_433C7EDD)

2 - придумываем любое новое значение во float (например 188.4955597) и переводим его в hex (433C7EDD)

3 - создаем число X равное нулю - это будет левая часть числа (822AC75A_433C7EDD),

4 - увеличиваем число X на единицу (в hex) и приставляем к нему справа наше 433C7EDD, то есть получаем X433C7EDD

5 - делим X433C7EDD на ключ B05C6C43 и получаем число Y

6 - умножаем число Y на ключ B05C6C43, и полученный результат сравниваем с X433C7EDD

7 - если полученный результат равен X433C7EDD , то выводим это X433C7EDD как финишное значение, если же не равен, то повторяем шаги 4, 5, 6

Показать  

 

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

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

  В 10.03.2019 в 11:22, partoftheworlD сказал:

Ну да, этот метод проще

Показать  

 

  В 10.03.2019 в 11:03, Antonshka сказал:

Нужно попробовать написать

Показать  

Хотя, если начинать с нуля, то довольно быстро подобрал

для (float) 200 -> [rcx+00000198]  =  1F180000

@Antonshka пжлста проверь у себя

Не ну быстро

для (float)666 ->  1C178000

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

  В 10.03.2019 в 11:33, Garik66 сказал:

Хотя, если начинать с нуля, то довольно быстро подобрал

для (float) 200 -> [rcx+00000198]  =  1F180000

@Antonshka пжлста проверь у себя

Показать  

Проверил, держит 200 оборотов стабильно. Сколько времени занял процесс подбора?

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

  В 10.03.2019 в 11:36, Antonshka сказал:

Проверил

Показать  

2-3 секунды, но может меньше.

Сек попробую засечь

Дай новое значение оборотов

 

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

  В 10.03.2019 в 11:38, Garik66 сказал:

Дай новое значение оборотов

Показать  

121.2541

С какой частотой работает скрипт подбора? Используешь Createthread для AA?

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

 

  В 10.03.2019 в 11:40, Antonshka сказал:

121,2541

Показать  

Досчитал до 4.  28ECA073

Короче сам потесть на Туториале СЕ 2 шаг

Табличка: // перезалил ниже ошибка в скрипте

 

  В 10.03.2019 в 11:40, Antonshka сказал:

121,2541

Показать  

Активируй скрипт

задай нужный Value

Обнули  Value_EAX

в adres через приблизительно 3 секунды будет результат. 

 

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

  В 10.03.2019 в 11:54, Garik66 сказал:

Задачка, как и способ шифрования очень понравились.

Показать  

Теперь ты знакомо c брутфорсом на собственном опыте.?

Но задачка и правда интересная.

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

  В 10.03.2019 в 11:56, partoftheworlD сказал:

ты знаком о брутфорсе

Показать  

не - не знаком, нас никто не знакомил.:D
теперь придется гуглить, что есть брутфорс и с чем его едят 

 

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

  В 10.03.2019 в 11:43, Garik66 сказал:

Активируй скрипт

задай нужный Value

Обнули  Value_EAX

в adres через приблизительно 3 секунды будет результат.

Показать  

Скрипт что-то не находит значение для (float)555 в Value.

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

  В 10.03.2019 в 12:35, Antonshka сказал:

Скрипт что-то не находит значение для (float)555 в Value.

Показать  

Ошибка в скрипте - нужно перенести Inc edx

  Показать контент

555 -> A07E4000

ЗЫ: ну ты крут нашел скорее всего единственное значение при котором не работал изначальный скрипт 

ЗЫ1: хотя стоп. чейто не то в торопях ненужно делать

 

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

  В 10.03.2019 в 12:39, Garik66 сказал:

555 -> A07E4000

Показать  

15616516 тоже не ищет(с большими числами не работает возможно из-за того что регистры x86 малы)

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

  В 10.03.2019 в 12:44, partoftheworlD сказал:

15616516 тоже не ищет(с большими числами не работает возможно)

Показать  

Ищет (но подольше теперь) скрипт вот так нужно переписать

  Показать контент

 

  В 10.03.2019 в 12:44, partoftheworlD сказал:

15616516

Показать  

0801EFAC

Короче обновил табличку 

Tutorial-i386090319.CT

ЗЫ: теперь вроде без ошибок

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

@Garik66 Я пытался понять принцип работы твоего скрипта, но так и не смог. Смотрел через отладчик за тем что он делает, наблюдал за значениями регистров, за значениями переменных, всё безрезультатно. Порой я не понимаю самых простых вещей. А ведь скрипт имеет несколько строчек.

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

 

Между тем, вот немного модифицированный твой скрипт. Для нахождения значения для (float)555 требует ~0.8 секунды (оригинал ~5 секунд)

  Показать контент

 

 

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

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

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

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