javascript - 使用转换后的 JS 函数在 Python 中进行反混淆

标签 javascript python cryptography web-scraping obfuscation

我需要将以下函数转换为 python,以对网页抓取时提取的文本进行反混淆:

function obfuscateText(coded, key) {
// Email obfuscator script 2.1 by Tim Williams, University of Arizona
// Random encryption key feature by Andrew Moulden, Site Engineering Ltd
// This code is freeware provided these four comment lines remain intact
// A wizard to generate this code is at http://www.jottings.com/obfuscator/
shift = coded.length
link = ""
for (i = 0; i < coded.length; i++) {
    if (key.indexOf(coded.charAt(i)) == -1) {
        ltr = coded.charAt(i)
        link += (ltr)
    }
    else {
        ltr = (key.indexOf(coded.charAt(i)) - shift + key.length) % key.length
        link += (key.charAt(ltr))
    }
}
document.write("<a href='mailto:" + link + "'>" + link + "</a>")

}"""

这是我转换后的Python等效项:

def obfuscateText(coded,key):
shift = len(coded)
link = ""
for i in range(0,len(coded)):
    inkey=key.index(coded[i]) if coded[i] in key  else None
    if ( not inkey):
        ltr = coded[i]
        link += ltr
    else:
        ltr = (key.index(coded[i]) - shift + len(key)) % len(key)
        link += key[ltr]

return link

打印 obfuscateText("uw#287u##Guw#287Xw8Iwu!#W7L#", "WXYVZabUcdTefgShiRjklQmnoPpqOrstNuvMwxyLz01K23J456I789H.@G!#$F%&E'*+D-/=C?^B_`{A|}~")

actionattraction$comcastWnet

但是我得到了一个稍微不正确的输出,而不是上面得到的actionattraction@comcast.net。另外,上面的代码很多时候为同一 html 页面提供随机字符

目标html页面在JS中有一个obfuscateText函数,带有编码和 key ,我在obsfunc中提取函数签名并即时执行它:

email=eval(obsfunc)

它将电子邮件存储在上面的变量中,但问题是它在大多数情况下都有效,但在某些时候会失败,我强烈觉得问题出在提供给python函数的参数上,它们可能需要转义或转换为它包含特殊字符?我尝试传递原始参数和不同的转换,例如 repr(),但问题仍然存在。

使用相同的 python 函数错误计算和正确计算的 actionattraction@comcast.net 的一些示例(第一行是电子邮件):

@ation@ttr@ationVaoma@st!nct
 obfuscateText("KMd%Y@Kdd8KMd%Y@IMY!MKcdJ@*d", "utvsrwqxpyonzm0l1k2ji3h4g5fe6d7c8b9aZ.Y@X!WV#U$T%S&amp;RQ'P*O+NM-L/K=J?IH^G_F`ED{C|B}A~")

}ction}ttr}ction@comc}st.net
 obfuscateText("}ARGML}RRP}ARGMLjAMKA}QRiLCR", "}|{`_^?=/-+*'&amp;%$#!@.9876543210zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA~")

actionattraction@comcast.net
 obfuscateText("DEWLRQDWWUDEWLRQoERPEDVWnQHW", "%&amp;$#!@.'9876*54321+0zyxw-vutsr/qponm=lkjih?gfed^cbaZY_XWVUT`SRQPO{NMLKJ|IHGFE}DCBA~")

最佳答案

我重写了反混淆器:

def deobfuscate_text(coded, key):
    offset = (len(key) - len(coded)) % len(key)
    shifted_key = key[offset:] + key[:offset]
    lookup = dict(zip(key, shifted_key))
    return "".join(lookup.get(ch, ch) for ch in coded)

并测试它为

tests = [
    ("KMd%Y@Kdd8KMd%Y@IMY!MKcdJ@*d", "utvsrwqxpyonzm0l1k2ji3h4g5fe6d7c8b9aZ.Y@X!WV#U$T%S&RQ'P*O+NM-L/K=J?IH^G_F`ED{C|B}A~"),
    ("}ARGML}RRP}ARGMLjAMKA}QRiLCR", "}|{`_^?=/-+*'&%$#!@.9876543210zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA~"),
    ("DEWLRQDWWUDEWLRQoERPEDVWnQHW", "%&$#!@.'9876*54321+0zyxw-vutsr/qponm=lkjih?gfed^cbaZY_XWVUT`SRQPO{NMLKJ|IHGFE}DCBA~"),
    ("ZUhq4uh@e4Om.04O", "ksYSozqUyFOx9uKvQa2P4lEBhMRGC8g6jZXiDwV5eJcAp7rIHL31bnTWmN0dft")
]

for coded,key in tests:
    print(deobfuscate_text(coded, key))

这给出了

actionattraction@comcast.net
actionattraction@comcast.net
actionattraction@comcast.net
anybody@home.com

请注意,所有三个键字符串均包含 &;将其替换为 & 可以解决问题。大概在某个时刻,javascript 被错误地进行了 html 代码转义; Python 有一个模块可以对 html 特殊字符进行取消编码,如下所示:

# Python 2.x:
import HTMLParser
html_parser = HTMLParser.HTMLParser()
unescaped = html_parser.unescape(my_string)

# Python 3.x:
import html.parser
html_parser = html.parser.HTMLParser()
unescaped = html_parser.unescape(my_string)

关于javascript - 使用转换后的 JS 函数在 Python 中进行反混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23230356/

相关文章:

javascript - Rails `link_to` 方法多次发布

python - 如何正确分割多个下划线?

c - 将从/dev/urandom读取的内容移植到非Unix平台

python - CTR 中的 AES 如何与 PyCrypto 一起用于 Python?

javascript - 模态窗口和对话窗口有什么区别?

javascript - 文本区域干扰 Ajax 代码

javascript - 使用范围输入动态更改 setInveral/Timeout 速度

python - 非贪婪组之后的可选组

python - 从 statsmodels OLS 结果中打印 'std err' 值

git - key 过期后,OpenPGP 签名的 git 提交会怎样?