Я надеюсь, что у вас все хорошо.
Я пришел сюда с небольшой проблемой (извините за мой английский, это не мой родной язык). В школе у меня есть небольшой проект вредоносного ПО, в целом у меня есть кейлоггер, который создает файл, а затем шифрует содержимое этого файла с помощью шифрования 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 во вредоносном ПО.
Декомпилированный код расписания ключей содержит следующий элемент:
(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"
.
@Aimasu, какие кодировки ты используешь? Я даже не могу воспроизвести строку "...ISOLANG..."
Я просто запускаю код из своего поста, предполагаю, что это utf-8, но не уверен.
@Aimasu я получаю «ISO⃪ANGà÷d?Pag<Æpȏ9Lâ" with your code. Note that by using
ord` и chr
, ваш код расшифровывает строковые символы вместо отдельных байтов, а это означает, что если ord(c) > 255
, расшифровывается только младший байт c
.
Хорошо, мне нужно немного изменить его, чтобы обрабатывать отдельные байты.
Я создал новую функцию, которая принимает только байты для первого файла. Я получаю ISOLANG 32ISOLANG 32[R, который доступен для чтения (и, кстати, имя вредоносного ПО), но для второго файла это все еще странный текст и строка, которые я не знаю. не знаю, почему это хорошо работает на одном, а не на другом
Возможно, состояние не было повторно инициализировано после первого использования, что может объяснить другой результат.
Но для каждого файла я перезапускаю свой скрипт, поэтому состояние необходимо каждый раз повторно инициализировать.
извини, я имел в виду, что, возможно, вредоносная программа этого не делает.
не волнуйся, ты мне очень помог, братан, я продолжу, думаю, я близок к ответу, еще раз спасибо!
Спасибо за ответ, но я думаю, что я пропустил что-то еще, потому что я изменил ключ на If y в своем коде, и иногда вывод «читаем», а иногда нет, с первым файлом у меня есть «ISO⃪ANG 32ISOLANG 32[R ˮ " что нестабильно, а во второй части второго файла у меня есть "ₗ.¢îÁÛ§Ƹ¬j)yÓ⁷Z]WfnØ(±³éä½ƹ", что немного странно