Расшифруйте RC4 с помощью Python, зная ключ

Я надеюсь, что у вас все хорошо.

Я пришел сюда с небольшой проблемой (извините за мой английский, это не мой родной язык). В школе у ​​меня есть небольшой проект вредоносного ПО, в целом у меня есть кейлоггер, который создает файл, а затем шифрует содержимое этого файла с помощью шифрования RC4. (ниже два примера различного содержимого этого файла)

Первый

========================
î³É†"Û4ZôßaV0%í;ËüüòaÐAiúˆcdÖ&

Второй

========================

ä¡Çš3µ{²agÄ}W8%í–YœèáŒ9¯ŽW‰‚”&ÂIAžŠmá'8V¡Uñši&Ædà·…í^ê¥>´©ÍjÌ{

ŒFÔ¿%ïÆñyFÎ3x°º“A)o4´´­‡—ÆéâùyÕ p‑@­®á÷Lì-»›ys‘ñî“wõl„/•+
w×jc´E"ؾ‑øSG,Üo`ürx;¼¡T#üdÊ-‡k«G‘å”b¿+†]Ù©–f:^É( ÁË è­Pàv8¹|籟D7…ÁSgœÛÚjá"æ‡=I•Âa|âOÄÝ\Ùþ×Æçð©Ð¨Û•Øâ¿tù5¾à…y¸Æy

========================

‰Î$œk{²aΞ:Xyc¢“ðƯ¨ÉxéÁR ËÌ~Ž

========================

IéÓí­q3C¦_Å)$Ãü¥Âƒ7Ð&èIΞ:XycjõúØ·v¯ìzëà—'ì`

========================

±Öšk{ð,•Ã{V4#

========================

ü§ÎâK³[’2…×bx2|p‚³ÐæˆéXÉár ëì^ iÈòãˆK7Ï4àZG¯

‰—¥ÃpÂTÅι Âu‚HÚ±+ïÈñýj«=v¾´O'a°Äß­‰—ÆéìùyÕ ž@­®á÷Bì#»›w}‘þã“wûl„/›% yÙdmºK"ؾ‑ùPI"Üo`ürx;¼¡T#ü

========================

 

========================

õ¡‹Ñ$Ý:þ;‡›iT|É9ZlcÒCkøŠafÔ$ãB™izl*Wò¾ójÐÃÄ

========================

 

========================

Теперь, проведя реверс-инжиниринг, я нашел ключ: если вы хотите сохранить секрет, вы также должны скрыть его от себя.

Итак, моей целью было расшифровать содержимое файла, чтобы увидеть, какие данные записывает кейлоггер, поэтому вот мой код на Python (на основе страницы RC4 в Википедии).

#!/usr/bin/env python
class WikipediaARC4:
    def __init__(self, key = None):
        self.state = list(range(256)) # initialisation de la table de permutation
        self.x = self.y = 0 # les index x et y, au lieu de i et j
  
        if key is not None:
            self.init(key)
  
    # Key schedule
    def init(self, key):
        for i in range(256):
            self.x = (ord(key[i % len(key)]) + self.state[i] + self.x) & 0xFF
            self.state[i], self.state[self.x] = self.state[self.x], self.state[i]
        self.x = 0
  
    # Générateur
    def crypt(self, input):
        output = [None]*len(input)
        for i in range(len(input)):
            self.x = (self.x + 1) & 0xFF
            self.y = (self.state[self.x] + self.y) & 0xFF
            self.state[self.x], self.state[self.y] = self.state[self.y], self.state[self.x]
            output[i] = chr((ord(input[i]) ^ self.state[(self.state[self.x] + self.state[self.y]) & 0xFF]))
        return ''.join(output)
  
if __name__ == '__main__':
    test_vectors = [['If you want to keep a secret, you must also hide it from yourself', 'î³É†"Û4ZôßaV0%í;ËüüòaÐAiúˆcdÖ&']]
    for i in test_vectors:
        print(i[0])
        print(WikipediaARC4(i[0]).crypt(i[1]))

Когда я запускаю свой код, это мой вывод

If you want to keep a secret, you must also hide it from yourself xBë⁃ìÖú½ÜûuåÐÅÙrJM©[&$5ȿÅk

Итак, вот мой вопрос: я действительно не знаю, так ли это на самом деле, потому что расшифрованный контент, похоже, не имеет особого значения. Есть ли у кого-нибудь из вас какие-нибудь мысли по этому поводу?

Спасибо ребята !

Примечание: два изображения RC4 во вредоносном ПО.

InitRC4позвоните в RC4

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Декомпилированный код расписания ключей содержит следующий элемент:

(param_2 + (local_10 & 3))

param2 — это адрес ключа (как вы уже поняли), а local_10 — это переменная цикла (назовем ее i). & 3 считывает 2 младших бита i, поэтому, когда i переходит от 0 к 255, i & 3 принимает значения 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, . ..

Это означает, что фактически используются только первые 4 байта ключа, другими словами, ключ — "If y".

Спасибо за ответ, но я думаю, что я пропустил что-то еще, потому что я изменил ключ на If y в своем коде, и иногда вывод «читаем», а иногда нет, с первым файлом у меня есть «ISO⃪ANG 32ISOLANG 32[R ˮ " что нестабильно, а во второй части второго файла у меня есть "ₗ.¢îÁÛ§Ƹ¬j)yÓ⁷Z]WfnØ(±³éä½ƹ", что немного странно

Aimasu 30.07.2024 16:00

@Aimasu, какие кодировки ты используешь? Я даже не могу воспроизвести строку "...ISOLANG..."

Aemyl 30.07.2024 17:58

Я просто запускаю код из своего поста, предполагаю, что это utf-8, но не уверен.

Aimasu 30.07.2024 18:16

@Aimasu я получаю «ISO⃪ANGà÷d?Pag<Æpȏ9Lâ" with your code. Note that by using ord` и chr, ваш код расшифровывает строковые символы вместо отдельных байтов, а это означает, что если ord(c) > 255, расшифровывается только младший байт c.

Aemyl 30.07.2024 19:19

Хорошо, мне нужно немного изменить его, чтобы обрабатывать отдельные байты.

Aimasu 30.07.2024 19:48

Я создал новую функцию, которая принимает только байты для первого файла. Я получаю ISOLANG 32ISOLANG 32[R, который доступен для чтения (и, кстати, имя вредоносного ПО), но для второго файла это все еще странный текст и строка, которые я не знаю. не знаю, почему это хорошо работает на одном, а не на другом

Aimasu 31.07.2024 10:10

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

Aemyl 31.07.2024 10:19

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

Aimasu 31.07.2024 10:22

извини, я имел в виду, что, возможно, вредоносная программа этого не делает.

Aemyl 31.07.2024 10:37

не волнуйся, ты мне очень помог, братан, я продолжу, думаю, я близок к ответу, еще раз спасибо!

Aimasu 31.07.2024 10:43

Другие вопросы по теме