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 1 час назад, Antonshka сказал: Но теперь нужно его изменить и зашифровать обратно. (new_val * 0xB05C6C43) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 15 минут назад, partoftheworlD сказал: (new_val * 0xB05C6C43) ? 1 час назад, Antonshka сказал: На этом этапе я остановился А в самой игре не пробовал найти участок с зашифровкой. Интересный способ - ни разу не видел. Подписался - жду развития. Сам покопался. но тоже встрял. Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2019 Автор Поделиться Опубликовано 10 марта, 2019 (изменено) 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) Если этот способ будет работать, то я премного буду тебе благодарен. Но я не понял как его использовать, чтобы получилось новое значение. Возможно я не совсем понятно объяснил суть вопроса. Изменено 10 марта, 2019 пользователем Antonshka Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 2 минуты назад, Antonshka сказал: B05C6C43 А это константа? или все же переменная? 4 минуты назад, Antonshka сказал: Но инструкций на чтение одного адреса бывает очень много ЗЫ: Ты имеешь ввиду, что придется передавать в регистр новое значение на каждой инструкции. Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2019 Автор Поделиться Опубликовано 10 марта, 2019 (изменено) 3 минуты назад, Garik66 сказал: А это константа? или все же переменная? Это константа. При перезапусках игры всегда такое значение. Вот кстати видео где один человек написал программу для расшифровки зашифровки значения, именно для этой игры и для этой инструкции Спойлер 9 минут назад, Garik66 сказал: ЗЫ: Ты имеешь ввиду, что придется передавать в регистр новое значение на каждой инструкции. Да, именно так. Плюс возможно придется делать фильтр в каждой инструкции. Изменено 10 марта, 2019 пользователем Antonshka Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 13 минут назад, Antonshka сказал: Да, именно так тогда действительно - трудозатратно Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2019 Автор Поделиться Опубликовано 10 марта, 2019 (изменено) 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 Но мысль так и не осуществил. Нужно попробовать написать Луа скрипт для выполнения этого метода. Быть может будет эффективным. Изменено 10 марта, 2019 пользователем Antonshka Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 14 минут назад, Antonshka сказал: Нужно попробовать написать И сколько по твоему это будет занимать времени? я уже это в СЕ-ASM давно реализовал. пока нету результата. думаю будет долго Спойлер Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 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 Ну да, этот метод проще и быстрее, полного перебора с дальнейшим вычислением. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 8 минут назад, partoftheworlD сказал: Ну да, этот метод проще 28 минут назад, Antonshka сказал: Нужно попробовать написать Хотя, если начинать с нуля, то довольно быстро подобрал для (float) 200 -> [rcx+00000198] = 1F180000 @Antonshka пжлста проверь у себя Не ну быстро для (float)666 -> 1C178000 Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2019 Автор Поделиться Опубликовано 10 марта, 2019 (изменено) 4 минуты назад, Garik66 сказал: Хотя, если начинать с нуля, то довольно быстро подобрал для (float) 200 -> [rcx+00000198] = 1F180000 @Antonshka пжлста проверь у себя Проверил, держит 200 оборотов стабильно. Сколько времени занял процесс подбора? Изменено 10 марта, 2019 пользователем Antonshka Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 1 минуту назад, Antonshka сказал: Проверил 2-3 секунды, но может меньше. Сек попробую засечь Дай новое значение оборотов Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2019 Автор Поделиться Опубликовано 10 марта, 2019 (изменено) 2 минуты назад, Garik66 сказал: Дай новое значение оборотов 121.2541 С какой частотой работает скрипт подбора? Используешь Createthread для AA? Изменено 10 марта, 2019 пользователем Antonshka Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 1 час назад, Antonshka сказал: 121,2541 Досчитал до 4. 28ECA073 Короче сам потесть на Туториале СЕ 2 шаг Табличка: // перезалил ниже ошибка в скрипте 1 час назад, Antonshka сказал: 121,2541 Активируй скрипт задай нужный Value Обнули Value_EAX в adres через приблизительно 3 секунды будет результат. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2019 Автор Поделиться Опубликовано 10 марта, 2019 1 час назад, Garik66 сказал: Досчитал до 4. 28ECA073 Спасибо. Да, держит 121.2541 оборотов. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 7 минут назад, Antonshka сказал: Спасибо. Тебе спасибо!!! Задачка, как и способ шифрования очень понравились. Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 5 минут назад, Garik66 сказал: Задачка, как и способ шифрования очень понравились. Теперь ты знакомо c брутфорсом на собственном опыте.? Но задачка и правда интересная. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 Только что, partoftheworlD сказал: ты знаком о брутфорсе не - не знаком, нас никто не знакомил. теперь придется гуглить, что есть брутфорс и с чем его едят Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2019 Автор Поделиться Опубликовано 10 марта, 2019 51 минуту назад, Garik66 сказал: Активируй скрипт задай нужный Value Обнули Value_EAX в adres через приблизительно 3 секунды будет результат. Скрипт что-то не находит значение для (float)555 в Value. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 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: хотя стоп. чейто не то в торопях ненужно делать Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 6 минут назад, Garik66 сказал: 555 -> A07E4000 15616516 тоже не ищет(с большими числами не работает возможно из-за того что регистры x86 малы) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 10 марта, 2019 Поделиться Опубликовано 10 марта, 2019 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 ЗЫ: теперь вроде без ошибок Ссылка на комментарий Поделиться на другие сайты Поделиться
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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения