猿人学第1题「js混淆-源码乱码」解题记录

猿人学第1题「js混淆-源码乱码」解题记录

题目链接:https://match.yuanrenxue.cn/match/1 难度:入门偏中 一句话概括:页面 JS 把签名逻辑藏进「减法偏移 → base64 → RC4 常量 → eval 出的魔改 MD5」四层壳里,逐层剥开即可还原出参数 m。

一、题目目标与规则

  • 请求全部 5 页数据,每页 10 个值,共 50 个值,提交这 50 个值的加和作为答案。
  • 第 5 页请求时 User-Agent 要改成 yuanrenxue,否则接口不返回数据。
  • 请求必须携带 sessionid(登录态 Cookie),每个已登录用户拿到的 50 个数不同,所以数字答案因人而异。
  • 接口参数 m 是动态签名,算错或过期都会返回 {"error": "token failed"}。

二、抓包与接口分析

接口为:

GET https://match.yuanrenxue.cn/api/question/1

查询参数:

参数 值 说明
page 1 ~ 5 页码
pageSize 10 每页 10 条
kw (空) 搜索关键字,本题固定为空
m 动态签名 由 JS 计算,格式见第三节

请求头要点:

  • referer: https://match.yuanrenxue.cn/match/1
  • x-requested-with: XMLHttpRequest(模拟 Ajax)
  • user-agent:前 4 页用普通 Chrome UA,第 5 页改成 yuanrenxue

Cookie 要点:sessionid=xxx(登录后从浏览器复制)。

成功响应结构(data 是本页 10 个数值组成的数组):

{
  "data": [5170, 2447, 4682, 3710, 6443, 2981, 5320, 4103, 6230, 3588],
  "state": "success"
}

对每页 data 求和,再累加 5 页即得答案。

三、逆向思路

打开题目页,源码是一坨严重乱码的 JS。真正有用的只有几个全局变量和两个函数:window.a(超长乱码字符串)、window.c(偏移)、window.document.e/f/g/h(用来拼方法名)、oo0O0(解密+执行入口),以及末尾生成 m 的几行。

3.1 第一层:减法偏移,还原出 base64

window.c = 5 是偏移量,window.document 里四个字段拼出 fromCharCode 和 charCodeAt:

window.c = 5;
window.document = {
    e: "fromC",   // 拼 g -> "fromCharCode"
    f: "charCo",  // 拼 h -> "charCodeAt"
    g: "harCode",
    h: "deAt"
};

oo0O0 里第一段循环,把 window.a 每个字符的编码减去下标 i、再减去 window.c,还原出的字符串累加到 window.b:

window.b = '';
for (var i = 0, len = window.a.length; i < len; i++) {
    window.b += String[document.e + document.g](window.a[i][document.f + document.h]() - i - window.c);
}

跑一遍之后 window.b 是一串 base64,开头是 dmFyIGhleGNhc2U9MDt...。

3.2 第二层:atob 解出「魔改 MD5」

对 window.b 做 atob,得到的是完整的 md5.js 源码,末尾多了一句:

;window.f = hex_md5(mwqqppz)

重点坑:这份 MD5 不是标准 MD5。它内部有 3 个常量被篡改过(例如 md5_ff 第一轮常量是 -680976936,标准值是 -680876936)。实测 hex_md5("abc") 输出 5c3365c2c6df875e9d2d1698fef70524,而标准 MD5 是 900150983cd24fb0d6963f7d28e17f72。所以不能用 Python 的 hashlib.md5 代替,必须原样跑这份 JS。

3.3 第三层:RC4 常量,拼出 replace 调用

U 数组里两个短字符串是「base64 + RC4」双重编码:

var U = ['W5r5W6VdIHZcT8kU', 'WQ8CWRaxWQirAW=='];

J('0x0', ']dQW') 用 RC4(密钥 ]dQW)解出 "replace",J('0x1', 'GTu!')(密钥 GTu!)解出 "mwqqppz"。于是这句:

eval(atob(window.b)[J('0x0', ']dQW')](J('0x1', 'GTu!'), ''' + mw + '''));

等价于:

eval(atob(window.b).replace("mwqqppz", "'" + mw + "'"));

也就是把 MD5 源码末尾的 hex_md5(mwqqppz) 替换成 hex_md5('时间戳'),再 eval 执行,从而 window.f = hex_md5(时间戳)。

3.4 生成签名 m

oo0O0(mw) 本身返回空字符串 '',它的作用只是副作用:执行上面的 eval,把 window.f 写成 hex_md5(mw)。外层代码:

var _0x2268f9 = Date.parse(new Date()) + (16798545 + -72936737 + 156138192);  // 括号内 = 100000000
_0x57feae = oo0O0(_0x2268f9.toString()) + window['f'];                    // window.f = MD5(时间戳)
function g() {
    m = _0x57feae + '丨' + _0x2268f9 / (-1 * 3483 + -9059 + 13542);       // '丨' 和 /1000
    return m;
}

还原后:

  • 16798545 + -72936737 + 156138192 = 100000000
  • -1 * 3483 + -9059 + 13542 = 1000
  • 丨 是 丨

所以最终签名:

m = hex_md5(String(Date.parse(new Date()) + 100000000)) + '丨' + (Date.parse(new Date()) + 100000000) / 1000

即「魔改 MD5(当前毫秒时间戳 + 1 亿)」拼接「丨」再拼接「秒级时间戳」。

3.5 解法落地

把还原后的逻辑整理成 env.js:开头 window = global 适配 Node/execjs 环境,末尾暴露 g()。Python 用 execjs.compile 编译后 call('g') 直接拿到 m,再拼进请求参数即可。

四、核心代码

a.py:

import subprocess
from functools import partial  # 作用.用来锁定某个参数的固定值
subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')
import requests
import execjs

def get(page, m_):
    headers = {
        "accept": "application/json, text/javascript, */*; q=0.01",
        "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
        "cache-control": "no-cache",
        "pragma": "no-cache",
        "priority": "u=1, i",
        "referer": "https://match.yuanrenxue.cn/match/1",
        "sec-ch-ua": "\"Chromium\";v=\"146\", \"Not-A.Brand\";v=\"24\", \"Google Chrome\";v=\"146\"",
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": "\"Windows\"",
        "sec-fetch-dest": "empty",
        "sec-fetch-mode": "cors",
        "sec-fetch-site": "same-origin",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
        "x-requested-with": "XMLHttpRequest"
    }
    cookies = {
        "Hm_lvt_434c501fe98c1a8ec74b813751d4e3e3": "1773750584",
        "Hm_lvt_f80b2b389f44bbfb3bfe1704817d44e0": "1773750388,1775317756",
        "HMACCOUNT": "00959BC5EB881F83",
        "sessionid": "frzna2wyl0oh1grr2ut761ejtf03a20i",
        "Hm_lpvt_f80b2b389f44bbfb3bfe1704817d44e0": "1775318283"
    }
    url = "https://match.yuanrenxue.cn/api/question/1"

    params = {
        "page": str(page),
        "pageSize": "10",
        "kw": "",
        "m": m_
    }
    response = requests.get(url, headers=headers, cookies=cookies, params=params)

    print(response.text)
    print(response)
    return sum(response.json().get("data"))

with open('env.js','r',encoding='utf-8') as f:
    a = f.read()
a1 = execjs.compile(a)

r = 0
for i in range(1,5):
    m = a1.call('g')
    print(m)
    r += get(i, m)
def get(page, m_):
    headers = {
        "accept": "application/json, text/javascript, */*; q=0.01",
        "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
        "cache-control": "no-cache",
        "pragma": "no-cache",
        "priority": "u=1, i",
        "referer": "https://match.yuanrenxue.cn/match/1",
        "sec-ch-ua": "\"Chromium\";v=\"146\", \"Not-A.Brand\";v=\"24\", \"Google Chrome\";v=\"146\"",
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": "\"Windows\"",
        "sec-fetch-dest": "empty",
        "sec-fetch-mode": "cors",
        "sec-fetch-site": "same-origin",
        "user-agent": "yuanrenxue",
        "x-requested-with": "XMLHttpRequest"
    }
    cookies = {
        "Hm_lvt_434c501fe98c1a8ec74b813751d4e3e3": "1773750584",
        "Hm_lvt_f80b2b389f44bbfb3bfe1704817d44e0": "1773750388,1775317756",
        "HMACCOUNT": "00959BC5EB881F83",
        "sessionid": "frzna2wyl0oh1grr2ut761ejtf03a20i",
        "Hm_lpvt_f80b2b389f44bbfb3bfe1704817d44e0": "1775318283"
    }
    url = "https://match.yuanrenxue.cn/api/question/1"

    params = {
        "page": str(page),
        "pageSize": "10",
        "kw": "",
        "m": m_
    }
    response = requests.get(url, headers=headers, cookies=cookies, params=params)

    print(response.text)
    print(response)
    return sum(response.json().get("data"))
m = a1.call('g')
print(m)
r += get(5,m)
print(r)


env.js:

window = global
window.a = 'isMRQsxrU]xtDhMbZ‹JrrdƒvˆxP„iiuyp‘x]…”—qš’z}®š g°‡¤¯©¡•tª¥‰¯º§¯‰·£¢³²¯¥ œ™˜Äº‰¡Ä½¢±Õ¿Ç¡É¹˜×²ÓÏÔέÓÖÏ¡¹Üɤ¤ßÃÉßòÝÂÄõÖëëõãÅëìÐÙÿðÕ÷ăøïûóÀòÕăþöÞáĒþăĆČăõùÑăďñÔĆýàĝòñôÞûôèĤċöĈģĎĉģïĜħđìġĖĉĵĊĉčĴħijľŁĢĴĤüĘĕĝņĴĿĩĺķĭĨĉĤĢĩČŀňĩʼnłĹĘŗİĭĬŘĵıİšŏĵŅťŋĥŅţŀţŅŧŜŨʼnIJňőūĹśŰřŹŞĹřŸūļĿųŰŁšƉũńńſţũſƀŤŲƏƕŷŶűőƄƏŗƋžƓƓƝƋŮŵƦƑŶŸƟƊŤŬƭƏƌŰƬƓžƐƫƠűƑƹƎƯƍƴƧƳƾƷƢƝƶƿƦơƄǃƫƩƈǂƹƝƾljƲƌǃǕǀƑǎǐƬƺƔǑljƽƜǒǍƱǗǢǏǗƱǟNjNJǛǚǖƽƨǠǒƫƴǰǗǂǔǯǚǕǻǭǐǞǻȁǣǢǝƽǰǻǃǷǪǿǿȉǷǚǡȇdzDzȂȋǶǐǘșǻǸǜȓȇǽǭȒȁǜǜȗǻȁȗȘǽǹǼȤȀȎǨȥȝȑǰȦȡȅȫȶȣȫȅȭȓȰșȮȪȑǼȴȦǿȈɄȫȖȨɃȮȩɏɁȤȲɏɕȷȶȱȑɄɏȗɋȾɓɓɝɋȮȵɕȻɘɀɟɊȤȬɭɏɌȰɧɛɑɁɦɕȰȰɫɏɕɫɬɑɍɐɸɔɢȼɹɱɥɄɺɵəɿʊɷɿəʒɽɢɥʂɾɥɐʈɺɓɜʘɿɪɼʗʂɽʣʕɸʆʣʩʋʊʅɥʘʣɫʟʒʧʧʱʟʂʉʺʥʊʌʳʞɸʀˁʣʠʄʻʯʥʕʺʩʄʄʿʣʩʿˀʥʡʤˌʨʶʐˍ˅ʹʘˎˉʭ˓˞ˋ˓ʭˠˇʲ˅˖˕˟ʤ˚˙ʽˍ˲˝ʽˢˬˢʱˉˬ˥ˊ˙˽˧˯ˉ˷ˣˢ˳˲˯˥ˠˁ˜˕˝˼ˮ̃ˤ́ˤˮˋ˕˦̗̈̊ˮ˦˨˕˲˪̒˜˶˜˹̗˺̘̝̜́̊˵̢̟̠̃˪̆ˬ̔˯̗̂̈˴̛̖̈˷̸̟̰̪́̒˼̵̷̵̵̛̹̱̥̺̙̙̻̥͈̯̱̭͚͎̝̭͎͎̣͈̤̬̼̄̿͊̿͂̍̐̐͋͋͛ͨ̿͊͘ͅͱ͈̾Ͳ̴͈́ͧͲ͕͌͘;͒ͯͲ̿ͬ͐;ͻ͑͘ͷ΂͜Όͬ̈́ͪ͋̓ͩ͠΄ΆΌͭ͢Ζ͐ͬ͵ΖΜͳͬ͗͡ΊΤΟ͞ΆΆ͸ΗΓάͣά΃ΰ΄α·Ύ΢ͬΊΒΪκΐ͵ΝάΨίΉνΙΝͻυΛψΔ΃ΞόΠΈΣϐςΏνχΡϕΦΥΏΙέζΨΗβϠΰΙθήμϤμςπΧϕϟιϭξνϮαφϤϞϴϋϸόϺϐφϦθϔθϡϾϬϳϳξϦϦϘϷϫЌσЋϤψϺϐϼϝϐЏϷϵϔЎЅϩЊϛϿПКϡ϶ϾЄМВϡЉИДЛϵХЅЍϯϯНЧЁеІЅЦϹУЬз϶ООАЯУдϼрМЁЩидлЕрХЭюЏлєЌѐзТецлямѓчџџѝебЛџябѧѧшФіѦтмЧѫчѳѲѰыѨѦѷѐіѦжєњєкєўѿѿѝѥрѻџѨьҁѯѿѿҋѥѡѓҏѿ҇җҔѭѪѥ҆ѿҟҚҠҁѽҢҤѺҗҦҤѾҬҚѩ҃ҊҐѨ҇ҎҢѮ҈ҒҳҴґҙѴүғҜҀҵңҳҳӀҙҕӆӃҳӋӋӉҡҞҙҺҳӓӎӕҵұӖӘүӛӚҖҲҪӀӠҶҮӀҠҺӂӚӠӀҤҧҭӗӍӈҩӑҬӕөӈӅҳӳӣӕӻӷӑӍҿӻӬӐӿӺӘԈӝӴӝӖӜԍӡәӇԐӦӞӬӌӫӲӨӑӮԜӰԛӰӺԛԞӹԁӜԗӻԄӨԝԋԛԛԪԁӽӫԫԛԍԳԯԉԆԁԢԛԻԶӴԝԙԾӻԕԍӻՄԛՈԨԀԞԦԺԈԤԪԺՈԨԌՒԕԿԵ԰ԑԹԔԽՑ԰ԭ՞՛ՋգգաԹԵԟգՔԸէբՀհՍ՜ՅԾՀյՉՂՄչՎՆՄջՔՊՈԸՖմդռ՜ՀԿՉճթդՅխՈձօդաՋ֏տա֖֗խթ՗֗ֈլ֛֖մ֤օ֐չղմգսյգ֬փպֲ֚ֆ֤ֈִ֊ָ֐ָ֌ַֹ֖֕֝ոֳ֗֠քַַֹ֧ׅ֝֙փַׇ֙׏׎֥֢֝־ַחגֵֹ֓ךםֲ׏מלַ֮׀ֲֺ֥֟ׄ׀ֶ׀פֱׄ֨֯כב׌֭וְי׭׌׉ֻ׷קׯ׿׼וב؂׿װה؃׾ל،׻׸סך׺؋צ׮׾׏תענؚׯ׶״؜׳؏ؒן؋׮לؠ؇ײ؅ؖ؋؟،أؗ׹دخ؅؁ׯد؟ؑططؘ״ئضؔ؜׷ػؖ؞ؔؿؙآؔ؅؟ئغ؄آتب؈ئخؾٌجؐ؏ؙكعشؕؽؘفٕشر؛ُٟر٧٦ؽعا٧٘ؼ٫٦لٴـٳّٕٶٸُٻٺٸٓيِٿٗٴ٘ټٜـكىٳ٩٤م٭وٱڅ٤١ُڏٿٱڗړ٭٩ٛڗڈ٬ڛږٴڤٰڤڅځڦکپڛڪڨڂڊڢ٭چپڌڳڋڂڄٲڎګڮٻڧۀٸڼڣڎڡڲڧڻڨڿڳۋۋۉڡڝڇۋڻڝۓۓڴڐۂےڮڶڭۈڱڪۊۛڶھےۣڻڲۈڢھڶیڨۂ۟ۢگۛھڬ۰ۗۂەۦۛۯۜ۳ۧۉۿ۾ەۑڿۿۯۡ܇܇ۨۄ۶܆۪ۢۥۼۥ۞۠ܕ۩ۡۏېۮۦ۰۔۲ۺ۬ܟ۶۽ܖۣ܏܂۠ܤ܋۶܉ܚ܏ܣܐܧܛ܍ܳܯ܉܅۷ܳܣܫܻܻܜ۸ܪܺܖܞܝܰܙܒܔ܃ܝܕ܃݌ܣܪܘݑܦܞܜݕܪ݈݊ݗܬܶݗݙܵܽܘݓܷ݀ܤݙ݇ݗݗݥܹܽܣݧݗܹݯݮ݂݅ܽݞݗݷݲݸݏݘܳݷݒݰݐݻݖݞݔކݛݸݤފݟݦݠލݤݩނݏݻޔ݌ސݷݢݵކݻݔކޓއޟޟޝݵݱݛޟޏݱާާވݤޖަނތݧޫއލ޲ްފޒޘݱޏ޼ޮݶޓޚތ޿ޔޞ޿޿ޝޥހ޻ޟިތ߂ޯߏ޿ߋޥޡޓߏ޿߇ߗߔޭުޥ߆޿ߟߚޚ߁޽ߢޡ޹ޱޟߨ޾޶ߌީ߃ߊ޸߰߇ߤ߈ߵ߈ߒ߳ߴߑߙ޴߯ߓߜ߀߶ߣࠃ߳ࠀߙߕࠆࠃ߳ࠋࠋࠉߡߞߙߺ߳ࠓࠎࠔߪߴߏࠓ߮߶ߴࠗ߳ࠐ߸ࠢ߷ࠤ߰ߟ߻ࠨߴࠪ߼ࠆࠧࠩࠅࠍߨࠣࠇࠐߴࠪࠗ࠷ࠧ࠵ࠍࠉ߳࠷ࠧࠉ࠿࠾ࠕࠒࠍ࠮ࠧࡇࡂࡇࠩࠥࡊࡍࠢ࠙ࡎࡌࠦࡔ࠾ࡖࠬࠢࡊࠓ࠮࡜ࠤ࡝࠰࠺࡛࡞࠹ࡁࠜࡗ࠻ࡄࠨ࡞ࡋ࡫࡛ࡪࡁ࠽ࠫ࡫࡛ࡍࡳ࡯ࡉࡆࡁࡢ࡛ࡻࡶ࠵࡝࡙ࡾ࠹ࡕࡍ࠻࠿࡚ࡒࡔࡁ࡟ࡦࡺࡆࡤࡪ࡜࢈ࡨࡌ࢒ࡕࡿࡵࡰࡑࡹࡔࢇ࢒ࡰ࡭࢛࢞ࢋࢣࢣࢡࡹࡵ࡟ࢣ࢔ࡸࢧࢢࢀࢰࡼࢯ࢑ࢍࢲࡱࢉࢂࢌࡴࢎࢆ࢈ࡶ࢒ࢊࢮࣂ࢔࢞ࢿࣀ࢝ࢥࢀࢻ࢟ࢨࢌࣂࢯ࣏ࢿ࣌ࢥࢡ࣒࣏ࢿࣗࣗࣕࢭࢪࢥࣆࢿࣟࣚ࣠ࢷࣀ࢛ࣟࢺࣂࣀࣣࢽࣆ࣌ࢦࣂࢺࣈࢫࣈࢾࣈࣶ࣑࣋࣪ࢷࣣ࣬ࢴ࣮ࣣࣸࣟ࣊ࣝࢼ࣮࣯ࣻࣷइऄࣝࣙऊइࣷएएएࣰ࣌ࣾऎ࣏࣫ࣤओ࣮ऌࣤगࣱࣺࣸटࣷࣾऀदࣻनख࣠ऀࣵञ࣫गरࣨबओࣾऑढगࣰढयणऻऻहऑऍࣷऻफऍृृतऀलूठनःेणऩॎउधॄूऌफढसऐमड़ॊ॔ऴघफ़डोु़झॅठ॓फ़़ह४१ॗ९९७ॅुफ९ॠॄॳ८ौॼैऴढ़ख़ॾऽॕ्ऻ঄ग़॒॔ॅॠॖ॔঎ॣঀংএ।८এঐ७ॵॐঋ९ॸड़঒ॿটএজॵॱঢটএধধথॽॺॵখএযপল঑঍ল঴ঋঁশ঴঎খপॷ঒ীঠূঘঞতৄঘঢৃ৅ড঩঄িণবঐ৆঳৓ৃ৑঩থএ৓ৃথ৛৚঱ম঩৊ৃৣ৞ঠ৅ু০৩া঵৪৬ূ৊৐৲েৎৈ৴ো৒ী৸ৌ৖৷৺৕ঢ়স৳ৗৠৄ৺১ਇ৷ਆঢ়৙েਇ৷৩ਏ਋৥ৢঢ়৾৷ਗ਒ਘ৮৓৓ਗ৳৹ਞਜ৶৾ৼড়৻৲ਈ৤৾ਆ਄০ਃਯਢ৯ਛ৾৬ਰਗਂਕਦਛ৴ਦਲ਼ਧਉਿਾਕ਑৿ਿਯਡੇੇਨ਄ਸ਼੆ਢੂਇੋਨਭ੒੐ਫਲਤਐਮਦਰਗ਴ਪਸ੘ਸਜਛਥ੏੅ੀਡ੉ਤ੗੢ੀ਽ਧ੫ਜ਼਽ੳੲ੉੅ਲ਼ੳ੤ੈ੷ੲ੐઀੫੬੕੎੐਼ਖ਼੒੔੃ਫ਼ઌ੨઎੢઀੾ੈ੧ઔ੨ઌ੬੐੓ਖ਼ઃ੹ੴ੕੽੘ઋખੴੱ੟ટએઁધણ੽੹੫ધઘ੼ફદ઄઴઀વકઑશહ઎અ઺સ઒ચલુખઞઔૃછૈલ૊ટકાઋષૐઈૌળઞ઱ૂાથ૆૏ૃ૛૛૙઱ભગ૛ોભૣૣૄઠ૒ૢિૈણ૧ૃહ૮૬૆૴૞રો૒૔઴ૌ૖૷૷૕૝સ૳૗ૠૄૻ૮૑૷ଃ૝૙ોଇ૷૿ଏଌ૥ૢ૝૾૷ଗ଒૔ૹ૵ଚଜ૲ૹଞଜ૶ଔ૬ଥૺଘ଄ૣ૿૶଄૦ଂଯଢ૯ଛ଎૬ରଗଂକଦଢଉପଳଧଙି଻କ଑ଃିଯଷେେନ଄ଶ୆ଢପଝ଼ଥଞଠ଎଩ଢତଔମଡ଼୎୛ଲୠନଙଷ୔଴ଡ଼଼ଠଣ଩୓୉ୄଥ୍ନୟ୧ୄୁଯ୯ୟ୑୷୳୍୉଻୷୨ୌ୻୶୔஄୐଼୥ୡஆஉ୞஋ஊஈୢஐ୬ஒ୦୞ஆ୍୫୲୸ஐ୰୔୛ଢ଼இ୽୸୙஁ଡ଼ஓ஛୸୵୧ணஓ஛஫ந஁୽ம஫ஜ஀யபஈஸஅத஍ஆஔஷ஑ச஌୹஖௄஌஁ஜ஢஘ேட஼ஔ௄தஈ௎஑஻ற஬஍வஐே௏஬ன௚ௗே௟௟௝வற஛௟ௐழ௣௞஼௬௅௘ு஺஼௰௅ாீ௵ோ௸ைழௐ௖ௐ௾௓௚௔௸௘஼஻௅௯௥௠ு௩௄௻ః௠௝ேఋ௻௝ఓఒ௩௥௓ఓఄ௨గఒ௰ఠఋఌ௵௮௰௞௹௱௟న௿ఆఈ௤ఄఊచ௪ఆఴఄబఌ௰௳௹ణఙఔ௵ఝ௸యషఔ఑௿ియడేృఝఙఋేసజోెత౔ఠ౓వఱౖౙమ౛ౚౘల఺నఝషమ౎౦఺లైఠావ౞ఫ౗౰న౬౓ా౑ౢ౞౅౦౯ౣ౻౻౹౑్ష౻౫్ಃಃ౤ీ౲ಂ౞౦ౡ౸ౡౚ౨ಋ౧಄ಂಔ౪ಈಂౕ౮౶ಆ౔౰౺ಛಛ౹ಁ౜ಗ౻಄౨ಟಒ౵ಛಧಁ౽౯ಫಛಣಳರಉಆಁಢಛ಻ಶ಻ಝಙಾೀಖಝೂೀಚೈತ಄ಟದಠಇಢೀಠ೑ತಮ೏೐ಭವಐೋಯಸಜ೓ೆ಩೏೜ವಱೢ೟೏೧೧೥ಽ಺ವೖ೏೯೪ೲ೑್ೲ೴ೋ೧೶೴೏೼ೌ೽೔ೊ೮ഀ೘ೞ೮ು೘ೢഃഅೡ೩ೄ೿ೣ೬೐ഇ೺ೝഃ഑೩೥೏ഓഃ೥ഛചೱ೮೩ഊഃണഞೞഅഁദഩ೾ഫപ೧ഃഠ೸റഈഎഀ೰ഌ഑പ೷ണ഼೴സടഊഝമപ഑ല഻യേേ൅ഝങഃേഷങ൏൏രഌാൎബഴഏ൓യഥ൚൘ള൐സൟശ൤ൄജ഻ലൖണ഼െ൧൧൅്നൣേ൐ഴ൫൞ു൧൳്൉഻൷൧൯ൿർൕ൒്൮൧ඇංඈ൞ൾൃඇൢ൪൜උ൥൮൬ඕ൪൲ආ඘൯൶ඊඞ൳൹ඒൟඋൾ൜චඇ൲අඖඒ൹කඣ඗ඉදණඅඁ൳දඟටභභ඘൴ඦබඒකඝඬඕඎඐൾ඙ඒඤ්ඞඖබ඄ජවඬෑඦඝෆඓ඿෈ඐුරඦඹ්ෆත෎෗෋ී෣෠ඹඵ෦෣ී෫෫෫෌ඨේ෪ෆ෦ණ෯්෨෌ෳ෍ූ෮ඹීේුขෘ෎෤ලේ෡෺෇ෳฌහจ෯ේ෭෾෺෱ฆซ෿ททต෭෩ීทง෩ฟฟ฀ොฎพ෺෴ෟร෿ปสศขชย෬งฤจำฌขฐ෰ฌถืืตฝ෸ำทภค฼ฮมืใฝนซ็ื฿๏์ลยฝ฾ื๗๒ณูี๚๜าษ๞๠ึ฾ิพฺโิย฾ๆไ๬ใ้๢ฯ๛๎ฬ๰๗โ๕๦๢๙๮๳๧๙๿๻๕๑ใ๿๯๷ງງ๨ไ๶ຆ๢๪๩๼๥๞๠ํ๩๡๏ຘ๯๦๨๖๲ຠ๼๘๸๾๬๝๸ຂຣລກຉ๤ຟ຃ຌ๰ຨບຍຣັຉ຅๯ຳຣ຅ົ຺ຑຎຉສຣໃ຾๽ລມໆ້ພລ໊່ຣສ຺ຈ຦໔ຬ໓ຫາິ໐ະດປຝ໇ຽຸນແຜ໗ໜຸີວ໣໓໛໫໨ແຽ໮໫ໜເ໯໪່໸ໄ໹໙໕໺ຶ໑໊໌ົ໖໎໌ຼໜ໒໤ແໟ༌໘༄໤່༎໑໻໱໬ໍ໵໐་༐໬໩༚༗༇༟༟༝໵໱໛༟༐໴༣༞໼༬༁༘༁໺໼༯༅໽໫༴༌༂༪໰༏༆༔໶༓༰༈໺༔༞༿ཀ༝༥ༀ༻༟༨༌ང༶༩༿ཌ༥༡དྷཏ༿བྷབྷཕ༭༪༥ཆ༿ཟཚའ༶༰༛ཟ༺གངལ༽ཆ༸ཫགྷཊ༼༩ཆཤ཈ཬཌ༰༳༹ལཙཔ༵ཝ༸ཱིླྀཔད༿ཿ཯ཡ྇ྃཝཙཋ྇ླྀཛྷྋ྆ཤྔཡྀཀྵརཨ྘཭ཥནྜྷིཪོམླྀཾུྥཻྨྚཥོ྆ྦྷྪ྅ྍཨྣ྇ྐུྫྷྞྑྦྷྶྍྉཷྷྦྷྙ྿ྻྕྒྍྮྦྷ࿇࿂྄ྩྥ࿊྆ྡྚྜྌྦྷ࿔ྨ࿖ྪྲྫྷ࿚ྯྶ࿎࿔ྴ྘࿞ྡ࿋࿁ྼྜྷ࿅ྠ࿛࿠ྼྐྵ࿪࿧࿗࿯࿯࿭࿅࿁ྫ࿯࿠࿄࿳࿮࿌࿼࿈ྵ࿝࿙࿾က࿖࿍ဂက࿚ဈ࿐࿂࿞࿦࿘࿇࿣࿚࿨ဈ࿨࿌࿋࿕࿿࿵࿰࿑࿹࿔ဏန࿰࿭࿗ရဋ࿭ဣဢ࿹࿵࿣ဣန࿸ဧဢကူထလစ࿾က࿭ဉခ࿯းဏဖလျဒယဲ࿼ဖ၄ဲ၃ဘဢ၃၅အဩငဿဣာတ၈်ိ၃ၑဩဥဏၓ၃ဥၛၚေီဩ၊၃ၣၞၤ်ဟဟၣှၜးၧ၂၊၄ၯ၈၎၀ိ၊ၒၘူၐၕၮျၧႀးၼၣ၎ၡၲၮၥၺၿၳႋႋႉၡၝ၇ႋၻၝ႓႓ၴၐႂ႒ၯၨၓ႗ၳႏ႞ႜၶၾၼၝၻႂၸႪၾၶ႖ႫႀႊႫႫႉ႑ၬႧႋ႔ၸႰႢ႕ႫႷ႑ႍၿႻႫႳჃჀ႙႖႑ႲႫ჋჆჌ႢႬႇ჋ႦႮႜ჏ႩႲႤიႮ჌ႤოႲႺႨტႷფზნႼႠ႟Ⴉდ჉ჄႥჍႨუშჄჁႫჯჟჁჷჶჍ჉Ⴗჷშ჌჻ჶეᄄვჰკგეჁოზჶᄌფლჺ჌ყᄔფჍწჱᄊთᄃᄌეᄘჿცჽᄎᄊᄁᄖᄛᄏᄗᄧᄤჽჹᄪᄧᄗᄯᄯᄯᄐწᄞᄮᄌᄔჯᄳᄎᄬᄈᄷᄑᄚᄔჸᄖᅄᄜᄀᄛᄢᄤᄁᄞᄥᄾᄋᄷᅐᄈᅒᄲᄱᄵᅈᄵᄐᄥᅋᄻᄥᅋᅚᄱᄭᅖᅘᄸᄜᄟᄥᅐᄠᄵᅝᅋᅈᄬᅜᅏᄽᅈᅧᅛᅣᅳᅫᅈᅒᅳᅴᅑᅚᅑᅬᅟᅳᅝᅮᅢᅡᅝᅷᅘᅕᄿᆃᅫᅻᅾᅋᅷᅚᅈᆒᅲᅱᅵᆈᅵᅐᅥᆋᅻᅥᆋᆗᅱᅭᅼᆘᆏᆂᅵᆘᆑᅶᆅᆩᆓᆛᅵᅶᆘᆤᆁᆠᆞᆍᆣᆲᆉᆅᅳᆳᆣᆕᆻᆷᆐᆞᅸᆵᆭᆡᆀᆶᆱᆕᆻᇆᆳᆻᆕᇈᆯᆚᆭᆾᆲᆌᆌᇑᆨᆥᇆᇓᆻᆵᇛᇏᆱᆭᆴᇛᇃᇣᇣᇙᆸᇆᇣᇩᇋᇊᇅᆥᇘᇣᆫᇟᇜᆬᇁᇩᇗᇔᆸᇨᇛᇉᇔᇳᇞᇳᇳᆸᇡᆽᇕሂᇯᇑᇷሊᇪᇩᇭሀᇭᇈᇝሃᇳᇝሃሖᇶᇵᇹሌᇹᇔᇩሏᇿᇩሏሔᇵᇱሒሜᇹᇶᇽመላሟሉሚሎልሉሣሄሁለሯሗሧሪሰልሉሦሴሑልመሸሯሡሥᇽሯሻምሀሲሩሌ቉ሞምለቃሧሰሔ቉ሷቇቇ቎ርሩሼ቗ቆ቟቟቙ስሱቀ቟቎ቁቧ቟ሼቊቧቭ቏቎቉ሩቜቧሯባ቟ቕቐሱ቙ሴቑቸቧቯቮቷባታብቾቘቦኆቿቜቚቈኁበቩቱ኉ቤቭናኊቩብቸናቻትኛኔቱቭ኎ኘ኏ኁኅቝ኏ኛችበኒ኉ቬኩቾችቨኣኇነቴኪኗ኷ኧኮኍ኉ኜ኷ኦ኿኿ኹንኑአ኿ኮኡ዇኿ኜኪ዇ውኯኮኩ኉ኼ዇኏ዃ኿ኵኰኑኹኔ኱ዘ዇ዏዎ዗ዃዓዅዝኸ዆ዦዟዒያዌዣዛዣዦየዄውዳዪዉዅዘዳዛዕዻዴዑውዮዸዯዡዥኽዯዻዝዀዲዩዌጉዞዝወጃዧደዔጋዾዡጇጎይዩዼ጗ጆጟጟጙድዱጀጟጎጁጧጟዼጊጧጭጏጎጉዩጜጧዯጣጟጕጐዱጙዴ጑ጸጧጯጯጵጡጷጿጱጮጷፇጾጝጙጬፇጯጩፏፈጥጡፂፌፃጵጹ጑ፃፏጱጔፆጽጠ፝ጲጱጜፗጻፄጨ፠ፒፅ፛።ፁጽፐ፫ፚ፳፳፭ፉፅፔ፳።ፕ፻፳ፐ፞፻ᎁ፣።፝ጽ፰፻ፃ፷፳፩፤ፅ፭ፈ፥ᎌ፻ᎃᎃᎎ፵ᎇᎇᎍᎇ፥ᎋፏᎆᎏ᎒᎘፵፱ᎎ᎟ᎇ᎗Ꭷ᎜፽፹᎞Ꭷ᎖፹Ꭳ፱᎓Ꭸ᎑Ꮁ᎖፱᎑ᎰᎣ፴፷Ꭻ᎞፸ᎀᏁᎣᎠᎄᎻᎯᎥ᎕ᎺᎩᎄᎄᎿᎣᎩᎿᏂᎥᎡᎴᏌᏂ᎑ᎹᏈᏄᏋᎥᏐᎵᎾᎵ᎘ᏌᏔᎵᏕᏎᏅᎤᏣᎼᎹᏀᏤᏄᎨᏣᏥᏄᏁᏐᏱᏟᏅᏕᏵᏛᎵᏕᏳᏕᏰᏌᎺᏔᏢ᏿ᏸᏝᏥᏝᐆᏴ᏿Ꮹᏺ᏷ᏭᏨᏉᏤᏡᏰᐏ᏶ᐗᏔᐓᏻᏹᏘᐒᐉᏭᐎᐙᐂᏜᐓᐥᐐᏡᐞᐠᐗᐊᐍᐜᐘᐟᏹᐠᐉᐏᐁᐵᐠᐫᐅᏵᐌᐆᐈ᏶ᐐᐙᐿᐳᐙᐟᐑᑅᐰᐻᐕᐅᐜᐖᐘᐆᐠᐪᑋᑅᐻᐍᐤᑋᑁᑋᐥᑙᐪᐩᐬᐝᐲᐪᑛᑑᐹᐮᐰᐞᐼᐠᐸᑢᐼᑫᑟᐫᑎᑌᑫᑡᑑᑎᐬᑨᑔᐰᑉᑤᑙᑬᑮᑻᑔᑚᑜᒁᑖᑴᑜᑀᑛᑸᒃᑻᑨᑄᑝᑸᑥᑭᑭᑺᑲᒆᑌᒁᑪᑲᑴᑐᑰᑶᑸᑕᑳᒐᒎᒡᑸᑲᑜᑞᒆᒆᑸᒗᒋᒬᑤᒞᒗᑩᒁᒤᒑᑬᑬᒧᒋᒑᒧᒨᒍᒯᒑᒺᒧᒳᒕᒰᒭᒍᒳᓆᒱᒖᒘᓉᒪᒿᒿᓉᒷᒙᒿᓅᒤᒭᓆᓏᒫᒲᒤᓙᒬᒔᒼᓙᓇᒭᒽᓝᓃᒝᒽᓛᒸᓛᒽᓟᓔᓠᓁᒪᓀᓊᓫᓱᓓᓒᓍᒭᓠᓫᒳᓧᓚᒴᒼᓽᓟᓜᓀᓼᓣᓎᓠᓻᓧᓑᓄᓺᓳᓄᓈᓾᓮᓮᓨᔇᓳᔓᔆᔏᓫᓲᓤᔙᓬᔜᓨᔝᓴᓩᔓᓡᔃᔘᔁᔡᔆᓡᔁᔠᔓᓤᓧᔛᔘᓨᓽᔥᔓᔐᓴᔤᔗᔅᔐᔯᔚᔕᔻᔯᔐᔞᔻᓺᔢᔢᔔᔳᔦᕈᓿᔿᔪᔥᔬᔆᔣᔪᔬᕒᔧᔭᕆᕎᔨᔥᔰᕍᔯᕌᔸᔕᔲᕠᔼᕘᔸᔝᕅᕔᕐᕗᔱᕙᕁᕅᕛᕜᕅᕠᔫᕰᕇᕣᕦᕮᕈᕅᕐᔫᕑᕬᕈᔶᕐᕙᕺᕷᕢᖄᔿᔷᕚᕢᕨᖀᕠᕅᕝᖀᕹᕞᕭᖑᕻᖃᖃᖅᕭᕢᖖᖘᕯᖋᖏᕜᕰᕭᕴᖕᕷᖔᖀᕝᕺᖨᖄᖠᖗᖉᖍᕥᖗᖣᖅᕨᖚᖑᕴᖱᖆᖅᖉᖰᖥᖈᕼᖽᖧᕸᖾᖷᖢᖝᗃᖵᖘᖦᗃᗉᖫᖪᖥᖅᖸᗃᖋᗇᖲᖮᗒᖔᖶᗇᗋᖘᖬᖩᖨᖏᖵᗐᖛᗗᖶᗤᖴᗠᗆᗗᗚᗠᗗᗉᗍᖥᗗᗣᗅᖨᗚᗑᖴᗱᗆᗆᗍᖰᗤᗬᗍᗭᗦᗝᖼᗻᗔᗑᗜᗼᗲᗁᗩᗸᗴᗻᗕᗾᗥᗫᗝᘑᗼᘇᗡᗑᗨᗡᘊᗗᘅᘏᗩᘝᗮᗭᗬᗡᗴᗮᗰᗤᗽᗵᗽᘟᘔᘠᘁᗪᘀᘉᗧᘰᘈᗬᘕᘲᘠᘧᘧᗲᘚᘚᘌᘫᘞᘰᗷᘿᘘᗼᘔᘄᘧᘑᘄᙃᘫᘩᘈᙂᘹᘝᘾᙉᘲᘌᙃᙕᙀᘑᙎᘗᘺᙋᙖᘝᘾᘘᙏᙡᙌᘝᙚᙜᙒᘠᘽᙒᙊᙜᘧᘟᙃᙌᘨᘰᙉᙍᙣᙧᙉᙫᙍᙯᙚᙚᙍᙈᙧᘸᙙᙴᙚᙢᙜᙻᙦᙷᙈᙺᙲᙚᙝᚎᙺᙿᚂᚅᙲ᙭ᚆᙔ᙭ᙡᚇᚉᙫᙶᙰ᚝ᙰᙾᙘᚡᚃᚂᙽᙝᚐ᚛ᙣᚗᚊᙥᙤᚡᚙᚍᙬᚢ᚝ᚁᚧᚲ᚟ᚧᚁᚩᚢᚙᙸᚷᚒᚴᚕᙸᚬᚳᚳᚶᚘᚦᛃᚂᚪᚪ᚜ᚻᚯᚚᚇᛁᚢᛄᛏᚎᚶᚶᚨᛇᚺᚶᚓᛓᚲᚺᛞᚠᛂ᚜ᛓᛥᛐᚡᛞᛠᚽᛆᚸᚫᛏᛣᚰᛱᛄᛂᛕᛤᛠᛧᛁᛩᛑᛖᛄᚻᛞᛰ᛿ᛲᛕᛷᜃᛸᛯ᛻ᛳᛀᛲᛕᜂᜎᛢᜀᜋᜁᛤ᜔ᛌᜆ᛾ᛦᛩ᜚ᜆᜋᜏᛛ᛿ᛩ᜚ᛡ᛾ᛝ᛽ᜥᜎᜅᛤ᜞᛽ᜟᜍᜭ᜗ᛨᛨ᛼᜚ᜁᜁ᜵ᜎᛰᛸᜫ᜛᜕ᜪᜳ᜞ᛷ᜻ᜱ᜙᜴᛿᛽ᜥᜢᜃ᛻ᜡ᜻᜻᜽ᜟᜪᜤᝑᜤᜭᝆᝉ᜶ᜱᝋ᜙ᝄᝏ᜹᜔ᝉ᜾ᜱ᝝ᜲᜱ᜽ᜥᝇ᝜ᝅᝥᝊᜥᝅᝤ᝗ᜨᜫ᝟ᝒᝧᝧ᝱᝟ᝂᝉᝯ᝛᝚ᝪᝳ᝞᝿ᝳ᜿᝭᝷ᝑច᝖᝕᝘ᝉᝲ᝙ᝩᝈᝮᝈ᝝ធᝳᝮᝓចᝪᝢᝤយᝮវ᝴᝕ᝳថដ᝜᝸᝿᝱ᝯ᝾᝞ខ᝶ឃល᝼ᝪ᝾ហ᝸ឰឆឤឈᝬឋធមᝳថឆឯឬឞឳផឳឣឡឤ឵វខឩី឴ុផឿឥឩហេឨឌ឵្ៀះះធឺឺឬ់ើឺភ៟ីវឰឤំ៧ឤ៣់៉ឨ២៙ួ៞៩ះើ៯៤ៈ៷៲៰៦឴។៶៕៝័៽២ូ៳៴៰៹៕ៀៜ៕៻៾៬ៈៜៃ៩᠄៥᠀៭᠈៓᠏៬៩៨᠐៳៩᠒᠙៸៭᠞ៜ៸᠁᠚᠝៾᠆᠈ᠤ᠀៨᠀ᠭ᠒៬ᠣᠤᠠᠩ᠅៰᠌᠅ᠫᠮ᠜៸᠌៳᠙ᠴ᠕ᠰ᠝ᠸ᠃ᠿ᠜᠙᠘ᡀᠣ᠙ᡂᡉᠨ᠝ᡆᡌᠧᡈᠤ᠑ᠬᠺ᠔ᡝᠿᠾᠹ᠙ᡌᡗ᠟ᡓᡇᠶᠠᡝᡕᡉᠨᡞᡙᠽᡣᡮᡛᡣᠽᡥᡞᡕᠴᡳᡎᡯᡌᠶᡓᡉᡯᡳᡔᡢ᡿ᠾᡦᡦᡘᡷᡪᢌᡃ᡽ᡦᡫᡡᡜᡫᡟᡱᡣᡯᡎᢇᡪᡴᢍᢗᡱ᡹᡻ᡜᡸ᡾ᡰᡱ᡿ᢂᡟᢁᢆᢇᢞᢗᢍᢌᢌᢧᢠᢒᢧᢉᢧᢗᢕᢙ᢮ᢢᢉ᢯ᢵᢦᡸᢿᢼ᢫ᢷᢄᣃᢰᢦᢙᣊᢵᢚᢩᢆᢹᢉᢿᢍᢾᣄᢜᣔᢪᣈ᢬ᢐ᢯ᢶᢼᢗᢴᢪᣒᣚᢵᣣᢴᢣᣑᣛᢵᣩᢺᢹᣌ᢭ᢾᣟᣀ᢯ᣓᣧᢴᣵᣈᣆᣙᣨᣤᣫᣅᣭᣕᣚᣈᢿᣢᣴᤃ᣷ᣙ᣻ᤇ᣼ᣳ᣿᣷ᣄ᣶ᣙᤆᣈᣨᣌᣤᤎᣭᣲᣬᤐᤆᣕ᣽ᤌᤈᤏᣩᤔ᣹᣽ᤒᤛ᣸ᣵᤁᤒᤊᤜᣧᣟᤂᤢᣧᣣᤉᤤᤢ᤭ᤈᤅᤈ᤬ᤏᤅ᤮ᤴᤏᤰᤐ᣹ᤗᤝᤶᤄᤝᤒᤔᤂᤜᤪ᥊᥃ᤠᤙ᤿᥃ᤰᤌᤤ᥎ᤪᤲᤓᤋ᤮᥎ᤓᤏᤵᥐ᥎ᥙᤴ᤭ᥓᥕᤸᥨᤴᥠ᤻᥆᥄ᥤ᥀᥉ᥐᥱ᥇᥎ᥐᥬ᥍᥂᥶ᤴ᥌ᥚ᥺ᥳᥐ᥍ᥙᥪᥢᥳ᥾ᦅᥝ᥸᥃ᦉᥩᥦ᥇᤿ᥤᥙᦆᦇᥤᥡᥤᦎᥪᦇᦊᦌ᥯ᥥᦎᦔ᥯ᦐᥰᥙ᥷᥽ᦖᥣᦇᦛᥨᦩ᥼᥺ᦍᦜᦘᦟ᥹ᦠᦉᦎ᥼ᥳᦖᦒᦶᥰᦐᥴᦈᦶᦐᦿᦳ᥿ᦪᦡᦤᦻᦦᦷᦾᦄᦜᦄᦘᧅᦣᧀᦌᧃᦥᧇ᧓ᧈᦿ᧋ᧃᦐᧂᦥ᧒᧞ᦲ᧏᧓ᦟᧃ᧓᧞ᦥᧆ᧘ᧈᦠ᧔ᦹᦹ᧟᧛᧍᧍᧫᧜᦬᧑ᦳ᧗᧧᧲ᦹ᧚᧻ᦸ᧮᧦᧍᧍ᨁ᧚᧢᧜᧻᧘᧕᧤ᦻ᧡᧼᧬ᨅ᧠᧚᧤ᨌ᧲᧭ᨆᨌ᧧ᨈ᧸ᨚ᧬᧺᧔᧝ᨋ᧾᧱ᨔᨍ᧲ᨁᨥᨏᨗ᧱᨝ᨗᨆᨧ᧧ᨖᨍ᧬ᨣᨛ᧭᨞ᨱᨗᨧᨀ᧹ᨊᨉᨫᨰᨪᨌᨀᨼᨣᨎᨠᨻᨯᨦᨳᩈᨴᨪᨕᩋᨺᨿᩂᨕ'
window.c = 5;
window.document = {
    e: "fromC",
    f: "charCo",
    g:"harCode",
    h: "deAt"
}

function oo0O0(mw) {
    window.b = '';
    for (var i = 0, len = window.a.length; i < len; i++) {
        // console.log(window.a[i]);
        window.b += String[document.e + document.g](window.a[i][document.f + document.h]() - i - window.c)
    }
    var U = ['W5r5W6VdIHZcT8kU', 'WQ8CWRaxWQirAW=='];
    var J = function (o, E) {
        o = o - 0x0;
        var N = U[o];
        if (J['bSSGte'] === undefined) {
            var Y = function (w) {
                var m = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/='
                    , T = String(w)['replace'](/=+$/, '');
                var A = '';
                for (var C = 0x0, b, W, l = 0x0; W = T['charAt'](l++); ~W && (b = C % 0x4 ? b * 0x40 + W : W,
                C++ % 0x4) ? A += String['fromCharCode'](0xff & b >> (-0x2 * C & 0x6)) : 0x0) {
                    W = m['indexOf'](W)
                }
                return A
            };
            var t = function (w, m) {
                var T = [], A = 0x0, C, b = '', W = '';
                w = Y(w);
                for (var R = 0x0, v = w['length']; R < v; R++) {
                    W += '%' + ('00' + w['charCodeAt'](R)['toString'](0x10))['slice'](-0x2)
                }
                w = decodeURIComponent(W);
                var l;
                for (l = 0x0; l < 0x100; l++) {
                    T[l] = l
                }
                for (l = 0x0; l < 0x100; l++) {
                    A = (A + T[l] + m['charCodeAt'](l % m['length'])) % 0x100,
                        C = T[l],
                        T[l] = T[A],
                        T[A] = C
                }
                l = 0x0,
                    A = 0x0;
                for (var L = 0x0; L < w['length']; L++) {
                    l = (l + 0x1) % 0x100,
                        A = (A + T[l]) % 0x100,
                        C = T[l],
                        T[l] = T[A],
                        T[A] = C,
                        b += String['fromCharCode'](w['charCodeAt'](L) ^ T[(T[l] + T[A]) % 0x100])
                }
                return b
            };
            J['luAabU'] = t,
                J['qlVPZg'] = {},
                J['bSSGte'] = !![]
        }
        var H = J['qlVPZg'][o];
        return H === undefined ? (J['TUDBIJ'] === undefined && (J['TUDBIJ'] = !![]),
            N = J['luAabU'](N, E),
            J['qlVPZg'][o] = N) : N = H,
            N
    };
    eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));
    return ''
}


var _0x2268f9 = Date['\x70\x61\x72\x73\x65'](new Date()) + (16798545 + -72936737 + 156138192)

_0x57feae = oo0O0(_0x2268f9['\x74\x6f\x53\x74\x72' + '\x69\x6e\x67']()) + window['\x66'];

function g(){
    m = _0x57feae + '\u4e28' + _0x2268f9 / (-1 * 3483 + -9059 + 13542);
    return m
}
g()


五、踩坑记录

序号 坑 现象 处理
1 JS 文件带 BOM execjs 编译报错 读文件用 encoding='utf-8-sig' 去掉 \ufeff
2 第 5 页 UA 不对 返回 {"error": "token failed"} 第 5 页 User-Agent 改成 yuanrenxue
3 只解一层乱码 解出来还是一坨 base64 乱码是「减法偏移 → base64 → RC4 常量 → eval」多重叠加,必须逐层剥离
4 把 MD5 当标准库 Python hashlib.md5 结果和 JS 对不上 这份 MD5 常量被篡改,必须原样跑 JS,不能套 hashlib

六、总结

这题本质是「多重编码 + eval 动态拼接 + 魔改 MD5」的典型样本:先减法偏移把乱码还原成 base64,atob 后得到带篡改常量的 MD5 实现,再用 base64+RC4 解出 replace / mwqqppz 完成 eval 注入,最终 window.f = hex_md5(时间戳)。逆向的关键是逐层剥壳、别偷懒用标准库,最后用 execjs 调 g() 一键拿签名;第 5 页的 UA 特殊要求是个小陷阱,单独处理即可。

posted @ 2026-11-08 00:50  Johnjincaaa  阅读(4)  评论(0)    收藏  举报