Bảo mật mã JS của bạn là một trong những nhiệm vụ quan trọng nhất khi bạn phải hiển thị mã của mình cho người dùng. Đó là lúc trình mã hóa JavaScript như aaencode, ra tay trợ giúp. Hôm nay tôi sẽ phân tích mã bị xáo trộn để biết thêm về cách mã bị xáo trộn được thực thi, đồng thời, có thêm kiến thức về kiểu dữ liệu JS
aaencode là gìBạn có thể không quen với cái tên này, vì vậy hãy để tôi chỉ cho bạn những gì bạn đã bỏ lỡ. Obfuscator có tên "aaencode" là một trong những obfuscator JS thú vị nhất được tạo bởi Yosuke Hasegawa. Không giống như các bộ mã hóa mã hóa khác, trong khi mã làm xáo trộn mã hóa của các bộ mã hóa mã hóa khác cho bạn cảm giác về một mã có thể giải được, thì aaencode khiến nó khó đọc đến mức khi nhìn vào nó, bạn thậm chí không nghĩ đó là mã JS đang hoạt động
Đây là bằng chứng, hãy thử xáo trộn một dòng mã đơn giản
alert["hi"]
Nó trông như thế nào trong aaencode
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
Tin hay không thì tùy, đoạn mã trên hoạt động hoàn hảo, bạn có thể thử thực thi nó trong bảng điều khiển của trình duyệt và làm quen với nó vì đoạn mã khó hiểu đó sắp bị phá vỡ
Hãy làm đẹp cho cô bé lọ lem của chúng taĐể tăng khả năng đọc, tôi đã sử dụng một trang web cực kỳ hữu ích có tên là jsbeautifier để gỡ mã nguồn phần nào. Sau khi sử dụng jsbeautifier, khả năng đọc chỉ được cải thiện nhẹ vì tất cả các biến đều là ký tự UTF8
Kết quả sau khi sử dụng jsbeautifier
Điên phải không? . Về cơ bản, nếu bạn sử dụng ký tự UTF8 để đặt tên cho các biến của mình thì dòng mã dưới đây được coi là JS hợp lệ
var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
Vậy chúng ta giải quyết vấn đề này như thế nào? . Quá trình này sẽ mất khá nhiều thời gian nhưng với tính năng thay thế tất cả văn bản cao cấp, tôi có thể hoàn thành nhiệm vụ chỉ sau vài phút
Đi sâu hơn vào thế giới mã
Trước tiên hãy nhìn vào 10 dòng đầu tiên
a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
Trước hết, chúng ta có thể thấy rằng mã đang gán một số ký tự ma thuật đen tối cho biến “a”. Tuy nhiên, mặc dù trông có vẻ kỳ quặc nhưng thực ra giá trị của nó chỉ là
a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
0 vì giá trị của a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
1 bao gồm 3 phần/`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
Vậy giá trị của
a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
1 chính là giá trị của thuộc tính a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
3 trong regex và vì thuộc tính a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
3 không được định nghĩa nên nó sẽ trả về a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
0Tiếp theo, giá trị của
a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
6 , a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
7 và a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
3 được đặt thành 3. Sau đó, các biến a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
9 và /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
0 được tạo và gán giá trị của /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
1 là /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
2. Biến /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
0 sau đó chia sẻ giá trị của nó với /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
4, một biến mới được tạo và cả hai đều chứa một giá trị mới là mặt cười chia mặt cườiHaha, đó thực sự không phải là một khuôn mặt cười, nó là sự kết hợp giữa biến ________ 36 và biến ________ 33 bằng cách sử dụng toán tử xor và toán tử chia. Giá trị thực của một khuôn mặt cười là
var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
2Vì vậy, chúng tôi có thể tính toán giá trị của
/`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
4 và /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
0 bây giờ bằng với /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
9Sau đó,
/`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
4 đã thay đổi giá trị của nó thành một đối tượng, điều đó có nghĩa là chỉ có /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
0 hiện mang giá trị của var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
22. Giá trị của e bây giờ dễ dàng giải quyết vì giờ đây nó chỉ là JavaScript cơ bảnvar ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
9Hãy xem thuộc tính
a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
1, giá trị của nó là var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
24. Bây giờ tất cả chúng ta đều biết rằng a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
1 bằng với a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
0 vì vậy var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
27 chắc chắn sẽ trả về var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
28 , sau đó var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
28 được nối với chuỗi a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
3 thay đổi giá trị thành var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
91 và sau đó, chỉ mục /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
0 của chuỗi được lấy là chỉ mục var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
22 của chuỗi Điều tương tự với
var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
96, tài sản, chúng tôi sẽ cóa = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
4và tài sản
var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
97 sẽ sở hữu giá trị củaa = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
6Hãy viết lại mã của chúng tôi với giá trị mới mà chúng tôi đã tính toán thành công
a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
7Chuyển sang 3 dòng tiếp theo
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
0Dòng đầu tiên trong 3 dòng đó dường như đang gán một thuộc tính mới cho biến đối tượng
/`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
4. Bởi vì /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
0 bằng với var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
22 và không có thuộc tính nào có tên là var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
22 trong /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
4 nên JavaScript sẽ tạo một thuộc tính mới nếu bạn gán một số giá trị cho một thuộc tính không xác định. Điều đó có nghĩa là /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
4 hiện đang sở hữu một tài sản khác có giá trị là a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
44Điều tương tự sẽ xảy ra với 2 dòng tiếp theo. Nhưng một cái gì đó khác biệt xuất hiện trong 2 dòng đó. Họ ghép nối
/`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
4 với a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
46? Đây là kết quả của nó
Như vậy, giá trị của 2 dòng cuối sẽ là
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
1Một lần nữa, hãy viết lại biến
/`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
4 với thuộc tính mới được thêm vàoNghỉ ngơi một lát
Bây giờ bạn nên nghỉ ngơi vì chúng tôi vừa hoàn thành công việc của mình ở giai đoạn 1 và bạn sẽ không thể sống sót qua giai đoạn 2 nếu bạn không nghỉ ngơi. Ai nói JavaScript dễ hơn giải tích?
Mã phức tạp hơnBây giờ chúng tôi sẽ chuyển sang phần khó nhất trong quá trình phân tích của chúng tôi. Đây là một phần của phần còn lại của mã bị xáo trộn của chúng tôi và trong phần này, chúng tôi sẽ phân tích phần từ đầu mã cho đến dòng 22
Hãy bắt đầu với dòng đầu tiên
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
2Như bạn có thể thấy đó là một dòng mã rất dài, chúng ta có thể tách chúng ra như thế này
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
3Có vẻ như câu lệnh này đang cố gắng xây dựng một chuỗi bởi vì chúng ta có thể thấy rằng điều đầu tiên mà chúng nối với nhau là ________ 460 là ký tự ________ 461. Do đó, chúng ta có thể thay thế tất cả các biến và thu được kết quả này
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
4Vì vậy, dòng mã này chỉ cần xây dựng chuỗi _______ 462 và sau đó gán nó cho một biến mới có tên là ________ 463
Chuyển sang câu lệnh tiếp theo, chúng ta có một dòng mã rất ngắn nhưng thú vị
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
5Vì vậy, chúng tôi biết rằng thuộc tính
a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
46 không tồn tại trong biến đối tượng /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
4, vì vậy chúng tôi có thể kết luận rằng dòng mã này đang tạo và gán một giá trị mới cho thuộc tính đó. Nhưng đó là một giá trị kỳ lạ vì chúng tôi đã phân tích trước đó rằng mặt cười sẽ trả về 3 và a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
66 sẽ bằng với a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
62. Do đó, giá trị thực của dòng của chúng tôi là゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
6Vậy hàm tạo là gì?
Trả về một tham chiếu đến hàm tạo
a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
69 đã tạo đối tượng thể hiện. Lưu ý rằng giá trị của thuộc tính này là một tham chiếu đến chính hàm đó, không phải là một chuỗi chứa tên của hàm. Giá trị chỉ ở chế độ chỉ đọc đối với các giá trị nguyên thủy như
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};var ಠ_ಠ = "I'm done with JS";
22,
alert[ಠ_ಠ];a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
71 và
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
72
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
Về cơ bản, bạn có thể sử dụng
a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
68 để tạo một phiên bản mới của loại đối tượng đóBây giờ, một câu hỏi hấp dẫn được đặt ra là "hàm tạo của một hàm tạo đối tượng là gì?"
Mọi hàm tạo của một lớp trong JavaScript là một hàm
Do đó, hàm tạo của hàm tạo của một đối tượng là hàm tạo của một hàm và mọi hàm trong JavaScript là một đối tượng
a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
74. Xem câu đầu tiên trong phần mô tả trong trang web này để biết thêmĐối tượng
a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
75 là đối tượng toàn cầu và theo tài liệu web MDNHàm tạo
a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
74 tạo một đối tượng
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
75 mới. Gọi trực tiếp hàm tạo có thể tạo các hàm động, nhưng gặp phải các vấn đề về bảo mật và hiệu suất tương tự như
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
78
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
Sau khi đọc thêm, bạn sẽ phát hiện ra rằng điều này hơi giống với hàm ________ 479 ngoại trừ nó sẽ tạo ra một hàm ẩn danh nhưng không gọi nó
Hàm a sẽ chỉ thực thi nếu chúng ta gọi nó
Quay lại lý do chính tại sao chúng tôi thực hiện tất cả các nghiên cứu này — dòng mã ngắn của chúng tôi
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
5Điều đó có nghĩa là thuộc tính
a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
3 của biến đối tượng /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
4 hiện chứa tham chiếu đến hàm tạo đối tượng a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
75Dòng mã tiếp theo của chúng tôi ngắn hơn một chút so với dòng đầu tiên nhưng đừng lo, đây chỉ là một mã xây dựng chuỗi khác
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
8Kết quả cuối cùng sẽ là
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
9Vì vậy, bây giờ chúng tôi đã tạo một biến mới có tên là
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
03 với chuỗi ゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
04 bên trong nóNăm dòng cuối cùng của mã giai đoạn 2 của chúng tôi
var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
0Rõ ràng là dòng đầu tiên sẽ tăng biến
a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
7 lên giá trị của /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
0 là 1. Bây giờ a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
7 sẽ giữ giá trị là 4Dòng tiếp theo sẽ lấy chuỗi mà chúng ta lấy được ở bước trước là
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
04 để dùng làm đối tượng thuộc tính /`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
4 và giá trị của nó là chuỗi ゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
10 hay chính xác hơn là ký tự ゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
11Ở dòng này code tiếp tục thêm một thuộc tính khác vào đối tượng
/`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
4 và giá trị của nó làvar ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
1Tiếp theo nó tạo một biến mới tên là
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
13 để lưu ký tự ゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
14var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
2Sau đó,
/`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
4 tiếp tục được thêm một thuộc tính mới vào dòng nàyvar ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
3Và đó là kết thúc của giai đoạn 2 của chúng tôi. Bây giờ chúng ta có thể viết lại mã của mình và đây là giao diện sau khi viết lại
Dòng cuối đứng
Chúng tôi hiện đang ở giai đoạn cuối cùng của quá trình phân tích. Chỉ có 1 dòng mã cuối cùng cũng là dòng quan trọng nhất trong tất cả
var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
4Đầu tiên, hãy tách chúng thành các phần
var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
5Như bạn có thể thấy,
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
16 đang gói tất cả mã bên trong nó và ゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
16 là hàm tạo đối tượng a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
75 vì vậy chúng tôi biết dòng này đang cố gắng tự động tạo một hàm và thực thi nó. Chúng ta cũng biết rằng hàm tạo đối tượng a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
75 lấy một chuỗi để sử dụng nó làm thân hàm, vì vậy mã bên trong nó phải được xây dựng một chuỗi. Sử dụng bảng điều khiển trình duyệt, chúng ta có thể thấy rằng mã bên trong đang xây dựng chuỗivar ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
6゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
20 có nghĩa là gì?Nó thực sự là một chuỗi thoát bát phân. Bằng cách dán trực tiếp vào bảng điều khiển, chúng ta có thể nhận được giá trị thực của nó, đó là
alert["hi"]
Hãy xây dựng lại mã
var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
8Chúng ta có thể viết lại hàm bên trong này
var ಠ_ಠ = "I'm done with JS";
alert[ಠ_ಠ];
9Vì vậy, sau khi hàm được xây dựng, nó sẽ được gọi với tham số
/`m´)ノ ~┻━┻ / -> regular expression
/*´∇`*/ -> comment
['_'] -> object property selector
0 và chuỗi ゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=[゚ー゚] =_=3; c=[゚Θ゚] =[゚ー゚]-[゚ー゚]; [゚Д゚] =[゚Θ゚]= [o^_^o]/ [o^_^o];[゚Д゚]={゚Θ゚: '_' ,゚ω゚ノ : [[゚ω゚ノ==3] +'_'] [゚Θ゚] ,゚ー゚ノ :[゚ω゚ノ+ '_'][o^_^o -[゚Θ゚]] ,゚Д゚ノ:[[゚ー゚==3] +'_'][゚ー゚] }; [゚Д゚] [゚Θ゚] =[[゚ω゚ノ==3] +'_'] [c^_^o];[゚Д゚] ['c'] = [[゚Д゚]+'_'] [ [゚ー゚]+[゚ー゚]-[゚Θ゚] ];[゚Д゚] ['o'] = [[゚Д゚]+'_'] [゚Θ゚];[゚o゚]=[゚Д゚] ['c']+[゚Д゚] ['o']+[゚ω゚ノ +'_'][゚Θ゚]+ [[゚ω゚ノ==3] +'_'] [゚ー゚] + [[゚Д゚] +'_'] [[゚ー゚]+[゚ー゚]]+ [[゚ー゚==3] +'_'] [゚Θ゚]+[[゚ー゚==3] +'_'] [[゚ー゚] - [゚Θ゚]]+[゚Д゚] ['c']+[[゚Д゚]+'_'] [[゚ー゚]+[゚ー゚]]+ [゚Д゚] ['o']+[[゚ー゚==3] +'_'] [゚Θ゚];[゚Д゚] ['_'] =[o^_^o] [゚o゚] [゚o゚];[゚ε゚]=[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚Д゚] .゚Д゚ノ+[[゚Д゚]+'_'] [[゚ー゚] + [゚ー゚]]+[[゚ー゚==3] +'_'] [o^_^o -゚Θ゚]+[[゚ー゚==3] +'_'] [゚Θ゚]+ [゚ω゚ノ +'_'] [゚Θ゚]; [゚ー゚]+=[゚Θ゚]; [゚Д゚][゚ε゚]='\\'; [゚Д゚].゚Θ゚ノ=[゚Д゚+ ゚ー゚][o^_^o -[゚Θ゚]];[o゚ー゚o]=[゚ω゚ノ +'_'][c^_^o];[゚Д゚] [゚o゚]='\"';[゚Д゚] ['_'] [ [゚Д゚] ['_'] [゚ε゚+[゚Д゚][゚o゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [゚ー゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[o^_^o] +[o^_^o]]+ [゚ー゚]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [c^_^o]+ [゚Д゚][゚ε゚]+[゚Θ゚]+ [[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚ε゚]+[゚ー゚]+ [[o^_^o] - [゚Θ゚]]+ [゚Д゚][゚ε゚]+[[゚ー゚] + [゚Θ゚]]+ [゚Θ゚]+ [゚Д゚][゚o゚]] [゚Θ゚]] ['_'];
22 sẽ được chuyển đến hàm tạo a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
75 bên ngoài, hàm này sẽ tạo hàm và sử dụng chuỗi đó làm phần thân hàm. Sau khi xây dựng hàm, nó sẽ gọi hàm bằng cách sử dụng ký tự a = /`m´)ノ ~┻━┻ / /*´∇`*/ ['_'];
o = [b] = _ = 3;
c = [d] = [b] - [b];
[e] = [d] = [o ^ _ ^ o] / [o ^ _ ^ o];
[e] = {
d: '_',
a: [[a == 3] + '_'][d],
h: [a + '_'][o ^ _ ^ o - [d]],
i: [[b == 3] + '_'][b]
};
46 và đó là cách mã của chúng tôi được thực thiTrường hợp đóng cửaĐó là cách aaencode JS obfuscator hoạt động và sẽ mất một khoảng thời gian đáng kể để phân tích nó, tuy nhiên, không gì là không thể. Ngoài ra, tôi muốn cảm ơn Yosuke Hasegawa vì đã tạo ra obfuscator tuyệt vời này và tôi hy vọng sau khi đọc nó, các bạn sẽ tìm thấy một số điều thú vị để làm với JS và vui lòng để lại nhận xét nếu bạn có bất kỳ câu hỏi hoặc lời khen nào. ]]