JS逆向|使用express框架開啟服務并替換加密字符串

在閱讀本文之前請確保電腦已安裝好Node.js.

express,根據(jù)其Github上的描述状您,是一個:
Fast, unopinionated, minimalist web framework for node.
其Github地址:https://github.com/expressjs/express
根據(jù)其Readme文檔挟纱,安裝:
npm install express
保存演示code:

const express = require('express')
const app = express()
 
 
app.get('/', function (req, res) {
  res.send('Hello World')
})
 
 
app.listen(3000)

然后運行(控制臺下輸入node xxx.js),并打開瀏覽器,輸入:

http://127.0.0.1:3000/

并回車媒役,得到瀏覽器上的結果:


image.png

當然示罗,這僅僅是個簡單的例子姑丑,還需要了解function (req, res)的用途,上面的代碼稍微改一下:

app.get('/', function (req, res) {
console.log(req.query); //只增加這一行拴清,看看打印結果
res.send('Hello World')
})
在瀏覽器上輸入如下URL,并回車:

http://127.0.0.1:3000/?sign=123456

查看命令行下的結果:


image.png

這樣就清楚了会通,直接構造參數(shù)口予,然后用res.send返回結果。

繼續(xù)沿用上一篇文章的代碼涕侈,將 大數(shù)組 + 位移函數(shù) + 解密函數(shù)的代碼添加進來沪停,并構造參數(shù),如下

const express = require('express')
const app = express()
 
 
var _0x2075 = ['wrw3EMKc', 'BBdBHWk=', 'wplgd8O5dHbDtFfDucK9CsOS', 'f8KvAcKewoDClg==', 'XcKowo9uOyfChw==', 'XcKowpRzOzDCgMKuw5vCtH8=', 'HmQkw5vDt8OIBDbCpMKdw6Aaw7HDmcKb', 'wpxzdMO4', 'R8KHF1k1w5A=', 'w4LDgcOowrjDhg==', 'w6RKw6PCmVDDpw==', 'w6DDgsKrCsK5wqAwKsOMTkPDilwgB241RVBIw6rCvwpWw5fCo8OSw59pBcK7UlrCucOZHy7DgsO5wpx5J8K5wqbCtMOMwqvCsiUFw5s4JGfDmwQPw7Fawq3CgXlkJyE=', 'VcObYsOHKcKpwpI=', 'KkZfcE52w77ChsKgUQ==', 'CmQsw57DvA==', 'YV7CscOYZg==', 'w5jDt8OUwr46w5c6LsKEPsO0', 'F8OUMQhRw78Q', 'YMKzeTvCpMKzHcKKGSjCj2dJwq3Cj3/ChsKSFVpMw4sZwrg9H8OLw4/DqUlhYlpaa8KYJsO5AcK2wqnCmGhEwqkbdMKKLsO/wpBFMcKlC8OvKUkXZ8KpBsOxw4XDk8K5w4Y6w7VZO8K/wojCqcO2wqQow5Z+w6dew7I3TMObw6Ykw7I=', 'Mk8Bw6QawqU=', 'wo5zw4vCkxvDuSBqwoENw7rCrF3DksKewoPDqMKHNSzCgcK2fcKxPMKbGcKwCW5GZWRpw6fDmgHCjXrCnXE3w4zDqlt3w64lw7JiworDi8Knw5YoW1LDlUbDpkEtGQPDnw==', 'w6lvdMKW', 'w7JFdsOhwrBqwrlMYcKVJRjCuMKQwpLDtMONwprCsMORw4BtRV0oeEQPCgAmMgx2'];
(function(_0xf486e7, _0x2075d7) {
    var _0x5c3a18 = function(_0x5b65b1) {
        while (--_0x5b65b1) {
            _0xf486e7['push'](_0xf486e7['shift']());
        }
    };
    _0x5c3a18(++_0x2075d7);
}(_0x2075, 0xa4));
var _0x5c3a = function(_0xf486e7, _0x2075d7) {
    _0xf486e7 = _0xf486e7 - 0x0;
    var _0x5c3a18 = _0x2075[_0xf486e7];
    if (_0x5c3a['vEVEZj'] === undefined) {
        (function() {
            var _0x2e1ca4;
            try {
                var _0x28e173 = Function('return\x20(function()\x20' + '{}.constructor(\x22return\x20this\x22)(\x20)' + ');');
                _0x2e1ca4 = _0x28e173();
            } catch (_0x16acc9) {
                _0x2e1ca4 = window;
            }
            var _0x16f958 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
            _0x2e1ca4['atob'] || (_0x2e1ca4['atob'] = function(_0x5a7812) {
                var _0x3c7e74 = String(_0x5a7812)['replace'](/=+$/, '');
                var _0x5e030c = '';
                for (var _0x4eaee2 = 0x0, _0x5954ef, _0x29200e, _0x5a128b = 0x0; _0x29200e = _0x3c7e74['charAt'](_0x5a128b++); ~_0x29200e && (_0x5954ef = _0x4eaee2 % 0x4 ? _0x5954ef * 0x40 + _0x29200e : _0x29200e,
                _0x4eaee2++ % 0x4) ? _0x5e030c += String['fromCharCode'](0xff & _0x5954ef >> (-0x2 * _0x4eaee2 & 0x6)) : 0x0) {
                    _0x29200e = _0x16f958['indexOf'](_0x29200e);
                }
                return _0x5e030c;
            }
            );
        }());
        var _0x3acf89 = function(_0x593a19, _0xfee22e) {
            var _0x1b5349 = [], _0x4ddb21 = 0x0, _0x28ed27, _0x4b4996 = '', _0xbdd0c6 = '';
            _0x593a19 = atob(_0x593a19);
            for (var _0x1d6343 = 0x0, _0x3f947e = _0x593a19['length']; _0x1d6343 < _0x3f947e; _0x1d6343++) {
                _0xbdd0c6 += '%' + ('00' + _0x593a19['charCodeAt'](_0x1d6343)['toString'](0x10))['slice'](-0x2);
            }
            _0x593a19 = decodeURIComponent(_0xbdd0c6);
            var _0x1a120c;
            for (_0x1a120c = 0x0; _0x1a120c < 0x100; _0x1a120c++) {
                _0x1b5349[_0x1a120c] = _0x1a120c;
            }
            for (_0x1a120c = 0x0; _0x1a120c < 0x100; _0x1a120c++) {
                _0x4ddb21 = (_0x4ddb21 + _0x1b5349[_0x1a120c] + _0xfee22e['charCodeAt'](_0x1a120c % _0xfee22e['length'])) % 0x100;
                _0x28ed27 = _0x1b5349[_0x1a120c];
                _0x1b5349[_0x1a120c] = _0x1b5349[_0x4ddb21];
                _0x1b5349[_0x4ddb21] = _0x28ed27;
            }
            _0x1a120c = 0x0;
            _0x4ddb21 = 0x0;
            for (var _0x585b7f = 0x0; _0x585b7f < _0x593a19['length']; _0x585b7f++) {
                _0x1a120c = (_0x1a120c + 0x1) % 0x100;
                _0x4ddb21 = (_0x4ddb21 + _0x1b5349[_0x1a120c]) % 0x100;
                _0x28ed27 = _0x1b5349[_0x1a120c];
                _0x1b5349[_0x1a120c] = _0x1b5349[_0x4ddb21];
                _0x1b5349[_0x4ddb21] = _0x28ed27;
                _0x4b4996 += String['fromCharCode'](_0x593a19['charCodeAt'](_0x585b7f) ^ _0x1b5349[(_0x1b5349[_0x1a120c] + _0x1b5349[_0x4ddb21]) % 0x100]);
            }
            return _0x4b4996;
        };
        _0x5c3a['HKkhxp'] = _0x3acf89;
        _0x5c3a['eabUGz'] = {};
        _0x5c3a['vEVEZj'] = !![];
    }
    var _0x5b65b1 = _0x5c3a['eabUGz'][_0xf486e7];
    if (_0x5b65b1 === undefined) {
        if (_0x5c3a['vszZjY'] === undefined) {
            _0x5c3a['vszZjY'] = !![];
        }
        _0x5c3a18 = _0x5c3a['HKkhxp'](_0x5c3a18, _0x2075d7);
        _0x5c3a['eabUGz'][_0xf486e7] = _0x5c3a18;
    } else {
        _0x5c3a18 = _0x5b65b1;
    }
    return _0x5c3a18;
};
 
 
app.get('/', function (req, res) {
  //req.query = {callback:"_0x5c3a('0x8', 'CwZq')"}
  let callback = req.query.callback;
  let value = eval(callback); //直接eval計算傳遞進來的解密函數(shù)及參數(shù)
  console.log(callback,value);
  res.send(value)  //結果
})
 
app.listen(3000)

在node下運行后裳涛,在瀏覽器上進行簡單的測試:

http://127.0.0.1:3000/?callback=_0x5c3a('0x8', 'CwZq')

回車后的結果:


image.png

這樣木张,我們就可以用requests庫進行請求,代碼如下:

reg = re.compile(r"_0x5c3a\([\s\S]{12,14}'\)")
results = reg.findall(code) # code是所有混淆代碼
 
 
for result in results:
    params = {"callback":result} #構造參數(shù)
    r = requests.get("http://127.0.0.1:3000/",params = params) #請求
    print (result,r.text) #打印結果
    code = code.replace(result,"'" + r.text + "'") #全局替換

結果如下:


image.png

和上一篇文章的結果一致端三,但效果明顯要好很多舷礼,特別是在處理多個這樣的調用時,其性能不是一個量級郊闯,因此在這里建議且轨,卸載掉電腦上的pyexecjs在這個庫吧,反正也沒再更新了虚婿。

不過這里在使用get時旋奢,遇到了一個坑,就是當提交的參數(shù)里面包含特殊字符時(比如'&'),可能會解析錯誤然痊,因此建議使用post方式至朗,可自行百度相關教程。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剧浸,一起剝皮案震驚了整個濱河市锹引,隨后出現(xiàn)的幾起案子矗钟,更是在濱河造成了極大的恐慌,老刑警劉巖嫌变,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吨艇,死亡現(xiàn)場離奇詭異,居然都是意外死亡腾啥,警方通過查閱死者的電腦和手機东涡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倘待,“玉大人疮跑,你說我怎么就攤上這事⊥苟妫” “怎么了祖娘?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長啊奄。 經(jīng)常有香客問我渐苏,道長,這世上最難降的妖魔是什么菇夸? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任整以,我火速辦了婚禮,結果婚禮上峻仇,老公的妹妹穿的比我還像新娘公黑。我一直安慰自己,他們只是感情好摄咆,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布凡蚜。 她就那樣靜靜地躺著,像睡著了一般吭从。 火紅的嫁衣襯著肌膚如雪朝蜘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天涩金,我揣著相機與錄音谱醇,去河邊找鬼。 笑死步做,一個胖子當著我的面吹牛副渴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播全度,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼煮剧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起勉盅,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤佑颇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后草娜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挑胸,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年宰闰,在試婚紗的時候發(fā)現(xiàn)自己被綠了茬贵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡议蟆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出萎战,到底是詐尸還是另有隱情咐容,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布蚂维,位于F島的核電站戳粒,受9級特大地震影響,放射性物質發(fā)生泄漏虫啥。R本人自食惡果不足惜蔚约,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涂籽。 院中可真熱鬧苹祟,春花似錦、人聲如沸评雌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽景东。三九已至砂轻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斤吐,已是汗流浹背搔涝。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留和措,地道東北人庄呈。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像派阱,于是被迫代替她去往敵國和親抒痒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容