逆向 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)
所以我在查看一个受感染的 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)