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 - nhaalclkiemr

#1
Hola. Perdón por el tocho de post :S pero es que siempre le dedico mucho esfuerzo a buscar mi modelo ideal cuando miro de un portatil nuevo xD

Estoy mirando de un portatil nuevo tras 4 años con el mío y os expongo aquí mi ardua búsqueda para que me deis recomendaciones o opiniones. El presupuesto que dispongo es de entre 1500€-2800€ (pero siempre buscando una buena relación calidad/precio y prefiriendo quedarme entorno a los ~2100€ aproximadamente). El portatil que busco quiero que pueda con juegos nuevos en alta calidad, y lo utilizaría aparte de para jugar para realizar programación y computación intensiva en CPU y GPU, aparte de utilizarlo como ordenador principal para todas las tareas. Aparte quiero tener un muy buen ordenador por una vez :D

Entre los requisitos que me he puesto para el portatil son los siguientes:

- Portatil de 17'' con pantalla 1080p.
- Procesador Intel i7 de 5ª o 6ª generación (principalmente 6ª)
- Gráfica 970M, 980M o superior (preferiblemente 980M de 4GB)
- Memoria DDR4 (8GB mínimo)
- Slot para al menos un disco SSD M.2 PCI-E (preferiblemente NVMe) (no tiene porque traer el disco duro, aunque si lo tiene es algo que hay que valorar según el precio)

Se que hay algunos portatiles con DDR3 o DDR3L y procesadores Intel de 4ª generación y que están bastante bien de precio, pero comparando precios al final no he visto que la diferencia entre estos y modelos más nuevos sea tanta como para pillar uno de esa generación. No me importa pillar un modelo con poca DDR4 y ampliarla en un futuro cuando sean más baratas, lo mismo para el SSD por NVMe, que son muy caros hoy en día, no me importa que no lo traiga mientras tenga el slot para ampliarlo en un futuro.

Sobre la gráfica, aunque no compensa en relación calidad/precio, estoy dispuesto a pagar la diferencia (aproximadamente 300€-400€) de comprar una 980M en lugar de una 970M, eso si, muchos modelos (especialmente los más caros) traen la versión de 8GB en lugar de la de 4GB, lo cual las encarece mucho y veo totalmente innecesario (4GB para resolución 1080p debería ser suficiente).

Sobre el procesador, la mayoría de portatiles del rango de precios que miro traen o un i7-6700HQ o un i7-6820HK. La verdad es que me gustaría mucho encontrar uno con un i7-6820HK con buena relación calidad/precio, tiene 2MB más de L3 cache, mayores frecuencias, y el multiplicador desbloqueado para poder hacerle algún overclocking sencillo, y en teoría este modelo solamente cuesta unos 150€-200€ más que el i7-6700HQ, lo cual estoy dispuesto a asumir. El problema es que los portatiles que traen la i7-6820HK son muy nuevos y muy caros, o si son baratos montan la 970M. En resumen, los portatiles con mejor relación calidad/precio que he encontrado no dan la opción a ponerle el 6820HK por esos 150€-200€ de más, teniendo que pasar a modelos mucho más caros.

Dicho esto, llevo varios días mirando muchos portatiles, expongo aquí por marcas lo que he encontrado:

- ASUS: No he visto nada que me convenza en la gama ROG de ASUS la verdad, si teneis alguna sugerencia decídmela. ¿Hay algún modelo pendiente de salir pronto? porque me extraña haber encontrado muy poca variedad actualizada.
- MSI:
  • MSI GT72 6QE-693XES: 1900€. El modelo que más me ha convencido al día de hoy y que usaré como referencia para comparar con otros. El modelo tiene un i7-6700HQ, una GTX980M 4GB, 16GB (2x8GB) de RAM DDR4-2133 (4-slots, max 64GB), 1TB (HDD 7200 rpm SATA) + 256GB  (256GB*1 NVMe M.2 SSD by PCIe Gen3 x4), y tiene salida para esta conexión nueva USB Type-C. La verdad es el modelo con mejor relación calidad/precio que he encontrado.

  • MSI GE72 6QF-047XES: 1600€. La versión más barata del anterior con una 970M de 3GB y con el SSD M.2 SATA (los normales de siempre) en lugar de M.2 PCI-E NVMe por 300€ menos. La verdad, prefiero pagar esos 300€ de más por un mucho mejor SSD y una 980M de 4GB.

  • MSI GT72S 6QE-484ES: 2700€. Este sería la nueva versión del MSI GT72, con mejoras en el procesador (i7-6820HK), en la gráfica (GTX980M con 8GB), en la placa base (chipset CM236  en lugar del HM170), en los discos duros SSD (son dos SSD de 128GB en raid 0 en lugar de uno solo de 256GB). La mejora del chipset de la placa base incluye soporte a vPro y a un mayor número de slots SSD entre otros. El precio de este modelo es 800€ más caro por unas mejoras que yo creo que no compensan por este aumento.
- Dell: Los Allienware 17 R3 tienen varias opciones de configuración, pero me parecen algo más cáros que los MSI con configuración similar, pongo aquí varias opciones de configuración y su precio (cuando selecciono la GTX980M solamente me deja seleccionar la de 8GB y no la de 4GB). No selecciono SSD porque en la web no especifica de que tipo es, pero se puede comprar solo con HDD y luego comprar por separado el SSD. En los precios les añado lo que me costaría comprarle por separado un disco SSD de 256Gb m.2 PCI-E NVMe x4 para ser más justos con la comparación con los anteriores portatiles nombrados:


  • Alienware 17 R3 i7-6700HQ, GTX970M 3GB, 16GB(2x8GB) RAM 2133MHz, No SSD, 1TB HDD: 1940€ + 180€(SSD) = 2120€

  • Alienware 17 R3 i7-6700HQ, GTX980M 8GB, 16GB(2x8GB) RAM 2133MHz, No SSD, 1TB HDD: 2240€ + 180€(SSD) = 2420€

  • Alienware 17 R3 i7-6820HK, GTX980M 8GB, 16GB(2x8GB) RAM 2133MHz, No SSD, 1TB HDD: 2390€ + 180€(SSD) = 2570€ (este sería el único más barato en comparación con su "equivalente" MSI GT72S 6QE-484ES)
- Clevo (o XMG): En general también me parecieron más caros que los MSI:

  • XMG P706 (i7-6700HQ, GTX970M 6GB, 16GB(2X8GB) RAM 2133MHz, 256GB m.2 SSD NVMe PCI-E x4, 1TB HDD 7200): 2000€ (por más de 2000€ espero una 980M la verdad...)

  • XMG P706 (i7-6820HK, GTX970M 6GB, 16GB(2X8GB) RAM 2133MHz, 256GB m.2 SSD NVMe PCI-E x4, 1TB HDD 7200): 2136€ (por más de 2000€ espero una 980M la verdad...)

  • XMG P706 (i7-6700HQ, GTX980M 8GB, 16GB(2X8GB) RAM 2133MHz, 256GB m.2 SSD NVMe PCI-E x4, 1TB HDD 7200): 2404€. Cuesta 500€ más que el MSI solamente por una GTX980M 8GB en lugar de una de 4GB (segurament el chipset de la placa sea más nuevo también). No se puede seleccionar la GTX980M de 4GB.

  • XMG P706 (i7-6820HK, GTX980M 8GB, 16GB(2X8GB) RAM 2133MHz, 256GB m.2 SSD NVMe PCI-E x4, 1TB HDD 7200): 2543€. Igual que el anterior, pero con un i7-6820HK en lugar del i7-6700HQ por solo 140€ más. El problema es que sigue costando 640€ más que el MSI solamente por una GTX980M 8GB en lugar de una de 4GB y un procesador i7-6820HK en lugar del i7-6700HQ. No se puede seleccionar la GTX980M de 4GB.

  • XMG U706: (i7-6700, GTX980M 8GB, 16GB(2X8GB) RAM 2133MHz, 256GB m.2 SSD NVMe PCI-E x4, 1TB HDD 7200): 2708€. Lo bueno de este modelo es que soporta CPU de escritorio, pero el precio es algo elevado.

  • XMG U706: (i7-6700K, GTX980M 8GB, 16GB(2X8GB) RAM 2133MHz, 256GB m.2 SSD NVMe PCI-E x4, 1TB HDD 7200): 2802€. Lo bueno de este modelo es que soporta CPU de escritorio, pero el precio es muy elevado y aunque el procesador está desbloqueado por las reviews dicen que el overclocking es limitado, ya que por defecto el procesador ya alcanza temperaturas peligrosamente altas (hay que tener en cuenta que es un procesador de sobremesa en un portatil).

Vistas estas opciones, de los portatiles que he buscado el que mejor calidad/precio ofrece teniendo unas buenas prestaciones es el MSI GT72 6QE-693XES, ¿pero cuales son sus problemas?:
- Procesador i7-6700HQ en lugar de i7-6820HK. Me encantaría encontrar este mismo modelo de portatil pero que montase este otro procesador, ya que por lo que he leído simplemente se diferencian en precio unos 150€-200€. Sin embargo, de todos los ordenadores listados arriba, el de mínimo precio que monte un i7-6820HK con una GTX980M cuesta 2543€. Creo que el procesador va soldado a la placa, no estoy seguro, pero creo que los HQ y HK son soldados.
- Monta el chipset HM170 en lugar del más nuevo CM236.
- Dudas sobre si soporta la virtualización VT-d: El chipset de la placa es más antiguo, y en el ARK de Intel pone que ese chipset HM170 no soporta virtualización VT-d. Sin embargo he encontrado imagenes en foros de gente que enseña las opciones de la BIOS de algún portatil con este chipset en donde le sale la opción para activar la virtualización VT-d (aquí), así que me queda esa duda. No es algo que sea muy importante, pero utilizo bastantes máquinas virtuales y era una tecnología que quería probar.

¿Cual es vuestra opinión al respecto de este tema? ¿Alguna opinión o recomendación? ¿Sabeis de algún portatil con una GTX980M y un i7-6820K que no se pase de los 2200€? Estoy casi convencido de pillar el poratil que he puesto antes, pero quería asegurarme primero que no me estoy pasando alguna cosa o algún modelo por alto.

Un saludo ;)
#2
Hola, vereis la pregunta es simple y por más que busco en google no encuentro nada. ¿Alquien sabe si existe un límite de tiempo o de tamaño de los videos subidos a youtube para que estos se pongan en 720p?

Tengo un canal de youtube, grabo varios videos y están todos en el exacto mismo formato. Los subo, y no tengo problema con los videos que duran 5 min, 20 min, o incluso tengo uno de 33min; y todos de ellos se suben en 720p HD. Sin embargo, luego tengo un video de 1h 30 min y otro de 1h 50 min, y esos se quedan como máximo en 480p, y eso que fueron grabados en el mismo formato y con el mismo programa.

Así que supongo que el problema es que hay algun limite para que los videos se pongan en hd en youtube, o bien un limite de duracion o bien de tamaño de los videos subidos. Por eso me gustaría saber cual es para saber como debo recortar los videos a partir de ahora.

Un saludo ;)
#3
La verdad  no sabía si colocar esto en la sección de Software, Hardware o Windows...

He comprado un nuevo portatil ASUS (Asus K55VM). De momento todo bien, pero he descubierto una cosa verdaderamente muy molesta...los botones de click del touchpad vienen dentro de la zona sensible...

Con el touchpad, yo estoy acostumbrado a pulsar los botones con el pulgar (dejandolo pegado todo el tiempo a los botones) mientras dirijo el puntero con el índice; vamos la manera de que lo usa todo el mundo, vamos algo asi (esta foto no es de mi portatil):



El problema del portatil, es que la sección con los botones tambien es sensible. Fijaos en esta imagen (esta foto si es de mi portatil):



Como veis parece que no tiene botones el touchpad, pero realmente si los tiene, se pueden pulsar en la sección inferior del touchpad. Ya en si, esto ya es algo engorroso, porque al estar los botones "por debajo" del touchpad no tienes la sensibilidad para detectar el boton hasta que lo pulsas. Pero lo peor, es que al ser la parte de los botones una zona táctil sensible, se producen muchos movimientos indeseados, porque como ya dije anteriormente, el dedo pulgar siempre está por encima de los botones haciendo contacto (lo dejas en reposo por encima), que ahora es zona sensible, asi que cada vez que intento mover con el dedo indice el raton, es como si estubiera presionando con dos dedos porque el pulgar esta pulsando una zona sensible...

He estado buscando por Google como podria solucionar este problema, lo unico que he encontrado ha sido esto:

http://superuser.com/questions/229489/disable-touch-pad-for-mouse-button-region-on-new-hp-pavillion-models

Basicamente lo que dicen es acceder al menu de configuración del touchpad, y desde ahi establecer la zona sensible eliminando la parte inferior que correspondería a la sección donde están los botones (ver imagen):



¿Porque no me sirve esta solución? Pues porque esto solo sirve para touchpads Synaptics, con drivers Synaptics, y el touchpad de mi portatil es Elantech, un ELAN Smart-Pad, y el menu de configuración está capadisimo y apenas puedes configurar un par de cositas y nada más... de hecho os pongo las screenshots con "todas" las opciones del menu:





He visto menús de touchpad ELAN con más opciones buscando por google, aunque sinceramente, no parecian tener ninguna opción que me fuese util en esta asunto.

He probado a buscar drivers en la páginas de ASUS, de Elantech ya tengo los ultimos instalados, tambien aparecen de Synaptic, pero logicamente, si intento instalarlos me dice que no encuentra ningun dispositivo Synaptic.

En resumen, necesito un software o algo que me permita limitar la zona sensible de mi touchpad ELAN Smart-Pad.

Quizas este tema os parezca una tonteria, pero se me hace casi imposible utilizar el touchpad. A ver si alguien me puede ayudar. Un saludo ;)
#4
Hola. Vereis, tengo una base de datos local MySQL. La tengo codificada en UTF-8, y para acceder a ella utilizo Java, el cual tambien lo tengo configurado para que utilice UTF-8. Utilizo InnoDB.

En principio me escribe y recupera datos de la base de datos correctamente, incluso escribe los carácteres especiales. El problema es que a la hora de comparar detecta algunos carácteres que no son como iguales, normalmente los carácteres con tildes. Por ejemplo, si tengo esta tabla llamada table1:




NombreEdad

Mânolö

20

Manolo

40

Pepe

10

Si hago:

SELECT * FROM `table1` WHERE (Mânolö LIKE `Nombre`);

me debería devolver unicamente:



NombreEdad

Mânolö

20

Sin embargo, me devuelve esto:



NombreEdad

Mânolö

20

Manolo

40


En resumen, a la hora de comparar (por ejemplo con un SELECT) toma por igual carácteres diferentes, por ejemplo a,á,à,,ä los toma por iguales.

Bueno el problema no son las consultas, sino insertar nuevos datos, ya que si inserto dos filas con clave primaria diferente en esos carácteres me la detecta como duplicado.

Por ejemplo, imaginemos que en la primera tabla la columna Nombre es la clave primaria. Para insertar una nueva fila Pepê, 80 sería así:

INSERT INTO `table1` (`Nombre`, `Edad`) VALUES ('Pepê', 80);

Sin embargo me devuelve un error:

ERROR 1062: Duplicate entry 'Pepê' for key 'PRIMARY'

Evidentemente no debería dar este error, ya que la nueva clave primaria es Pepê y la ya existente es Pepe.


Buscando por google, encontré que podría ser había que describir el COLLATE de las tablas como utf8_general_ci, utf8_unicode_ci o utf8_bin entre otros muchos. Buscando más información comentaba que las comparaciones se hacían diferentes segundo el COLLATE y hablaba de los acentos, por lo que creía que era esto, establecí todas las tablas y el esquema principal como utf8_bin, que es la comparación binaria, pero me sigue dando el mismo error.


Bueno dicho esto todo ¿alguien tiene alguna idea como solucionar mi problema?

Saludos ;)
#5
CitarBueno gente, buscando un portatil para un amigo, de precio hasta los 550€ (preferiblemente que no supere los 500€) mas o menos, he encontrado este (un ASUS K52JU SX403V) que me pareció bastante acertado por 434€:

http://www.controlp.com/ASUS-K52JU-SX403V---Core-i3-370M-24-GHz---RAM-4-GB_99270_P.asp?iva=SI

Según me dijo para lo unico que lo quiere es realizar trabajos, navegar por internet, ver peliculas, etc. Pero no para juegos ni para aplicaciones 3D.

Pues buscando en esa página (tenemos la tienda bastante cerca y suelen estar bien de precio) me llamó la atención por varias cosas, tiene un procesador decente (i3 370M), 4GB de RAM DDR3, un buen disco duro de 640GB y a pesar de que no los quiere para juegos tiene una gráfica Radeon HD 6370M por lo que pueda pasar. Además tengo más ordenadores ASUS y en general me gusta la marca.

Me direis que si ya lo he decidido porque pregunto. Pues porque soy bastente indeciso y siempre pregunto "por si acaso" a ver si alguien sabe si tiene algo malo o algo que yo deba saber este portatil. O si teneis sugerencias mejores tambien las acepto.

Saludos ;)

El tema principal ya está solucionado, y he aprovechado este mismo hilo para preguntar sobre otro portatil. Mirar aqui: http://foro.elhacker.net/hardware/opinion_sobre_portatil_asus_k52ju_sx403v-t337426.0.html;msg1661684#msg1661684
#6
Creo que el titulo lo aclara bastante. Estoy haciendo un bash en el que necesito abrir un proceso de consola (o otro script bash) en otra shell (o otra pestaña) mientras el bash original continua ejecutandose (no espera a la finalización de la otra shell).

Llamar a un proceso desde la shell mientras se sigue ejecutando el script es bastante facil utilizando el símbolo &. Ejemplo:

Código (bash) [Seleccionar]
...
./programauno -param1 -param2 &
./programados -param1 asdasd &
./programatres -param1 -param2 -param3 &
...


De esta manera el script iria ejecutando los programas paralelamente mientras continua. El problema es que esos programas son por consola y necesitan interacción con el usuario, muestran estadisticas, etc... por lo tanto necesito que cada uno de esos procesos se ejecute en una nueva shell. Tal y como lo puse todos los programas se ejecutarian en la misma consola y se mostraría un lio de cosas.

Investigando por la red, solo ponían una manera de hacer esto, y era llamando a la shell especifica (XTerm, gnome-terminal, etc...) con parámetros que ejecutaran directamente los programas que queremos. Esto funciona bien, pero tiene el problema de que el script solo funcionaria para determinadas shell y no para todas. Un ejemplo de esto con gnome-terminal sería:

Código (bash) [Seleccionar]
...
gnome-terminal -x mibashuno.sh &
gnome-terminal -x mibashdos.sh &
...



Con esto todo dicho, ahí van mis preguntas:

-¿Existe algún comando o alguna llamada que sirva para todas las shell y que permita ejecutar cada uno de los procesos en una shell diferente? (en un batch de windows por ejemplo se usa start)

-Si esto no es posible, ¿sabeis si existe alguna shell por defecto que venga instalada en todos o la mayoría de los Linux? Yo he visto por ejemplo que la XTerm está en bastantes SO de Linux, pero conozco pocas distros diferentes para saber si está en todos.

-Si tampoco existe una "shell universal" ¿Cuales son las shell más populares que vienen en Linux? De esta manera podría comprobar mediante el script si alguna de las shell de mi lista está instalada en el SO, y de estarlo ejecutar esa con sus propios parámetros. Actualmente yo solo conozco la gnome-terminal y el XTerm.

-Cualquier otra sugerencia, cuestión o ayuda que creais que puede ayudarme a solucionar el problema decidmela.


Esto es todo, a ver si alguien puede ayudarme.

Saludos ;)
#7
Hola en problema es el siguiente:

En JSTL para recoger los parametros de la URL (método GET) lo hago mediante la variable ${param.nombre} (para una url al estilo pagina.jsp?nombre=valor)

El problema es que la variable es un numero (debería serlo), y tengo que hacer la comprobación <c:when test="${param.nombre > 4}">. Eso da un error si el parametro es nulo o es una letra. para comprobar si es nulo entonces lo hago asi <c:when test="${(param.nombre != null) && (param.nombre > 4)}">

Llegados a este punto tengo el problema de que si alguien introdujera el parametro como una letra (por ejemplo pagina.jsp?nombre=asd) el servidor daria un fallo en ejecucion porque no puede comparar un string con un numero. ¿Como puedo añadir una comparación en JSTL o que podría hacer para evitar que me falle si se introducen letras en lugar de numeros en el parametro?

Saludos ;)
#8
R-WlanXDecrypter 1.0
by nhaalclkiemr & millanzarreta - (incluido en la suite Wifiway desde la versión 2.0.2)

Aqui os presento una utilidad que he creado para la generación de diccionarios de claves por defecto de R, una compañía de Galicia. Son las conocidas como R-WlanX (donde X es un número) o nombres similares. Recientemente también se ven bastantes redes wifimedia_R-XXXX (las X son números), las cuales también analizaremos.

He visto por aí que existe un Rwlandecrypter (por eso le puse otro nombre), sin embargo lo he probado y no me ha convencido, crea un diccionario de apenas 14 MB que incluye solo una pequeña parte de las posibles claves por defecto.

Antes de presentar el programa me gustaría analizar estas redes para tener claro que tipo de contraseñas utilizan los routers de R por defecto.

Analisis

Redes wifimedia_R-XXXX:

Estas redes son las que vienen con ciertos routers que proporciona R. La compañía los proporciona si tienes contratado un cierto servicio llamado wifimedia. Dicho servicio viene por defecto de forma gratiuta para conexiónes de 30Mb o más, aunque también se puede contratar por cierto precio para conexiones de menos velocidad, pero esto último no es común. Es decir, estas redes suelen ser de alta velocidad. Traen contraseña WPA/WPA2, sin embargo, la contraseña por defecto es ridicula. Por esto mismo en ocasiones el técnico que instala el router cambia esta contraseña, aunque eso no es lo normal.

La contraseña por defecto de estas redes es la MAC del router con el último digito terminado en 0, las letras suelen ser minúsculas pero en ocasiones pueden ser mayúsculas. Un ejemplo:

SSID: wifimedia_R-1234
MAC: 00:26:5B:1E:28:A5

La clave será: 00265b1e28a0
También puede ser: 00265B1E28A0


Como se puede observar la seguridad de estos routers es ridícula, no hace falta ni capturar paquetes ni usar el programa R-WlanXDecrypter ni nada.

Redes R-WlanX con Clave WEP:

Lo primero es aclarar que ni el SSID ni la MAC dan detalles sobre la clave. El numero del SSID normalmente suele ser el canal (aunque no siempre) del AP. No siempre se cumple el formato exacto de "R-WlanX", a veces se mezclan mayusculas minusculas, a veces hay espacios, a veces guiones, a veces nada separando las palabras; e incluso a veces se ven palabras adicionales en el SSID.

La manera más universal de definir las contraseñas por defecto de R es que son números seguidos de ceros. ¿Cuantos números antes de los 0's? Normalmente 8, en alguna ocasión 6. Ahora independiente de esto tenemos cuatro posibilidades de tipos de contraseñas por defecto (descartando contraseñas mayores de 128 bits):


  • Contraseña WEP 128 bit ASCII (ej.: "2010945600000") : El tipo de contraseña más común
  • Contraseña WEP 128 bit Hexadecimal (ej.: 20:10:94:56:00:00:00:00:00:00:00:00:00): Raras, pero haberlas hailas
  • Contraseña WEP 64 bit ASCII: Nunca he visto una de este tipo
  • Contraseña WEP 64 bit Hexadecimal (ej: 20:10:94:56:00): Se ven bastantes

¿Significan algo los números? ese tema es bastante misterioso:

-Algunas claves empiezan por un año (ej.: "2008") seguidas de 4 numeros aleatorios; se cree que el año es el de fabricación de router, pero nos encontramos muchos años futuros (ej.: "2023"), asi que no parece ser ese el caso. Igualmente la mayoría de claves empiezan por 2, si queremos reducir el intervalo de busqueda podemos empezar buscando claves que empiecen por 2. Recientemente se ha descubierto que este número parece ser el ID que R asigna a su cliente (dato completamente desconocido para nosotros que solo está presente en sus facturas).

-En otros casos, sobre todo cuando se tratan de 6 numeros seguidos de 0's (en vez de 8 ) se cree que puede ser el número de telefono sin el prefijo. Saber esto no nos ayuda mucho, pero en caso de estas claves tan solo son 6 números seguidos de 0's en vez de 8, lo que reduce muy sustencialmente nuestro intervalo de busqueda

Bueno, independientemente del origen de los numeros, nos encontramos con que solo varían como máximo 8 digitos, que siempre son numeros, por lo que  tenemos 10^8=100.000.000 de posibilidades para cada tipo de contraseñas, que no son tampoco muchas. En un ordenador portatil actual de gama media se comprobarían todas las claves en unas 2 horas o menos aproximadamente.

Redes R-WlanX con Claves WPA:

En la actualidad es más frecuente ver routers de R con claves por defecto WPA que con claves WEP, aunque el patrón de contraseñas es similar al WEP. En este caso las contraseñas por defecto son claves de 8 dígitos pero sin seguir de 0's, al estilo XXXXXXXX (ej.: "20109456"). Este número parece ser el ID del cliente, y parece ser que este número tambien empieza en la mayoría de ocasiones (hasta ahora en todas las probadas) por 2, por lo que las contraseñas se nos reducirian solamente a las que empiezan por 2 (estilo 2XXXXXXX).

Tambien se han detectado casos de claves WPA de 10 dígitos, aunque siguen siendo solo 8 dígitos variables, pero con dos 0's a continuación (aunque estas son mucho menos frecuentes). Al estilo XXXXXXXX00 (ej.: "2010945600"). Al igual que con las claves de 8 dígitos, solo se han encontrado casos de contraseñas que empezaran por 2 al estilo 2XXXXXXX00.

El tercer patrón de claves WPA que se ha detectado se trata de una contraseña de 16 dígitos, pero que realmente es una contraseña de 8 dígitos variables repetida dos veces, al estilo ABCDEFGHABCDEFGH (ej.: "2015483920154839").

A la modesta velocidad de crackeo de 1000key/sec, tardaríamos sobre 28horas en comprobar el diccionario completo de claves. Si probamos solo las claves que empiezan por 2, tardaríamos aproximadamente 3 horas en comprobarlas.

Con esto terminamos el análisis y procedo a explicar la aplicación.

R-WlanXDecrypter

El programa soporta actualmente plataformas Unix y Windows. Las opciones básicas son las necesarias para crear diccionarios para contraseñas WEP, y las opciones adicionales, que explicaré mas tarde, son una manera de crear diccionarios más personalizados y que también sirven para claves WPA.

El proyecto está ahora disponible con su código fuente en GitHub. Se creará un tag por cada versión que se libere, y los desarrollos principales se harán sobre el master:
https://github.com/millanzarreta/R-WlanXDecrypter



Opciones básicas


  • -n <nbits>: Crea el diccionario para claves de 64bits, 128bits, etc... Aunque tambien es compatible para claves más grandes como 512bits nunca me he encontrado una de R de ese tipo. Si no especificamos el parámetro el programa coge una clave por defecto de 128bits
  • -h <sep>: Se creará un diccionario en formato hexadecimal, no es un formato alternativo de guardar las claves, sino que es un diccionario diferente a uno creado sin esta opción -h. El parametro <sep> es el caracter (en decimal) separador de los bytes expresados en formato hexadecimal, si no se especifica por defecto es : , que es el símbolo más utilizado para esta función y el que utiliza aircrack-ng

Utilizando solo estas opciones podemos crear diccionarios universales para las contraseñas de R con claves WEP. Si creais el diccionario para aircrack-ng es importante recordar que no admite diccionarios mayores de 2GB. Por defecto el programa crea claves de 8 digitos seguido de 0's (y asi incluimos tambien a las de 6 dígitos). En las notas de la nueva versión de aircrack-ng comentan que debería soportar diccionarios mayores de 2GB, pero comprobandolo empíricamente a mi me siguen sin funcionar.

-Primero crearemos un diccionario ASCII para contraseñas de 128bits, ocupará 1,40GB:

R-WlanXDecrypter rwlan128.txt

-Ahora crearemos un diccionario Hexadecimal para contraseñas de 64 bits, ocupará 1,48GB:

R-WlanXDecrypter rwlan64hex.txt -h -n 64

-Con esos dos diccionarios deberían bastar para la mayoría de routers de R. Aún asi siempre podremos generar un diccionario Hexadecimal para contraseñas de 128bits. Este diccionario ocuparía 3,72GB:

R-WlanXDecrypter rwlan128hex.txt -h

Si creamos el diccionario para aircrack-ng hay que recordar que no admite diccionarios de más de 2GB, por lo que tendremos que dividir en dos este diccionario (por ejemplo: dos diccionarios de 1,86GB cada uno):

R-WlanXDecrypter rwlan128hex1.txt -h -max 49999999
R-WlanXDecrypter rwlan128hex2.txt -h -min 50000000


-Tambien podremos crear un diccionario para claves ASCII de 64bits, aunque nunca vi ninguna de este tipo en R el diccionario tan solo ocupa 683KB:

R-WlanXDecrypter rwlan64.txt -n 64


    Se supone que en estos diccionarios están todas las claves que puede contener un router de R, pero tenga en cuenta que pueda que existan claves de mayor longitud que 128bits, aunque nunca he visto ninguna hasta la fecha.

Opciones avanzadas:


  • -c <nchar>: Por defecto en las palabras del diccionario varian 8 digitos y despues se rellenan con 0's asta completar la longitud de la clave. Se puede utilizar esta opción si queremos especificar otro numero de digitos variables
  • -cm <decchar>: Por defecto las claves se rellenan con 0's. Con este parámetro podremos especificar otro carácter de relleno (especificar el codigo decimal del carácter)
  • -min <num>: Con esta opción podemos definir el comienzo del diccionario especificando el valor mínimo. Se especifica el valor minimo excluyendo el relleno (es decir, solo contando el número formado por los bytes variables)
  • -max <num>: Con esta opción podemos definir el final del diccionario especificando el valor máximo. Se especifica el valor máximo excluyendo el relleno (es decir, solo contando el número formado por los bytes variables)
  • -rep <num>: Con esta opción podemos especificar que la parte variable de las contraseñas generadas se repita num veces
  • -r: Si especificamos esta opción las palabras del diccionario estarán separadas por el byte LF (char 10). Por defecto están separadas por 2 bytes: CR+LF (char 13)(char 10). La mayoría de programas reconocen ambos formatos. Con esta opción ahorramos 1 byte por cada palabra.
  • -m <nbytes>: Hace lo mismo que -n (por eso no es compatible con esa opción) pero con esta opción podemos definir manualmente el número de bytes de la clave. Cuando hablamos de contraseñas de pongamos 128bits, 24 de estos se utilizan para el IV, por lo que la clave es realmente de solo (128-24)/8=13 bytes.-n 64 es equivalente a -m 5, -n 128 a -m 13, etc...
  • -q: No mostrara el estado del proceso de creación del diccionario

Con las opciones por defecto los diccionarios generados son de un gran tamaño y con muchas palabras, y se puede tardar mucho tiempo en comprobarlas todas dependiendo del equipo. Con estas opciones avanzadas podemos definir diccionarios más personalizados. Varios ejemplos útiles:

-Como ya hemos dicho, en algunas ocasiones las claves son solo 6 numeros seguidos de 0's, en ese caso crearemos los diccionarios anteriores (excepto el de 64bits ASCII ya que no tiene sentido reducirlo) pero para 6 bytes variables en lugar de 8. Los diccionarios creados ocupan tan solo 67,7MB los 3 juntos. De esta manera podemos hacer una comprobación rapida con el aircrack-ng para claves con 6 numeros variables antes de utilizar los diccionarios grandes:

[/list]R-WlanXDecrypter rwlan128-c6.txt -c 6
R-WlanXDecrypter rwlan64hex-c6.txt -h -n 64 -c 6
R-WlanXDecrypter rwlan128hex-c6.txt -h -c 6

-Ya nombramos que muchas de las contraseñas por defecto de R suelen empezar por 2. Utilizando -min y -max podremos definir diccionarios de solo ese rango (empiecen por 2). Los 3 diccionarios que estamos creando (128bits ascii, 64bits hex y 128bits hex) ocuparían la decima parte cada uno:

R-WlanXDecrypter rwlan128-start2.txt -min 20000000 -max 29999999
R-WlanXDecrypter rwlan64hex-start2.txt -h -n 64 -min 20000000 -max 29999999
R-WlanXDecrypter rwlan128hex-start2.txt -h -min 20000000 -max 29999999

Caso WPA:

-Podemos utilizar el programa con las opciones vistas para crear un diccionario para claves WPA. En este caso tenemos que indicar que cree un diccionario de 8 digitos, todos variables. El diccionario tendrá 100.000.000 claves y ocupará 953.67MB:

R-WlanXDecrypter rwlanwpa.txt -m 8

-Si queremos reducir el tiempo de búsqueda, podemos crear un diccionario que contenga unicamente las claves que empiezan por 2. El diccionario tiene 10.000.000 claves y ocupa 95.37MB:

R-WlanXDecrypter rwlanwpa-start2.txt -m 8 -min 20000000 -max 29999999

La mayoría de claves WPA de R son de 8 cifras, pero tambien se han detectado algunos casos de claves de 10 cifras con 8 dígitos variables seguidas de dos 0's. Para crear ese diccionario sería así:

-El diccionario completo para WPA de 10 cifras tiene 100.000.000 claves y ocupa 1144.41MB:

R-WlanXDecrypter rwlanwpa10.txt -m 10

-Si solo queremos reducir el tiempo de búsqueda, podemos probar las claves que empiezan por 2. Este diccionario tiene 10.000.000 claves y ocupa 114.44MB.

R-WlanXDecrypter rwlanwpa10-start2.txt -m 10 -min 20000000 -max 29999999

Por último, también se ha detectado un patrón de contraseñas de 16 dígitos, que son realmente contraseñas de 8 dígitos variables que se repiten.

-El diccionario completo para WPA de 16 cifras tiene 100.000.000 claves y ocupa 1716.61MB:

R-WlanXDecrypter rwlanwpa16-rep1.txt -m 16 -rep 1

-Si solo queremos reducir el tiempo de búsqueda, podemos probar las claves que empiezan por 2. Este diccionario tiene 10.000.000 claves y ocupa 171.77MB.

R-WlanXDecrypter rwlanwpa16-rep1-start2.txt -m 16 -rep 1 -min 20000000 -max 29999999


Hasta ahora todas las redes analizadas empiezan por el número 2. Por eso se recomienda empezar con los diccionarios que solo recojen claves que empiezan por 2, y utilizar los diccionarios generales de 8 y 10 cifras solo en el caso de que estos no funcionen.

Descarga

Incluye versiones compiladas para linux y windows y el código fuente.

-Versión actual (1.0 ):

-Mirror 1: https://www.dropbox.com/s/5aojiwb58nqqvkm/R-WlanXDecrypter1.0.zip?dl=1
-Mirror 2: https://github.com/millanzarreta/R-WlanXDecrypter/raw/release-1.0/R-WlanXDecrypter1.0.zip

-Versiones antiguas (0.9 ):

-Mirror 1: https://www.dropbox.com/s/srlrovcubxm3son/R-WlanXDecrypter0.9.zip?dl=1
-Mirror 2: https://github.com/millanzarreta/R-WlanXDecrypter/raw/release-0.9/R-WlanXDecrypter0.9.zip

-Versiones antiguas (0.8 ):

-Mirror 1: https://www.dropbox.com/s/p0mt5t0uyjmqdxt/R-WlanXDecrypter0.8.rar?dl=1
-Mirror 2: https://github.com/millanzarreta/R-WlanXDecrypter/raw/release-0.8/R-WlanXDecrypter0.8.rar

Changelog

v1.0 [27/10/2014]
-----------------
+Añadida opción -rep <num> que permite que la parte variable se repita <num> veces
+Cambio en el tipo de variables por otros más adecuados
+Corregido el error que mostraba mal el proceso de creación si el diccionario era mayor a 2GB
+Corregido un error que se producia en ocasiones al crear diccionarios hexadecimales y que producia un tamaño de palabra diferente al especificado
+Corrección de varios errores menores

v0.9 [11/10/2010]
-----------------
+Mostrar tamaño archivo final y numero de claves
+Mostrar status del proceso
+Añadido quiet mode -q
+Corregido bug en las opciones -min y -max
+Pequeña optimización del bucle generador de claves
+Corrección de pequeños fallos generales

v0.8 [06/10/2010]
-----------------
+Primer lanzamiento publico

Anexo: Como usar diccionarios Hexadecimales en aircrack-ng

Para definir en aircrack-ng un diccionario hexadeximal hay que especificar h: antes de la ruta del diccionario y siempre debemos especificar la longitud de las claves WEP del diccionario que estamos usando:

aircrak-ng -n 128 -w h:"rwlan1281hex.txt" captura.cap
aircrak-ng -n 64 -w h:"rwlan64hex.txt" captura.cap

Aun así, en la versión actual de aircrack-ng 1.1, existen varios bugs y dificultades que impiden el correcto funcionamiento de los diccionarios hexadecimales. He creado un post al respecto aqui que explica detalladamente como solucionar este problema.

Parece que en la nueva versión de aircrack-ng aún siguen presentes estos bugs.

Saludos ;)




LAST EDIT: Actualizado a la versión 1.0
#9
Como algunos ya sabreis, los diccionarios hexadecimales no funcionan en la versión actual de aircrack-ng 1.1 debido a varios bugs en el codigo fuente. Ahora propondre una solución para esto.

Primero explicar que es un diccionario hexadecimal y porque usarlos:

Un diccionario hexadecimal es igual que un diccionario normal pero en vez de definir palabras ASCII definimos el valor de los bytes de una palabra en hexadecimal (separamos los bytes con un separador, el más común y el que usa aircrak-ng es : ). Destacar que aunque cada linea representa una palabra hexadecimal los valores (0-F) estan escritos en ASCII, por lo que los diccionarios ocupan mucho más de lo que deberían, por ejemplo una palabra de 4 bytes ocupa 11 bytes en un diccionario hexadecimal. Un diccionario hexadecimal visualizado con un editor de texto cualquiera tendria este estilo:

24:35:1A:4E:20:01
D4:35:1A:4E:56:02
A2:24:1D:4E:20:06
...


¿Por que se usan este tipo de diccionarios? Pues basicamente nos permite representar todas las combinaciones posibles, mientras que las palabras ASCII incluyen solo a un pequeño grupo de carácteres. Hay gente que define las contraseñas en modo hexadecimal, si un byte de esa contraseña es por ejemplo 6, es muy dificil que encontremos la contraseña con un diccionario ordinario puesto que no es un carácter representable.

Vale, ahora pasemos a aircrack-ng. Verdaderamente los diccionarios hexadecimales son utiles para ataques con diccionarios a routers con claves predeterminadas, muchos fabricantes establecen las contraseñas por defecto en modo hexadecimal. Para definir en aircrack-ng un diccionario hexadeximal hay que especificar h: antes de la ruta del diccionario y siempre debemos especificar con -n el tamaño en bits de las claves del diccionario:

aircrak-ng -n 64 -w h:"ruta_diccionario.txt" captura.cap


Pero ahora nos encontramos un problema, aircrack-ng tiene un bug conocido y con la solución en el tracker de web pero aun sin corregir en el programa. Para información detallada: http://trac.aircrack-ng.org/ticket/685.
Para solucionarlo tenemos que modificar el código del source aircrack-ng.c.

El problema consiste en que no se libera memoria que se reserva dinamicamente, por lo que el sistema envia una señal KILL a aircrack-ng, en windows produce directamente un error. Para solucionarlo debemos ir al final de la función next_key (aproximadamente linea 4326), donde veamos este código:

free(tmp);
tmp=NULL;


debemos cambiarlo por:

free(tmp2);
tmp2=NULL;


Así ya tenemos solucionado este problema.


Sin embargo existen aun más complicaciones en el código, esta vez en la función crack_wep_dict (aproximadamente linea 4377). El problema se encuentra en esta parte del codigo casi al principio de la función:

i = strlen( key );

origlen = i;

while(i<opt.keylen)
{
key[i] = key[i - origlen];
i++;
}

key[i] = '\0';

      

Como sabreis las contraseñas WEP son de tamaño fijo, es decir son de 64bits (5bytes), 128bits(13bytes), etc...
Como en los diccionarios las contraseñas pueden tener diferente tamaño, lo que hace aircrack es duplicar el contenido, por ejemplo si encuentra en un diccionario la palabra "hola" y esta analizando contraseñas de 128bits, cambiara la palabra "hola" por "holaholaholah". Para esto detecta el final de la palabra cuando encuentra el caracter nulo '\0', y aqui esta el error. En un diccionario hexadecimal podriamos tener la palabra 12:34:00:53:2A y debido a lo comentado anteriormente, aicrack-ng solo nos leera los dos primeros bytes 12:34 y rellenara el resto, con lo que nos estropea cualquier palabra que tenga algun byte 00 (muy común en muchas contraseñas hexadecimales para rellenar).

Realmente este relleno no es para nada necesario, si utilizamos diccionarios para ataques WEP deben ser del tamaño justo a una clave WEP para que el resultado sea efectivo. Sabiendo esto modificaremos el codigo para que no rellene la contraseña. Reservaremos memoria con calloc para rellenar automaticamente con caracteres nulos, tambien eliminaremos la definición de la variable origlen que ya no es necesaria (podria darnos errores con make). En la función crack_wep_dict eliminamos directamente el código citado anteriormente. Y en esa misma función al principio modificamos el codigo:

    int i, origlen, keysize;
    char *key;

    key = (char*) malloc(sizeof(char) * (opt.keylen + 1));


por:

    int i, keysize;
    char *key;

    key = (char*) calloc(1,sizeof(char) * (opt.keylen + 1));



Con estos cambios aplicados, ahora solo tenemos que compilar de nuevo y ya tenemos nuestro aircrack-ng parcheado para que funcione con diccionarios hexadecimales. Yo recomiendo que esta nueva compilación se use solo para esto, para utilizar diccionarios hexadecimales en claves WEP. Para el resto de funciones mejor utilizar la versión compilada original (seguramente ofrezca un mayor rendimiento por las optimizaciones). Para compilar podeis utilizar el Makefile que traen los propios sources mediante make -f Makefile

Una aclaración importante: cuando utilizamos ataque de diccionario para contraseñas WEP debemos especificar con el parametro -n la longitud de la clave. Por defecto establece la longitud a 128bit, si estamos utilizando un diccionario de 64bits debemos especificarlo con -n 64 o no funcionará correctamente.

Bueno, para los vagos aqui os pongo una versión del aircrack-ng 1.1 modificada como explique anteriormente para que funcione con diccionarios hexadecimales. Van el source modificado y el ejecutable (Linux y Windows). Compilado con gcc versión 4.2.2 en Linux, y gcc 4.3.4 mediante Cygwin para Windows (junto al ejecutable de Windows incluyo las librerias de cygwin necesarias para que funcione):
Mirror 1: http://www.fileden.com/files/2006/9/18/225525/aircrack-ng-parchedhexdictionaries.zip
Mirror 2: http://www.megaupload.com/?d=0CLDYUI8

Estos archivos los he compilado yo con gcc (tal y como indico arriba). Desconozco como compilaron los binarios originales, pero seguro que lo hicieron con mejores optimizaciones. Es por esto que no recomiendo substituir los binarios originales por estos ejecutables que he compilado yo porque seguramente sean algo más lentos. Lo óptimo sería utilizar los binarios originales siempre que se pueda, excepto cuando necesitemos utilizar un diccionario hexadecimal, que será cuando hechemos mano de nuestra versión recompilada.

Espero que les sirva de ayuda.

Saludos ;)
#10
Na pues eso...si alguien juega al World of Warcraft en el server Caballeros Vengadores (o algo parecido) y es de la orda (yo soy un elfo de sangre) pues k ponga un post...

El server ese ta muy bien y no se cae (a mi aun nunca se me cayó), sin embargo no hay mucha gente...pero por eso a ver si se apunta más gente...

Saludos ;)

P.D.: Esto no sabía si iba aki o en Foro Libre...lo pongo aki si está mal muevanlo...
#11
Weno en una de mis creaciones (maleficas como no) pretendo desacerme de la heurística de los AVs como es obvio leyendo el titulo...weno el tema de cifrar las String está claro que lo tengo que realizar...la cuestión es otra:

Muchos AVs (como el NOD32) detectan por heurística acciones sospechosas, y muchas de ellas relacionadas con el inicio de una aplicación...por ejemplo en VB si tienes un modulo (y no formularios, por ejemplo con un Sub Main) y en el Main le pones una instruccion FileCopy, Kill, ... automaticamente pasa a ser detectado (y si lo hago con un Form_Load de un formulario parecido)...ese es el tipo de heurística que quiero evitar, la heurística que me detecta ciertas acciones en el Load (o Main) de mi programa...

Pues weno lo primero que hice fue poner APIs en lugar de las propias funciones del VB...funcionó en algunos casos pero en otros no...también prové a crear una funcion que llamara a otra funcion y asi sucesivamente pero eso no cuela a los AVs (sería demasiado facil no? xD)

Muchos os preguntareis porque insisto en no poner un Form, ya que con un Form podría poner por ejemplo un Timer que llamase a mi funcion y listo, al no estar en el Load ya no canta ni la mitad...sin embargo no quiero usar un Form pork probando descubrí que el hecho de poner un Form me aumenta 40KB la aplicación, de pesar 68KB usando solo modulos conuna funcion Sub Main enuno de ellos, me pasa a 108KB poniendo un solo Form con un Timer y el mismo code...eso es mucho para mi...(weno sobra decir que en mi aplicación es silenciosa y no muestra nada en pantalla, por eso los Forms son innecesarios)

Por eso, la cuestión es: como hacer que mi programa tras ejecutarse inicie automaticamente su codigo con instrucciones que el AV detecta como sospechosas si están programadas para ejecutarse al inicio?

A mi por el momento se me ocurrieron dos ideas:


  • Usar CreateThread: Sin embargo tengo entendido que con VB6.0 esa API no siempre funciona bien para ejecutar las propias funciones del programa y me daría problemas...y de hecho ya me las dió con funciones de una sola linea, no me imagino con un codigo grande entero que llama a varias funciones, APIs, etc...
  • Usar SetTimer y KillTimer para establecer un Timer (y en cuanto se ejecute una vez desactivarlo automaticamente) mediante APIs (y asi no me hace falta el Form) y apuntando a la funcion Main: Es la mejor alternativa que veo, pero aun tengo que provar si funciona correctamente, pues me da a mi que causará errores...por ejemplo a la hora de usar la funcoin Command que recoge los parametros de la aplicación no se si desde el Timer funcionará (me da a mi que no)...weno mañana (hoy es tarde) pruebo y ya os comento...pero no se, otra alternativa me parecería más segura...

Sobre este post decir que weno lo pongo para que vosotros me digais vuestras opiniones de que hariais vosotros...si veis mejores alternativas al Timer mediante APIs...mejores soluciones...etc...pero insisto...nada de Forms!

Saludos ;)
#12
Hola mirad mire con un escaner de vulnerabilidades si una web era vulnerable a algo...pasé el X-Scan y el Shadow Security Scanner...los resultados fueron estos:

Puertos abiertos:

21.- FTP - File Transfer Control
80.- WWW-HTTP - World Wide Web HTTP (Hyper Text Transfer Protocol)
443.- HTTPS - HTTPS (Hyper Text Transfer Protocol Secure) - SSL (Secure Socket Layer)
8001.- Generic - Share Service Port
8002.- Generic - Share Service Port
8003.- Generic - Share Service Port
8004.- Generic - Share Service Port
8005.- Generic - Share Service Port
8006.- Generic - Share Service Port
8007.- Generic - Share Service Port
8008.- Generic - Share Service Port
8009.- Generic - Share Service Port
8010.- Generic - Share Service Port
9000.- UNKNOW - Unknow Service


Vulnerabilidades con X-Scan:

-"IIS 5.0 .printer remote buffer overflow" maybe vulnerable
-"IIS Index Server ISAPI remote buffer overflow" maybe vulnerable(/NULL.ida)
-"IIS Index Server ISAPI remote buffer overflow" maybe vulnerable(/NULL.idq)


Vulnerabilidades con Shadow Security Center:

-Web Servers : Apache HTTP Server 2.2.6, 2.0.61 and 1.3.39 mod_status Cross-Site Scripting Vulnerability: 80, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 9000

-Web Servers : Apache HTTP Server 413 Error HTTP Request Method Cross-Site Scripting Weakness (esta vulnerabilidad aparece dos veces para cada puerto): 80, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 9000

-Web Servers : Apache HTTP Server Mod_Cache Denial of Service Vulnerability: 80, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 9000

-Web Servers : Apache HTTP Server Mod_Proxy Denial of Service Vulnerability (esta vulnerabilidad aparece dos veces para cada puerto): 80, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 9000

-Web Servers : Apache HTTP Server Mod_Status Cross-Site Scripting Vulnerability: 80, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 9000

-Web Servers : Apache Mod_AutoIndex.C Undefined Charset Cross-Site Scripting Vulnerability (esta vulnerabilidad aparece dos veces para cada puerto): 80, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 9000

-Web Servers : Apache mod_imagemap and mod_imap Cross-Site Scripting Vulnerability: 80, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 9000

-Web Servers : Apache mod_negotiation HTML Injection and HTTP Response Splitting Vulnerability: 80, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 9000

-Web Servers : Apache mod_proxy_balancer Multiple Vulnerabilities: 80, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 9000

-Web Servers : Apache mod_proxy_ftp Undefined Charset UTF-7 Cross-Site Scripting Vulnerability: 80, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 9000

-Web Servers : Apache Mod_SSL Custom Error Document Remote Denial Of Service Vulnerability: 80, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 9000


Weno pues estos son los resultados...se necesita mas informacion? yo la verdad de esto no entiendo mucho pero me gustaría que me dijeran si esta web es realmente vulnerable a algo...pork ya me dijeron que los escaneres de vulnarebilidades no son para ala sacar ai vulnerabilidades explotables a lo loco...

Weno a ver si alguien sabe algo...

Saludos ;)
#13
Weno pues hablando asi con Tughack nos surgio el tema de crashear procesos inyectando en su memoria...me dijo que con el code de Hendrix para inyectar DLL en procesos si intentas inyectar DLLs que no existen (una ruta falsa) los procesos crasheaban...sin embargo a mi no me funciona y el volvio a probar y tampoco le funcionó...el code por si alguien no sabe es este:

http://foro.elhacker.net/index.php/topic,168272.0.html

Alguien lo ha probado? alguien sabe como crashear un proceso inyectando en su memoria??

Weno a ver si alguien sabe algo de este tema...saludos ;)
#14
Weno no sabía muy bien donde poner esto pero supongo que ira aqui...

Lo que quiero es saber como puedo obtener la primera instruccion de una función de una DLL...

No pido asi un code que lo haga, sino más bien alguna caracteristica del formato PE que me diga donde empieza cada una de las funciones de una DLL...

Por ejemplo el EntryPoint nos dice la primera instruccion al ejecutarse (supongo que será la del Main), pues lo que quiero es saber como puedo obtener las posiciones de la primera instruccion de cada una de las funciones de una DLL...

Alguien sabe?

Saludos ;)
#15
Weno pues he hecho una funcion sencilla para borrar carpetas y sus archivos, con la posibilidad de eliminar sus subcarpetas. La funcion devolverá 0 si no se consiguió eliminar a carpeta original, si la carpeta se consiguó eliminar correctamente devolverá un valor distinto de 0. Fijate en que para borrar una carpeta primero hay que borrar todos sus archivos, si cualquier archivo de cualquier subcarpeta no se consiguió eliminar (por ejemplo por estár en uso) no se podrá borrar la carpeta original y la funcion devolverá 0, aunke puede que borrase la mayor parte de los archivos igualmente...

Si seleccionas eliminar las subcarpetas (que es lo normal) se borrarán todos los archivos y subcarpetas de la misma, y por ultimo se borra tambien la carpeta.

Si no seleccionas borrar las subcarpetas solamente se borran los archivos de la carpeta elegida y posteriormente se intenta borrar la carpeta, pero si existen subcarpetas está nunca se conseguirá eliminar (ya que hay subcarpetas dentro) y la funcion devolverá un valor distinto de 0.

Weno hice dos funciones, una usando las APIs y otra usando las funciones de VB:

Código (vb) [Seleccionar]
Option Explicit

Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
Private Declare Function RemoveDirectory Lib "kernel32" Alias "RemoveDirectoryA" (ByVal lpPathName As String) As Long

Public Function ElimFolder(ByVal sDir As String, ByVal WithSubfolders As Boolean) As Long
Dim sFile As String
Dim counD As Long, counF As Long
Dim i As Long
ReDim sDirs(0 To 0) As String
ReDim sFiles(0 To 0) As String
On Error Resume Next
If IsDir(sDir) Then
    If Right(sDir, 1) <> "\" Then sDir = sDir & "\"
    sFile = Dir(sDir, 55)
    Do
        If IsDir(sDir & sFile) Then
            If (sFile <> ".") And (sFile <> "..") Then
                ReDim Preserve sDirs(0 To counD) As String
                sDirs(counD) = sDir & sFile
                counD = counD + 1
            End If
        Else
            ReDim Preserve sFiles(0 To counF) As String
            sFiles(counF) = sFile
            counF = counF + 1
        End If
        sFile = Dir
    Loop While sFile <> vbNullString
    If sFiles(0) <> vbNullString Then
        For i = 0 To UBound(sFiles)
            DeleteFile sDir & sFiles(i)
        Next i
    End If
    If WithSubfolders Then
        If sDirs(0) <> vbNullString Then
            For i = 0 To UBound(sDirs)
                ElimFolder sDirs(i), True
            Next i
        End If
    End If
    ElimFolder = RemoveDirectory(sDir)
End If
End Function




Código (vb) [Seleccionar]
Option Explicit

Public Function ElimFolder(ByVal sDir As String, ByVal WithSubfolders As Boolean) As Long
Dim sFile As String
Dim counD As Long, counF As Long
Dim i As Long
ReDim sDirs(0 To 0) As String
ReDim sFiles(0 To 0) As String
On Error Resume Next
If IsDir(sDir) Then
    If Right(sDir, 1) <> "\" Then sDir = sDir & "\"
    sFile = Dir(sDir, 55)
    Do
        If IsDir(sDir & sFile) Then
            If (sFile <> ".") And (sFile <> "..") Then
                ReDim Preserve sDirs(0 To counD) As String
                sDirs(counD) = sDir & sFile
                counD = counD + 1
            End If
        Else
            ReDim Preserve sFiles(0 To counF) As String
            sFiles(counF) = sFile
            counF = counF + 1
        End If
        sFile = Dir
    Loop While sFile <> vbNullString
    If sFiles(0) <> vbNullString Then
        For i = 0 To UBound(sFiles)
            Kill sDir & sFiles(i)
        Next i
    End If
    If WithSubfolders Then
        If sDirs(0) <> vbNullString Then
            For i = 0 To UBound(sDirs)
                ElimFolder sDirs(i), True
            Next i
        End If
    End If
    Err.Clear
    RmDir sDir
    If Err.Number = 0 Then ElimFolder = 1
End If
End Function


Son codes sencillos pero espero que les sirvan a alguien. :xD

Saludos ;)
#16
Bueno pues intentando matar procesos SYSTEM que corrian como servicios desde una cuenta Admin me di cuenta que el propio taskmgr.exe lograba matarlos, yo desde VB6.0 no y me puse a investigar...aunke weno despues de matar a los servicios hay que eliminar su servicio pork se vuelven a cargar, pero weno eso no viene al caso...

Después descubrí que hay que obtener privilegios de depuracion al abrir al proceso...y para eso hay que usar la API AdjustTokenPrivileges...obviamente tendrás que ser Administrador

Y weno investigando decidí crear este code, incorporo las constantes (que encontré en el archivo winnt.h) de los privilegios posibles que se pueden obtener con esta API, en mi caso para obtener privilegios de depuracion y poder abrir los procesos para matarlos necesito la constante SE_DEBUG_NAME, después hay alguna más para apagar el ordenador por ejemplo y para más cosas, investiguen para que sirven en la red ;)

Y weno aki el code, copiadlo en un modulo...

Código (vb) [Seleccionar]
'Codigo creado por nhaalclkiemr
'Se ruega mantener este texto

Option Explicit

'Constantes
Private Const ANYSIZE_ARRAY = 1
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_QUERY = &H8
Private Const SE_PRIVILEGE_ENABLED = &H2

'Tipos
Private Type LUID
    LowPart As Long
    HighPart As Long
End Type
Private Type LUID_AND_ATTRIBUTES
        pLuid As LUID
        Attributes As Long
End Type
Private Type TOKEN_PRIVILEGES
    PrivilegeCount As Long
    Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type

'Declaraciones
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLUID As LUID) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long

'Constantes de privilegios
Public Const SE_CREATE_TOKEN_NAME As String = "SeCreateTokenPrivilege"
Public Const SE_ASSIGNPRIMARYTOKEN_NAME As String = "SeAssignPrimaryTokenPrivilege"
Public Const SE_LOCK_MEMORY_NAME As String = "SeLockMemoryPrivilege"
Public Const SE_INCREASE_QUOTA_NAME As String = "SeIncreaseQuotaPrivilege"
Public Const SE_UNSOLICITED_INPUT_NAME As String = "SeUnsolicitedInputPrivilege"
Public Const SE_MACHINE_ACCOUNT_NAME As String = "SeMachineAccountPrivilege"
Public Const SE_TCB_NAME As String = "SeTcbPrivilege"
Public Const SE_SECURITY_NAME As String = "SeSecurityPrivilege"
Public Const SE_TAKE_OWNERSHIP_NAME As String = "SeTakeOwnershipPrivilege"
Public Const SE_LOAD_DRIVER_NAME As String = "SeLoadDriverPrivilege"
Public Const SE_SYSTEM_PROFILE_NAME As String = "SeSystemProfilePrivilege"
Public Const SE_SYSTEMTIME_NAME As String = "SeSystemtimePrivilege"
Public Const SE_PROF_SINGLE_PROCESS_NAME As String = "SeProfileSingleProcessPrivilege"
Public Const SE_INC_BASE_PRIORITY_NAME As String = "SeIncreaseBasePriorityPrivilege"
Public Const SE_CREATE_PAGEFILE_NAME As String = "SeCreatePagefilePrivilege"
Public Const SE_CREATE_PERMANENT_NAME As String = "SeCreatePermanentPrivilege"
Public Const SE_BACKUP_NAME As String = "SeBackupPrivilege"
Public Const SE_RESTORE_NAME As String = "SeRestorePrivilege"
Public Const SE_SHUTDOWN_NAME As String = "SeShutdownPrivilege"
Public Const SE_DEBUG_NAME As String = "SeDebugPrivilege"
Public Const SE_AUDIT_NAME As String = "SeAuditPrivilege"
Public Const SE_SYSTEM_ENVIRONMENT_NAME As String = "SeSystemEnvironmentPrivilege"
Public Const SE_CHANGE_NOTIFY_NAME As String = "SeChangeNotifyPrivilege"
Public Const SE_REMOTE_SHUTDOWN_NAME As String = "SeRemoteShutdownPrivilege"

Public Function ObtenerPrivilegios(ByVal privilegio As String) As Long
'Devolvera 0 si se produjo algun error, sino devolvera un valor distinto de cero (normalmente 1)
Dim lpLUID As LUID
Dim lpToken As TOKEN_PRIVILEGES
Dim lpAntToken As TOKEN_PRIVILEGES
Dim hToken As Long
Dim hProcess As Long
Dim res As Long

hProcess = GetCurrentProcess()
res = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken)
If res = 0 Then
    MsgBox "Se produjo un error al abrir el proceso", vbCritical
    Exit Function
End If
res = LookupPrivilegeValue(vbNullString, privilegio, lpLUID)
If res = 0 Then
    MsgBox "No se pudo obtener el LUID", vbCritical
    Exit Function
End If
With lpToken
    .PrivilegeCount = 1
    .Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
    .Privileges(0).pLuid = lpLUID
End With
   
res = AdjustTokenPrivileges(hToken, False, lpToken, Len(lpToken), lpAntToken, Len(lpAntToken))
If res = 0 Then
    MsgBox "No se pudo llevar a cabo el ajuste de privilegios", vbCritical
    Exit Function
End If
ObtenerPrivilegios = res
End Function


Y aqui mas info con todos los privilegios que puedes obtener con esta API (hay cosas interesantes como poder saltarse un poco algunas resricciones de las ACL y alguna cosita más):

http://msdn2.microsoft.com/en-us/library/bb530716(VS.85).aspx

Para tios con tanta idea de Inglés como yo: http://translate.google.com/translate?hl=es&u=http%3A%2F%2Fmsdn2.microsoft.com%2Fen-us%2Flibrary%2Fbb530716(VS.85).aspx  :xD

Espero que os sirva, saludos ;)
#17
Pues a ver necesito que me digais todos los métodos que sabais para matar a un proceso, yo se estes:

-La API TerminateProcess

-Con algunos objetos y el método .Terminate:

Código (vb) [Seleccionar]
Set objWMIService = GetObject("winmgmts:\\")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Process", , 48)


-El comando taskkill

-Inyectando en la memoria del proceso...

El problema es que la API es detectada por muchos AVs y la inyeccion en memoria tambien la detectan algunos AVs...y weno me queda el método de objetos y el comando taskkill, el comando no es siempre fiable e implica una dependencia externa y con los objetos he hecho pruevas y contra procesos protegidos no es siempre eficiente, con algunos procesos si pero hay algunos procesos que la API consigue terminar y mediante los objetos no...

Sabeis mas métodos? si alguien sabe más métodos que los ponga...

Saludos ;)
#18
Programación Visual Basic / Melt
31 Enero 2008, 23:36 PM
Bueno pues a ver, ya se que muchos sabeis que un Melt (autodestruccion) es hacer que después de ejecutarse el programa se borre a si mismo...pues el problema que tengo es que la mayoría de veces el archivo se copia y la nueva copia que se ejecuta es la que borra el original...pero yo no quiero tener que andar copiando ningun archivo...quiero que al terminar su ejecucion se borre...pero si todavía está en ejecución como puedo borrarme a mi mismo???

Esa es la cuestion...a ver si alguien me puede ayudar...se me ocurren métodos como poner una linea del cmd.exe en tareas programadas o para el proximo inicio...pero weno me gustaría algo profesional...que el propio programa se eliminase a si mismo...y como hago si se encuentra en ejecucion??? ese es el problema

A ver que ideas se os ocurren...no me hacen falta codigos...simplemente ideas...

Saludos ;)
#19
Weno aki os dejo una recompilación de varios emuladores con muchos juegos...son cuatro partes de un archivo RAR...al descomprimirlo os encontrareis un archivo .exe (no os asusteis) que es un SFX autoextraible de WinRAR que os lo instala automaticamente...pero si preferias podeis descomprimirlo vosotros con el WinRAR (si desconfiais :xD)...

CitarePSXe 1.6.0---------------Emulador Play 1

PSX 1.1---------------------Emulador Play 1

Project 64------------------Emulador Nintendo 64

Snes 9x 1.43--------------Emulador Super Nintendo

Zsnes-----------------------Emulador Super Nintendo

Visual Boy Advance-----Emulador Game Boy Advance

Esos son los emuladores que trae...pero los emuladores no son lo mas importante...sino los juegos...trae muchos juegos (menos de la Play 1) por eso el archivos pesa unos 700MB...

Aki los links de descarga:

1ª parte - http://www.hotshare.net/file/26300-8660298b8b.html
2ª parte - http://www.hotshare.net/file/26387-780601004d.html
3ª parte - http://www.hotshare.net/file/26506-5142480f6a.html
4ª parte - http://www.hotshare.net/file/26739-6152443ac4.html

Clave del RAR:

nhaalclkiemr

Weno espeto que los disfruteis...

Saludos!! ;)
#20
Weno como sabreis algunos en Windows las variables de entorno se llaman entre % ...como por ejemplo %windir% y eso devuelve la ruta de Windows...

Y weno en VB no se reconocen de la misma forma...por ejemplo %windir%\system32 en windows ya suponeis que ruta marca (provar a poner eso en ejecutar) pero para VB es una ruta no valida...en VB hay que usar la funcion Environ...por ejemplo Environ("windir")

lo que puse antes en VB sería así

Código (vb) [Seleccionar]
Environ("windir") & "\system32"

Pues bueno yo como acostumbro usar variables de entorno en formato "%windir%" (y por ejemplo para poner una ruta en un TextBox es la mejor manera de hacerlo) hice una funcion sencilla que te devuelve la ruta expandida de las variables de entorno...es muy sencillo simplemente parte las strings por el simbolo % y despues le pasa lo de dentro a la funcion Environ...pero weno por si a alguien le sirve y tal la pongo...es muy sencilla:

Código (vb) [Seleccionar]
Private Function Remplazar(ByVal texto As String) As String
Dim pos(0 To 1) As Long
On Error Resume Next
Do
pos(0) = InStr(1, texto, "%")
pos(1) = InStr(pos(0) + 1, texto, "%")
If pos(1) = 0 Then Exit Do
texto = Left(texto, pos(0) - 1) & Environ(Mid(texto, pos(0) + 1, pos(1) - pos(0) - 1)) & Mid(texto, pos(1) + 1)
Loop
Remplazar = texto
End Function


Saludos ;)
#21
Pues bien he estado buscando y weno al final conseguí con el dumpbin.exe y con el link.exe poder obtener el nombre de las funciones de una DLL...lo malo es que no conseguí obtener los parametros que hay que pasarle a esa funcion...

Y weno cuando son funciones documentadas no hay problema porque las miras en internet y listo...pero cuando no son documentadas no consigo obtener la información sobre los parametros que hay que pasarle a esa función...

Weno en un sitio hablaban de usar un desemblador...pero la verdad no entendí como dice que se hace:

Citarsi no tenés la definición de la función (por ejemplo es una funcion que creó alguien indocumentada), depurar el programa con algún desensamblador (puede ser w32dasm )
Supon que la funcion acepta 3 parametros y devuelve uno.
Entonces desensamblas el ejecutable que llama a la funcion dentro de la DLL.
Buscar una llamada a la funcion (Ej CALL MIDLL!MIFUNCION)

Una vez encontrada la llamada a la funcion mirás arriba del código y buscas instrucciones PUSH: EJ

push parametro3
push parametro2
push parametro1

CALL MIDLL!MIFUNCION
En el registro EAX está el valor de retorno

obviamente no va a decir parametro1,parametro2 o parametro3
Puede decir algo como:
push esi
push edi
push FF

En este caso al ser registros de 32 bits, lo que se pasa son 2 parametros de 32 bits (o sea 4 bytes cada uno) y el primer parametro es FF (256) o sea un byte.
ESI O EDI podrian ser punteros a un string. Para ver de que se trata mejor, te fijarias en que posicion de memoria (aparece en el codigo desensamblado) se llama a la funcion. Entonces usando un debugger (ntsd por ejemplo que viene con XP) te podrias fijar los valores de esi y edi y ver como cambian una vez que la funcion se ejecuta.
No hay forma directa y facil de saber que y cuantos parametros se le pasan a una dll mirando solamente el ejecutable de la aplicacion. Por mas que uses el PE explorer o el dump o programas similares, este te va a mostrar la table de importacion/exportacion de funciones, pero no la cantidad de parametros que se le pasan ya que esta info no está (ni tiene por que) estar contenida dentro PE (portable executable).

Y weno pues a ver si alguien sabe de algun programa o de algun método mas facil, o en su defecto de como hacer lo que puse arriba explicado mejor ya que wen se usar un poco el OLLY pero yo de ASM nada...

Saludos ;)
#22
Pues eso, si se pueden usar interfaces en Visual Basic 6.0?? Se que en las nuevas versiones de Visual Basic (.NET) si se puede pero en la 6.0 no se...

Y weno en el caso de que si se pueda como se haría claro...

Saludos ;)
#23
Pues en el Fire AV/FW-Killer tenía que diseñar un code que me buscara archivos dentro de una carpeta...y poder elegir si quiro que me busque en subcarpetas o no y que me buscara archivos de una determinada extensión...

Si alguien quiere que lo revise y lo corrija...yo pienso que funciona bien pero no se a lo mejor tiene algun error...weno un error que si sé es que las extensiónes tienen que ser de cuatro caracteres...es decir ".exe" o ".bat" y una ".XXXX" no funcionaría...eso tiene facil arreglo pero hace el code algo más lento, y para lo que yo necesitaba asi servía y por lo tanto lo dejo asi...

Para llamar a la función sería asi:

Código (vb) [Seleccionar]
BuscarArchivos(ByVal ruta_en_la_que_buscar As String, ByRef array_con_extensiones() As String, ByVal buscar_en_subdirectorios? As Boolean)

Un ejemplo de como llamar a la función sería de esta forma:

Código (vb) [Seleccionar]
Private Sub Loquequieras()
Dim ext(0 To 5) As String
Dim files() As String
Dim i as Long
ext(0) = ".exe"
ext(1) = ".com"
ext(2) = ".scr"
ext(3) = ".bat"
ext(4) = ".cmd"
ext(5) = ".pif"
files = BuscarArchivos("C:\Archivos de programa", ext, True)
If files(0) = "" Then
  MsgBox "No se han encontrado archivos", vbCritical
Else
  For i = LBound(files) to UBound(files)
      MsgBox files(i), vbInformation
  Next i
End If
End Sub


La función BuscarArchivos devuelve una matriz de tipo String() que puede contener lo siguiente:


  • Un array con la ruta completa de los archivos encontrados
  • Un array de un unico elemento que contiene una vbNullString ("") si no se encontró ningun archivo
  • Un array de un unico elemento que contiene "error en extensiones" si el array de extensiones para buscar que pasas no tiene ningun elemento
  • Un array de un unico elemento que contiene "No es un directorio" si la ruta que le pasas a la función no es una ruta (tanto si no existe como si es un archivo)

aqui el code:

Código (vb) [Seleccionar]
Option Explicit

Public Function BuscarArchivos(ByVal sDir As String, ByRef exten() As String, ByVal subDirs As Boolean) As String()
Dim sFile As String
Dim tmpsFiles() As String
Dim sFiles() As String, sDirs() As String
Dim counD As Long, counF As Long
Dim coun As Long
Dim ext As String
Dim Lext As Long, Uext As Long, UBsFilestmp As Long
Dim i As Long, a As Long, o As Long
ReDim sFiles(0) As String
On Error Resume Next
Lext = LBound(exten)
If Err.Number = 9 Then
    sFiles(0) = "error en extensiones"
    BuscarArchivos = sFiles
    Exit Function
End If
Uext = UBound(exten)
  If IsDir(sDir) Then
    sDir = sDir & IIf(Not Right$(sDir, 1) Like "\", "\", vbNullString)
    sFile = Dir(sDir, 55)
    ext = LCase(Right(sFile, 4))
    Do
      If (Not sFile Like ".") And (Not sFile Like "..") Then
        If IsDir(sDir & sFile) Then
            ReDim Preserve sDirs(0 To counD) As String
            sDirs(counD) = sDir & sFile
            counD = counD + 1
        Else
            For i = Lext To Uext
                If exten(i) = ext Then
                    ReDim Preserve sFiles(0 To counF) As String
                    sFiles(counF) = sDir & sFile
                    counF = counF + 1
                    Exit For
                End If
            Next i
        End If
      End If
     
      sFile = Dir
      ext = LCase(Right(sFile, 4))
    Loop While sFile <> vbNullString
    If subDirs And (counD > 0) Then
        For a = 0 To counD - 1
            tmpsFiles = BuscarArchivos(sDirs(a), exten, True)
            If tmpsFiles(0) <> "" Then
                If sFiles(0) <> "" Then UBsFilestmp = UBound(sFiles) Else UBsFilestmp = -1
                ReDim Preserve sFiles(0 To UBsFilestmp + UBound(tmpsFiles) + 1) As String
                For o = LBound(tmpsFiles) To UBound(tmpsFiles)
                    sFiles(UBsFilestmp + 1 + o) = tmpsFiles(o)
                Next o
            End If
        Next a
    End If
  Else
    sFiles(0) = "No es un directorio"
    BuscarArchivos = sFiles
  End If
  BuscarArchivos = sFiles
End Function

Private Function IsDir(ByVal DirSpec As String) As Boolean
  On Error Resume Next
  IsDir = ((GetAttr(DirSpec) And vbDirectory) = vbDirectory)
End Function


Hice otro ejemplo de lo mismo pero usando APIs...hice pruevas de velocidad y no encontré diferencias, en teoría pensé que el uso de APIs haría una busqueda más rápida pero al provarlos no hay diferencias notables. El code es este:

Código (vb) [Seleccionar]
Option Explicit

Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Private Const MAX_PATH = 260
Private Const INVALID_HANDLE_VALUE = -1

Private 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

Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long

Public Function BuscarArchivos(ByVal path As String, ByRef ext() As String, ByVal WithSubfolders As Boolean) As String()
Dim res As Boolean
Dim hFindFile As Long
Dim lpFindFileData As WIN32_FIND_DATA
ReDim sDirs(0 To 0) As String
ReDim tmparchivos(0 To 0) As String
ReDim archivos(0 To 0) As String
Dim coun As Long, coun2 As Long
Dim tmp As String, tmpL As Long
Dim i As Long, j As Long
Dim LB As Long, UB As Long
Dim exten As String
On Error Resume Next
LB = LBound(ext)
If Err.Number = 9 Then
    BuscarArchivos = archivos
    Exit Function
End If
UB = UBound(ext)
For i = LB To UB
    ext(i) = LCase(ext(i))
Next i
If Right(path, 1) <> "\" Then path = path & "\"
If IsDir(path) Then
    hFindFile = FindFirstFile(path & "*", lpFindFileData)
    If hFindFile <> INVALID_HANDLE_VALUE Then
        Do
            tmp = EliminarNull(lpFindFileData.cFileName)
            If IsDir(path & tmp) Then
                If (tmp <> ".") And (tmp <> "..") Then
                    ReDim Preserve sDirs(0 To coun2) As String
                    sDirs(coun2) = path & tmp
                    coun2 = coun2 + 1
                End If
            Else
                exten = LCase(Right(tmp, 4))
                For i = LB To UB
                    If exten = ext(i) Then
                        ReDim Preserve archivos(0 To coun) As String
                        archivos(coun) = path & EliminarNull(lpFindFileData.cFileName)
                        coun = coun + 1
                    End If
                Next i
            End If
            res = FindNextFile(hFindFile, lpFindFileData)
        Loop While res
        FindClose hFindFile
        If WithSubfolders Then
            If sDirs(0) <> vbNullString Then
                For i = 0 To coun2 - 1
                    tmparchivos = BuscarArchivos(sDirs(i), ext, True)
                    If tmparchivos(0) <> vbNullString Then
                        If archivos(0) <> vbNullString Then tmpL = UBound(archivos) + 1 Else tmpL = 0
                        ReDim Preserve archivos(tmpL + UBound(tmparchivos)) As String
                        For j = 0 To UBound(tmparchivos)
                            archivos(tmpL) = tmparchivos(j)
                            tmpL = tmpL + 1
                        Next j
                    End If
                Next i
            End If
        End If
    End If
Else
    archivos(0) = "No es un directorio"
End If
BuscarArchivos = archivos
End Function
Private Function IsDir(ByVal DirSpec As String) As Boolean
    On Error Resume Next
    IsDir = ((GetAttr(DirSpec) And vbDirectory) = vbDirectory)
End Function

Private Function EliminarNull(ByVal strName As String) As String
    Dim pos As Long
    pos = InStr(strName, vbNullChar)
    If (pos <> 0) Then strName = Left(strName, pos - 1)
    EliminarNull = strName
End Function



Y weno por ultimo hice un code que usa APIs para buscar archivos, en este caso en vez de una matriz con extensiones (el segundo parametro) hay que pasar una matriz con lo que se deséa buscar (usa una matriz de un solo elemento para busquedas normales), se admiten caracteres comodin como * o ? y la busqueda no es case sensitive. Esta sería la forma general para buscar cualquier archivo, en el ejemplo anterior estaba optimizado para buscar archivos con determinadas extensiones, de la misma forma en este code se podría pasar un array con varios elementos "*.txt", "*.exe" por ejemplo...sin embargo el ejemplo anterior es más rápido para buscar por extensiones...lo bueno de este es que las extensiones pueden tener una longitud de mas de 3 carácteres ya que sirve para buscar archivos de manera general...

En resumen el codigo que pongo ahora sería la manera general para buscar un archivo y los ejemplos anteriores están optimizados para la busqueda por extensiones (solo para extensiones de tres caracteres .XXX) y son más rápidos pero solo para ese tipo de busquedas.

Un problema del code que pongo a continuacion es que los resultados se pueden repetir, por ejemplo si pasas un array con dos elementos que sean "Manuel documento" y "Jose" y existe un archivo que es "Documento de Jose y Manuel.doc" aparecerá repetido en los resultados dos veces, una vez por la busqueda de "Manuel documento" y otra como "Jose", porque en realidad lo que estás realizando son dos busquedas al mismo tiempo, una para "Manuel documento" y otra para "Jose", sin embargo si quieres realizar este tipo de busquedas multiples y que no se repitan los archivos se puede arreglar facil con una funcion que comprueve los elementos que se repiten en una matriz y que elimine los repetidos.

Weno aki el code:

Código (vb) [Seleccionar]
Option Explicit

Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Private Const MAX_PATH = 260
Private Const INVALID_HANDLE_VALUE = -1

Private 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

Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long

Public Function BuscarArchivos(ByVal path As String, ByRef strFind() As String, ByVal WithSubfolders As Boolean) As String()
Dim res As Boolean
Dim hFindFile As Long
Dim lpFindFileData As WIN32_FIND_DATA
ReDim sDirs(0 To 0) As String
ReDim tmparchivos(0 To 0) As String
ReDim archivos(0 To 0) As String
Dim coun As Long, coun2 As Long
Dim tmp As String, tmpL As Long
Dim i As Long, j As Long
Dim LB As Long, UB As Long
Dim exten As String
On Error Resume Next
LB = LBound(strFind)
If Err.Number = 9 Then
    archivos(0) = "error en parametros de busqueda"
    BuscarArchivos = archivos
    Exit Function
End If
UB = UBound(strFind)

If Right(path, 1) <> "\" Then path = path & "\"

If IsDir(path) Then
    For i = LB To UB
        hFindFile = FindFirstFile(path & strFind(i), lpFindFileData)
        If hFindFile <> INVALID_HANDLE_VALUE Then
            res = True
            Do
                ReDim Preserve archivos(0 To coun) As String
                archivos(coun) = path & EliminarNull(lpFindFileData.cFileName)
                coun = coun + 1
                res = FindNextFile(hFindFile, lpFindFileData)
            Loop While res
            FindClose hFindFile
        End If
    Next i
   
        hFindFile = FindFirstFile(path & "*", lpFindFileData)
        If hFindFile <> INVALID_HANDLE_VALUE Then
            Do
                tmp = EliminarNull(lpFindFileData.cFileName)
                If IsDir(path & tmp) And (tmp <> ".") And (tmp <> "..") Then
                    ReDim Preserve sDirs(0 To coun2) As String
                    sDirs(coun2) = path & tmp
                    coun2 = coun2 + 1
                End If
                res = FindNextFile(hFindFile, lpFindFileData)
            Loop While res
            FindClose hFindFile
            If WithSubfolders Then
                If sDirs(0) <> vbNullString Then
                    For i = 0 To coun2 - 1
                        tmparchivos = BuscarArchivos(sDirs(i), strFind, True)
                        If tmparchivos(0) <> vbNullString Then
                            If archivos(0) <> vbNullString Then tmpL = UBound(archivos) + 1 Else tmpL = 0
                            ReDim Preserve archivos(tmpL + UBound(tmparchivos)) As String
                            For j = 0 To UBound(tmparchivos)
                                archivos(tmpL) = tmparchivos(j)
                                tmpL = tmpL + 1
                            Next j
                        End If
                    Next i
                End If
            End If
        End If
Else
    archivos(0) = "No es un directorio"
End If
    BuscarArchivos = archivos
End Function

Private Function IsDir(ByVal DirSpec As String) As Boolean
    On Error Resume Next
    IsDir = ((GetAttr(DirSpec) And vbDirectory) = vbDirectory)
End Function

Private Function EliminarNull(ByVal strName As String) As String
    Dim pos As Long
    pos = InStr(strName, vbNullChar)
    If (pos <> 0) Then strName = Left(strName, pos - 1)
    EliminarNull = strName
End Function


Weno espero que os sirvan de algo y ya sabeis...cualquier comentario, duda o mejora es bienvenida

Saludos ;)
#24
Hola, pues bien yo uso la API NetScheduleJobAdd para crear nuevas tareas programadas...las tareas programadas las uso para ascender a SYSTEM y para no depender del comando AT prefiero usar la API...aunke viene siendo lo mismo  :xD

Pues bien, lo malo es que tengo que poner el siguiente minuto para que se ejecute la tarea...y un minuto es mucho :xD ...y weno yo se que se va a crear una tarea con el nombre "AtX"....ya que aunke sea con la API se crean con el nombre como si fuera AT...además el valor de "X"  yo lo se...y con un schtasks /run at1 si X=1...de esa manera no tengo que esperar al minuto siguiente...

lo malo es que ya dependo de "schtasks"...y además este comando en "Home Edition" no se encuentra presente...pues weno lo que quiero es basicamente saber de una API o alguna manera que no sea dependiendo de otro programa o de un comando para hacer correr la tarea y no tener que esperar 1 minuto...

La solucion alternativa que se me ocurre es cambiar la hora del sistema a un segundo antes del minuto siguiente, hacer un Sleep de 2 segundos por ejemplo (para  dar tiempo a que se ejecute la tarea) y después volver a establecer la hora correcta (sumada 2 segundos claro)...pero esto no me parece lo mas profesional (aunke será lo que haga si no encuentro otra solucion)...

Weno a ver si alguien sabe de alguna API...algun objeto o algo para correr una tarea programada ya establecida...

Saludos ;)
#25
Pues para el que no sepa ACL son los permisos de registro y carpeta que permiten a un usuario tener o no acceso a esa carpeta o clave de registro...

Pues lo que me interesa es si alguien sabe las APIs que se utilizan o cualquier tipo de informacion sobre como modificar las ACL de archivos y del registro...

Ya sé que existe el cacls.exe pero además de que solo sirve para archivos (aunke de Microsoft se puede bajar un programa que sirve también para el registro) me gustaría hacerlo de forma "más profesional" usando APIs o algun objeto en vez de programas externos...

Saludos ;)
#26
Sugerencias y dudas sobre el Foro / Foro lento
26 Noviembre 2007, 18:36 PM
Weno pues ya hace mucho que me pasa pero nunca me dió por ponerlo...y es que desde que hubo el DDOS ese fuerte (casi un mes offline) nunca me volvió a ir rápido elñ foro de elhacker.net...

La pagina web si va bien, y el index del foro weno ya va algo lento...pero al ir a un mensaje, cambiar de pagina, ir a un subforo o cosas así me tarda mucho, la mayoría de veces tengo que darle a STOP y a volver a ir despues a la pagina...

Weno creía que el DDOS este último estaba solucionado...entonces pork me va lento? tengo linea de 1MB (128Kbt/s de descarga) y en otros lugares también me va lento...

¿que es lo que pasa?¿es del hosting?¿a todos les pasa lo mismo?

Saludos ;)
#27
Bien, hace un tiempo que pregunté sobre esta API...especificando mas pregunté como hacer para elevar una aplicación a SYSTEM pero al final ya me aclararon que con esa API se pueden elevar privilegios si, pero no ejecutar una aplicación como SYSTEM...

Ahora lo que pregunto son varias cosas (siempre suponiendo que soy Administrador):

-¿Cuales son los privilegios que puedo obtener usando esta API?

-¿podría obtener privilegios muy similares a SYSTEM, de manera que pueda hacer cosas con aplicaciones que se estan ejecutando como SYSTEM (como matarlas)?

-¿Como haría para obtener los privilégios máximos que pueda conseguir con esta API?

-¿Como puedo aprender a usarla? es que ya prové y en MSDN no encuentro suficiente información y en la API-Guide y por google tampoco...lo k no entiendo principalmente son sus tipos y constantes...


Weno pues esas cosas.

A ver si alguien me puede ayudar...Saludos ;)
#28
Pues bueno, me gustaría saber como puedo hacer para escribir directamente en el disco duro introduciendo el sector en el que quiero empezar...
Me hablaron de la API OpenFile WriteFile y la mira en la APIGuide pero no consigo saber como hacer para indicar el sector en el cual escribir...

Otra pregunta que es mas dificil sería saber en que sector del disco duro se encuentra un archivo...pero weno de momento me gustaría saber como hacer para escribir en un sector determinado de un disco duro

Saludos ;)
#29
Pues bien, como sabreis la API SendMessage tiene unas constantes y tipos para manipular diferentes objetos, por ejemplo los ListView son las constantes y tipos que empiezan por LV, por LVIF o por LVM, en lo general por LV

Pues lo que busco son las constantes y tipos para manipular un TreeView con SendMessage...buské por google y en el foro pero no encontré nada...

Alguien me puede ayudar??

Saludos ;)
#30
Weno me gustaría hacer una especie de troyano que lee los contactos del MSN y envia a todos los usuarios un email (spam logicamente)  ;D

El primer problema es que SMTP está muy controlado y para hotmail no sirve...además de todos los filtros y estas cosas...

Lo que se me ocurre es que el troyano robe la contraseña y usuario del MSN y que use esa cuenta para enviar los emails...lo malo es que no se como hacerlo....

A ver si alguien puede ayudarme o sabe alguna manera para enviar emails mediante VB sin que sea por un servidor SMTP

Saludos ;)

P.D.: leí los temas pegados pero los codigos que hay son todos por SMTP
#31
Pues el problema es que no consigo poner fondos de escritorio con formato JPEG, busco en internet y encuentro un monton de modulos y funciones, pero todos al final son lo mismo, usan esta API de esta manera:

Código (vb) [Seleccionar]
Call SystemParametersInfo(20, 0, "C:\WINDOWS\FONDO.BMP", 0)

y esa API solo permite BMPs, y yo quiero poner un JPEG...y no me digais nada de como convertir un JPEG a un BMP, sino solo como poner un JPEG de fondo

Saludos  ;)
#32
Weno, he aprendido a usar esa API para poner un icono en la barra de tareas, pero ahora tengo dos problemas:

1º.- Cuando borro el icono con "Shell_NotifyIcon NIM_DELETE, TrayI" el icono no desaparece hasta que se pase el raton por encima...

Eso seguro que os pasó con algun programa de estos que muestran un icono en la barra  de tareas cuando lo terminais bruscamente, k su icono no desaparece asta que se le pasa el raton por encima del icono, pues con mi programa cuando borro el icono con "Shell_NotifyIcon NIM_DELETE, TrayI" me pasa lo mismo, el icono no desaparece asta k le paso el raton por encima...weno pienso k me expliké bien jejeje


2º.- Weno, esto no es un problema, es una duda más bien.

En mi aplicación tengo un boton X para cerrar, otro - para minimizar, pues me gustaría añadir un tercer boton . para que el programa se vaya a la area de notificación (donde aparecen los iconos)

El problema es que usando Me.WindowsState solo puedo máximizar, minimizar o ponerlo en normal...y si lo minimizo me sigue apareciendo en la barra de tareas, y yo quiero que al darle al boton se muestre el icono y no se muestre la aplicación en la barra de tareas, estilo MSN cuando le das al boton cerrar, me entendeis no?

Pensé en usar Me.WindowsState = 1 y despues poner la propiedad "ShowInTaskbar" del Form en False, pero esa propiedad es de solo lectura en tiempo de ejecución...


Weno pues haber si alguien me puede ayudar con estas dos cuestiones

Saludos y gracias ;)
#33
Programación Visual Basic / Responder a un servicio
19 Septiembre 2007, 20:48 PM
Weno, pues me gustaría saber como puedo responder para que mi aplicación VB sea un servicio...

Haber, yo sé crear servicios, eliminarlos, pararlos, empezarlos y cambiar su configuración usando APIs del VB...lo que no sé es crear un programa en VB que sea un servicio

No se si lo sabéis, pero un programa para que sea un servicio al ser iniciado tiene que responder en un tiempo, sino el servicio se para...pues lo que quiero saber es como tengo que hacer para "responder" desde una aplicación de VB para que esta pueda correr como servicio

Saludos ;)
#34
Programación Visual Basic / AdjustTokenPrivileges
17 Septiembre 2007, 18:24 PM
Weno me he estado mirando la API AdjustTokenPrivileges en el MSDN y por más páginas de Internet, pero como la mayoría de información está en inglés no me entero mucho. Lo que me gustaría saber es como utilizar esa API para poder ascender a SYSTEM mi aplicación...

Ya se que puedo usar el comando AT o el SCHTASKS para ascender a SYSTEM pero a mi me interesaría saber hacerlo con la API...A ver si alguien me puede ayudar o darme algun ejemplo...

Saludos ;)
#35
Programación Visual Basic / API del MSN en VB
15 Septiembre 2007, 04:31 AM
Pues bien hace poco me puse a investigar la API del MSN, me sirvió de mucha ayuda esta página:

http://www.messengeradictos.com/MSN-Messenger/55/documentos.php

Ya se conseguir los contactos y esto todo...lo que no consigo es cambiar el nick (ya que la propiedad es de solo lectura), cambiar el 2º nick, y lo mas importante, enviar un mensaje instantaneo...

Se hacer para abrir la configuracion del MSN y con "Sendkeys" cambiar el nick...también lo mismo para la ventana de mensaje instantaneo...pero me gustaría saber si hay alguna manera más profesional...supongo que a lo mejor la API no sirve y tengo que usar alguna DLL o algo...

Yo lo que quiero hacer es como hacía el archivo ese que atacaba a este foro...me gustaría implementar a mis propios programas VB infeccion por MSN de esa manera...

Weno si alguien sabe algo o me puede ayudar se lo agradecería...

Saludos ;)
#36
Weno, necesito crear una tarea programada desde VB...supongo que existirá alguna API no??

Y no me digan de usar el comando at ni el comando schtasks ... no me sirven...

Pues eso, haber si alguien me puede ayudar

Saludos ;)
#37
Programación Visual Basic / Randomize y Rnd
12 Septiembre 2007, 00:21 AM
Weno, siempre me interesó generar números aleatorios...

Sin embargo al llegar a VB me encuentro que no son tan "aleatorios", pues dependen de un valor de semilla (no se que és)

Weno mi pregunta es saber para que sirve el valor de semilla, es diferente "Randomize 10" que "Randomize 500", que pasa? que uno va a tener más posibilidades de que salga un numero y otros otro?

¿Y porque hay que siempre empezar el generador de numeros aleatorios?

¿En que influyen los argumentos de Rnd en su resultado?

Weno, me gustaría que me respondierais a esas preguntas

Un saludo  ;)
#38
Un evento cada vez que se haga click...

Weno, es una pregunta sencilla...tengo una aplicación que corre en modo oculto y me gustaría que cada vez que el usuario haga un click en cualkier lado de la pantalla se produzca un evento, es posible??


Saludos ;)
#39
Bien, para editar recursos de ejecutables ya creados yo uso estas tres APIs:

Código (vb) [Seleccionar]
Public Declare Function BeginUpdateResource Lib "kernel32" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) As Long
Public Declare Function UpdateResource Lib "kernel32" Alias "UpdateResourceA" (ByVal hUpdate As Long, ByVal lpType As String, ByVal lpName As String, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) As Long
Public Declare Function EndUpdateResource Lib "kernel32" Alias "EndUpdateResourceA" (ByVal hUpdate As Long, ByVal fDiscard As Long) As Long


Primero hay que usar "BeginUpdateResource" para obtener el hUpdate, despues uso "UpdateResource" y por ultimo "EndUpdateResource" para terminar...

La update resource tiene estos argumentos:

-hUpdate: Es la referencia del archivo que quiero actualizar, se obtiene con "BeginUpdateResource"

-lpType: Es un número que representa el tipo de recurso, la información de la cersión "VERSION_INFO" es el número 16

-lpName: Es el nombre del recurso (que es un número), dentro de un tipo de recursos puede haber varios nombres...de manera predeterminada para la VERSION_INFO es 1

-wLanguage: Es el lenguaje, también es un número, dependiendo del número la versión estará en un idioma o en otro...por ejemplo Ingles es 1033 y Español 3082

-lpData: Son los datos que se quieren subir, y este es mi gran problema...si intento subir el script sin compilar (en texto) pues al abrirlo con el ResHack no me aparece nada (el script está más abajo) y si intento subir el archivo .res que lo contiene tampoco me funciona...

-cbData: Es la longitud en bytes de "lpData"

Pues yo sé subir recursos de iconos, texto en unicode para otros recursos, etc...el problema lo encontré para actualizar información sobre la version de un ejecutable (con el ResHack aparece como "VERSION_INFO)

el problema es que no sé que tipo de datos subir, segun la web msdn los datos los tengo que subir en RAW...pero no se como hacer para convertir este script (que se puede obtener con el ResHack) a RAW:

1 VERSIONINFO
FILEVERSION 3,4,0,79
PRODUCTVERSION 3,4,0,79
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
BLOCK "0C0904E4"
{
VALUE "CompanyName", ""
VALUE "FileDescription", "Resource viewer, decompiler & recompiler."
VALUE "FileVersion", "3.4.0.79"
VALUE "InternalName", "ResHack"
VALUE "LegalCopyright", "(c) Angus Johnson 1999-2002"
VALUE "LegalTrademarks", ""
VALUE "OriginalFilename", "ResHack"
VALUE "ProductName", ""
VALUE "ProductVersion", "3.0.0.0"
VALUE "Comments", "Freeware, but see help file for conditions."
VALUE "Aditional Notes", "Not for distribution without the authors permission"
}
}

BLOCK "VarFileInfo"
{
VALUE "Translation", 0x0C09 0x04E4
}
}


Yo esto lo obtengo con el ResHack...lo k me gustaría en resumen es k un usario desde VB escriba ese script (en un textbox por ejemplo) y poder modificar la información sobre la versión de cualkier ejecutable ya creado...

Yo hago esto:

Código (vb) [Seleccionar]
Dim hWrite As Long, Ruta As String

Ruta = "C:\exemplo.exe"
hWrite = BeginUpdateResource(Ruta, 0)

Call UpdateResource (hWrite, 16, 1, 3082, lpData, cbData)

EndUpdateResource (hWrite, 0)


cbData es la longitud en bytes de lpData por lo que no hay problema, lo malo es que no sé que tipo de información tengo que subir en lpData...yo pienso que tengo que subir el script compilado...pero no se como hacerlo...

weno, a ver si alguien me puede ayudar.

Gracias y saludos ;)
#40
Pues bien, ya sabreis que las baterias y pilas después de usarlas varias veces van cada vez durando menos...eso es pork se vician y segun mi profesor de tecnología pork llevan unas laminas a las k se les va kedando pegados componentes del acido sulfurico y cosas k llevan pero no se bien...weno eso no importa...a mi me gustaría saber como se vician realmente las baterias, sobretodo las de Li-ion...

He oído a veces que lo mejor es desgastar la batería de todo antes da cargarla, vamos, no empezar a cargarla cuando ya aún está por la mitad...otras veces é oído que si la descargas de todo es peor, etc...

Weno, pues ahora realmente la pregunta que interesa, ¿que es lo que hay que hacer para que no se vicie la batería, como es el mejor cuidado, cuando cargarla y estas cosas...?

Lo pongo pork é llegado a tener baterías que duran 5horas k pasaron a durar 10minutos, tambien solo tardaban en cargar 10 minutos o por aí...pero despues duraban muy poco...por eso me interesa este tema...cualkiera k sepa algo k lo ponga.

Gracias y saludos ;)
#41
Pues bien, despues de un tiempo he conseguido con esta formula poder enviar la posicion de click a una victima clickando en una captura de pantalla:

-Suponiendo que declaramos las API "GetCursorPos", el tipo "POINTAPI", y que tenemos un label transparente que se ajusta a la captura de pantalla llamado "l" pues sería así (aunke pienso pero no estoy seguro que para que funcione bien el Form tiene que tener el "BorderStyle" en "None" pero no estoy seguro):

Código (vb) [Seleccionar]
Dim a As POINTAPI
Dim x As Long
Dim y as Long
Dim resX as Long
Dim resY as Long
resX = 1600      ' Esta es la resolución de la victima (horizontal)
resY = 1200      ' Esta es la resolución de la victima (vertical)
GetCursorPos a
x = ((a.x - ((Me.Left + l.Left) / 15)) / (((l.Width + Me.Left + l.Left) / 15) - (Me.Left + l.Left) / 15)) * resX
y = ((a.y - ((Me.Top + l.Top) / 15)) / (((l.Heigth + Me.Top + l.Top) / 15) - (Me.Top + l.Top) / 15)) * resY


Pues bien, el problema viene a la hora de hacer click, para eso uso la API mouse_event, para hacer click supongo que será así:

Código (vb) [Seleccionar]
SetCursorPos x, y
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0


y para doble click:

Código (vb) [Seleccionar]
SetCursorPos x, y
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0


Esto suponiendo que pulsas el boton izquierdo...si no sería lo mismo pero con el de la derecha...

Entonces al server le pueden llegar cuatro casos:

1º- Click boton izquierdo
2º- Click boton derecho
3º- Doble click boton izquierdo
4º- Doble click boton derecho

Lo malo es como envío yo esos comandos al server, porque me encuentro con estes problemas:

-Si uso el evento click y doble click del label tengo dos problemas, primero que no se que boton (si fue el derecho o el izquierdo el que pulso) y segundo que al hacer doble click ademas de producirse el evento "DblClick" tambien se produce el evento "click".

-Si uso el evento "Mouse_down" soluciono el problema de que boton fue el que pulsó el label, pero me encuentro con el problema de como diferencio el doble click del click.

Muchos pensaran que no hace falta separar el evento doble click, ya que al hacer dos clicks produzco dos eventos "Mouse_down" que se enviaran al server y este hará dos veces click...pero lo malo de eso es que un paquete puede tardar más en llegar que otro y puede que lo que me haga el server sean dos clicks separados (que el ordenador no reconocera como dble click)...


Bueno, después de este royo todo me gustaría que me dieran posibles soluciones...seguro que más de uno tiene un troyano hecho en VB 6.0 que envia clicks si haces tu click en la captura de pantalla...

Weno, espero que me podais ayudar y saludos ;)
#42
Weno, pues explico mi problema a ver si se entiende:

A mi me gustan las matrices dentro de otras matrices, y lo que quiero es tener varios archivos en matrices de esta forma:

filedata(0)(1 to FileLen(file1))
filedata(1)(1 to FileLen(file2))
filedata(2)(1 to FileLen(file3))
filedata(3)(1 to FileLen(file4))
filedata(4)(1 to FileLen(file5))


Una matriz filedata, cada elemento de la matriz es una matriz que contiene un array de bytes de cada archivo

Eso consigo hacerlo, lo malo es que tengo que declarar esto:

Código (vb) [Seleccionar]
Dim i As Long
Dim file(0 to 3) As String
file(1) = "C:\archivo1.txt"
file(2) = "C:\archivo2.txt"
file(3) = "C:\archivo3.txt"
ReDim filedata(0 to numerodearchivos) As Variant
For i = LBound(file) to UBound(file)
ReDim tempfiledata(0 to FileLen(file(i)) - 1) As Byte
filedata(i) = tempfiledata
Erase tempfiledata
Next i


Weno, como veis tengo que utilizar una matriz tempfiledata temporal, pero este no es el mayor problema, sino que si tengo que pasar esta matriz a una funcion pues me da un error:

Imaginaros esta funcion:

Código (vb) [Seleccionar]
Function convertirBytes (ByRef filedata() As Byte) As Long
'Ahora aki iria cualkiera cosa, el argumento lo paso ByRef pork las matrices hay que pasarlas siempre ByRef
End Function


Pues cojed el primer code que puse, pues si después llamo a la funcion así me da un error:

Código (vb) [Seleccionar]
Call convertirBytes (filedata(0))

En teoría filedata(0) es un array de bytes, y la funcion es lo que pide, pero me da un error. Yo creo que el error se debe a que filedata está declarada como Variant...pero la tengo que declarar como Variant para después poder meter dentro el array de bytes...Si la declaro como Byte despues no puedo meter dentro un array de Bytes...

La unica solución que encontré fue algo parecido a lo que hice al principio, usar una matriz temporal. Llamaría a la funcion de esta forma:

Código (vb) [Seleccionar]
ReDim tempfiledata (LBound(filedata(0)) to UBound(filedata(0))) As Byte
tempfiledata = filedata(0)
Call convertirBytes (tempfiledata)
Erase tempfiledata


Entonces así si que me funcionaría...pero imaginate que tengo que llamar a muchas funciones y tengo muchos archivos y grandes (es decir, muchos array de bytes), pues entonces andar pasando grandes cantidades de bytes a variables temporales reducen la velocidad de la aplicación...

Por eso me gustaría que me dierais posibles solucíones, lo importante es pasar a una funcion que pide un array de bytes pues eso, un array de bytes que está contenida en otra matriz...más claro no lo puedo decir...


Weno, si alguien me puede ayudar que escriba algo, espero vuestra ayuda, un saludo ;)
#43
Weno, pues eso, como puedo obtener el modelo, marca, etc... de la placa base y de la gráfica...se hacerlo del procesador, pero de la grafica y de la placa no...

Saludos ;)
#44
Weno, primero deciros que ya se que existe la funcion Environ que resuelve variables de entorno, pero lo que yo quiero es que un programa lo haga automaticamente, teniendo una string...pongo un ejemplo:

Imaginaros que tengo este String:

%windir%\system32\cmd.exe

Pues quiero que me lo convierta en este (suponiendo que la variable de entorno windir sea C:\Windows):

C:\Windows\system32\cmd.exe

Supongo que lo que tengo que hacer es separar lo de dentro del %

y hacer

Environ("windir") & "\systen32\cmd.exe"

Pero no se como hacer para separar ese windir

Weno, si alguien me puede ayudar que lo diga...

Saludos ;)
#45
Pues la verdad es que me gustó este control que usa MadAntrax en el Cactus Joiner y quise ponerselo a algunos de mis programas. Pero lo malo es que me causan problemas.

Tengo tres ordenadores, todos con Windows XP SP2, en dos me causa problemas todos los programas que tengan estos controles, por ejemplo el Cactus Joiner se queda bloqueado consumiendo el 100% de la CPU cuando pulso alguno de estos botones, en otros programas que tengo pues tras pulsar uno se me queda bloqueada, o tengo que activar otra ventana y volver activar esa para que siga funcionando el programa, o se me queda seleccionado el boton y pulse donde pulse es como si pulsara ese boton, etc...la verdad es que me había gustado este control por eso lo digo a ver si encontrais alguna solución. Ahh, en el otro ordenador no me da ningun problema, no se de que puede ser, ¿a alguien más le pasa?

Tambien me gustaría que me dijerais de donde puedo sacar más botones de este estilo así wapos por lo menos...

Weno, saludos ;)