Antonshka Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 Пытаюсь понять принцип работы инструкции, но пока безрезультатно: 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. Но теперь нужно его изменить и зашифровать обратно. --------------------- На этом этапе я остановился ----------------------- Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 06:52, Antonshka сказал: Но теперь нужно его изменить и зашифровать обратно. Показать (new_val * 0xB05C6C43) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 08:30, partoftheworlD сказал: (new_val * 0xB05C6C43) Показать ? В 10.03.2019 в 06:52, Antonshka сказал: На этом этапе я остановился Показать А в самой игре не пробовал найти участок с зашифровкой. Интересный способ - ни разу не видел. Подписался - жду развития. Сам покопался. но тоже встрял. Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2019 Автор Поделиться Опубликовано 10 марта, 2019 (изменено) В 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) Показать Если этот способ будет работать, то я премного буду тебе благодарен. Но я не понял как его использовать, чтобы получилось новое значение. Возможно я не совсем понятно объяснил суть вопроса. Изменено 10 марта, 2019 пользователем Antonshka Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 09:26, Antonshka сказал: B05C6C43 Показать А это константа? или все же переменная? В 10.03.2019 в 09:26, Antonshka сказал: Но инструкций на чтение одного адреса бывает очень много Показать ЗЫ: Ты имеешь ввиду, что придется передавать в регистр новое значение на каждой инструкции. Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2019 Автор Поделиться Опубликовано 10 марта, 2019 (изменено) В 10.03.2019 в 09:29, Garik66 сказал: А это константа? или все же переменная? Показать Это константа. При перезапусках игры всегда такое значение. Вот кстати видео где один человек написал программу для расшифровки зашифровки значения, именно для этой игры и для этой инструкции Показать контент В 10.03.2019 в 09:29, Garik66 сказал: ЗЫ: Ты имеешь ввиду, что придется передавать в регистр новое значение на каждой инструкции. Показать Да, именно так. Плюс возможно придется делать фильтр в каждой инструкции. Изменено 10 марта, 2019 пользователем Antonshka Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 09:32, Antonshka сказал: Да, именно так Показать тогда действительно - трудозатратно Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 09:32, 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2019 Автор Поделиться Опубликовано 10 марта, 2019 (изменено) В 10.03.2019 в 09:49, 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 Но мысль так и не осуществил. Нужно попробовать написать Луа скрипт для выполнения этого метода. Быть может будет эффективным. Изменено 10 марта, 2019 пользователем Antonshka Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 11:03, Antonshka сказал: Нужно попробовать написать Показать И сколько по твоему это будет занимать времени? я уже это в СЕ-ASM давно реализовал. пока нету результата. думаю будет долго Показать контент Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 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 Показать Ну да, этот метод проще и быстрее, полного перебора с дальнейшим вычислением. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 11:22, partoftheworlD сказал: Ну да, этот метод проще Показать В 10.03.2019 в 11:03, Antonshka сказал: Нужно попробовать написать Показать Хотя, если начинать с нуля, то довольно быстро подобрал для (float) 200 -> [rcx+00000198] = 1F180000 @Antonshka пжлста проверь у себя Не ну быстро для (float)666 -> 1C178000 Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2019 Автор Поделиться Опубликовано 10 марта, 2019 (изменено) В 10.03.2019 в 11:33, Garik66 сказал: Хотя, если начинать с нуля, то довольно быстро подобрал для (float) 200 -> [rcx+00000198] = 1F180000 @Antonshka пжлста проверь у себя Показать Проверил, держит 200 оборотов стабильно. Сколько времени занял процесс подбора? Изменено 10 марта, 2019 пользователем Antonshka Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 11:36, Antonshka сказал: Проверил Показать 2-3 секунды, но может меньше. Сек попробую засечь Дай новое значение оборотов Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2019 Автор Поделиться Опубликовано 10 марта, 2019 (изменено) В 10.03.2019 в 11:38, Garik66 сказал: Дай новое значение оборотов Показать 121.2541 С какой частотой работает скрипт подбора? Используешь Createthread для AA? Изменено 10 марта, 2019 пользователем Antonshka Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2019 Автор Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 11:43, Garik66 сказал: Досчитал до 4. 28ECA073 Показать Спасибо. Да, держит 121.2541 оборотов. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 11:46, Antonshka сказал: Спасибо. Показать Тебе спасибо!!! Задачка, как и способ шифрования очень понравились. Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 11:54, Garik66 сказал: Задачка, как и способ шифрования очень понравились. Показать Теперь ты знакомо c брутфорсом на собственном опыте.? Но задачка и правда интересная. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 11:56, partoftheworlD сказал: ты знаком о брутфорсе Показать не - не знаком, нас никто не знакомил. теперь придется гуглить, что есть брутфорс и с чем его едят Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2019 Автор Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 11:43, Garik66 сказал: Активируй скрипт задай нужный Value Обнули Value_EAX в adres через приблизительно 3 секунды будет результат. Показать Скрипт что-то не находит значение для (float)555 в Value. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 12:35, 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: хотя стоп. чейто не то в торопях ненужно делать Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 12:39, Garik66 сказал: 555 -> A07E4000 Показать 15616516 тоже не ищет(с большими числами не работает возможно из-за того что регистры x86 малы) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 В 10.03.2019 в 12:44, 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 В 10.03.2019 в 12:44, partoftheworlD сказал: 15616516 Показать 0801EFAC Короче обновил табличку Tutorial-i386090319.CT ЗЫ: теперь вроде без ошибок Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2019 Автор Поделиться Опубликовано 10 марта, 2019 (изменено) @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 Изменено 10 марта, 2019 пользователем Antonshka 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения