
Анализ кастомной обфусцированной виртуальной машины и формата байт-кода DataDome, раскрывающий шифрование строк, S-блочные шифры и сигнатуры браузерного fingerprinting для обучения реверс-инжинирингу.
DataDome встраивает собственную виртуальную машину в свой бандл, чтобы скрыть, что они на самом деле делают. Мне стало любопытно, и я разобрал её. Делюсь здесь для всех, кто интересуется подобными головоломками по реверс-инжинирингу.
DataDome отправляет в ваш браузер сильно обфусцированный JavaScript-бандл. Внутри него находится собственная виртуальная машина — они компилируют свою настоящую логику снятия отпечатков в частный байткод-формат, а затем выполняют его внутри этой ВМ во время выполнения. Это анализ последней версии на момент написания.
Никакой код DataDome не включён в этот репозиторий — только мой собственный анализ и инструменты.
Пожалуйста, прочитайте примечание внизу перед использованием.
Когда вы можете читать байткод, выделяются несколько вещей.
Шифрование строк. Все строки хранятся в одном зашифрованном блоке в начале байткода. Каждая строка декодируется во время выполнения с помощью индивидуального XOR-ключа в сочетании с seed-значением, встроенным в заголовок таблицы. Так что даже чтение сырых байтов ничего вам не скажет без знания seed-значения.
Таблицы S-boxes повсюду. Первые ~20 КБ байткода почти полностью состоят из последовательностей PUSH_N_IMM + ARRAY_FROM_STACK, строящих таблицы поиска размером 256 байт. Это S-boxes, вероятно, для собственного шифра или раундов AES, используемых для хеширования собранных сигналов перед отправкой.
Сигналы снятия отпечатков, которые вы можете увидеть после декодирования строк:
Этот проект существует исключительно для удовлетворения любопытства о том, как работает обфускация на основе собственной виртуальной машины на практике. Это учебное упражнение по реверс-инжинирингу, а не инструмент для обхода обнаружения ботов.
Что вы делаете с этими знаниями — это ваша ответственность.