逆向 XOR Javascript 混淆函数与 Python

Reversing XOR Javascript Obfuscation Function with Python

所以我在查看一个受感染的 WordPress 网站时看到了这个注入的 js。它基本上进行了一轮混淆 (charCodeAt(13-3,9-2, etc)。然后,它输出以下内容:

var key = 'eooquewZmf';
var enced = '<encoded_base64_blob>';

function xor_enc(string, key) {
  var res = '';
  for (var i = 0; i < string.length; i++) {
    res += String.fromCharCode(string.charCodeAt(i) ^ key.charCodeAt(i % key.length));
  }
  return res;
}

我真的是想通过在 Python 中编写反混淆器来理解混淆技术,而不是仅仅通过 运行 JS 文件获取明文数据并获取明文。

所以我首先尝试了解代码发生了什么:

变量

key = 异或键, enced = 要解码的文本

函数

xor_enc 似乎有两个论点,"string" 和 "key"。 变量 "res" 是一个空字符串 初始化一个 for 循环,将从 0 到字符串的长度,一次一个字符 "res" 变量将由以下内容填充:

a) "string"的每个字符都会被转换成一个char b) i % (modulo) 的位置乘以密钥的完整长度 (10 个字符)

然后a异或b。然后将返回。

所以我认为我的主要问题是理解 b 并在 Python 中复制它。到目前为止,这是我所拥有的:https://repl.it/repls/CluelessUnsungDisc,但它是 fubar 并返回以下错误:

File "main.py", line 8, in <module>
    newstring += chr(ord(dec[letter]) ^ ord(letter % len(key)))
TypeError: ord() expected string of length 1, but int found

我不知道是我的括号还是嵌套,但 ord 没有正确看到字符位置。

原始 JS 在这里:https://pastebin.com/yMz6aP7V((请记住,它的 JS 来自受感染的 WordPress 站点,因此可能是恶意的)

任何帮助将不胜感激!

based ="<base64>"
dec = base64.b64decode(based)
print(dec)
key = 'eooquewZmf'
newstring = ''
for letter in range(len(dec)):
    newstring += chr(ord(dec[letter]) ^ ord(letter % len(key)))
    print(newstring)

File "main.py", line 8, in <module>
    newstring += chr(ord(dec[letter]) ^ ord(letter % len(key)))
TypeError: ord() expected string of length 1, but int found

您应该与 key 的元素进行异或运算。 letter % len(key) 是该元素的索引(它只是通过环绕键循环)。

b64decode() returns 一个 bytes 对象而不是字符串,因此您可以只访问整数形式的元素,不需要调用 ord()

import base64

def b64_xor(b64,key):
  dec = base64.b64decode(b64)
  newstring = ''
  for i, letter in enumerate(dec):
    newstring += chr(letter ^ ord(key[i % len(key)]))
  print(newstring)

DEMO