--Define Variables local argv = {...} local argc = #argv local vDefs = nil local fDef = nil local oldDefs = false local machineInf = false local viruscount = 0 local critical = false --Define Functions function ord(char) return string.byte(char) end function ordA1(char) return string.byte(char)-string.byte("a")+1 end function chr(num) return string.char(num) end function chrA1(num) return string.char(string.byte("a")+num-1) end function checkSum(str) local checkSum = 0 for i=1, #str do local c = string.sub(str,i,i) checkSum = checkSum + ord(c) end return checkSum end function update() local url = http.get("https://pastebin.com/raw/wjYsbRPC") if url ~= nil then fs.delete(shell.getRunningProgram()) writeFile(shell.getRunningProgram(),url.readAll()) return true else return false end end function hash(str) local hash = "" for i=1, #str do local c = string.sub(str,i,i) hash = hash..chr(ord(c)+checkSum(c)) end return hash end function removeStr(oldstr,remove) return string.gsub(oldstr,remove,"") end function getDefs() local virDefs = http.get("https://pastebin.com/raw/v3iDY3Qb") local defs = nil if virDefs == nil then defs = false else defs = textutils.unserialise(virDefs.readAll()) virDefs.close() end return defs end function exists(fName) return fs.exists(fName) end function readFile(fName) if exists(fName) then local f = fs.open(fName,"r") local fRead = f.readAll() f.close() return fRead else return false end end function writeFile(fName,fData) local f = fs.open(fName,"w") if f == nil then return false else f.write(fData) f.close() end end function strFind(original,target) return string.find(original,target) end function setCritical() critical = true end function isCritical() return critical end function scanFile(fName,defs) local fData = readFile(fName) local isInf = false print("Scanning File: "..fName) if fData ~= false then for i=1,#defs do if strFind(fData,defs[i][1]) then if defs[i][2] == 1 then print("High Security risk file found: "..fName.." Attempting to remove file...") isInf = true writeFile(fName..".backup",removeStr(fData,defs[i][1])) writeFile(fName,"printError(\"This file has been overwritten due to compromisation of this file. If you need to restore this file, there is a backup saved to "..fName..".backup".."\")") setCritical() break end print("Virus Found in file "..fName.." Attempting to remove virus code...") writeFile(fName,removeStr(fData,defs[i][1])) isInf = true end end return 0,isInf else return 1 end end function wipe() local files = fs.list("/") for i=1,#files do if files[i] ~= "rom" then fs.delete(files[i]) end end end function scanDir(Directory,def) print("Scannng Directory: "..Directory) local sDir = shell.dir() sDir = shell.resolve( Directory ) local tAll = fs.list( sDir ) local tFiles = {} local tDirs = {} for n, sItem in pairs( tAll ) do if string.sub( sItem, 1, 1 ) ~= "." then local sPath = fs.combine( sDir, sItem ) if fs.isDir( sPath ) then table.insert( tDirs, sItem ) else table.insert( tFiles, sItem ) end end end table.sort( tDirs ) table.sort( tFiles ) for i=1,table.getn(tFiles) do local code,x = scanFile(Directory.."/"..tFiles[i],def) if code == 1 then printError("Error scanning file: "..Directory.."/"..tFiles[i]) else if x then machineInf = true viruscount = viruscount + 1 end end end for i=1,table.getn(tDirs) do if tDirs[i] ~= "rom" then scanDir(Directory.."/"..tDirs[i],def) end end end function vFullScan() scanDir("/",vDefs) if machineInf then print("Alert! "..viruscount.." Virus(es) Found!") else print("Machine is Virus Free!") end if isCritical() then local msg = [[ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Alert! System Status Critical: One or more files infected with a destructive virus. System wipe may be necessary. Would you like to wipe the system? [Y]es [N]o ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Awaiting Input... ]] print(msg) while true do local event,key1 = os.pullEvent() if event == "key" then if key1 == keys.y then wipe() print("System Wiped, Have a good day.") break elseif key1 == keys.n then break end else print(msg) end end end end function fFullScan() scanDir("/",fDef) if machineInf then print("Alert! "..viruscount.." Virus(es) Found!") else print("Machine is Virus Free!") end if isCritical() then local msg = [[ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Alert! System Status Critical: One or more files infected with a destructive virus. System wipe may be necessary. Would you like to wipe the system? [Y]es [N]o ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Awaiting Input... ]] print(msg) while true do local event,key1 = os.pullEvent() if event == "key" then if key1 == keys.y then wipe() print("System Wiped, Have a good day.") break elseif key1 == keys.n then break end else print(msg) end end end end function setTermBg(color) term.setBackgroundColor(color) term.clear() end function cPos(x,y) term.setCursorPos(x,y) end function setLineBg(y,color) cPos(1,y) term.setBackgroundColor(color) term.clearLine() end function wColor(txt,color) term.setTextColor(color) write(txt) end function setTxtC(color) term.setTextColor(color) end function setTxtBC(color) term.setBackgroundColor(color) end function clearScreen() term.clear() term.setCursorPos(1,1) end function gui(v) local tx,ty = term.getSize() local btn_scan = "Scan" local btn_update = "Update" local btn_u_x,btn_u_y = tx-btn_update:len(),ty local btn_s_x,btn_s_y = 1,ty local txtbgcolor = nil local msg = [[ J-Os Antivirus-0.1-Dev is a sophisticated antivirus that protects your system as well as removes active viruses. ]] if advanced then local bgcolor = colors.aqua txtbgcolor = colors.aqua setTermBg(bgcolor) cPos(1,1) setLineBg(1,colors.gray) cPos(1,1) wColor("[Close] J-Os Antivirus-0.1-DEV",colors.red) else local bgcolor = colors.gray txtbgcolor = colors.gray setTermBg(bgcolor) cPos(1,1) setLineBg(1,colors.gray) cPos(1,1) wColor("[Close] J-Os Antivirus-0.1-DEV",colors.white) end cPos(1,3) wColor(msg,colors.white) cPos(btn_s_x,btn_s_y) setTxtBC(txtbgcolor) wColor(btn_scan,colors.white) cPos(btn_u_x,btn_u_y) setTxtBC(txtbgcolor) wColor(btn_update,colors.white) local timer1 = nil while true do local event,but,cx,cy = os.pullEvent() if event == "mouse_click" then if cx >= btn_s_x and cx <= btn_s_x + btn_scan:len() and cy == btn_s_y then if v then clearScreen() vFullScan() setLineBg(1,colors.gray) cPos(1,1) wColor("[Close] J-Os Antivirus-0.1-DEV",colors.white) setLineBg(2,colors.gray) cPos(1,2) timer1 = os.startTimer(10) else clearScreen() fFullScan() setLineBg(1,colors.gray) cPos(1,1) wColor("[Close] J-Os Antivirus-0.1-DEV",colors.white) setLineBg(2,colors.gray) cPos(1,2) timer1 = os.startTimer(10) end elseif cx >= btn_u_x and cx <= btn_u_x + btn_update:len() and cy == btn_u_y then if update() then cPos(1,3) setLineBg(3,colors.gray) cPos(1,3) wColor("System updated, Restarting in 5 seconds",colors.white) os.sleep(5) setTxtBC(colors.black) setTxtC(colors.white) clearScreen() break else cPos(1,3) setLineBg(3,colors.gray) cPos(1,3) wColor("Error updating! (Is there wifi?)",colors.white) end elseif cx >= 1 and cx <= 7 and cy == 1 then setTxtBC(colors.black) setTxtC(colors.white) clearScreen() break end elseif event == "timer" and but == timer1 then gui(v) break end end end --Set Variables vDefs = getDefs() --Get the definitons if vDefs == false then printError("Error grabbing definitions! Reverting to old defs.") oldDefs = true if oldDefs then print("Grabbing Old Virus Definitions...") fDef = readFile(".fdef") fDef_hash = readFile(".fdef_hash") if fDef == false then printError("Error opening Virus Definitions file! (Is it up to date?)") else if fDef_hash == false then printError("Fatal Error! Cannot read hash! Aborting!") fDef = false else if fDef_hash == hash(fDef) then fDef = textutils.unserialise(fDef) else printError("Fatal Error! Hash is invalid! Aborting!") fDef = false end end end end if fDef ~= false then --Run antivirus with fDef as definitions gui(false) end else writeFile(".fdef",textutils.serialise(vDefs)) writeFile(".fdef_hash",hash(textutils.serialise(vDefs))) --Run antivirus with vDef as definitions gui(true) end