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

partoftheworlD

Помогаторы
  • Публикаций

    2673
  • Зарегистрирован

  • Посещение

  • Победитель дней

    168

Весь контент partoftheworlD

  1. Всем чем угодно, от перехвата трафика твоего wifi, до уязвимости клиента/сервера позволяющей получить сессионный токен. Как вариант у админа сервера может база с открытыми паролями, а он их продает.
  2. partoftheworlD

    Книги

    Немного обновил и упорядочил книги из личного хранилища, может кому пригодятся. (Возможно это считается за пиратством, так что ссылку буду выдавать в личных сообщениях, на форуме или в дискорде) В архив входят:
  3. Для примера возьмем 2 игры: CSGO и Left 4 Dead 2, в них используется Source Engine, и как можно подумать подсветка должна реализовываться одинаково, но не тут-то было. Давайте взглянем на процесс инициализации предметов (включая игроков) в CSGO: Как можем здесь увидеть для каждого объекта при инициализации резервируется место в структуре подсветки и возвращается ID в этой структуре, который отличный от ID игрока. Внутри GetGlowIndex: Прелести наследования, т.е. есть класс, который наследуется для любых предметов и инициализирует структуру подсветки, даже для обычных занавесок или телевизора. Вот только в L4D2 ничего такого нет, тут все куда более просто или оптимизировано, структура подсветки наследуется только для боссов (танк, курильщик и т.д.) и игроков, а подсветка ведется постоянно нужно лишь изменить уровень прозрачности. А вот структура определяющая подсветку для мобов (обычных зараженных) является динамической из-за чего заполняется только при определенных условиях, это создает некоторые сложности с подсветкой т.к. придется вручную выделять память под каждого моба и заполнять структуру определяющую подсветку, но просто так записав значение по определенным адресам не выйдет из-за подсчета объектов в структуре. Но мы ведь не пальцем деланные, немного пореверсив находим функцию инициализации, правда перед вызовом необходимо получить указатель на моба, это делается с помощью вызова виртуальной функции, которая принимает id и возвращает указатель на структуру. На выходе получаем это:
  4. Начнем с FLIRT(Fast Library Identification and Recognition Technology). Суть технологии проста - экономия времени, вместо ручного восстановления библиотечных функций, используются сигнатурные файлы сгенерированные из статических библиотек с помощью утилит, которые идут в комплексе с IDA SDK, которые по ходу анализа переименовывают функции найденный с помощью сигнатур. Сигнатурный файлы выглядит так: Например, мы знаем, что игра X использует Lua для выполнения скриптов, но сама длл луа вшита в файл, а не идет в комплексе рядом с ним, из-за чего мы не можем увидеть импортируемые функции, а значит придется потратить кучу времени, чтобы вручную по исходникам восстановить их. И тут на помощь приходит FLIRT, подключаем сигнатурный модуль в процесс анализа и буквально через пару секунд функции начинаются помечаться как библиотечные и подписываться. Пока IDA работает, реверсер отдыхает. У GHIDRA есть подобный функционал, но называется Function ID. И чтобы базы для гидры не генерировать руками, есть готовый скрипт, но для начала совету прочитать статью автора, чтобы не было вопросов по использованию скрипта: https://blog.threatrack.de/2019/09/20/ghidra-fid-generator/
  5. С недавним обновлением Raft в игре изменили радар, теперь необходимо ввести код из 4-х цифр, который является частотой, чтобы радар показал координаты, найти массив с координатами и кодами слишком просто, и поэтому мы будем генерировать коды без какого-либо воздействия на память игры. Открыв dnSpy необходимо найти участок кода, отвечающий за генерацию частот. Восстановив код и запустив для проверки, обнаружились некоторые проблемы: 1. Cид используется 1 раз при создании нового мира. 2. Частота состоит из 4 цифр, из-за чего очень много сидов будет подходить под значение первой частоты, которая дается в начале игры, поэтому придется брутить и генерировать все возможные частоты для 2-4 локаций. На генерацию сидов ушло порядка 30 минут, 90000+ возможных сидов и лишь 1 правильный набор кодов. Занятие было бессмысленным, но это был отличный способ занять вечер. Seed: 1276855 ------------------------------ 9839 1106 5814 8084 ------------------------------
  6. Составление темы в разделе вопросов без вопроса, вот что круто.
  7. partoftheworlD

    Поиск анимаций CE

    Нужно выйти на структуру игрока и смотреть все вложенные структуры минимум в 2-3 уровнях.
  8. Разработка этого плагина началась с того, что Dark Souls 3 начал выеживаться, а именно не работал сканер указателей, в целом этот "плагин" бесполезная, но точная(в теории) вещь для большинства игр. Может быть кто-то более опытный в Lua захочет его доделать. Осталось сделать 3 пункта: Нормальный парсинг инструкций Парсинг...ну что тут сказать, в Lua паттерны это какой-то regex после авиакатастрофы попавший в аварию на машине скорой.
  9. Проблема с ассоциативным списком решена с помощь костылей. (defineGRegs) Код в принципе рабочий, но я бы переписал, а именно тот участок кода, который устанавливает бряк на найденный регистр, это не совсем правильно. Правильнее будет искать указатель на этот адрес, через поиск и уже после ставить бряк на найденный указатель, чтобы получить следующее смещение, если код не переписать он может зациклится на одной инструкции, если нет выхода на структуру выше.
  10. Нужно смотреть на код, как расставляешь и проверяешь доступность hwbp, а так же как отлавливаешь исключения
  11. Раз это локальный баг, то похоже придется искать из-за чего в один играх сканер указателей работает, а в других нет. (!!!Заметка: Проверить исходники CE, а так же посмотреть, есть ли отличия между сегментами кода, в играх где сканер указателей работает и в DS3)
  12. После двух дней тестов Cheat Engine 6.8.3/7, оказалось что автоматический поиск указателей не работает в некоторых играх, каких-то определенных причин для этого нет. В пути к скану указателей, а так же в название скана нет кириллицы, пробелов и всякого такого. В других играх или в том же CE туториале сканер указателей работает как и должен, в общем тут точно не обошлось без магии. Выглядит все это так: Пока у меня только 2 варианта решения этой проблемы: 1. Использовать ручной поиск указателей. 2. Писать свой сканер.
  13. partoftheworlD

    CppHackGame CTF Challenge

    CppHackGame - это очень маленькая текстовая RPG игра. Тем не менее, эта игра предназначена для челленджа по взлому. Сможешь ли, ты убить гоблина и забрать сундук? Правила: Разрешено использовать любые инструменты, разрешено патчить только код относящийся к игроку/гоблину. Скачать cpphackgame.exe
  14. Размер указывается для определенных типов брейкпоинта, чтобы зацепить изменения в адресе, только на запись и на чтение, если брейкпоинт на выполнение, то размер игнорируется. Получение значений регистров через асм вставки не должно было вызвать проблем, но правильнее было бы открыть поток, получить контекст, из контекста выбрать нужные регистры. auto threadID = GetCurrentThreadId(); auto hThread = OpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME | THREAD_QUERY_INFORMATION, FALSE, threadID); CONTEXT ctx = { 0 }; ctx.ContextFlags = CONTEXT_FULL; GetThreadContext(hThread , &ctx);
  15. Все готовые указатели есть в таблице рекласса, начальный класс это CWorldChrManImp, ну или так указатель на здоровье DarkSoulsIII.exe+0x4768e78] +80] +1F90] +18] +D8] Любой, например здоровье.
  16. Рассмотрим решение задания из Начало стандартное, ищем строку с сообщением об ошибке, переходим по перекрестным ссылкам и находим инструкцию проверки. Теперь зайдем в эту функцию и начнем разбирать. .text:00002173 cmp username_lenth, 10h .text:0000217A mov esi, offset username .text:0000217F movsd xmm0, ds:dbl_7D48 ; // xmm0 = 2.0 .text:00002187 cmovnb esi, username .text:0000218E movd xmm1, ebx .text:00002192 cvtdq2pd xmm1, xmm1 .text:00002196 call _libm_sse2_pow_precise .text:0000219B movsx eax, byte ptr [esi+ebx] ; // v0 = esi[ebx] получаем символ из массива .text:0000219F imul eax, ebx ; // v1 = v0 * idx .text:000021A2 inc ebx ; // idx++ .text:000021A3 cvttsd2si ecx, xmm0 .text:000021A7 cdq .text:000021A8 idiv ecx ; // v2 = v1 % pow(2, idx) .text:000021AA add edi, edx ; // checksum += v2 Немного восстановили функцию, это что-то похожее на генерацию чексуммы из строки. Приведем это в человеческий вид username = 'UserName' checksum = 0 for idx in range(len(username)): v1 = ord(username[idx]) * idx v2 = v1 % pow(2, idx) checksum += v2 print(checksum) Спускаемся немного ниже и видим инструкции, которые проверяют чексуммы, введенного пароля и имени пользователя. while (tmp_checksum != input_checksum): checksum -= char_value_ char_value_ = *tmp_checksum++; Зная алгоритм проверки, можем написать кейген. Для этого необходимо генерировать новые символы и отнимать от чек суммы значение, пока чексумма не станет равна 0 def generate_password(checksum): g_check = 0 password = '' tmp = 0 while True: char = random.randint(0x21, 0x2E) # генерируем символы, можно выбрать любые tmp = checksum - g_check # вычисление временной чексуммы if tmp // 0x56 == 0: # небольшая проверка последнего символа, чтобы избежать символов, которые будут нечитаемыми # после некоторых тестов 0x56 было более подходящим значением с минимальным выводом мусора. password += chr(tmp) break g_check += char # вычисление сгенерированной чек суммы password += chr(char) # добавление символа в строку с сгенерированным паролем print(password)
  17. C 3-м пунктом разобрались, спасибо @Hack
  18. Уже сегодня экспериментировал с ними, на удивление даже карта указателей пустая(которая "Generate Pointermap") Каких-то спец. атрибутов на регионы памяти тоже нет. В том же скариме такой выход на структуру уровнем выше работает.
  19. partoftheworlD

    CppHackGame CTF Challenge

    Нет, это лишь часть задания.
  20. partoftheworlD

    DS3

    PhyreEngine // velocity. used for backstab detection // speed the opponent is approaching at. Player doesnt need to know their own. Idealy would like just if sprinting or not, actual velocity isnt important // -0.04 slow walk // -0.13 walk // -0.16 - 18 sprint wireshark filter ((udp.port >= 27000 && udp.port <= 27030) or udp.port == 3478 or udp.port == 4379 or udp.port == 4380 or (udp.port >= 50000 && udp.port <= 50003)) or ((tcp.port >= 27014 && tcp.port >= 27050) or tcp.port == 50050) NS_SPRJ::WorldChrManImp - (48 8B 1D ? ? ? ? 48 8B F9 48 85 DB 74 40) 48 8B 0D ? ? ? ? 48 85 C9 74 09 48 8B 89 ? ? ? ? EB 03 49 8B CD 4D 85 FF 74 60 48 85 C9 74 0E 48 8B 01 FF 90 ? ? ? ? 4C 8B E0 EB 03 NS_SPRJ::WorldChrManImp + 80] = NS_SPRJ::PlayerIns NS_SPRJ::PlayerIns + 1f90] = ptr_table ptr_table + 18] = NS_SPRJ::SprjChrDataModule NS_SPRJ::WorldChrManImp + 1d0/1ce8] = EntityList EntityMax = 100 EntityList + idx * 0x38 - список игроков/npc ds3.rcnet
  21. partoftheworlD

    Посоветуйте литературу !

    Если времени мало, стоит определить для начала для чего нужен асм, если в целом для программирования на асм, то лучше The Art of Assembly Language, 2nd Edition Randall Hyde пока ничего не находил, если для отладки, то куда быстрее будет заняться реверсом, а так же иметь под рукой документацию по асму, решать всякие crackme/keygenme, для начала даже можно самому компилировать простые программки, учиться по ним читать и понимать асм.
  22. Навряд ли, скорее просто проверка инициализировалась ли память под структуру нового предмета. Во-первых обратить внимание на то, как происходит подбор, если без касания к предмету(т.е. гг проезжает мимо и лут собирается) это идеальные условия. Для начала стоит попробовать более простой способ поиска, например, попытаться найти дистанцию между предметом и гг. Если такое значение найдется, считай 75% дела уже сделано и останется как по учебнику повесить бряк на доступ и после подобрать предмет, таким образом ты найдешь инструкцию, которая сравнивает дистанцию между предметами, и если она меньше определенного статического значения, то будет подбор. А дальше на любителя, либо отключить проверку, чтобы подбор было по всей локации, либо увеличить дистанцию.
×

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

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