01/10/2018, 01:08

Làm sao để đọc mã Java Script này?

eval(function (p, a, c, k, e, d) { e = function (c) { return (c < a ? ' : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)) }; if (!'.replace(/^/, String)) { while (c--) { d[e(c)] = k[c] || e(c) } k = [function (e) { return d[e] }]; e = function () { return '\w+' }; c = 1 }; while (c--) { if (k[c]) { p = p.replace(new RegExp('\b' + e(c) + '\b', 'g'), k[c]) } } return p }('8 1k=3(){2.i=[];2.L=[];2.X(1s("1t"))};1k.1r={1a:3(a){2.n=a},y:3(){4 2.n},1b:3(a){2.1i=a},1w:3(){4 2.1i},18:3(a){2.1l=a},1H:3(){4 2.1l},12:3(a){2.1d=a},o:3(){4 2.1d},16:3(a){2.1n=a},1x:3(){4 2.1n},19:3(a){2.1m=a},G:3(){4 2.1m},1A:3(a){2.i.t(a)},1B:3(a){4 2.i[a]},1F:3(a){2.1c=a},H:3(){4 2.1c},15:3(a){2.z=a},I:3(){4 2.z},X:3(a){2.Y=a},g:3(){4 2.Y},13:3(a){2.10=a},1z:3(){4 2.10},17:3(a){2.F=a},1y:3(){4 2.F},14:3(a){2.V=a},1C:3(){4 2.V},D:3(){8 a=[],b;m(b 1D 2.i)2.i.1G(b)&&a.t(2.i[b]);4 a.1E(",")},Z:3(a){"S"!==U a&&(a=l.T(a.d),2.1b(a.1v),2.18(a.1q),2.12(a.q),2.1a(a.n),2.16(a.1u),2.19(a.E),2.15(a.z),2.14(a.1J),2.13(a.21),2.17(a.F))},20:3(a){8 b=2,c=b.g()+"/1Z.j/1X",d={9:0};"x"==k&&(d.9=1);d=l.K(d);4 w.r({v:c,23:"C",1I:"s",22:!1,24:!0,J:"N/s",u:d,R:3(c){b.Z(c);"S"!==U a&&(c=l.T(c.d),a(c))}})},25:3(){8 a=2,b={9:0,26:1,q:a.o()};"x"==k&&(b.9=1);8 c=a.g()+"/1Y.j";4 w.r({v:c,B:"1V",u:b,R:3(b){a.L.t(c);0==b&&(Q.O.M.P=a.g()+"/11.j?W=0");-1==b&&(Q.O.M.P=a.g()+"/11.j?W=-1")}})},1N:3(){},1M:3(a){a={9:0,n:2.y(),q:2.o(),E:2.G(),1L:a};"x"==k&&(a.9=1);a=l.K(a);8 b=2.g()+"/1W.j/1K";2.L.t(b);4 w.r({v:b,B:"C",u:a,J:"N/s"})},1O:3(){8 a=2,b={9:0,n:a.y(),q:a.o(),E:1g(a.y(),a.o(),a.G(),a.H(),a.D(),a.I()),1P:a.H(),1U:a.D(),z:a.I()};"x"==k&&(b.9=1);8 b=l.K(b),c=a.g()+"/1S.j/1Q";4 w.r({v:c,B:"C",J:"N/s",u:b,R:3(b){b=b.d;"1R"==k&&(Q.O.M.P=a.g()+"/"+b.p(7,b.h))}})}};3 1T(a,b){m(8 c="",d=a.A("").h/(b+1),e=1;e<=d;e++)c+=a.p(e*b+(e-1),e*b+1+(e-1));4 c}3 1p(a,b){m(8 c=a.A(""),d="",e=0;e<c.h;e++)8 f=1f.1e().1j(1o).p(0,b),d=d+(f+c[e]);4 d}3 1h(a){a=a.A("");m(8 b="",c=0;c<a.h;c++)b+=a[a.h-c-1];4 b}3 1g(a,b,c,d,e,f){f=a+'","'+b+'","'+1p(c,6)+'","'+d+'","'+e+'","'+f;f=1h(f);a=f.A("");b="";m(c=0;c<a.h;c++)f=1f.1e().1j(1o).p(0,5),b+=f+a[c];4 b};', 62, 131, '||this|function|return||||var|local|||||||getBaseUrl|length|questionScore|aspx|ENV|JSON|for|userId|getExam|substring|which_exam|ajax|json|push|data|url|jQuery|dev|getUserId|ran|split|type|POST|getStringScores|Token|site_de|getToken|getTotalScore|getRan|contentType|stringify|debug|location|application|top|href|window|success|undefined|parse|typeof|userName|login|setBaseUrl|baseUrl|handleGameDataResponse|lang|Default|setExam|setLang|setUserName|setRan|setGameId|setSiteDe|setClasses|setToken|setUserId|setRound|totalScore|exam|random|Math|press|pressl|round|toString|Api|classes|token|gameId|36|presst|block|prototype|getParameterFromUrl|site_url|game_id|which_round|getRound|getGameId|getSiteDe|getLang|setScore|getScore|getUserName|in|join|setTotalScore|hasOwnProperty|getClasses|dataType|full_name|PostPoint|point|sendUserScoreWhenSubmitQuestion|sendDataWhenClickToQuestion|sendTotalUserScore|totalPoint|SendtotalPoint|production|SubmitTotalPoint|compers|subPoint|GET|sendPoint|getdata|Timer|urlData|getGameData|language|processData|method|crossDomain|sendUserDataConfirm|start'.split('|'), 0, {}))

Mình có đoạn mã như trên, làm thế nào để đọc nó?
Xin lỗi, mình là newbie.

ACP viết 03:21 ngày 01/10/2018

Đoạn javascript này đã được minify - tức là nén lại sao cho dung lượng nhỏ nhất để tăng tốc độ load (đặt tên 1 kí tự, xóa khoảng trắng,…).
Muốn dễ đọc hơn, bạn có thể xài tool này để unminify nó: http://unminify.com/. Dù vậy tên biến vẫn là 1 kí tự nhé

Đào An viết 03:11 ngày 01/10/2018

nếu b dùng sublime thì có thể down 1 số plugin là đẹp code js về và sài.
https://packagecontrol.io/packages/HTML-CSS-JS%20Prettify

Dang H. viết 03:09 ngày 01/10/2018

Nếu bạn xem kỹ sẽ thấy cái code đó nó làm như thế này:

eval(
  function(…) {
    …
  }(/*code đã minified*/)
)

Giải thích từng bước:

  • Xử lý cái code đã minified bằng split(’|’)
  • Lấy kết quả cho vào cái hàm kia, sinh ra cái code thật
  • Eval code thật

Để xem mã nó thì bạn copy cái đoạn trong cái eval ra, chỉ để lại function và code minified, paste vào Chrome Dev Tools, sẽ ra được đoạn mã gốc, sau đó dùng tool unminify để ra mã như ban đầu

Kết quả:

var Api = function() {
    this.questionScore = [];
    this.debug = [];
    this.setBaseUrl(getParameterFromUrl("site_url"))
};
Api.prototype = {
    setUserId: function(a) {
        this.userId = a
    },
    getUserId: function() {
        return this.userId
    },
    setRound: function(a) {
        this.round = a
    },
    getRound: function() {
        return this.round
    },
    setClasses: function(a) {
        this.classes = a
    },
    getClasses: function() {
        return this.classes
    },
    setExam: function(a) {
        this.exam = a
    },
    getExam: function() {
        return this.exam
    },
    setGameId: function(a) {
        this.gameId = a
    },
    getGameId: function() {
        return this.gameId
    },
    setToken: function(a) {
        this.token = a
    },
    getToken: function() {
        return this.token
    },
    setScore: function(a) {
        this.questionScore.push(a)
    },
    getScore: function(a) {
        return this.questionScore[a]
    },
    setTotalScore: function(a) {
        this.totalScore = a
    },
    getTotalScore: function() {
        return this.totalScore
    },
    setRan: function(a) {
        this.ran = a
    },
    getRan: function() {
        return this.ran
    },
    setBaseUrl: function(a) {
        this.baseUrl = a
    },
    getBaseUrl: function() {
        return this.baseUrl
    },
    setLang: function(a) {
        this.lang = a
    },
    getLang: function() {
        return this.lang
    },
    setSiteDe: function(a) {
        this.site_de = a
    },
    getSiteDe: function() {
        return this.site_de
    },
    setUserName: function(a) {
        this.userName = a
    },
    getUserName: function() {
        return this.userName
    },
    getStringScores: function() {
        var a = [],
            b;
        for (b in this.questionScore) this.questionScore.hasOwnProperty(b) && a.push(this.questionScore[b]);
        return a.join(",")
    },
    handleGameDataResponse: function(a) {
        "undefined" !== typeof a && (a = JSON.parse(a.d), this.setRound(a.which_round), this.setClasses(a.block), this.setExam(a.which_exam), this.setUserId(a.userId), this.setGameId(a.game_id), this.setToken(a.Token), this.setRan(a.ran), this.setUserName(a.full_name), this.setLang(a.language), this.setSiteDe(a.site_de))
    },
    getGameData: function(a) {
        var b = this,
            c = b.getBaseUrl() + "/urlData.aspx/getdata",
            d = {
                local: 0
            };
        "dev" == ENV && (d.local = 1);
        d = JSON.stringify(d);
        return jQuery.ajax({
            url: c,
            method: "POST",
            dataType: "json",
            processData: !1,
            crossDomain: !0,
            contentType: "application/json",
            data: d,
            success: function(c) {
                b.handleGameDataResponse(c);
                "undefined" !== typeof a && (c = JSON.parse(c.d), a(c))
            }
        })
    },
    sendUserDataConfirm: function() {
        var a = this,
            b = {
                local: 0,
                start: 1,
                which_exam: a.getExam()
            };
        "dev" == ENV && (b.local = 1);
        var c = a.getBaseUrl() + "/Timer.aspx";
        return jQuery.ajax({
            url: c,
            type: "GET",
            data: b,
            success: function(b) {
                a.debug.push(c);
                0 == b && (window.top.location.href = a.getBaseUrl() + "/Default.aspx?login=0"); - 1 == b && (window.top.location.href = a.getBaseUrl() + "/Default.aspx?login=-1")
            }
        })
    },
    sendDataWhenClickToQuestion: function() {},
    sendUserScoreWhenSubmitQuestion: function(a) {
        a = {
            local: 0,
            userId: this.getUserId(),
            which_exam: this.getExam(),
            Token: this.getToken(),
            point: a
        };
        "dev" == ENV && (a.local = 1);
        a = JSON.stringify(a);
        var b = this.getBaseUrl() + "/sendPoint.aspx/PostPoint";
        this.debug.push(b);
        return jQuery.ajax({
            url: b,
            type: "POST",
            data: a,
            contentType: "application/json"
        })
    },
    sendTotalUserScore: function() {
        var a = this,
            b = {
                local: 0,
                userId: a.getUserId(),
                which_exam: a.getExam(),
                Token: press(a.getUserId(), a.getExam(), a.getToken(), a.getTotalScore(), a.getStringScores(), a.getRan()),
                totalPoint: a.getTotalScore(),
                subPoint: a.getStringScores(),
                ran: a.getRan()
            };
        "dev" == ENV && (b.local = 1);
        var b = JSON.stringify(b),
            c = a.getBaseUrl() + "/SubmitTotalPoint.aspx/SendtotalPoint";
        return jQuery.ajax({
            url: c,
            type: "POST",
            contentType: "application/json",
            data: b,
            success: function(b) {
                b = b.d;
                "production" == ENV && (window.top.location.href = a.getBaseUrl() + "/" + b.substring(7, b.length))
            }
        })
    }
};

function compers(a, b) {
    for (var c = "", d = a.split("").length / (b + 1), e = 1; e <= d; e++) c += a.substring(e * b + (e - 1), e * b + 1 + (e - 1));
    return c
}

function presst(a, b) {
    for (var c = a.split(""), d = "", e = 0; e < c.length; e++) var f = Math.random().toString(36).substring(0, b),
        d = d + (f + c[e]);
    return d
}

function pressl(a) {
    a = a.split("");
    for (var b = "", c = 0; c < a.length; c++) b += a[a.length - c - 1];
    return b
}

function press(a, b, c, d, e, f) {
    f = a + '","' + b + '","' + presst(c, 6) + '","' + d + '","' + e + '","' + f;
    f = pressl(f);
    a = f.split("");
    b = "";
    for (c = 0; c < a.length; c++) f = Math.random().toString(36).substring(0, 5), b += f + a[c];
    return b
};
null viết 03:15 ngày 01/10/2018

Thay eval bằng console.log rồi mở Console lên chạy.

Bài liên quan
0