Foro de elhacker.net

Programación => Java => Mensaje iniciado por: klaine en 23 Mayo 2011, 06:25 am



Título: [JARs] Como modificar un archivo que esté en un mismo jar?
Publicado por: klaine en 23 Mayo 2011, 06:25 am
Buenas, tengo el siguiente problema con los archivos.jar

¿Como podría modificar los archivos que están compresos en el mismo jar con una aplicacion en java?

Por ejemplo, tengo mi archivo.class en una carpeta, en esa misma carpeta tengo una carpeta con archivos *.txt y la carpeta con el manifest, ok si compilo y ejecuto a nivel de linea de comandos puedo modificar el contenido de cualquier archivo.txt que esté en dicha carpeta, ahora bien, si comprimo y ejecuto el ejecutable.jar al tratar de trabajar con el directorio actual me toma el directorio donde está el .jar y no el directorio que está dentro del .jar, entonces mi duda es: ¿se puede trabajar con los archivos que están compresos dentro del .jar? ¿como?

No quisiera llegar a tener que depender de archivos externos  :-\

De antemano, gracias  :D

Saludos  ;)


Título: Re: [JARs] Como modificar un archivo que esté en un mismo jar?
Publicado por: 1mpuls0 en 23 Mayo 2011, 20:49 pm
Hola

Interesante tema.

No sé muy bien que intentas hacer como para querer modificar el .txt

Hasta donde sé no se puede de una forma tan fácil.

Investiga sobre la clase ZipFile tal vez contenga algún método que pueda ayudarte, ya que el jar es como un .zip.

Si no, la única solución es hacer lo que tenga que hacer tu aplicación y al momento de querer modificar el .txt crear una copia del jar,extraer el contenido, modificar el .txt, terminar la aplicación, volver a crear el jar, renombrarlo e iniciar de nuevo la aplicación.

Explica mejor que es lo que intentas hacer y a ver si encontramos una mejor solución.

Saludos.



Título: Re: [JARs] Como modificar un archivo que esté en un mismo jar?
Publicado por: klaine en 28 Mayo 2011, 08:44 am
Intentaba hacer un programa que me logeara en paginas, resolví hacerlo de la siguiente forma:

> Un método que escribe archivos, lo uso para escribir un vbs que envíe pulsaciones de teclas, como no supe llamar al vbs desde java resolvi usar este mismo metodo para escribir un bat que llame al vbs y le pase los argumentos con cscript

> Un metodo que reciba los argumentos necesarios para escribir el bat y que llame al vbs

> Esop, el resto lo hace el vbs, luego de abrir el navegador con la url especificada, muestra un msgbox y cuando se le da aceptar espera tres segundos y envía las pulsaciones de teclas.

Dejo el code de los métodos que uso, dejaría el code completo pero la gui la hice en netbeans, ya no me da el ánimo para codear en bloc de notas Xd

para escribir un archivo:

Código
  1. void writer(String[] args, String file, boolean rewrite, boolean delete_on_exit){
  2.  
  3.        /**
  4.          *
  5.          * El primer argumento indica
  6.          * las palabras que se agregaran al archivo de
  7.          * texto plano.
  8.          *
  9.          * El segundo argumento indica la ruta de
  10.          * dicho archivo.
  11.          *
  12.          * Si el tercer argumento
  13.          * es true el archivo
  14.          * se sobreescribe
  15.          *
  16.          * Si el cuarto argumento es true
  17.          * el archivo se borra al cerrar
  18.          * el programa
  19.          *
  20.          *
  21.          */
  22.  
  23.    String[] in=this.reader(file).split("\n");
  24.  
  25.    Writer w=new Writer(file, delete_on_exit);
  26.  
  27.    if(rewrite){
  28.  
  29.        w.touch();
  30.  
  31.    }else{
  32.  
  33.    for(String val:in){
  34.  
  35.        w.write(val);
  36.  
  37.    }
  38.  
  39.    }
  40.  
  41.    for(String val:args){
  42.  
  43.        w.write(val);
  44.  
  45.    }
  46.  
  47.    w.close();
  48.  
  49.    }
  50.  
  51.  

Y la clase writer:

Código
  1. class Writer {
  2.  
  3.    java.io.BufferedWriter bw;
  4.  
  5.    String file="";
  6.  
  7.    Writer(String foo, boolean delete){
  8.  
  9.        this.file=foo;
  10.  
  11.        try{
  12.  
  13.            File f = new File(this.file);
  14.  
  15.            if(delete){
  16.  
  17.            f.deleteOnExit();
  18.  
  19.            }
  20.  
  21.            bw=new BufferedWriter(new FileWriter(f));
  22.  
  23.        }catch(IOException ex){
  24.  
  25.        }
  26.    }
  27.  
  28.    public void write(String line){
  29.  
  30.        try{
  31.  
  32.        bw.append(line);
  33.  
  34.        bw.newLine();
  35.  
  36.        }catch (IOException ex) {
  37.  
  38.            ex.printStackTrace();
  39.  
  40.        }
  41.  
  42.        }
  43.  
  44.  
  45.  
  46.    public void touch(){
  47.  
  48.  
  49.  
  50.        File f = new File(this.file);
  51.  
  52.        try{
  53.  
  54.            if(f.exists()){
  55.            f.delete();
  56.            f.createNewFile();
  57.            }else{
  58.            f.createNewFile();
  59.            }
  60.  
  61.        }catch(IOException c){
  62.  
  63.        }
  64.  
  65.    }
  66.  
  67.    public void touch(String foo){
  68.  
  69.        try{
  70.  
  71.            File fi= new File(foo);
  72.  
  73.            if(fi.exists()){
  74.  
  75.                fi.delete();
  76.                fi.createNewFile();
  77.  
  78.            }else{
  79.  
  80.                fi.createNewFile();
  81.  
  82.            }
  83.  
  84.        }catch(IOException c){
  85.  
  86.        }
  87.  
  88.    }
  89.  
  90. public void close(){
  91.  
  92.    try{
  93.  
  94.        this.bw.close();
  95.  
  96.    }catch(IOException ex){
  97.  
  98.    }
  99.  
  100. }
  101.  
  102. }
  103.  

El vbs, este no cambia

Código
  1.  
  2. set wss=createobject("wscript.shell")
  3. dim com
  4. com=""""
  5. wss.run("cmd /c start " + com + com + " " + wscript.arguments(0))
  6. msgbox "pulsa aceptar para logear"
  7. wscript.sleep 3000
  8. wss.sendkeys wscript.arguments(1)
  9. wscript.sleep 200
  10. wss.sendkeys "{tab}"
  11. wscript.sleep 200
  12. wss.sendkeys wscript.arguments(2)
  13.  
  14.  
  15.  

El bat, este se escribe con el método writer de java:

Código
  1.  
  2. @echo off
  3. cscript /nologo "C:\Users\Zero\desktop\temp.vbs" "http://foro.elhacker.net/login.html" "user" "pass"
  4.  
  5.  
  6.  

El metodo que llama al writer y escribe el bat (no recuerdo si fue este es que lo hice varias veces)

Código
  1.  
  2. public void cscript(String[] args, String vbs) {
  3.  
  4.        String temp = "";
  5.  
  6.        if (new File(System.getProperty("user.home") + "\\desktop").isDirectory()) {
  7.  
  8.            temp = System.getProperty("user.home") + "\\desktop\\temp.bat";
  9.  
  10.        } else if (new File(System.getProperty("user.home") + "\\escritorio").isDirectory()) {
  11.  
  12.            temp = System.getProperty("user.home") + "\\escritorio\\temp.bat";
  13.  
  14.        } else {
  15.  
  16.            temp = JOptionPane.showInputDialog("Dame el path de tu escritorio");
  17.  
  18.        }
  19.  
  20.        String args2 = "";
  21.  
  22.        for (String val : args) {
  23.  
  24.            args2 += " " + "\"" + val + "\"";
  25.  
  26.        }
  27.  
  28.        String com = "\"";
  29.  
  30.        String[] bat = {"@echo off", "cscript /nologo " + com + vbs + com + args2};
  31.  
  32.        this.writer(bat, temp, true, true);
  33.  
  34.        try {
  35.  
  36.            Runtime.getRuntime().exec("cmd /c " + temp);
  37.  
  38.        } catch (IOException ex) {
  39.        }
  40.  
  41.  
  42.  
  43.    }
  44.  
  45.  

Y bueno, el programa me salió, pero dependo mucho de estos archivos temporales, si hay otra solución sería genial, desde ya gracias por leer este tema.

Saludos  ;)


Título: Re: [JARs] Como modificar un archivo que esté en un mismo jar?
Publicado por: kiriost en 28 Mayo 2011, 22:22 pm
Amigo si deseas enviar pulsaciones de tecla usa la clase Robot que trae Java, en vez de hacer tanto lío.  ::)

Acá te dejo un ejemplo de la utilización de la clase Robot:
Código
  1. import java.awt.Robot;
  2. import java.awt.event.*;
  3.  
  4. public class Main {
  5.    public static void main(String args[]) {
  6.        Robot bot = new Robot();
  7.        bot.keyPress(KeyEvent.VK_Q); //Presiona Q
  8.    }
  9. }
  10.  

Espero que te sirva. Y si quieres crear un bot que te registre en diferentes páginas te recomendaría informarte sobre los comandos HTTP (GET y POST) y crear un bot mediante sockets (yo ya tengo el mío)


Título: Re: [JARs] Como modificar un archivo que esté en un mismo jar?
Publicado por: klaine en 28 Mayo 2011, 23:15 pm
Sry me faltó decir que la razón por la que quiero modificar un archivo dentro de un jar es porque este programa escribe mis direcciones en archivo de texto plano, el contenido es como sigue:

url#user#pass

Entonces después lo lee con un buffereredreader y lo divide con String.split("#")
Con eso creo los archivos ya mencionados, investigaré sobre la clase robot, no la conocía, gracias, pero ahora lo que necesito es eso de modificar el txt que esté dentro del jar (si hay otra opcion, bienvenida sea).

Saludos y gracias por vuestra ayuda  ;)