Hướng dẫn is obfuscated javascript slower? - javascript bị xáo trộn có chậm hơn không?

Tôi có một kịch bản bị che giấu và bắt đầu như thế này:

var _0xfb0b=["\x48\x2E\x31\x36\x28\x22\x4B\x2E

... Nó tiếp tục như thế để có thêm 435.000 ký tự (tệp có 425kb) và cuối cùng, điều này đang đến:

while(_0x8b47x3--){if(_0x8b47x4[_0x8b47x3]){_0x8b47x1=_0x8b47x1[_0xfb0b[8]]( 
new RegExp(_0xfb0b[6]+_0x8b47x5(_0x8b47x3)+_0xfb0b[6],_0xfb0b[7]),
_0x8b47x4[_0x8b47x3]);} ;} ;return _0x8b47x1;} 
(_0xfb0b[0],62,2263,_0xfb0b[3][_0xfb0b[2]](_0xfb0b[1])));

Câu hỏi của tôi là: Không phải là một trình duyệt khó thực hiện đó so với một kịch bản không bị che giấu và nếu vậy, tôi có thể mất bao nhiêu thời gian vì sự che giấu? Đặc biệt là các trình duyệt cũ như IE6 thực sự không phải là người biểu diễn trong JS phải dành nhiều thời gian hơn cho việc đó, phải không?

Đã hỏi ngày 12 tháng 3 năm 2012 lúc 3:57Mar 12, 2012 at 3:57

Hướng dẫn is obfuscated javascript slower? - javascript bị xáo trộn có chậm hơn không?

2

Nó chắc chắn làm chậm trình duyệt đáng kể hơn trên các trình duyệt cũ hơn (cụ thể là khi khởi tạo), nhưng nó chắc chắn làm chậm nó ngay cả sau đó. Tôi đã có một tệp bị che giấu nặng nề, mất khoảng 1,2 giây để khởi tạo, không bị ảnh hưởng trong cùng một trình duyệt và PC là khoảng 0,2 giây, vì vậy, có ý nghĩa.

Đã trả lời ngày 12 tháng 3 năm 2012 lúc 4:03Mar 12, 2012 at 4:03

Hướng dẫn is obfuscated javascript slower? - javascript bị xáo trộn có chậm hơn không?

Ryan Kemptryan KeemRyan Kempt

4.1356 Huy hiệu vàng28 Huy hiệu bạc39 Huy hiệu Đồng6 gold badges28 silver badges39 bronze badges

Nó phụ thuộc vào những gì obfuscator làm.

Nếu nó chủ yếu đổi tên các định danh, tôi hy vọng nó sẽ có rất ít tác động đến hiệu suất trừ khi các tên nhận dạng mà nó sử dụng là dài một cách giả tạo.

Nếu nó tranh giành điều khiển hoặc luồng dữ liệu, nó có thể có tác động tùy ý đến thực thi mã. Một số cuộc tranh giành dòng điều khiển có thể được thực hiện chỉ với chi phí không đổi.

Bạn sẽ phải điều tra phương pháp obfuscation để biết câu trả lời cho điều này. Có thể dễ dàng hơn để chỉ đo lường sự khác biệt.

Đã trả lời ngày 12 tháng 3 năm 2012 lúc 4:02Mar 12, 2012 at 4:02

Hướng dẫn is obfuscated javascript slower? - javascript bị xáo trộn có chậm hơn không?

IRA Baxterira BaxterIra Baxter

92.1K22 Huy hiệu vàng169 Huy hiệu bạc335 Huy hiệu Đồng22 gold badges169 silver badges335 bronze badges

Sự obfuscation mà bạn đang sử dụng dường như chỉ lưu trữ tất cả các hằng số chuỗi thành một mảng và đặt chúng vào mã nơi chúng ban đầu. Các chuỗi bị xua đuổi vào mảng nhưng vẫn ra như chuỗi. (Thử console.log (_0xfb0b) để xem ý tôi là gì).

Nó, chắc chắn, làm chậm khởi tạo mã. Tuy nhiên, một khi mảng đó đã được khởi tạo, tác động đến tập lệnh là không đáng kể.

Đã trả lời ngày 12 tháng 3 năm 2012 lúc 4:01Mar 12, 2012 at 4:01

DanreduxdanreduxDanRedux

8.8155 Huy hiệu vàng22 Huy hiệu bạc41 Huy hiệu đồng5 gold badges22 silver badges41 bronze badges

Khi download các bộ thư viện trên Internet (đặc biệt là thư viện Jquery, Javascript), thỉnh thoảng bạn sẽ nhận được những file rất nhỏ, nội dung bên trong thì bị minify và không có 1 chút meaning nào. Đó chính là kỹ thuật Obfuscated code.

Obfuscated code là gì?

Đây là một kỹ thuật để trả lời cho câu hỏi mà mình thường gặp của các bạn developer mới vào nghề: “Làm sao để che giấu source code của mình?”. Hãy thử xem ví dụ phía dưới:

Source:

function redirectUrl(url, selectorString) {
    if (url !== '') {
        if (selectorString === null || (selectorString !== null && $(selectorString).val() != url)) {
            window.location.replace(url);
        }
    }
}
function removeData(row) {
    row.addClass("warning");
    row.fadeOut(400, function () {
        row.remove();
    });
}
var delay = (function () {
    var timer = 0;
    return function (callback, ms) {
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    };
})();

Obfuscated code:

eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}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}('1 g(3,4){6(3!==''){6(4===a||(4!==a&&$(4).d()!=3)){f.b.c(3)}}}1 e(2){2.l("n");2.o(h,1(){2.p()})}7 m=(1(){7 5=0;i 1(8,9){j(5);5=k(8,9)}})();',26,26,'|function|row|url|selectorString|timer|if|var|callback|ms|null|location|replace|val|removeData|window|redirectUrl|400|return|clearTimeout|setTimeout|addClass|delay|warning|fadeOut|remove'.split('|'),0,{}))

Obfuscated code format:

eval(function (p, a, c, k, e, d) {
    e = function (c) {
        return c.toString(36)
    };
    if (!''.replace(/^/, String)) {
        while (c--) {
            d[c.toString(a)] = k[c] || c.toString(a)
        }
        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
}('1 g(3,4){6(3!==''){6(4===a||(4!==a&&$(4).d()!=3)){f.b.c(3)}}}1 e(2){2.l("n");2.o(h,1(){2.p()})}7 m=(1(){7 5=0;i 1(8,9){j(5);5=k(8,9)}})();', 26, 26, '|function|row|url|selectorString|timer|if|var|callback|ms|null|location|replace|val|removeData|window|redirectUrl|400|return|clearTimeout|setTimeout|addClass|delay|warning|fadeOut|remove'.split('|'), 0, {}))

Tại sao cần phải Obfuscated code?

  • Dung lượng code sẽ được giảm xuống.
  • Trong Javascript, sẽ làm thời gian tải xuống đáng kể.
  • Khi code được Obfuscated sẽ rất khó để đảo ngược lại định dạng ban đầu.

Các bạn có thể thấy, với Obfuscated code, nó không những chỉ minify (cắt bỏ các đoạn xuống dòng, dấu cách không cần thiết làm giảm dung lượng file, tiết kiệm băng thông) mà nó còn thay đổi luôn cả tên lớp, tên hàm, tên biến,… thành những kí tự đơn giản vô nghĩa (VD: a(), var b,…). Vậy nên Obfuscated code còn được biết đến với cái tên Việt là kỹ thuật làm rối code: người khác có thể có được code của bạn nhưng khó có thể hiểu hết toàn bộ ý nghĩa code mà bạn viết Obfuscated code được dùng trong rất nhiều ngôn ngữ chứ không chỉ riêng Javascript. Thường thì đối với các source public họ sẽ chỉ minify để giảm dung lượng file khi load. Còn Obfuscated chỉ dùng khi muốn cải thiện hiệu suất hơn nữa và đặc biệt là dùng để giấu code. Giấu code ở đây cũng không hoàn toàn là không dịch ngược lại được, tuy nhiên sẽ tốn khá nhiều thời gian.kỹ thuật làm rối code: người khác có thể có được code của bạn nhưng khó có thể hiểu hết toàn bộ ý nghĩa code mà bạn viết

Hướng dẫn is obfuscated javascript slower? - javascript bị xáo trộn có chậm hơn không?
Obfuscated code được dùng trong rất nhiều ngôn ngữ chứ không chỉ riêng Javascript. Thường thì đối với các source public họ sẽ chỉ minify để giảm dung lượng file khi load. Còn Obfuscated chỉ dùng khi muốn cải thiện hiệu suất hơn nữa và đặc biệt là dùng để giấu code. Giấu code ở đây cũng không hoàn toàn là không dịch ngược lại được, tuy nhiên sẽ tốn khá nhiều thời gian.

Obfuscation == Encryption?

Không, obfuscation != encryption.

  • Trong JavaScript, trình duyệt có thể thực thi encrypted code, trong khi trình duyệt sẽ thực thi obfuscated code.
  • Encrypted code luôn cần giải mã để được thực thi.
  • Obfuscated code không yêu cầu khử dữ liệu để thực thi.

Khi viết Obfuscator cần chú ý:

-Chỉ thay đổi những tên riêng, không thay đổi từ khóa, tên lệnh, hay các API của hệ thống

-Tránh xung đột tên. Ví dụ: nếu thay tên lớp và tên biến giống nhau, chương trình có thể chạy không giống bình thường và thậm chí là không hiểu nó đang làm gì

-Nhất quán. Khi thay đổi tên phải thay đổi toàn bộ các file nguồn có chứa cùng đối tượng đó. Ví dụ: file abc.jsp chứa lớp tên ABC thì khi đổi tên lớp ABC, tất cả các file khác có dùng lớp ABC cũng phải thay đổi theo.

-Đặt tên mới càng ngắn càng tốt. Làm như thế để dịch mã nhanh hơn, đỡ tốn công sức cho trình dịch

-Lọai bỏ dư thừa

Làm sao để Obfuscated code?

Tất nhiên bạn có thể tự làm bằng tay. Thôi, tốt nhất là dùng các bộ thư viện, phần mềm hoặc một số tools online vì những công cụ này đã được viết để có thể Obfuscated code của bạn một cách tối ưu nhất. Một số tools online:

  • JavaScript HTML Code/Text Obfuscator
  • Online Javascript Obfuscator DaftLogic
  • Jsobfuscate

Nếu code của bạn là vì cộng đồng thì bạn chỉ cần minify để giảm dung lượng file thôi, còn nếu vẫn muốn giấu code thì Obfuscated code là một lựa chọn tối ưu cho bạn. Cám ơn các bạn đã đọc bài viết

Tài liệu tham khảo:

  • https://obfuscator.io/
  • http://soaptek.blogspot.com/2013/01/tim-hieu-ve-minified-obfuscated-code.html