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

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
  • Создана
  • Последний ответ

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

15 минут назад, partoftheworlD сказал:

 

(new_val * 0xB05C6C43)

?:blink:

1 час назад, Antonshka сказал:

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

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

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

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

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

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

41 минуту назад, 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

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

 

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

 

 

58 минут назад, partoftheworlD сказал:

(new_val * 0xB05C6C43)

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

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

2 минуты назад, Antonshka сказал:

B05C6C43

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

 

4 минуты назад, Antonshka сказал:

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

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

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

3 минуты назад, Garik66 сказал:

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

 

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

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

Спойлер

 

 

9 минут назад, Garik66 сказал:

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

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

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

22 минуты назад, Antonshka сказал:

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

 

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

 

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

Спойлер

import random
import time

const    = 0xB05C6C43
newvalue = 0x44a72000 #1337

while(True):
	time.sleep(0.01)
	#b = int(random.randint(0xffffffff, 0xffffffffffffffff) * const) #для поиска коллизий
	b = int(random.randint(0x0, 0xffffffff) * const)
	if hex(b & 0xffffffff) == hex(newvalue):
		print("\n\n\n\nWinner\n\n\n\n\n")
		print(hex(b))
		f = open("key.txt", "a")
		f.write('{}'.format(hex(b)))
		f.close()
		break

 

 

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

1 час назад, partoftheworlD сказал:

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

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


import random
import time

const    = 0xB05C6C43
newvalue = 0x44a72000 #1337

while(True):
	time.sleep(0.01)
	#b = int(random.randint(0xffffffff, 0xffffffffffffffff) * const) #для поиска коллизий
	b = int(random.randint(0x0, 0xffffffff) * const)
	if hex(b & 0xffffffff) == hex(newvalue):
		print("\n\n\n\nWinner\n\n\n\n\n")
		print(hex(b))
		f = open("key.txt", "a")
		f.write('{}'.format(hex(b)))
		f.close()
		break

 

 

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

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
Ссылка на комментарий
Поделиться на другие сайты

14 минут назад, Antonshka сказал:

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

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

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

Спойлер

image.thumb.png.c2c9369dcd51e701940a4259ba2b95f9.png

 

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

16 минут назад, Garik66 сказал:

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

 

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

 

33 минуты назад, 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

 

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

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

8 минут назад, partoftheworlD сказал:

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

 

28 минут назад, Antonshka сказал:

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

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

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

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

Не ну быстро

для (float)666 ->  1C178000

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

4 минуты назад, Garik66 сказал:

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

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

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

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

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

2 минуты назад, Garik66 сказал:

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

121.2541

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

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

 

1 час назад, Antonshka сказал:

121,2541

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

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

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

 

1 час назад, Antonshka сказал:

121,2541

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

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

Обнули  Value_EAX

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

 

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

5 минут назад, Garik66 сказал:

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

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

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

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

Только что, partoftheworlD сказал:

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

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

 

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

51 минуту назад, Garik66 сказал:

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

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

Обнули  Value_EAX

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

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

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

25 минут назад, Antonshka сказал:

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

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

Спойлер

Podbor:
  mov eax,[Value]

  div [Value_B05C6C43]
  mov [adres],eax
  imul eax,[adres],B05C6C43
  cmp eax,[Value]
  je @f
  inc edx
  jmp Podbor

 

555 -> A07E4000

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

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

 

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

1 минуту назад, partoftheworlD сказал:

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

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

Спойлер

Podbor:
  push edx
  mov eax,[Value]

  div [Value_B05C6C43]
  mov [adres],eax
  imul eax,[adres],B05C6C43
  cmp eax,[Value]
  je @f
  pop edx
  inc edx
  jmp Podbor

@@:
  mov [Value_EAX],eax
  pop rdx
  pop rax

 

 

2 минуты назад, partoftheworlD сказал:

15616516

0801EFAC

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

Tutorial-i386090319.CT

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

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

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

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

 

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

Спойлер

  push eax
  push ebx
  push ecx
  push edx
  mov ecx,[Value]

Podbor:
  inc ebx
  imul eax,ebx,B05C6C43
  cmp eax,ecx
  je @f
  jmp Podbor


@@:
  mov [adres],ebx
  mov [Value_EAX],eax
  pop edx
  pop ecx
  pop ebx
  pop eax

 

 

 

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

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

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

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