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 - Ferсhu

#1
Java / Reemplazar en cadena [J2ME]
17 Agosto 2008, 22:38 PM
Alguien sabe una forma facil para reemplazar un caracter de un string en el entorno j2me.

Reemplazarlo por el numero de posicion, Cadena.replace() no me sirve.

hay q converitr a array? :s
#2
Buenas, Alguien sabe si se puede instalar los bloques de comandos AT faltantes en un celular? si hay alguna forma, este solo tiene los basicos.
#3
Abril Negro 2008: Taller de Formato PE by Ferchu




Este taller se tratara el Formato PE en archivos ejecutables, solo se tocaran los conceptos importantes, tratando de que se entiendan los conceptos mas fundamentalos que abarcan a los archivos con este formato. Voy a tratar de usar un lenguaje para que todos entiendan, pero cuando sea necesario, y a medida que el taller avance, se va recurrir a un lenguaje mas tecnico.

Antes de empezar, voy a mencionar algunas convenciones (con las cuales me explico) y conceptos minimos sobre la memoria que se deberian manejar para entender lo que luego se expone.

A lo largo de este texto, todos los numeros que comienzen con 0x... son numero en base hexadecimal y deben ser interpretados como tales.

Cuando hablamos de memoria virtual, nos referimos al bloque de memoria que nos asigna el Sistema Operativo en la Ram para trabajar con nuestro programa. La direccion virtual no hace referencia a la direccion real de la memoria ram, solo a un bloque que el programa esta usando de ella. En win32 los programas pueden manejar direcciones de memoria de 0 a 232, esto NO quiere decir que en memoria se cargue 4 gb, solo que el programa puede manejar direcciones de ese tamaño (0x00000000 - 0xFFFFFFFF).

Cuando hablamos de direcciones, no siempre nos estamos refiriendo a la memoria, sino tambien a  la posicion de los datos en el archivo.

Para pasar en limpio, cuando hablemos de direcciones en memoria, seran "direcciones virtuales", y cuando hablemos de direcciones en el archivo, seran "direcciones fisicas".


Ahora si, empezemos...


Introduccion


Un archivo ejectuable esta estructurado de la siguiente forma:



Cabecera DOS
Stub Dos
Cabecera PE
Tabla de secciones
1º sección
2º sección
3º sección
Nº sección
Datos extra



  • Cabecera DOS: Es el comienzo del archivo, especifica las caracteristicas necesarias para ejecutar el programa cuando el Sistema Operativo es DOS. De lo contrario salta a la cabecera PE.

  • Stub Dos: Codigo que se ejecuta si el entorno es DOS. Por ej: El tipico cartelito "This program cannot be run in DOS mode"

  • Cabecera PE: Estructura que contiene diversa informacion sobre el archivo ejectuable. (por ahora eso solo decimos.)

  • Tabla de secciones: Como es obvio, contiene el listado de las secciones del ejectuable, mas adelante se explicara su estructura.

  • Los datos extra, serian aquellos que no esten contemplados por la estructura del ejectuable, es decir, no pertenescan a ninguna sección. Para que entiendan mejor, por ej: como muchos servers de troyanos que utilizan el final del archivo para guardar la configuracion del mismo. Estos solo son apilados al final y quien entiende la estructura de esos datos es el programa.


    Bueno la Cabecera DOS y el Stub Dos, no nos interesan mucho a nosotros. Lo que si realmente importa es la Cabecera PE, pero....donde encuentra la cabecera PE en un ejecutable?? Esta siempre en un mismo lugar??. La respuesta es NO, puede estar en cualquier posicion. Para saber donde esta, hay que ir al offset PE que esta e_lfanew (miembro de la cabecera DOS) que es la pos 0x3c del archivo, ahi se encuentra un entero (4 bytes) que dice la direccion fisica donde comienza la cabecera PE.

    A continuacion se describe, Los miembros mas importantes del estructura PE.

    Los primeros 2 bytes de la cabecera, corresponden a las letras "PE", asi a simple vista, con un editor hexadecimal, mirando el offset PE y yendo a la posicion, rapidamente encontramos el comienzo de la cabecera.

    Machine (offset + 0x04)

    Corresponde a la arquitectura para la cual esta "preparado" el archivo. Esto se indica por medio de Flags por lo cual con un editor solo veremos numeros, pero con un debugger como olly u otros programas podemos ver a cual arquitectura corresponde el valor (o buscando en la msdn), igual esto no es muy importante para nosotros.

    NumberOfSections (offset + 0x06)

    En este WORD (2 bytes) se indica la cantidad de secciones que contiene el archivo, En el caso de que agreguemos una sección este sera uno de los tantos valores a modificar.

    SizeOfOptionalHeader (offset + 0x14)

    Es un WORD (2 bytes) que nos dice el tamaño de la cabecera opcional, en la mayoria de los archivos esta cabecera existe, y aca esta

    Characteristics (offset + 0x16)

    Contiene informacion sobre las caracteristicas de la imagen (si es ejecutable, si es 32 bits, etc). No es muy importante para nosotros, asi que solo lo mencionamos.

    SizeOfCode (offset + 0x1C)

    Es un entero (4 bytes) que contiene la suma de los tamaños de todas las secciones de "codigo".

    SizeOfInitializedData (offset + 0x20)

    Es un entero (4 bytes) que contiene la suma de los tamaños de todas las secciones de que tiene datos inicializados.

    SizeOfUninitializedData (offset + 0x24)

    Es un entero (4 bytes) que contiene la suma de los tamaños de todas las secciones de que tiene datos NO inicializados.

    AddressOfEntryPoint (offset + 0x28)

    Es un entero (4 bytes) que contiene el offset virtual donde comienza a ejecutar codigo. La direccion virtual seria este OEP + ImageBase.

    BaseOfCode (offset + 0x2C)

    Es un entero (4 bytes) que contiene el offset virtual donde se va a alojar la sección de codigo. Para tener la direccion virtual hay que sumarle la ImageBase.

    BaseOfData (offset + 0x30)

    Es un entero (4 bytes) que contiene el offset virtual donde se va a alojar la sección de datos. Para tener la direccion virtual hay que sumarle la ImageBase.

    ImageBase (offset + 0x34)

    Esta es la ImageBase de la que hablabamos en los 3 Itemos anteriores, Es un entero que contiene la direccion Virtual sobre la cual se va a cargar las secciones en memoria.
    Por eso de dice que es la Base, por que todos los offset estan haciendo referencia a una direccion  virtual empezando desde esa posicion.

    SectionAlignment (offset + 0x38)

    Al alojar memoria, se hace con un criterio, se reserva memoria de a "bloques", estos bloques deben ser multipos de este valor, generalmente es 0x1000. En pocas palabras cuando se reserva memoria se lo hace de a bloques de 0x1000 bytes. No importa si a la sección a cargar le va a sobrar espacio, se redonde a ese numero, siempre para arriba claro.

    FileAlignment (offset + 0x3C)

    Igual que el Item anterior, solo que aca se habla sobre los bloques en el archivo, los datos estan agrupados por bloques de un tamaño "FileAlignment", y al cargarlos en memoria el SO respeta esta alineacion. Esto es muy importante a considerar cuando vamos a agregar una nueva sección, de tener en cuenta de que nuestros datos esten alineados en el archivo, de lo contrario no se van a cargar Correctamente en memoria.
    A modo comentario, si lo prueban veran que carga en la memoria datos anteriores al comienzo de dicha sección.

    SizeOfImage (offset + 0x50)

    Es un entero (4 bytes) que nos dice el tamaño de memoria virtual total que utiliza el archivo para luego volcar las secciones, es decir, la cantidad de memoria virtual que utilizara el archivo. Es otro de los valores que vamos a modificar al agregunar una sección.

    NumberOfRvaAndSizes (offset + 0x74)

    Contiene el numero de "bloques de tablas" que hay en la cabecera opcional.

    El segundo "bloque" contiene informacion sobre donde se aloja en memoria virtual la Import Table, y el tamaño de ella. Es el unico que nos importa por ahora.
    Este Bloque, si existe, esta en el offset 0x80 de la cabecera. Digo si existe por que si NumberOfRvaAndSizes es 0, ese "bloque" no queda definido.

    Al final de estos bloques, comienza a especificarse las secciones mediante una estructura de datos (IMAGE_SECTION_HEADER) que tiene un tamaño de 0x28 bytes, al final de esta comienza la proxima y asi hasta la ultima.

    Con un editor hexadecimal se ven facilmente el nombre de la sección, x ej: ".text", ".data", ".rcsc",  "idata", etc.

    A continuacion se describen los miembros mas importantes de la estructura (IMAGE_SECTION_HEADER)

    Ahora el offset es diferente al anterior, este corresponde a la direccion donde comienza la estructura que define a la sección.

    Name (offset + 0x00) (8 bytes)

    Nombre corto de la sección, por ej ".code", ".data", el nombre es solo para identificar a la sección, no describre si esta es de codigo, de datos, etc, eso lo hace el miembro Characteristics de la estructura. (ver mas abajo).

    VirtualSize (offset + 0x08) (4 bytes)

    Es el tamaño del bloque de la memoria virtual donde se cargara la sección. Es decir se reserva un bloque de memoria de este tamaño, la direccion donde se lo reserva lo dice el siguiente miembro. El valor es siempre mayor o igual a el de SizeOfRawData.

    VirtualAddress (offset + 0x0C) (4 bytes)

    Es la direccion virtual que se reserva para cargar la sección.

    SizeOfRawData (offset + 0x10) (4 bytes)

    Tamaño que ocupa la sección en el archivo.

    PointerToRawData (offset + 0x14) (4 bytes)

    Direccion fisica que indica donde comienzan el contenido de la sección EN el archivo. Recordar que esta direccion debe ser multiplo de FileAlignment, que generalmente es 0x200.

    Characteristics (offset + 0x24) (4 bytes)

    En este miembro se indican las caracteristicas de la sección mediante flags. Si en la sección esta PERMITIDO escribir, leer, executar, si la sección ES de codigo, datos inicializados, datos no inicializados, etc.
    Para saber que corresponde a cada flag, lo mejor es mirar la msdn, no tiene mucho sentido explicar que es esto.

    http://msdn2.microsoft.com/en-us/library/ms680341.aspx


    A continuacion, para que se entienda donde esta hubicado cada miembro, vemos de 2 modos diferentes, al notepad.exe, la primera con un editor hexadecimal, para apreciar mejor los valores y ver como se almazenan, y luego con un debugger, para ver mas organizada la estructura dividida por miembros, ya que el debugger reconocer cada uno, y nos indica cuales son. De esta manera podran comparar e ir familiarizando con la ubicacion de los datos que luego vamos a modificar.




    En la cabecera DOS, lo unico que nos interesa conocer es la posicion donde empieza la cabecera PE. Asi que en el olly seria esto:




    La Cabecera PE:




    La lista de Secciones:













    Capitulo II: Agregando una sección, sin morir en el intento.
    (17/04/08)



    Como dice el titulo, en este capitulo vamos a agregar una sección, hacer esto no es muy dificil cuando se lo sabe hacer, pero para uno que empieza hay que tener cuidado, asi que vamos a ver en la practica que hay muchas formas de terminar en un error, y que el programa se cierre quedandonos sin entender el porque.

    Esto es debido a que el Sistema Operativo, "valida" la cabecera PE, y sus secciones, es decir que cualquier descuido que tengamos al agregar la sección se reflejara en un error en la ejecucion del archivo.

    Bueno para empezar vamos a agregar una sección de datos, esto es algo sin sentido, no tiene mucha utilidad, pero nos sirve para practicar como agregar la sección correctamente, sin tener errores en la "validacion".

    Los pasos a seguir serian:

    1) Analizar y Calcular los valores para la nueva sección (VirtualAddress, VirtualSize, PointerToRawData,SizeOfRawData, Characteristics).

    2) Agregar al final de la lista de secciones la nueva sección.

    3) Modificar los valores en la cabecera PE para que admita la nueva sección.

    4) Agregar la sección donde acordamos que va a estar ubicada.

    Bueno empezemos analizando que valores irian para cada uno.

    PointerToRawData que era??, donde comienza la sección en el archivo. Y donde la vamos a poner?? en donde tengamos lugar libre, y para no complicar las cosas, eso es al final del archivo. Entonces el valor va coincidir con el tamaño del archivo.

    SizeOfRawData, Esto sera el tamaño de los datos que va a contener la sección, hasta ahora no especifique que datos eran, pero para hacer las cosas simples vamos a poner una frase de 0x50 bytes de longuitud.

    VirtualAddress, este seria el offset en memoria virtual donde se carga la sección, para saber que valor poner, tenemos q saber que valores hay libres, ya que si ponemos un valor cualquiera x ej 0x3000 este puede coincidir con el de otra sección, y eso provocaria un error al cargarse el archivo. Para hacerlo prollijo, hallamos el valor de la siguiente direccion virtual disponible, esto se puede hacer de 2 maneras.

    Hallar la sección que tiene la VirtualAddress mas grande, sumarle su VirtualSize y redondear al multiplo de SectionAlignment (0x1000).

    La otra forma, seria mirar SizeOfImage, y redondear al multiplo de SectionAlignment (que comunmente es 0x1000).

    VirtualSize era el tamaño en memoria que ocupa la sección, como restriccion tenemos que debe ser mayor o igual que SizeOfRawData, osea que como valor podemos poner el tamaño, asi que nos queda 0x50.

    Ahora vamos a aplicar todo lo dicho al archivo notepad.exe.

    Definimos una frase aleatoria para usar como dato para el ejemplo:

    "Hola yo soy la sección de prueba, y ocupo exactamente la cantidad de 0x50 bytes." (realmente ocupa eso la frase jeje)

    El tamaño del notepad.exe, al menos en mi xp, es de 0x11200 bytes (70.144), en esa posicion vamos a poner nuestra frase.

    Y el valor de SizeOfImage es de 0x14000, como ya esta redondeado, usamos este.

    En Characteristics vamos a definir la sección como de datos inicializados, y solo de lectura.

    Entonces los datos quedarian asi:

    Name: ".Ferchu" (yo pongo este, ustedes el nombre que quieran no mas grande que 8 )
    PointerToRawData: 0x11200
    SizeOfRawData: 0x50
    VirtualAddress: 0x14000
    VirtualSize : 0x50
    Characteristics : 0x40000040 (Ver msdn)


    Luego agarramos el editor hexa, abrimos el notepad.exe vamos hasta donde esta la ultima sección, mui contento a agregar nuestra sección a la lista, pero al ubicar la posicion donde iria, nos encontramos con que ahi hay datos, usara esos datos el programa o sera basura??. Entonces abrimos el notepad con el olly, y si revisamos y miramos bien la cabecera PE, vemos que hay una tabla llamada "Bound Import Table" que hace referencia a esa posicion, es decir que al cargarse el archivo el SO va a ir a buscar esa tabla. Pero sera verdad todo esto?, entonces vamos a sacarnos la duda, modificamos alguno de sos valores, guardamos y vemos si pasa algo. Si hacemos todo eso vemos un lindo mensaje de error.

    Como hacemos? que otra posiblidad hay?, una seria mover la tabla hacia otro lugar y modificar el puntero de la cabecera PE hacia la nueva posicion, asi tenemos lugar para añadir nuestros datos, pero como el archivo es de windows, ni en **** vamos a encontrar un espacio vacio disponible para copiar esa tabla. Luego pensamos, sera importante esa tabla?? ya probamos que si la modificamos tira error, pero y si la desvinculamos, si eliminamos el puntero q hace referencia a ella y hacemos como que no existe, pasara algo?, efectivamente si ponemos el valor de Bound Import Table address en 0, y hacemos lo mismo con el de size, guardamos y probamos el notepad vemos que arranca perfectamente.

    Si no entendieron con exactitud lo que se dijo en los 2 parrafos anteriores, no se preocupen que no es muy importante, solo es para explicar el motivo por el cual se hace eso. En pocas palabras, ponemos en cero el puntero de esa tabla para que el SO piense que no existe, y No la vaya a buscar cuando se ejecuta el archivo, eso nos da la libertad de modificar los datos que antes no se podian sin que ocurra un error, asi que ahora si a agregar la sección a el final de la lista.

    Los datos que vamosa escribir seran estos:




    NombreValorTamaño
    Name:.Ferchu(8 bytes)
    VirtualSize: 0x00000050 (4 bytes)
    VirtualAddress:0x00014000 (4 bytes)
    SizeOfRawData: 0x00000050(4 bytes)
    PointerToRawData:0x00011200(4 bytes)
    PointerToRelocations:No interesa, todo a cero.(4 bytes)
    PointerToLinenumbers:No interesa, todo a cero.(4 bytes)
    NumberOfRelocations:No interesa, todo a cero.(2 bytes)
    NumberOfLinenumbers:No interesa, todo a cero.(2 bytes)
    Characteristics:0x40000040 (Ver msdn)(4 bytes)


    Esta vez si los datos estan en orden de aparicion, asi que solo hay que tener en cuenta al escribirlos, que van al revez (de atras hacia adelante), como se muestra en la foto.

    La ultima sección termina en 0x24f, asi que la nuestra se empieza a definir en la posicion 0x250 del archivo, como se ve en la foto.




    Lo de azul es lo modificado.


    Luego sigue modificar los valores en la cabecera PE. Se puede  lograr que se cargue la sección solo modificando 2, el de NumberOfSections, y SizeOfImage. El primero, como seguramente piensan, se incrementa en 1. y al segundo se le suma el tamaño virtual de la nueva sección.

    NumberOfSections: 0x0003  ----->   0x0004
    SizeOfImage: 0x00014000   ----->   0x00014050

    Bound Import Table address: 0x250 ----->   0x0
    Bound Import Table size: 0xD0        ----->   0x0

    Los valores de "Bound Import Table" lo modificamos por lo dicho anteriormente, estan ubicados en el archivo en el offset PE + 0xD0 y offset PE + 0xD4, Los ponemos a 0 y listo.

    SizeOfData no la incluimos por que no es necesario modificarla, pero seguro que si no la modificamos, la suma de las secciones de datos inicializados es diferente a el valor de esta, y puede que un AV detecte que nuestra sección fue agregada a mano por no coincidir los valores, pero para nostros eso nos interesa.

    Supuestamente conocen ya la posicion donde se encuentran esos valores, asi q solo hay q cambinar 2 numer con el editor hexa. Y quedaria asi:




    Y finalmente agregamos nuestra frase "Hola yo soy la sección de prueba, y ocupo exactamente la cantidad de 0x50 bytes." al final del archivo, como los datos de la nueva sección.




    Y listo.


    Ahora solo queda ver si hicimos las cosas bien, para eso usamos el olly y abrimos el notepad.exe (o el nombre que usaron) que acabamos de modificar. Si al abrirlo nos sale algun cartelito de de error, de seguro algun valor pusimos mal, en caso de que no haya ninguna advertencia procedemos a ver si la sección fue cargada en memoria, para eso apretamos en la M que esta en la barra y buscamos la sección por el nombre que le dimos, si la encontramos hacemos 2 click y deberia aparecer los datos de la sección, osea la frase.

    A mi me queda algo asi:




    Y eso es todo, logramos que cargue la sección correctamente. Como se dijo al principio esto es de practica, agregar solo la sección asi no tiene mucha utilidad, en el proximo capitulo se hara algo mas funcional pero ya no se explicara tan detalladamente, por eso es que ahora se explica bien para que no se pierdan, luego iremos mas rapido.


    Fin del segundo capitulo.






    Nota: no pregunten cosas como x ej, como manejar un editor hexa, en el post, para eso abran un tema aparte asi no mesclamos las cosas.







    Capitulo III: Agregando una sección con codigo.
    23/04/08



    En este capitulo vamos a hacer una infeccion simple solo para demostrar el concepto, si bien se puede infectar un ejecutable con codigo sobre una sección ya existente, nosotros lo vamos a hacer en una sección nueva, para utilizar lo aprendio hasta ahora.

    La infeccion mas simple que se puede hacer, es que el programa antes de ejecutarce normalmente muestre un cuadro de mensaje (MessageBox), con algun texto de alerta que nosotros elijamos, esto no afectara en nada al funcionamiento del programa, tampoco es nada maligno, ya que esas cosas no se tocaran en este taller.

    Se supone que ya conocen como agregar una sección, asi que no vamos a perder mucho tiempo en eso, solo se explicara detalladamente las cosas nuevas.

    El metodo para agregar la sección es igual que en el capitulo anterior, pero con la diferencia que ahora en vez de desvincular la "Bound Import Table", lo que vamos a hacer es un truquito que consiste en bajar la cabecera PE 0x28 bytes, para tener lugar para definir nuestra sección sin pisar la tabla. Al bajar la cabecera pisamos datos que no son importantes. Luego solo modificamos en offset PE, y listo, agregamos la sección sin desvincular la tabla.

    Los datos a modificar en la cabecera entonces son:




    NombreValorTamaño
    offset PE:0xE0 - 0x28 = 0xB8(4 bytes)
    NumberOfSections: 0x0004 (+1) (2 bytes)
    AddressOfEntryPoint:0x00014031 (4 bytes)
    SizeOfImagebase:0x00014050 (4 bytes)



    Como notaran, ahora modificamos el OEP, con el de nuestro codigo (como ya tengo el codigo echo ya se que empiza en esa dire), y debemos anotar el OEP original del programa para hacer un salto luego de que nuestro codigo finalize, para que comienze el programa normalmente.

    sección nueva:



    NombreValorTamaño
    Name:.Nueva(8 bytes)
    VirtualSize: 0x00000050 (4 bytes)
    VirtualAddress:0x00014000 (4 bytes)
    SizeOfRawData: 0x00000050(4 bytes)
    PointerToRawData:0x00011200(4 bytes)
    PointerToRelocations:No interesa, todo a cero.(4 bytes)
    PointerToLinenumbers:No interesa, todo a cero.(4 bytes)
    NumberOfRelocations:No interesa, todo a cero.(2 bytes)
    NumberOfLinenumbers:No interesa, todo a cero.(2 bytes)
    Characteristics:0x60000020 (Ver msdn)(4 bytes)



    Y como una Imagen vale mas que mil palabras...




    Se puede apreciar en la comparacion la cabecera PE desplazada 0x28 bytes hacia abajo (considerese abajo, como desplazamiento hacia menor direccion que la actual), y se ve la "Bound Import Table" intacta (la que en el otro capitulo eliminamos/sobreescribimos).

    Ahora necesitamos crear el codigo que se va a ejecutar en la nueva sección, para hacerlo simple vamos a utilizar la direccion harcoded, de la funcion MessageBoxA. No les voy a enseñar como crear un codigo ni nada por el estilo ya que eso no se relaciona con el taller, hay muchas formas de crear un codigo en asm portable, sin basarse en direcciones hardcoded, pero para hacer algo bien simple y ya que no necesitamos portabilidad, utilizamos la direccion de la funcion.

    Entonces este sera el codigo en asm que ira en la sección nueva, es bastante simple, para que lo pueda entender cualquiera, por desgracia yo solo aprendi a usar el registro "eax", jajaj, asi que solo use ese.

    codigo                                OPcodes

    Cadena titulo                         "Soy el notepad y estoy infectado!!!\0"
    Cadena msg                            "Infectado!!!\0"
    call [siguiente instruccion]          E8 00 00 00 00
    pop eax                               58
    push 0                                6A 00
    sub eax, 0x12                         2C 12
    push eax                              50
    sub eax, 0x24                         2C 24
    push eax                              50
    push 0                                6A 00
    mov eax, 0x77D5050B                   B8 0B 05 D5 77       // B8 + direccion de MessageBoxA
    call eax                              FF D0
    mov eax, 0x010739D                    B8 9D 73 00 01       // B8 + entry point
    jmp eax                               FF E0




    El codigo empieza con las cadenas de texto para el titulo y el mensaje, luego viene un call a la siguiente instruccion, es un pequeño truquito, la instruccion call antes de ir a la subrutina mete la direccion de su siguiente instruccion en la pila y luego salta hacia la direccion, pero en este caso la utilizamos para obtener una referencia sobre que direccion estamos parados, asi luego poder obtener la direccion de las cadenas de texto.
    Luego se meten a la pila los argumentos para el messagebox, se guarda la direccion de la funcion en eax, y se llama a la funcion, despues se guarda en entry point en eax, para saltar hacia alli y que comienze el programa como si nada hubiera pasado.

    Para los que se estan preguntando por q no hice jmp [direccion] directamente, bueno la respuesta es simple, tanto los jmps como los calls tiene en los opcodes la distancia entre la direccion de la instruccion y la direccion a saltar, y para no estar haciendo cuentas, es mas facil asi, ademas de que necesitamos la direccion de esa instruccion. Y sino, creanme que es mas facil asi jeje.

    Nota: La direccion de MessageBoxA esta harcoded, asi que deberan buscar la que corresponde a su windows, puede que coincida, como que no. pero lo mejor es verificarlo.

    Ahora escribimos esos opcodes al final del archivo, y nos queda algo asi:





    Y listo, ya tenemos nuestro notepad infectado. Lo ejectuamos, vemos nuestro mensajito, le damos aceptar y luego se ejecutara todo normalmente.


    No me responsabilizo de sus acciones, ni de la forma que utilizan lo aprendido en este taller.





    Por desgracia el ancho de banda del hosting se exedio asi que tuve que subir las fotos a un hosting de imagenes, y la calidad bajo, asi que se ven mal. Para el que quiera ver las fotos originales, estan aca:

    http://usuarios.lycos.es/lawebdeferchu/fotos/tallerPE/
    http://www.geocities.com/lawebdeferchu/fotos/tallerPE/


#4
Abril negro / GeMaCrypter Version 1.1 Beta
28 Marzo 2008, 00:40 AM
Ya se que movieron el post a el hilo de contribucciones q esta pegado, pero abro este hilo aparte para las problemas, dudas, comentarios y/o sugerencias, ya que en el otro hilo no se permiten.


http://foro.elhacker.net/index.php/topic,146962.msg978629.html#msg978629

CitarHola, les presento a GeMaCrypter, por ahora en la version beta, quizas mas adelante este la version final.

   
  • cifra todas las secciones de un ejecutable.
       
  • Borra la IT original y carga la IAT en tiempo de ejecucion.
       
  • Agrega una nueva sección con el codigo del crypter.


    Hay que aclarar que los datos que no esten definidos como sección no se va a cifrar.

    Como es la version beta, algunos archivos quedan corruptos despues de encriptarlos, ya sea por q ya estan empacados, o por que el programa utiliza datos que hay luego de la ultima sección en el header, o etc.
Descargar GeMaCrypter
http://lawebdeferchu.hyperphp.com/programas/downloads.php?nombre=GeMaCrypter

GeMaCrypter V1.1
http://lawebdeferchu.hyperphp.com/programas/downloads.php?nombre=GeMaCrypterV1.1

Saludos!!
#5
Hola, tengo algunas sugerencias, ustedes diran q opinan:

1) Agregar a la barra de botones de la web, entre "ayuda" y  "buscar", El botoncito de reglas q anda dando vuelta por muchas firmas de los mods. Vamos, "homologuemoslo", asi esta a la vista de todos.

2) Crear un subforo para Warzone (separar un tema para cada prueba), Ya que solo tiene un hilo y cada vez se llena mas de paginas, con muchos usuarios preguntando lo mismo, por q a la mayoria le da vagancia leerse las 20 paginas, y a su vez al volver a preguntar agrandan el tema, se desorganiza mas y mas. Cuantas mas paginas, menos leen y mas preguntan,cuanto mas preguntan, mas paginas aparecen y muchisimo menos leen (Se entiende??, espero q si).

3) Estaria bueno algun torneo (como el de criptografia q nunca se termino jaja), ya q ahora veo muchas mas gente merodiando por el foro, seguramente habra muchos interesados. Pero eso depende del tiempo de los mods y demas.

Y.....por ahora nada mas.

Ustedes que opinan??

Saludos!!
#6
ya vi en varios lados y en varias palabras q el corrector cambia cosas q no deberia....

pero lo mas grave es q cambia la direcciones de la web.....

cambia el h a c k e r (todo junto) x elhacquer quedando asi inseribles los links en muchos temas.

Que anda pasando?
#7
PHP / 2 problemas, header y session
26 Diciembre 2007, 22:28 PM
Bueno tengo 2 problemitas al subir una web q estoy haciendo, lo mas loco es q en mi server apache de mi pc anda todo perfecto.

un problema es q header("location:index.php"); no me redirecciona, ni poniendo la url completa. lei por ahi q para usar eso hay q hacerlo antes de enviar cualkier contenido a la pagina, y probe eso tmb y nada. sigue sin redireccionar. Se redireccionar con html y js pero quiero hacerlo en php, es mas rapido y en mi pc funciona mui bien.

segundo problema, no me loguea las sessiones, en mi pc funciona bien, pero ahi las variables parecerian q se borran a la segunda vez de actualizar la pagina, lo mas loco q al principio andaba y dejo de andar misteriosamente.

El codigo no lo pongo ya q es algo largo. En el server local no tengo estos problemas, es raro  :huh:

Q puede ser??
#8
Se puede empacar una dll por separado, o debe ser empacada desde el un packer como projecto, indicando todos los archivos del programa.

No se si me explico, digamos q tengo programa.exe q usa libreria.dll y libreria2.dll.

Se puede empacar las librerias dll por separado?? y el programa.exe las puede usar normalmente? o se debe emapcar todo junto con un packer.

Es una duda q me surgio.

Edit: ya probe y creo q se puede jeje, pero buen aver q mas pueden aportar.

Saludos!!
#9
Como puedo obtener el texto de esto javascript:alert(document.documentElement.innerHTML), pero de una manera q lo pueda copiar, para dsp pegarlo en el block de notas.

Se me habia ocurrido javascript:void(prompt('',document.documentElement.innerHTML)), pero no es multilinea.  :-(


Alguna idea??


Saludos!!!
#10
Ingeniería Inversa / Apis de visual basic
8 Octubre 2007, 05:06 AM
Bueno la idea es poner una lista de las funciones de la libreria q usa visual basic al ejecutar un programa, por ahora solo pongo esta informacion con una breve descripcion, mas adelante Capas desarrolle un poco mas cada funcion, como x ej donde devuelve los datos, q pasa como argumentos, si pasa direccion de memoria (si es de stack u de otro lado), etc, etc.

Esta parte es copiada, y modificada un poco, de un tuto de Ricardo Narvaja, aprovechando q mencionaba algunas.

Conversion:

__vbaI2Str Convierte una String a  Integer
__vbaI4Str Convierte una String a Long
__vbar4Str Convierte una String a Single
__vbar8Str Convierte una String a Double
VarCyFromStr Convierte String a Currency
VarBstrFromI2 Convierte Integer a String

Datos:

__vbaStrCopy - Copia una String a una posicion de memoria
__vbaVarCopy - Copia una Variable a una posicion de memoria
__vbaVarMove – Mueve una Variable a otra posicion de la memoria
__vbafreevar Libera una Variable que no se utiliza
__vbafreestr – Libera una String
__vbafreeobj – Libera un Objeto

Matematicas:

__vbavaradd – Suma de dos Variables
__vbavarsub – Resta dos Variables
__vbavarmul – Multiplica dos Variables
__vbavaridiv - Divide dos variables dando como resultado un Integer
__vbavarxor – function XOR

Varios:

__vbavarfornext - Verifica si se cumple la condicion para volver a empezar el bucle.
__vbavarforinit - Inicializa la variables para un bucle. El bucle termina con un __vbavarfornext (del mismo nivel), puede estar anidado con otro bucle (Ojo jeje)
multibytetowidechar – Cambia una String a formato ancho
rtcMsgBox – Muestra un message box
__vbaobjset  Activa un Objeto
rtcInputBox – Muestra una Input Box de Visual Basic
__vbaNew – Muestra una caja de dialogo
__vbaNew2 - Muestra una caja de dialogo
__vbaEnd – Finalizacion del Programa
_rtcDir – Busca si existe un archivo
__vbaFileOpen – Abre una archivo

Tratamiento de string:

__vbastrvarval – Toma el valor de una ubicación especifica en una String
rtcTrimBstr – Recorta una String
__vbavarcat – Une dos string, las "pega",
__vbaLenBstr – Obtiene el largo de una string y devuelve en eax su tamaño
__vbaLenVar - Obtiene el largo de una variable
rtcMidCharVar – Toma un determinado carácter de una string para trabajar con el.

Comparaciones:

__vbastrcomp – Compara dos Strins
__vbastrcmp - Compara dos strings
__vbavartsteq - Compara dos variables si son iguales
__vbaFpCmpCy - Compara Floating point con Currency
__vbavartstNe - Compara dos variables si no son iguales


Si alguien kiere decir q funciones les parece importante y deberian estar, puede hacerlo, si kiere ayudar con alguna descripcion y/o profundizando un poco tambien puede hacerlo.
#11
Ingeniería Inversa / CraCKmE - Molesto
4 Octubre 2007, 08:32 AM
Bueno como esta aburrido hice este pekeño crackme aver si alguien consigue un user y un pass, esta facil, pero.....es algo molesto el chico.

CraCKmE - Molesto
http://www.gigasize.com/get.php?d=p8dg3hk0bjb


Saludos!!


#12
Scripting / jerarquia de operadores
2 Octubre 2007, 23:55 PM
alguien sabe la jerarquia de operadors en js, Es decir q operaciones se hacen primeros y cuales le siguen.

ej: reT=!a+b*c^d-e>>f&g/h%i&j|k;

#13
Multimedia / error codec
14 Septiembre 2007, 07:18 AM
Hola, cuando intengo abrir un archivo .avi me dice q necesita codecs, me baja los codecs de wm9 y los instalo pero me dice q no se puede ver el video.

no instale ningun pack ni nada. solo codecs separados

en la info del sistema me dice q esta instalado:

Microsoft Windows Media Video 9 VCM   
C:\WINDOWS\system32\WMV9VCM.DLL   9.0.1.0369   
1,35 MB (1.415.680 Bytes)   

el error es "Se descargó un descompresor para este archivo, pero no funciona. Es posible que necesite reiniciar su explorador. (Error=80040200)

Un error de certificación originó errores en la operación. (Error=80040295)"

Se supone q si lo baja de microsoft no tiene conflictos nose por q no me funciona.

Q puedo haceR?
#14
Holas, esto lo publico aca ya q en el foro de chats ircs no creo q tenga ni idea.

buen el tema es q debido a ciertas circunstancias tengo q modificar el msn para q sea multisesion, pero necesito hacerlo a mano, alguien sabe donde hay q mododificar los datos??


Saludos!!
#15
Holass, les dejo un ejemplo de un programa q hice en estos dias, No uso mucho visual basic pero estaba muy aburrido y empeze a hacer un chat entre un servidor y un cliente para probar y como me gusto como kedo me puse a hacer uno al estilo mensajero, y ahora dicidi ponerlo aca por si a alguien le interesa como ejemplo.

Empeze solo con cosas de winsock y de apokito le agrege mas cositas, Basicamente es un mensajero q se comunica con otro mensajero en otra pc en una lan,  no hay cliente ni servidor, sino q el mismo programa tiene la opcion de "llamar" o "esperar q lo llamen", para eso uso 2 sock diferente asi kedaba mas prolijo. Tiene echo un miniprotocolo para comunicarce:

@#IDPC:datos#Crtl:datos#Nick:datos#Msge:datos#Esti:datos#

Solo lo menciono nada mas por q en el ejemplo solo uso el nick y el mensaje. Despues si lo termino con las fotos y lo demas lo subo, pero por ahora keda asi, sin terminar.

Ademas Guardo la configuracion Actual en un archivo para la proxima vez q se ejecuta. Tambien sirve de ejemplo.

Podria estar 2 horas escribiendo pero ni da, jaja aca esta el codigo.

- Formulario: "Mensajero"
- 5 Botones: Conectar, Desconectar, Esperar conexion, Configuracion, Enviar
- 2 Text Box: Mensaje, Conversacion.
- 2 Winsock: WinSockA, WinsockP
- 1 ComonDialog (no es necesario, es solo para la foto)

Código (vb) [Seleccionar]

'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
'>                                                  <
'>           Ejemplo Creado Por Ferchu              <
'>           f.e.r.c.h.u.s [x] hotmail.com          <
'>               Para elhacker.net                  <
'>                 <~>Ferchu<~>                     <
'>                                                  <
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Private Sub Command1_Click()
Load Configuracion
Configuracion.Show
End Sub

Private Sub Conectar_Click()
WinsockP.Close
WinsockA.Close
Escuchar.Enabled = False
WinsockA.Connect IPDestino, PuertoRemoto

End Sub

Private Sub Desconectar_Click()
WinsockP.Close
WinsockA.Close
Conectar.Enabled = True
Escuchar.Enabled = True

End Sub

Private Sub Enviar_Click()
Dim texto As String, Data As String


If ((WinsockP.State = 7) Or (WinsockA.State = 7)) Then
    texto = Mensaje
    texto = Replace(texto, "#", "&num")
    Data = "@#IDPC:123" + "#Crtl:123" + "#Nick:" + MiNick + "#Msge:" + texto + "#"
    If (WinsockP.State = 7) Then
    WinsockP.SendData Data
    Else
    WinsockA.SendData Data
    End If
    Conversacion = Conversacion + MiNick + " Dice :" + vbCrLf + Mensaje + vbCrLf
    Mensaje = ""
Else
MsgBox "Estas desconectado", vbExclamation + vbOKOnly, "Atencion"

End If
End Sub

Private Sub Escuchar_Click()
WinsockP.Close
WinsockA.Close
Conectar.Enabled = False
WinsockP.Bind PuertoLocal
WinsockP.Listen

End Sub

Private Sub Form_Load()
path = App.path
With Configuracion
IPDestino = .IP
PuertoRemoto = .PuertoR
PuertoLocal = .PuertoL
MiNick = .Nick
End With
flagfoto = False
End Sub

Private Sub Mensaje_KeyPress(KeyAscii As Integer)
If (KeyAscii = 13) Then Enviar_Click
End Sub

Private Sub WinsockA_Connect()
Conversacion = Conversacion + "Iniciando sesion..." + vbCrLf
End Sub

Private Sub WinsockA_Close()
Dim Desconexion As String

If (nickuser = "") Then
Desconexion = "Se perdio la conexion..." + vbCrLf
Else
Desconexion = "El usuario " + nickuser + " se desconecto..." + vbCrLf
End If
Conversacion = Conversacion + Desconexion

End Sub

Private Sub WinsockP_Close()
Dim Desconexion As String

If (nickuser = "") Then
Desconexion = "Se perdio la conexion..."
Else
Desconexion = "El usuario '" + nickuser + "' se desconecto..." + vbCrLf
End If
Conversacion = Conversacion + Desconexion
Desconectar_Click
End Sub

Private Sub WinsockP_ConnectionRequest(ByVal requestID As Long)
If WinsockP.State <> sckClosed Then WinsockP.Close
WinsockP.Accept requestID
Conversacion = Conversacion + "Iniciando sesion..." + vbCrLf

End Sub

Private Sub WinsockP_DataArrival(ByVal bytesTotal As Long)
Dim Data As String
WinsockP.GetData Data
procesar Data

End Sub

Private Sub WinsockA_DataArrival(ByVal bytesTotal As Long)
Dim Data As String
WinsockA.GetData Data
procesar Data
End Sub

Private Sub Form_Unload(Cancel As Integer)
Unload Configuracion
End Sub



-Formulario: "Configuracion"
- 2 Botones: Aceptar, Foto
- 4 Text Box: Nick,IP , PuertoR, PuertoL
- 4 Label

Código (vb) [Seleccionar]


Private Sub Form_Initialize()
Dim exist As String


On Error GoTo fin

exist = Dir$(path + "\" + "Config.Fer")

If (exist <> "") Then

Open path + "\" + "Config.Fer" For Random As #1 Len = Len(Config)

Get #1, 1, Config
Close #1

MiNick = Trim(Config.MiNick)
IPDestino = Config.IPDestino
PuertoRemoto = Config.PuertoRemoto
PuertoLocal = Config.PuertoLocal
Mensajero.Dialog.FileName = Config.Foto
If (Trim(Config.Foto) <> "") Then Mensajero.Foto.Picture = LoadPicture(Mensajero.Dialog.FileName)

Nick = Trim(Config.MiNick)
IP = Config.IPDestino
PuertoR = Config.PuertoRemoto
PuertoL = Config.PuertoLocal
Else
Nick = "Mensajerito"
IP = "127.0.0.1"
PuertoR = 8000
PuertoL = 8000

End If
fin:
End Sub


Private Sub Foto_Click()

Mensajero.Dialog.InitDir = path
Mensajero.Dialog.ShowOpen

If (Mensajero.Dialog.FileName <> "") Then Mensajero.Foto.Picture = LoadPicture(Mensajero.Dialog.FileName)

End Sub

Private Sub OK_Click()
Dim Config As ConfigFer

MiNick = Nick
IPDestino = IPDestino
PuertoRemoto = PuertoR
PuertoLocal = PuertoL

Config.Foto = Mensajero.Dialog.FileName
Config.MiNick = MiNick
Config.IPDestino = IPDestino
Config.PuertoRemoto = PuertoRemoto
Config.PuertoLocal = PuertoLocal


Open path + "\" + "Config.Fer" For Random As #1 Len = Len(Config)

Put #1, 1, Config
Close #1

Unload Me

End Sub



- 1 Modulo: Modulofer :p jaja

Código (vb) [Seleccionar]
Public path As String
Public PuertoLocal As Long
Public PuertoRemoto As Long
Public MiNick As String
Public IPDestino As String
Public nickuser As String
Public PCID As String            'No utilizado en el ejemplo
Public Control As String         'No utilizado en el ejemplo
Public flagfoto As Boolean
Public Config As ConfigFer
Public Type ConfigFer
        PuertoLocal As Long
        PuertoRemoto As Long
        MiNick As String * 20
        IPDestino As String * 20
        Foto As String * 100

End Type

Sub mensajes(texto As String)
Dim tipo As String
tipo = Left(texto, 5)
Select Case (tipo)
    Case "IDPC:"
    'No utilizado en este ejemplo
    Case "Crtl:"
    'No utilizado en este ejemplo
    Case "Foto:"
    'No utilizado en este ejemplo

    Case "Nick:"
    nickuser = Right(texto, Len(texto) - 5)
    Case "Msge:"
    texto = Right(texto, Len(texto) - 5)
    texto = Replace(texto, "&num", "#")
    Mensajero.Conversacion = Mensajero.Conversacion + nickuser + " Dice: " + vbCrLf + texto + vbCrLf
    End Select
End Sub

Sub procesar(Data As String)
Dim pos As Long, valido As String, msg As String

valido = Left(Data, 1)
Data = Right(Data, Len(Data) - 2)
If (valido = "@") Then
pos = InStr(1, Data, "#", vbTextCompare)

While (pos <> 0)
    msg = Left(Data, pos - 1)
    mensajes (msg)
    Data = Right(Data, Len(Data) - pos)
    pos = InStr(1, Data, "#", vbTextCompare)
Wend

End If
End Sub



Bueno eso es todo, Espero q a alguien le sirva. Acepto criticas y sugerencias jejeje.

Para los mas vaguitos, aca les dejo el archivo.

Mensajero.rar
http://www.xzshare.it/777504


Saludos!!!
#16
Java / Crear exe con GCJ.
4 Septiembre 2007, 02:11 AM
Holass, bueno ahora estoy tratando de crear un ejecutable a partir de los archivos .java

Lo q hago es lo siguiente:

>GCJ --main=Prueba3 -o prueba3 Prueba3.java Prueba3Frame.java

Me genera prueba3.exe pero al ejecutarlo me sale error, supongo q es por q kiere linkear a librerias dinamicas o algo asi, segun lo q estuve buscando.

CitarException in thread "main" java.awt.AWTError: Cannot load AWT toolkit:
   <<No stacktrace available>>
Caused by: java.lang.ClassNotFoundException:
   <<No stacktrace available>>

El codigo no tiene errores por q con JCreator lo ejecutar perfectamente.

Como hago para q funcione??

Buske mencionan usar ldd para saber a q archivos llama, pero no encuentro el pack dle cygwin q lo contiene.   :¬¬


Pd:uso windows


Saludos!!!
#17
Hola, keria saber si hay algun compilador de java del tipo visual j++, pero algo mas liviano.

aver para q me entiendan, en c++ tengo "visual c++" y "dev-c++", en java tendria "visual j++" y.. "          ", algo asi estoy buscando, algo "analogo" al dev-c++ pero para java.


Pd:el eclipse y el jbuilder me parecen muy pesados, ademsa el jbuilder no es gratis.

Edit: jaja perdon q bestia, no me di cuenta.

Saludos!!!
#18
Alguien sabe con q programa puedo averiguar en q fue programado un archivo? por q los q tengo me dice si es o no es en cierto programa, pero si no me dice q clase es.

Preferentemente q me diga si es en:c/c++,c#,vb,delphi,perl,phyton,asm. en fin toda la info q sea posible obtener, si me diferencia entre dev-c++ y vc++ mejor jeje.

Otra cosita, alguien conoce algun decopilador para vb ademas de: Vb decompiler, smartcheck, VB Reformer, Boomerang.

La verdad no me gusta ninguno, siempre se terminan tildando a la mitdad del proceso o no muestran nada decompilado.

Saludos!!
#19
PHP / Noticifacion por PHP
16 Agosto 2007, 01:41 AM
Bueno antes q nada no se si iva aca o en el subforo de php, si es asi muevanlo.

Digamos q tengo cierto programita q conecta con una web, y quiero q deje una notificacion de su ip y cierta info. Pensando asi rapido me imagino q se puede por medio de las cabeceras, q conecte q mande los datos y q el codigo php guarde en un archivo las cabeceras.
tampoco estoy seguro de como obtener la ip PERO de la conexion y no enviandola como dato en la cabecera, creo q con una variable de php me lo decia, pero capaz esa variable se bada en datos de la cabecera jej, en fin si alguien esta seguro de cual es la mejor forma q me diga.

Algo mas deberia hacer?  :-\ por casualidad alguien tiene algun ejemplo de este tipo de notificacion?


Saludos!!!
#20
Bueno ya q aca se ponen las sugerencias para el foro les cuento la q se me ocurrio jaj nose como llegue a pensar esto, pero llego. Se me ocurrio se podria ahorar mucho trabajo, tiempo, esfuerzo, hasta bajaria el stress de algunos jaja no tanto no creo.

Bueno lo q se me ocurrio es q se podria implementar en el registro de users nuevos una serie de 10 preguntas con multiple choice, Donde pregunte normas basicas del foro, algo obvio, para forma de recordatorio o solo para mencionarlas asi se aseguran q los users nuevos vean eso y se enteren.

Ademas lo digo de forma interactiva, 10 preguntas 3 opciones, en javascrip, rapido, y hasta q no pones la correcta no sigues, un ej, seria:

"Puedo pedir cracks?"(si/no/si, y un cafe)
"puedo pedir programas?"(si/no/aveces)
"Los usuarios del foro me resuelven mi codigo en c?"(si/no/jajaj)
"Puedo hacer spam?"(si/no/NO!!!)
"Puedo dejar info de terceros"(si/no/solo el tel de tu hna jaja)


Algo asi (seguro a alguno se le ocurriran mas graciosas jaj), no esas preguntas sino otras q algun moderador elija q seguramente sabra las cosas basicas q todo nuevo user hace mal, asi ahorraria mucho tiempo, para el user nuevo y para el q le dice q asi no se hacen las cosas.

Bueno ustedes diganme q opinan, se podria hacer algo de esto? funcionaria? o es mucho trabajo? jaja.


Saludos!!!.
#21
Alguien sabe usar Cximage para convertir bmp a jpg? tengo el codigo pero no me reconoce la clase, por lo cual no anda y nose por q.


#include <windows.h>
#include "ximage.h"
#include "stdafx.h"
#pragma comment(lib,"CxImage.lib")
#pragma comment(lib,"jpeg.lib")


int main()
{
CxImage image;

// bmp -> jpg
image.Load("d:\\image.bmp", CXIMAGE_FORMAT_BMP);
if (image.IsValid())
{
if(!image.IsGrayScale()) image.IncreaseBpp(24);
image.SetJpegQuality(70);
image.Save("d:\\image.jpg",CXIMAGE_FORMAT_JPG);
}

// jpg -> bmp

    image.Load("d:\\image.jpg", CXIMAGE_FORMAT_JPG);
if (image.IsValid())
{
if(!image.IsGrayScale()) image.IncreaseBpp(24);
image.Save("d:\\image2.bmp",CXIMAGE_FORMAT_BMP);
}


}
// redimensionner + bmp -> jpg

    image.Load("d:\\image.bmp", CXIMAGE_FORMAT_BMP);
if (image.IsValid())
{
image.Resample(1024/2,768/2,1,0);
image.Save("d:\\imagesize.jpg",CXIMAGE_FORMAT_JPG);
}

return 1;
}




Errores:
Citar--------------------Configuration: convertir - Win32 Debug--------------------
Compiling...
convertir.cpp
D:\visual\convertir\convertir.cpp(12) : error C2065: 'CxImage' : undeclared identifier
D:\visual\convertir\convertir.cpp(12) : error C2146: syntax error : missing ';' before identifier 'image'
D:\visual\convertir\convertir.cpp(12) : error C2065: 'image' : undeclared identifier
D:\visual\convertir\convertir.cpp(15) : error C2228: left of '.Load' must have class/struct/union type
D:\visual\convertir\convertir.cpp(15) : error C2065: 'CXIMAGE_FORMAT_BMP' : undeclared identifier
D:\visual\convertir\convertir.cpp(16) : error C2228: left of '.IsValid' must have class/struct/union type
D:\visual\convertir\convertir.cpp(18) : error C2228: left of '.IsGrayScale' must have class/struct/union type
D:\visual\convertir\convertir.cpp(18) : error C2228: left of '.IncreaseBpp' must have class/struct/union type
D:\visual\convertir\convertir.cpp(19) : error C2228: left of '.SetJpegQuality' must have class/struct/union type
D:\visual\convertir\convertir.cpp(20) : error C2228: left of '.Save' must have class/struct/union type
D:\visual\convertir\convertir.cpp(20) : error C2065: 'CXIMAGE_FORMAT_JPG' : undeclared identifier
D:\visual\convertir\convertir.cpp(25) : error C2228: left of '.Load' must have class/struct/union type
D:\visual\convertir\convertir.cpp(26) : error C2228: left of '.IsValid' must have class/struct/union type
D:\visual\convertir\convertir.cpp(28) : error C2228: left of '.IsGrayScale' must have class/struct/union type
D:\visual\convertir\convertir.cpp(28) : error C2228: left of '.IncreaseBpp' must have class/struct/union type
D:\visual\convertir\convertir.cpp(29) : error C2228: left of '.Save' must have class/struct/union type
D:\visual\convertir\convertir.cpp(34) : error C2228: left of '.Load' must have class/struct/union type
D:\visual\convertir\convertir.cpp(35) : error C2228: left of '.IsValid' must have class/struct/union type
D:\visual\convertir\convertir.cpp(37) : error C2228: left of '.Resample' must have class/struct/union type
D:\visual\convertir\convertir.cpp(38) : error C2228: left of '.Save' must have class/struct/union type
Error executing cl.exe.

convertir.exe - 20 error(s), 0 warning(s)

lo q me pasa es obvio, no encuentra la clase 'CxImage' , pero yo baje el codigo de Cximage, lo compile con visual c++ 6, cree el .lib, incluia todas las funciones q aparecen ahi, lo puse en la carpeta y lo linkie, con el jpeg.lib lo mismo hice, pero no anda y no se q pasa.

y con dev-c++ creo q no se puede linkear a un .lib no? solo a un .a? alguien me lo puede confirmar.
#22
Alguien sabe como agregar un boton en la barra del explorador de windows (como el de yahoo)??

busque pero es dificil ya q aparece de todo menos lo q quiero jeje. Me imagino q debe ser agregando una dll o algo asi?? , pero no tengo ni idea como hacerlo.

Si alguien tiene info de esto o algun link interesante....

Gracias.
#23
hola hay alguna forma de sustituir estas instrucciones por otras q no contengan "00".

"instruccion                = opcode"

add [bx+si],al            = 0000
add bh,ah                  = 00E7 
add [bx+di],al            = 0001
mov di,[di+0x0]         =  8B7D00
call 0x10a                  =  E89000
push word 0x2            =  680200
push word [di+0x0]     = FF7500   

todas tienen 00 y si son pasadas por una funcion como strcpy se termian el el null. hay alguna alternativa?

add [bx+si],al   esta creo q la puedo separar en varios pasos no?? algo asi:

xor eax, eax
add eax,bx
add eax, si
add [eax], al

pero no estoy seguro si alguna de esas 4 nuevas instruc tienen 00.

Pd: hay algun programita simple q le escriba la instruccion en asm y me de el opcode, sin tener q estar compilando con nasm y mirar asi podria buscar otras, se entiende??
#24
hola me gustaria saber si alguien sabe q diferencias existen entre un programa compilado con dev-c++ y el mismo en visual c++.

Si no me equivoco el codigo generado por visual c++ es mas entendible cuando abro el prog en el olly, en cambio en dev-c++ es diferente y algo mas dificil de entender a simple vista, es decir una misma rutina la hace de una forma mas complicada y se tarda mas en comprender q hace.
me gustaria q diferencias hay entre los 2?