Chuỗi dựng sẵn của JavaScript là gì?


147

câu hỏi này rất khó để tóm tắt trong một tiêu đề câu hỏi

CẬP NHẬT Tôi đã tạo một JSFiddle xây dựng một chuỗi bị xáo trộn khỏi đầu vào của bạn dựa trên các chữ cái được trích xuất từ ​​câu hỏi này: Bạn có thể truy cập nó ở đây , hoặc một ý chính sẽ dễ dàng hơn?

Gần đây tôi đã bắt gặp một chút JavaScript thú vị trong hồ sơ này trông giống như thế này:

javascript:[[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+([]+!!-
[])[1<<1]+[/~/+{}][+!1][-~1<<1]+([]+/-/[(!!1+[])[1>>1]+(!!1
+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+([,][
~1]+[])[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+(/1/+
1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</[1]+[])[1/1.1&1]

Xin lỗi để phá hỏng sự bất ngờ nhưng khi đánh giá nó sẽ trả về điều này:

"I love you" in Chrome
"I lone you" In Firefox
"I lo[e you" in IE10

Cách thức này hoạt động khi thoát ra, là tạo ra một loạt các tin nhắn và kéo các chữ cái ra khỏi chúng như vậy (sử dụng "tôi" làm ví dụ):

[]+1/!1
returns
"Infinity"
then
[[]+1/!1]
creates this array:
["Infinity"]
then
[[]+1/!1][1^1]
Takes the first (1^1 == 0) element of that array
"Infinity"
finally
[[]+1/!1][1^1][1>>1]
Takes the first (1>>1 == 0) char of that string
"I"

Các chuỗi khác được tạo bao gồm:

({}+[])       -> "[object Object]" (where the space comes from)
([]+!!-[])    -> "false" (used for it's "l")
[/~/+{}][+!1] -> "/~/[object Object]" (this is used for an "o")
(/<</[1]+[])  -> "undefined"

Tôi đã quan tâm đến việc tìm một sự thay thế cho "n" và "[" và đã đưa ra điều này:

String.fromCharCode(('1'.charCodeAt(0)<<1)+(10<<1))

Tôi cảm thấy theo tinh thần sử dụng 1 và 0, nhưng vi phạm một trong những khía cạnh thanh lịch hơn của mã gốc, đó là sự xuất hiện của việc không liên quan gì đến chuỗi. Có ai khác có ý tưởng làm thế nào để tạo một "v" phù hợp với mã bị xáo trộn ban đầu không?

Dưới đây là một số thông tin bổ sung được tìm thấy sau khi nhiều lập trình viên JavaScript tài năng đã xem xét sâu hơn về điều này

Firefox trả về "Tôi cô đơn" Vì dòng này:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+

[1^11<<1] cắt một ký tự cụ thể từ đây:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])

Đánh giá này:

"function test() {
    [native code]
}"

Có vẻ như chúng ta có thể có chữ "V" !!!

Chrome trả về "Tôi yêu bạn", bởi vì cùng một mã trả về điều này:

"function test() { [native code] }"

Trước khi câu hỏi được đóng lại để kết nối đáng ngờ với "một vấn đề lập trình thực sự", tôi nghĩ rằng tôi đã thêm một giải pháp tóm tắt được xây dựng trên @ Supr's , @ Cory's@ alpha123's :

alert([[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+(
[]+!!-[])[1<<1]+[/~/+{}][+!1][-~1<<1]+[([]+/-/[(
!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(
!!1+[])[1^1]])[1+(1^(11+1+1)<<1)],([]+/-/[(!!1+[
])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[
])[1^1]])[1^11<<1],([]+/-/[(!!1+[])[1>>1]+(!!1+[
])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11
+1+1)<<1]][((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<
1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1<<1<<1<<1
)+1<<1]==({}+[])[1^1])*1)+((([]+/-/[(!!1+[])[1>>
1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1
]])[(1^11<<1)-1]==({}+[])[1^1])<<1)]+([,][~1]+[]
)[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+
(/1/+1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</
[1]+[])[1/1.1&1])

Với sự phức tạp của mã và thông điệp mà nó tạo ra, nó giống như công cụ JavaScript đang nói bạn cảm thấy đặc biệt như thế nào :)


9
Nó nói "tình yêu" trong bảng điều khiển Chrome. i.imgur.com/rVyKMoP.png
bfavaretto

2
Điều gì sẽ xảy ra nếu bạn loại bỏ các chữ cái không có trong function test() { [native code] }đó, sau đó bạn có thể bình thường hóa nó và trích xuất chữ cái bạn muốn
Jason Sperske

4
Dựa trên mã đầu ra chuỗi không được xác định để in một tin nhắn bằng cách sử dụng mã bị che khuất ... Tôi đang gọi cách này quá cục bộ.

2
@Ian, đúng rồi. Nếu những người trong cuộc sống mà tôi yêu thực sự quan tâm đến tôi, họ sẽ sử dụng Chrome :)
Jason Sperske

4
Phần hay nhất về điều này là cảnh báo mà trình soạn thảo văn bản của tôi đưa ra: "Việc sử dụng nhầm lẫn '!'"
Jake Johnson

Câu trả lời:


83

Trước hết, tôi muốn cảm ơn Jason và tất cả những người đóng góp đã chơi với đoạn trích hài hước đó. Tôi đã viết đoạn mã đó chỉ để giải trí để gửi cho vợ tôi vào ngày 14 tháng 2 :) Chỉ có Chrome được cài đặt trên máy tính xách tay, tôi không có tùy chọn nào để kiểm tra xem nó hoạt động như thế nào trong Firefox và IE. Hơn nữa, tôi không thực sự mong đợi rằng việc toString()thể hiện các phương thức tích hợp có thể trông khác nhau trong các trình duyệt khác.

Bây giờ, chuyển sang vấn đề thực sự , chúng ta hãy xem chính xác mã. Vâng, "v"là "vấn đề" thực sự ở đây. Tôi không tìm thấy cách nào khác để nhận được thư này ngoại trừ phân tích [native code]chuỗi, có thể được lấy từ bất kỳ phương thức tích hợp nào. Vì tôi giới hạn bản thân không có chuỗi và không có số trừ khi 1được sử dụng, tôi cần khai thác một số phương thức chỉ có các ký tự có sẵn trong tên của nó.

Nhân vật có sẵn có thể thu được từ khóa hiện tại và cơ quan đại diện chuỗi, tức là từ đầu chúng tôi đã có NaN, null, undefined, Infinity, true, false, và "[object Object]". Một số trong số chúng có thể dễ dàng chuyển đổi thành chuỗi, ví dụ như 1/!1+[]cho "Infinity".

Tôi đã phân tích các phương thức xây dựng khác nhau cho mảng [], đối tượng {}, biểu thức chính quy /(?:)/, số 1.1, chuỗi "1"và phát hiện ra một phương thức đẹp của RegExpđối tượng được gọi test(). Tên của nó có thể được lắp ráp từ tất cả các ký tự có sẵn, ví dụ "t""e"từ true"s"từ false. Tôi đã tạo một chuỗi "test"và giải quyết phương thức này bằng cách sử dụng ký hiệu ngoặc vuông cho regex bằng chữ /-/, được xác định chính xác trong dòng này:

/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]]

Như đã thảo luận, đoạn mã này được đánh giá trong Chrome là:

function test() { [native code] }

trong Firefox như:

function test() {
    [native code]
}

và trong IE là:

 function test() {     [native code] }  

(sau này đặc biệt chú ý đến khoảng trắng trước functiontừ khóa)

Vì vậy, như bạn thấy rõ, mã của tôi đã nhận được ký tự thứ 24 từ chuỗi được trình bày, trong Chrome là "v"(như đã được lên kế hoạch), nhưng không may là trong Firefox và IE - "n""["tương ứng.

Để tạo ra cùng một đầu ra trong tất cả các trình duyệt, tôi đã sử dụng cách tiếp cận khác với minh họa trong các câu trả lời khác. Bây giờ phiên bản sửa đổi trông như thế:

javascript:[[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+([]+!!-
[])[1<<1]+[/~/+{}][+!1][-~1<<1]+/\[[^1]+\]/[([]+![])[1<<1<<
1]+(/|/[(1+{})[1+11>>>1]+[[]+{}][+!1][1]+([]+1/[])[1<<1>>1]
+([1<1]+[])[1+11>>>1+1]+[[!!1]+1][+[]][1-1]+([]+!!/!/)[1|1]
+(/1/[1]+[])[!1%1]+(-{}+{})[-1+1e1-1]+(1+[!!1])[1]+([]+1+{}
)[1<<1]+[!!/!!/+[]][+[]][1&1]]+/=/)[1e1+(1<<1|1)+(([]+/-/[(
!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1
]])[1^1]==+!1)]+(!![]+{})[1|1<<1]+[1+{}+1][!1+!1][(11>>1)+1
]](([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+
(!!1+[])[1^1]]))[1&.1][11>>>1]+([,][~1]+[])[1-~1]+[[]+{}][!
1.1%1][11111.1%11.1*111e11|!1]+(/1/+1/[1<1][1%1])[1^11]+[[]
,[]+{}][1<<1>>>1][1||1]+(/[<+>]/[1&1|1]+[1.1])[1/11.1&1.11]

Tuy nhiên, để gây tò mò cho độc giả, tôi sẽ không cung cấp giải pháp cho điều đó. Tôi thành thật tin rằng bạn sẽ dễ dàng hiểu cách thức hoạt động của nó ... và một số thậm chí có thể gây ngạc nhiên cho người mình yêu theo cách đa trình duyệt;)

PS Tuy nhiên một Obfuscator

Lấy cảm hứng từ ý tưởng của Jason để tạo ra một công cụ che giấu phổ quát, tôi đã viết thêm một công cụ nữa. Bạn có thể tìm thấy nó tại JSBin: http://jsbin.com/amecoq/2 . Nó có thể làm xáo trộn bất kỳ văn bản nào có chứa số [0-9], chữ Latin nhỏ [a-z]và dấu cách. Độ dài chuỗi bị giới hạn chủ yếu bằng RAM của bạn (ít nhất là phần thân của câu trả lời của tôi đã bị che khuất thành công). Đầu ra được hỗ trợ bởi Chrome, Firefox và IE.

Gợi ý: công cụ sử dụng phương pháp obfuscation khác với trình bày ở trên.


4
"constructor" ... wow thật tuyệt vời và bạn giữ hình chữ nhật hoàn hảo với các ngắt dòng hợp lệ. Bạn thật tốt
Jason Sperske

1
Tôi đã tạo một Obfuscator tạo ra một chuỗi phù hợp với quy tắc phong cách của bạn: jsfiddle.net/w9rFF/8
Jason Sperske

@JasonSperske Đó là một mẹo hay! Công việc tuyệt vời Tôi sẽ cố gắng đóng góp cho nó.
VisioN

26

Tại sao không phải là native codebit từ câu hỏi đang được sử dụng? Cái này cung cấp cho 'v'cả Chrome và Firefox:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]>([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11+1+1)<<1]?([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]:([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11+1+1)<<1]

Chỉnh sửa để hỗ trợ IE và thực hiện mà không cần toán tử ternary: Công cụ này hoạt động trong Chrome, IE và FF. Xây dựng một mảng và sử dụng ==để xác định trình duyệt.

[([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1+(1^(11+1+1)<<1)],([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1],([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11+1+1)<<1]][((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1<<1<<1<<1)+1<<1]==({}+[])[1^1])*1)+((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1^11<<1)-1]==({}+[])[1^1])<<1)]

Có thể đọc được

[
    //ie
    ([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1+(1^(11+1+1)<<1)],
    //ch
    ([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1],
    //ff
    ([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11+1+1)<<1]
]
[
    //ch?
    ((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1<<1<<1<<1)+1<<1]==({}+[])[1^1])*1)+
    //ff?
    ((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1^11<<1)-1]==({}+[])[1^1])<<1)
]

Điều đó thật thú vị. Ban đầu, nó đã bị bác bỏ rằng vị trí của các từ "mã gốc" là không thể đoán trước giữa Firefox và Chrome. Điều này giải quyết điều đó nhưng không hoạt động trong IE10 (nơi nó trả về "i"). Tuy nhiên, tôi tự hỏi nếu tùy chọn này có thể cung cấp một số ý tưởng mới
Jason Sperske

Ý tưởng là chỉ cần chọn cả hai nvvà chỉ cần chọn nào là lớn nhất: str[23]>str[27]?str[23]:str[27]. Nói cách khác, toán tử bậc ba là mánh khóe. Cũng có thể được mở rộng để hỗ trợ IE:([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1+(1^(11+1+1)<<1)]
Supr

1
Câu trả lời của bạn là đầu tiên (trước người tạo mã gốc), nhưng tôi cảm thấy câu trả lời của anh ta có thể được coi là hợp lý nhất. Vẫn còn công việc tuyệt vời (và được 13 phiếu bầu xứng đáng)
Jason Sperske

1
Tiểu nitlog: toán tử bậc ba là toán tử quan trọng thứ ba, sau toán tử chính và phụ. Một toán tử có ba toán hạng là ternary.
Eric Lippert

1
@EricLippert, gah, tôi thậm chí đã googled nó để đảm bảo rằng tôi đã sử dụng đúng thuật ngữ, nhưng tôi vẫn kết thúc với một từ sai! Cảm ơn, đã sửa.
Supr

8

Điều này gần đến mức tôi có thể nhận được, thật không may, nó vi phạm quy ước của obfuscation ban đầu bằng cách gọi tới unescape():

unescape((/%/+[])[1]+(/1/[1]+[])[1%1]+(+!1)+(+!1)+(1e1+(11*(1-~1)<<1)))

Phá bỏ:

(/%/+[])[1]          => "%"
(/1/[1]+[])[1%1]     => "u"
(+!1)                => "0"
(+!1)                => "0"
(1e1+(11*(1-~1)<<1)) => "76"
===========================
unescape("%u0076")   => "v"

Những ý tưởng khác:

  1. Bằng cách nào đó có được unescape("\x76")
  2. Bằng cách nào đó chuyển đổi 118mà không gọiString.fromCharCode()
  3. Lấy văn bản từ một ngoại lệ có từ "Không hợp lệ" trong đó

Cập nhật:

Tôi bắt đầu chơi golf code và đã làm cho nó ngắn hơn, thay thế các bộ phận bằng nhiều 1s hơn , v.v.


Tôi cũng thích cái này Tôi hơi khó hiểu khi chọn một câu trả lời "đúng", vì cả hai bạn và @ alpha123 đều trông cực kỳ khó hiểu và khéo léo che giấu ý định ban đầu.
Jason Sperske

Và hỗ trợ IE10 niêm phong thỏa thuận (với lời xin lỗi chân thành @ alpha123 cho câu trả lời xuất sắc)
Jason Sperske

Bạn có thể thay thế '%'bằng (/%/+[[]+1/!1])[1]cách loại bỏ bất kỳ dấu ngoặc kép. Tôi cũng đã thêm l=unescape;bằng cách sử dụng chữ thường Lđể ẩn tham chiếu unescape. Điều này thật thú vị :)
Jason Sperske

@JasonSperske: Thậm chí ngắn hơn:(/%/+[])[1]
C

1
Hoặc bạn có thể đặt tên cho biến của bạn $1;
Cᴏʀʏ

4

Đây là phần tạo ra n / v:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]

Trong Firefox, ([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])đánh giá

"function test() {
    [native code]
}"

trong khi trong Chrome thì

"function test() { [native code] }"

1^11<<1 bằng 23. Vì vậy, do khoảng trắng thêm của Firefox, điều này không đủ để đến 'v', và thay vào đó là 'n'.

Và đây là lý do tại sao bạn không nên dựa vào hành vi Hàm # toString. ;)

EDIT: Cuối cùng tôi đã tìm thấy một phiên bản trình duyệt chéo khá khó hiểu:

[[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+([]+!!-[])[1<<1]+[/~/+{}][+!1][-~1<<1]+([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1^11<<1)+(parseInt("010")<10?(1+1+1+1):0)]+([,][~1]+[])[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+(/1/+1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</[1]+[])[1/1.1&1]

Điều này thay thế phần n / v bằng:

([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1^11<<1)+(parseInt("010")<10?(1+1+1+1):0)]

khai thác sự khác biệt trong parseInt (rõ ràng Firefox phân tích các số bắt đầu bằng 0 là bát phân, trong khi Chrome không) để thêm 4 trong trường hợp của Firefox, do đó, nhận được 'v' từ 'bản địa' trong cả hai trường hợp (tôi không thể tìm thấy 'v' khác ': P).
ParseInt trông hơi lạc lõng, nhưng đó là điều tốt nhất tôi có thể làm bây giờ.


1
Câu hỏi làDoes anyone else have an idea of how to generate a "v" that is in keeping with the original obfuscated code?
Ian

Cảm ơn. Bây giờ tôi đang cố gắng tìm ra một cách đa trình duyệt để làm điều đó ... 'V' là một lá thư không phổ biến đáng ngạc nhiên ....
Peter C

@Ian - vậy thì có lẽ, [(1 ^ 11 << 1) + 1 + 1 + 1 + 1] sẽ làm gì?
boostzflep

@JanDvorak - Hiện tại tôi không có FF. Nó đánh giá cái gì? Nếu tôi có thể quá tự phụ để hỏi, đó là.
boostzflep

@enhzflep xin lỗi, ý tôi là "điều đó sẽ không hoạt động trong Chrome, mặt khác"
John Dvorak

4

Đối với chung trường hợp sử dụng , nếu vỏ nhân vật không phải là mối quan tâm lớn, tôi có thể có xu hướng lừa dối một chút.

Tạo hàm "c" biến số 0 .. 25 thành ký tự.

c=function(v){for(var i in window){for(var ci in i){if(parseInt(i[ci],(10+11+11)+(1<<1)+(1<<1))==(v+10)){return i[ci]}}}};

Vì lý do hiệu suất, bộ đệm trước các chữ cái, nếu bạn muốn.

l=[];for(var i=0; i<(11+11)+(1<<1)+(1<<1);i++){l[i]=c(i);}

Trong bảng điều khiển Chrome, mảng kết quả trông như thế này:

> l;
["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "K", "l", "m", "n", "o", "p", "q", "r", "S", "t", "u", "v", "w", "x", "y", "Z"]

Vì vậy, ... v của bạn có thể làl[10+10+1] .

Ngoài ra, một giải pháp chung như thế này:

p=(function(){10%11}+[])[1+11+(1<<1)]; // "%"
u=(function(){club=1}+[])[1+11+(1<<1)]; // "u"
vc=p+u+(0+[])+(0+[])+((111>>1)+11+10+[]); // "%u0076"
unescape(vc);

Hoặc, đối với vấn đề cụ thể này, có thể chỉ là:

(function(){v=1}+[])[10+(1<<1)]; // "v"

3

Điều này mang lại av trong Chrome:

Object.getOwnPropertyNames(Object)[17][3];

Và điều này thực hiện trong Firefox:

Object.getOwnPropertyNames(Object)[9][3]

Cả hai đều kéo nó ra khỏi Object.prototype.preventExtensions() , vì vậy bạn có thể tìm thấy một cách đa trình duyệt để tham chiếu phương thức đó. (Đây là tên 17 ký tự duy nhất trong Object.Prototype cho người mới bắt đầu.)

Hãy thoải mái xây dựng một phiên bản khó hiểu hơn về điều này và tự mình lấy tất cả tín dụng, tôi đã hết thời gian;)


2

Trong chrome, biểu thức ([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])ước lượng thành "function test() { [native code] }", ước lượng [1^11<<1]thành 23 (toán tử bitwise làm cho biến bị cắt thành 32 bit)


Câu hỏi làDoes anyone else have an idea of how to generate a "v" that is in keeping with the original obfuscated code?
Ian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.