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

#1
Estoy haciendo una aplicacion para capturar el trafico de un programa especifico. En realidad no tengo que serializar paquetes de red, sino simplemente los mensajes que se envian a travez de sockets, en otras palabras el buffer del paquete.

Lo que estoy haciendo basicamente es redireccionando las funciones send y recv a unas propias para luego serializar toda la comunicación de la aplicación.

Estuve probando la libreria Protobuf de Google y es muy facil de usar, el problema es que almacena todos los datos en memoria y hay que serializarlos/deserializarlos todos juntos, y basicamente la memoria va aumentando lentamente.

Yo estaria necesitando una libreria que me permita serializar por partes, es decir, ir añadiendo los paquetes al archivo a medida que van llegando.

La salida que espero es mas o menos así, aunque no necesariamente en json, preferiria datos binarios.
{
     "date": "2018-08-10T17:03:15Z",
     "version": "7.6.1.1",
     "packets":
     [
      {
       "buffer": "xxxxxxxx",
       "date": "2018-08-10T17:18:16Z"
      },
      {
       "buffer": "xxxxxxxx",
       "date": "2018-08-10T17:18:16Z"
      },
      ...
     ]
}


Vi que por ejemplo wireshark usa Cap'n Proto pero no estoy del todo seguro que permita serializar por partes, y mucho menos deserializar solo algunos datos.

Flatbuffers al parecer permite deserializar por partes, pero no estoy seguro si se puede hacer una serialización "por partes" como explique mas arriba.

De cualquier modo, incluso es posible hacer lo que requiero? No se si existe un nombre tecnico para esto, hice una busqueda en google pero no encontre nada. Quizás solo sea posible serializar todo junto, en ese caso no se cual seria el camino ideal para evitar problemas de memoria.

No es algo critico, la aplicacion es para algo muy especifico y personal pero me gustaria saber si hay alguna otra alternativa.

Saludos.
#2
Estoy estudiando diseño de sistemas y me estoy comiendo la cabeza con la definición de algunos métodos. Lo que me cuesta identificar es quien debe llevar a cabo algunos métodos.

El escenario con el que estuve practicando es muy simple: "Un laboratorio de analisis clinicos ha comenzado el desarrollo de un sistema para la registracion de los analisis realizados por sus pacientes y el profesional que los solicita".

Partiendo de eso identifique cuatro clases: Paciente, Medico, Laboratorio y Analisis.

  • Paciente: representa una persona que se atiende en el laboratorio
  • Medico: representa un profesional de la salud
  • Analisis: representa un estudio solicitado por un medico especifico para un paciente determinado
  • Laboratorio: representa la clinica donde los medicos realizan analisis a los pacientes

De ahi pase a realizar el digrama de clases UML teniendo en cuenta que:

  • Un paciente puede tener muchos analisis. El paciente debe conocer los analisis que se realizo
  • Un medico puede haber solicitado muchos analisis. Debe tener cuenta de los analisis que requirio



Mi problema es que ese diagrama no me convence porque no tengo forma de asegurar que cuando se ejecuta paciente.addAnalisis(a), el analisis a ya haya sido cargado en el laboratorio.

Para ponerlo de otra forma, cualquiera que tenga acceso a un objeto Paciente podria agregar un analisis al paciente sin cargar ese mismo analisis al laboratorio y/o medico correspondiente. Lo mismo pasaria para un medico, cualquiera que tenga una referencia al medico podria cargarle un analisis sin tambien agregarlo al laboratorio ni al paciente. Esto supongo que generaria mucha inconsistencia en el sistema.

Yo podria implementar esa logica en Laboratorio::addAnalisis(a: Analisis), pero de nuevo, nada impide que alguien se salte esto y lo agregue manualmente.


Entonces mi otra solucion fue elminar los metodos addAnalisis y getListaAnalisis tanto de medico como de paciente, y luego agregar dos metodos a Laboratorio:

  • getAnalisisByPaciente(p: Paciente): Analisis[0..*]
  • getAnalisisByMedico(m: Medico): Analisis[0..*]

En este caso solo podria agregar analisis desde la clase Laboratorio, y asi implementar toda la logica necesaria en un solo lugar. Verifico que el medico y paciente asignado al analisis existan y luego lo agrego a la lista.
El problema es que ahora no estaria reflejando lo de que un paciente y un medico tienen que llevar cuenta de los analisis realizados.

Entonces no se como es la forma correcta de resolver esto.

Quizas no me deberia importar que alguien pueda llamar a Paciente.addAnalisis() y me estoy complicando por nada

Perdon por la falta de coherencia en todo esto pero tengo una ensalada en la cabeza y no se como explicarlo mejor. Saludos
#3
EDIT2: El algoritmo resulto ser LZO.
Cualquiera que necesite informacion sobre su funcionamiento hay algo aca:
https://www.kernel.org/doc/Documentation/lzo.txt

Lastimosamente sin ingenieria inversa no se puede obtener informacion de como funciona, en ningun lado hay una especificacion oficial.



Buenas, estoy en el proceso de hacer ingenieria inversa al protocolo de red de un mmorpg.

Algunos paquetes que suelen ser muy largos se comprimen con un algoritmo que estuve analizando pero no puedo determinar cual es (el cliente solo los descomprime, nunca comprime un paquete para enviarlo, por lo tanto no tengo acceso al proceso de compresion)
Todavia sigo creyendo que es una variante del LZ77 pero no logro dar con cual, lei el funcionamiento de varias pero no encuentro un parecido a ninguna (y tampoco creo que sea viable ponerme a probar todas porque seria dificil dar con el resultado exacto).

Tambien utilice extensiones del ida pro pero no tuve buenos resultados. Se menciona Deflate y unlzx pero ninguna de las referencias es utilizada dentro del proceso de descompresión.

Voy a intentar explicar lo mas claro posible como funciona el proceso, a ver si alguno me puede dar una mano. Se que seria facil simplemente reconstruirlo tal cual me muestra el hex rays y listo, pero mas me mata la curiosidad de saber cual es y quisiera poder implementarlo al 100%



Detalles:
Por lo que pude observar del algoritmo siempre trabaja sobre el buffer de entrada y de salida. Nunca utiliza alguna tabla/string o lo que fuese externo a estos dos.
Utiliza punteros (tal como el lz77 y sus variantes) para indicar el desplazamiento hacia atrás desde la posición actual. La información que tienen los punteros esta definida a nivel de bits.
Siempre que descomprime lo hace en base a lo que fue escribiendo en el buffer de salida. Del de entrada solo va tomando los pares de bytes que representan los punteros.
Desde mi parecer la descompresión es obligatoriamente secuencial, no hay posibilidad de saber dinamicamente donde hay otro puntero, al menos sin haber analizado los punteros anteriores.
Al comienzo de la cadena comprimida siempre hay un par indicando que es lo que viene.
El factor de compresion, al menos para el unico paquete que analice (lo hice varias veces pero siempre trae la misma informacion) es de casi el 50%.


Algoritmo:
Voy a intentar explicarlo a grandes rasgos (es posible que me saltee algunas partes).
Si quieren ver el algoritmo en c sacado de hex rays lo pueden hacer aqui:
https://gist.github.com/FYGonzalo/a4118d35620d48bacea2253d5aa48e6d

Las variables las renombre yo, puede que alguna tenga un nombre que no la represente. Tambien hay algunos comentarios del codigo, igual no se si sera mas entendible leer mi "pseudocodigo" o el codigo directo del hex rays.

Mas abajo adjunto una parte del proceso de descompresión de un paquete.

Al comenzar analiza el primer byte (de ahora en mas firstByte) del buffer de entrada (de ahora en mas inputBuffer).
Si este es mayor a 0x11 (17): // Significa que hay bytes descomprimidos y se deben copiar tal como estan
   Le resta 0x11 (17) al firstByte y el resultado indica la cantidad de bytes por copiar.
   Avanza una posicion en el inputBuffer (la siguiente al firstByte) y copia lo que indica el resultado anterior.
   Dependiendo cuanto fue el resultado salta a un label donde sigue haciendo analisis del par de bytes.
Sino
LABEL 1
   Lee en una variable "secondByte" el segundo byte del inputBuffer
   Si el firstByte es menor a 0x10 (16)
       Si el firstByte es nulo
           Si el secondByte es nulo
               -----
           firstByte = secondByte + 15
       Copia una DWORD del inputBuffer al outputBuffer y avanza los punteros (de ambos buffer) 4 posiciones
       Asigna a un contador el valor de firstByte - 1
       En base al valor del contador itera copiando bytes del inputBuffer al outputBuffer (sin modificarlos)
       Vuelve a leer del inputBuffer otro par (firstByte & secondByte)
       Si el firstByte es menor a 0x10 (16)
           ------
   Mientras (1)
       Si firstByte es mayor a 0x40
           Obtiene un puntero al outputBuffer retrocediendo ((-((firstByte >> 2) & 7) - 1) - secondByte * 8) posiciones


Pausa. Aca se observa una de las situaciones en donde se opera el par en base al valor de sus bitss.
En un caso que detallo mas abajo, el par que se trabaja es (4C, 01)
El valor en bits de 4C es: 0100 1100
Aplicamos el shift de 2 posiciones: 0001 0011
Aplicamos el and 7: 0001 0011 & 0000 0111 = 0000 0011
Sumamos 1 (en realidad es resta, pero son ambos negativos asi que lo obviamos): 0000 0100.

La conclusion que saque de esta operacion (y de otras donde se repite) es que en el firstByte, cuando es mayor o igual a 0x40, hay 3 bitss que indican parte del desplazamiento.
En este caso seria: 0100 1100
Pero como luego se le suma 1 sabemos que el primer termino, de la operacion compleja indicada en la ultima linea de codigo mas arriba, dara como resultado un valor entre 1 y 8 (no mas ni menos).

Luego simplemente se suma (nuevamente, es una resta pero al ser todos negativos lo obviamos) el valor del secondByte (sin importar cual fuere) multiplicado por 8.
Es decir que al final vamos a retroceder en el outputBuffer la cantidad resultante de esta suma.


           Avanza el inputBuffer posicionandose en el byte siguiente al par que estamos analizando
           Determinamos la cantidad de bytes por copiar* aplicando ((firstByte >> 5) - 1)        


Nuevamente nos detenemos aqui.
Recordemos que el firstByte actualmente tiene el valor 4C que en binario es: 0100 1100.
Aplicamos el shift 5 posiciones a la derecha: 0000 0010
Le restamos 1: 0000 0010 - 0000 0001.

La conclusión de este segmento es que los 3 bitss de mayor peso del firstByte (siempre que este sea mayor a 0x40) indican una cantidad de bytes por copiar*.
*En realidad no indica la cantidad total de bytes por copiar. Obligatoriamente al llegar a este punto se copian al menos 2 bytes (lo veran en las siguientes lineas de codigo), pero indica la cantidad de bytes, luego de haber copiado 2 obligatorios, que se deben copiar.


           Copiamos dos bytes obligatorios del outputBuffer (basados en el puntero que obtuvimos anteriormente hace 4 lineas de codigo)
           Luego copiamos tantos bytes del outputBuffer como indique la operacion anterior.
           Luego saltamos a otro label donde aplicamos una and entre el firstByte y 3. El resultado indica la cantidad de bytes (planos) del inputBuffer por copiar. En caso de que sea 0, volvemos al Label 1, sino continuamos en el while.


Nuevamente se opera a nivel de bits.
Al aplicar la operacion and entre el valor de firstByte y 3 (0000 0011) lo que hacemos es analizar los dos bits de menor peso del firstByte.
Es decir que ahora como conclusión entendemos que significa completamente el firstByte cuando es mayor o igual a 0x40:
0100 1100: Indican parte de la cantidad de bytes a copiar del "diccionario" (recordemos que se le resta 1) y obligatoriamente se copiaban 2
0100 1100: Indican parte del desplazamiento hacia atras en el outputBuffer donde se encuentra la cadena descomprimida (recordemos que se le suma 1 y luego 8 * secondByte)
0100 1100: Indican la cantidad de bytes planos del outputBuffer que debemos copiar luego de haber copiado los "descomprimidos".


       Si el firstByte es menor a 0x20 (32)
           Break (sale del while y creo que termina con algunas operaciones)
       (Si el firstByte es menor que 0x40 pero mayor o igual a 0x16 - Condicion no especificada pero se llega a este punto debido a esa situacion)


En este caso se da una situacion particular. Es como si se invirtieran la responsabilidad de los bytes del par y ahora el segundo byte (secondByte) indica los desplazamientos hacia atras en el outputBuffer y el firstByte los bytes por copiar.


           Se obtiene una "cantidadCopiar" haciendo firstByte & 0x1F


Aqui nuevamente se vuelve a trabajar a nivel de bitss.
Un caso que analice en el cual se entraba a este punto es con el par (2A, C8).
Como dijimos anteriormente cuando el firstByte es menor a 0x40 pero mayor o igual a 0x20 se invierten las responsabilidades.
Sabemos que 2A es: 0010 1010
Y 1F: 0001 1111

Asi que al aplicar la operacion and entre ambos lo que estamos haciendo es recuperar los 5 bitss de menor peso del firstByte.
El resultado sera 0000 1010


           Si cantidadCopiar es nula
               Si secondByte es cero
                   -----
               cantidadCopiar += secondByte + 31 (decimal)
           Obtenemos un puntero al outputBuffer con un retroceso desde la posicion actual determinado por ((secondByte >> 2) + 1)


Nuevamente se trabaja con bitss.
Recordemos, secondByte es C8: 1100 1000
Aplicamos el shift: 0011 0010 (50 decimal)
Restamos 1: 0011 0001 (49 decimal)


           Avanzamos el inputBuffer 2 posiciones (nos saltamos un byte despues del par que estamos analizando)
           --- Se aplica una operacion rara dada una condicion que nunca vi que fuese verdadera bajo el inputBuffer de prueba que estoy analizando ----
           Copiamos una DWORD de la posicion que indica el puntero que definimos unas lineas atras (del outputBuffer) y lo pegamos en la posicion actual del outputBuffer. Es decir, copiamos una DWORD "descifrada" del outputBuffer a la posicion actual del outputBuffer (basicamente buscamos en el diccionario la palabra y la pegamos)
           Avanzamos 4 posiciones (por el DWORD) en los punteros a ambos buffers.
           Disminuimos la cantidadCopiar en 2
           Hacemos un bucle copiando la cantidad de bytes que indique "cantidadCopiar"

           Nuevamente (como el caso de mayor o igual a 0x40): (Basicamente es un label que no lo puse como tal)
           Aplicamos un and entre el byte que indica el offset (ahora es el secondByte, en el caso anterior habia sido firstByte) y 3. El resultado indica la cantidad de bytes "planos" restantes por copiar del inputBuffer al outputBuffer.


Otra vez trabajamos a nivel de bits.
Al aplicar el and al secondByte (0xC8) lo que estamos haciendo es recuperar los 2 bitss de menor peso.

Recapitulando ahora conocemos toda la informacion que trae el secondByte:
0011 0010: Indican el desplazamiento hacia atras en el outputBuffer (recordemos que se le resta 1)
0011 0010 Indican la cantidad de bytes "planos" que deben copiarse del inputBuffer al outputBuffer, luego de haber copiado los del diccionario indicados por el puntero.


           En caso de que este resultado sea mayor que 0, copiamos los bytes que indican y seguimos dentro del while.
           En caso contrario (sea igual a 0), volvemos al LABEL 1.

Ya cuando se sale de todo este bucle (unicamente por el Break de que firstByte < 0x20) se hacen operaciones para finalizar, se copian los bytes restantes y algun que otro detalle.
Se devuelve la longitud del buffer de salida.


Descompresion de un paquete real:
Lo pueden ver aqui, hay imagenes y una explicacion del proceso hasta cierto punto (no lo cargo al post porque se haria mucho mas largo de lo que ya es).
http://imgur.com/a/kuQkl





Y eso es todo lo que pude obtener, la verdad es que hay algunos detalles mas del algoritmo pero no llegue a analizarlos porque mi principal objetivo es determinar que estandar de compresion (si es que es un estandar) es el utilizado.

Espero no haberlos aburrido, y que me puedan dar una mano, me costo mucho trabajo hacer la ingenieria inversa y luego un poco mas redactar todo el post y juntar las pruebas.

Saludos.
#4
Estoy escribiendo un Packet Sniffer y lo que quiero hacer es cada vez que capturo un paquete, serializarlo a un archivo XML para poder procesarlo mas tarde.

Estuve analizando usar XmlSerialization que fue lo primero que encontre en google pero mi problema es que, por lo que vi, esta pensado para que cada vez que se serializa un objeto, este se guarde en un nuevo archivo (lo digo por el hecho de que escribe el archivo completo, incluyendo el namespace y etc). Si utilizo esto lo que ocurre es que tengo que mantener en memoria todos los paquetes que vayan llegando hasta que el usuario quiera dejar de capturar y luego recien escribir el archivo (uso excesivo de memoria).

Mi primera idea fue que cada vez que llegue un paquete, escribirlo en el archivo y liberar ese objeto, por lo que me parece que XDocument puede ser util en este caso, solo que voy a tener que escribir manualmente el proceso de serialización.

Basicamente lo que me gustaria saber, si ya manejaron la serialización xml, como me recomiendan haga este proceso.

Saludos
#5
Buenas a todos.

Tengo un conocido que trabaja (no pertenece al area de sistemas) en una empresa de transportes (no quiero dar muchos detalles para no tener problemas) que esta preocupado porque se entero que en una ciudad estan cargando tarjetas de transporte de otra empresa de forma ilegal y tiene dudas sobre si no esta pasando lo mismo en su empresa.

Como entusiasta que soy me puse a investigar sobre el tema y tengo entendido que las tarjetas que usan son las Mifare Classic de 1k. Lei por completo el tema que hay en este foro del año 2009 y segui googleando, obviamente me entere que son facilmente hackeables en poco tiempo.

Le comente todo lo que encontre y me dijo que hablo con el gerente de sistemas y le dijo lo siguiente:
"Me dijo que [CIUDAD DE LA EMPRESA DONDE TRABAJA] es distinto porque modificaron la estructura de la tarjeta y que el código son 6 dígitos por lo que se tardaría 11 años en encontrar la clave.. Y que además tiene una firma que calculo son otros dígitos mas.
Pero la de [OTRAS CIUDADES QUE USAN MIFARE] dijo el que pudo romper en 4 dias, Y el teniendo el primer numero, saco por fuerza bruta"

Por lo que es obvio que cuando se refiere a que modificaron los 6 digitos hace referencia a una de las claves a o b de los sectores y que cuando habla de fuerza bruta hace referencia al metodo "darkside"
Y calculo que cuando se refiere a la firma es algun metodo de crifrado sobre la info del sector que utilizan.

Ahora, la cosa es que este conocido dice que el area de sistemas es un tanto soberbio y que no esta seguro de todo lo que le dicen, entonces le explique los metodos de seguridad que considero que pueden tener pero al fin y al cabo la mayoria son corrompibles.

Lo unico probablemente seguro seria que la informacion de la tarjeta, cada vez que se realice una transaccion se valide con un servidor, pero siendo transportes en constante movimiento creo que no se pueden valer de una conexion en tiempo real todo el tiempo.
Y lo de que se encuentre cifrado tampoco es muy claro porque tranquilamente podria cargar la tarjeta, guardar el dump y cuando se termine el credito volver a pegar ese dump (a menos que tenga algun tipo de seguridad adicional).

Al fin y al cabo lo que me gustaria saber es si alguno de ustedes conoce algun caso practico donde se le haya agregar mayor seguridad a las tarjetas mifare classic, porque lo que me hace ruido es que si en paises importantes como chile o mexico (o incluso paises europeos) se pudo hackearlas, entonces que tanto pudo haber hecho una empresa de por acá como para darle esa seguridad a las tarjetas mifare classic que al final nunca llegaron a tener.

Soy tan solo un chico de 21 años y siento que es muy probable que le este llenando de paranoia a mi amigo (no me creo tan inteligente como para poder burlar al area de sistemas de una empresa importante) pero es que hay muchas cosas que me hacen ruido.

Mi objetivo es basicamente saber si existe la chance de que ellos (el area de sistema) le haya agregado la seguridad necesaria a la tarjeta o solo lo dice para que mi conocido no rompa los huevos.
Probablemente la unica forma de saber esto sea que yo me ponga a probar pero no tengo el lector.

Saludos y gracias de antemano.

#6
Hola.
En la facultad nos pidieron que desarrollemos una aplicación web un poco compleja, básicamente para que utilicemos Java EE 7 (JPA, JDBC, Servidor de mail, etc).
Estuve leyendo y viendo algunos videos y todavia no logro imaginarme como sera mi proyecto.
Por lo que lei se recomienda utilizar maven para la gestion y estructuracion del proyecto por lo que busque y me encontre con esto:
https://maven.apache.org/plugins-archives/maven-archetype-plugin-1.0-alpha-7/examples/j2ee-simple.html

Y lo que me marea es que no se como organizo mi aplicacion bajo esa estructura. Digo esto porque me vi un tutorial (no muy bueno) de codigo facilito y en primer lugar habla sobre crear un sistema bajo java ee pero empieza el proyecto como un web application solamente, y despues habla sobre el mvc y lo unico que hace es dividir el proyecto asi
.
|
|--WebPages
|  |--index.jsp
|
|--SourcePackages
|  |--modelo
|  |  |--conexion.java
|  |
|  |--servlet
|  |  |--controlador.java

Y no me parece que un proyecto de Java EE se diseñe asi, no se exactamente como explicarlo pero siento que no es la forma de encarar un proyecto.

Alguien me podria encaminar un poco? Gracias
#7
Estoy intentando capturar un mensaje que posteriormente sera un packet antes de que se encripte.
Tengo la direccion estatica de la funcion que quiero modificar, entonces mediante el siguiente algoritmo modifico el codigo para que cuando ingrese a esa funcion salte a mi codigo.
Código (cpp) [Seleccionar]
void JmpPatch(void *pDest, void *pSrc, int nNops = 0) {

DWORD OldProt;
VirtualProtect(pSrc, 5 + nNops, PAGE_EXECUTE_READWRITE, &OldProt);
PointTo = (DWORD)pSrc + 8;
*(char*)pSrc = (char)0xE9;
*(DWORD*)((DWORD)pSrc + 1) = (DWORD)pDest - (DWORD)pSrc - 5;

for (int i = 0; i < nNops; ++i) { *(BYTE*)((DWORD)pSrc + 5 + i) = 0x90; }

VirtualProtect(pSrc, 5 + nNops, OldProt, &OldProt);
}


El codigo funciona bien, salta a mi funcion, entonces lo que hago es ejecutar las instrucciones que habia reemplazado y despues volver a donde estaba (estoy haciendo pruebas solamente).

Esta es la funcion original en Assembler (yo coloco el jmp en 0x626324 y hago nop de dos bytes mas) y mas abajo estas la funcion mia a la que salto.

Código (cpp) [Seleccionar]
DWORD dir = 0x62632B;
void ImprimirLog()
{
__asm {
mov edi, [esp + 4 + DWORD PTR 0Ch]
shr edi, 2
push dir
ret
}
}


El problema es que cuando llego a mi funcion se me cambian todos los registros de la cpu y el stack, y se me hace un desastre y cuando hago el return se me corrompe todo.

Esto es antes de llegar a __asm { }


Y asi queda cuando entra a __asm { }



No tengo idea en que estoy fallando, ya probe un monton de cosas y quede ahi trabado.
#8
Ya hace mucho que vengo jodiendo con querer hacer un server emulator de un juego online (no existe ningun emulador). Cada vez que empiezo lo dejo al tiempo, aunque siempre avanzo un poquitito mas. Hoy se repite la historia...

Cuando arranque (a comienzo de año) me habia dado cuenta que los paquetes estan cifrados, y con el OllyDBG pude encontrar el algoritmo de encriptacion (muy simple).

Cuando me conecto al servidor, el mismo envia una clave de 16 bytes que todavia no se como se genera pero no importa.
Cada vez que el cliente tiene que enviar un mensaje, realizar una operacion XOR entre una DWORD del mensaje y una DWORD de la clave, la DWORD de la clave se elige mediante un algoritmo tonto que ahora no lo recuerdo.
Luego de cifrar el mensaje se suma a cada DWORD de la clave la longitud del mensaje cifrado. (En realidad no es la totalidad de la longitud, si el mensaje tiene una longitud de 0x38, entonces suma 0x30, no se como llamarlo)

Y se repite todo por cada mensaje enviado.
Entonces lo siguiente que debia hacer era desencriptarlos e interpretarlos.

En ese momento se me habia ocurrido (debido a mis pocas capacidades pensativas) hacer un programa en el cual al ingresar la clave, el numero del mensaje (ej, mensaje 5) y el mensaje, este me devuelva el mismo descifrado.
Me dispuse a hacerlo pero me frustro perder tanto tiempo teniendo que convertir datos para poder tratarlos, para poder ponerlos en los componentes de la GUI, etc, asi que deje todo a la *****.

Hoy retomando me di cuenta que lo mejor que podria hacer es interceptar la funcion que lo cifra (o descifra) y guardar el mensaje en un log antes de encriptarlo, asi puedo tomar muchisimas muestras y analizarlas facilmente.

Estuve leyendo sobre la inyeccion de DLLs pero hay cosas que no me quedan muy en claro.
La funcion a la que quiero acceder (basicamente para extenderla) no son del sistema, son del juego sobre el cual estoy trabajando.
Leyendo un par de cosas en google se me ocurrio que lo ideal seria obtener la direccion de memoria donde esta la funcion (creo que es fija) y luego sustituir alguna instruccion con un jump a la DLL que yo inserto.
Ya dentro de mi funcion tendria que acceder a los parametros (un buffer y la longitud del buffer) de la funcion la cual intercepte y es eso lo que no se como tengo que hacer.
Segun tengo entendido los parametros, en assembler, se pasan por el Stack y luego son recuperados por la funcion que se ejecuta, entonces yo deberia saltar a mi funcion en la primera instruccion, sacar todos los parametros, procesarlos y despues volver a volcarlos en el Stack, eso es correcto?

Y algo relacionado pero a parte, mi idea es ir capturando ese buffer cada vez que se va a mandar un mensaje e ir guardandolo en un log (xml).
Como tendria que hacerlo? Porque si lo hago en mi funcion cada vez que llegue tendria que abrir el log, escribir el buffer y algunos datos mas, y despues cerrar el archivo, creo que no seria lo optimo teniendo en cuenta que haria esto todo el tiempo que se envian paquetes.

Saludos.
#9
Buenas a todos. Estoy en el proceso de armar un emulador del servidor de un juego (aclaro que no existe ninguno de dicho juego, estoy con la ingenieria inversa). El progreso recién es casi del 2%, lo único que tengo por ahora son datos mínimos que si los uso bien, podre hacer el resto.
Entonces quería comenzar a desarrollar el servidor para ir armando una estructura base e ir probando los paquetes que ya los conozco.

Mi duda es si Python funcionara como lenguaje para emular el servidor o tendré que mirar para otro lado (Pense en C# pero no me gusta la sintaxis).

Yo creo que el servidor, con soportar hasta 10.000 personajes, es susficiente (y estoy exagerando).

No es que elija Python por que es multiplataforma, solo lo hago porque me gusta la sintaxis.

¿Creen que funcionará?

#10
Buenas!
Mi presentacion
¿Que conocimientos tengo? Soy estudiante de Ing. en sistemas de informacion, apenas pasando al 3er año pero con conocimientos basicos -> medios (para no exagerar) de programacion, programé en C# y Python (todo lo hago por hobby, no trabajo), y tuve que analizar un codigo en C. También conozco assembler para el microcontrolador PIC 16x84, asi que entender a grandes rasgos assembler de x86 no es una tarea muy complicada.

Introduccion al problema.
Hace poco se me dio la idea de intentar hacer un emulador de un juego online que me dio muchos vicios años atras (el juego aun sigue funcionando). Estas son las cosas que fui probando:
1- Obtener el source del cliente. Está escrito en C++ v6, y segun lei en internet es imposible decompilar. Descarté esta opcion.
2- Por la anterior, se me ocurrio que seria buena idea interceptar los paquetes y asi comenzar a hacer el emulador, viendo que datos eran enviados y como debia comportarse. ¿El problema? Los paquetes se encuentran cifrados.
3- Googleando me encontre con un pdf que explica bastante bien los caminos que hay que seguir para hacer un emulador http://cellframework.sourceforge.net/uploads/Introduction%20to%20Server%20Side%20Emulation.pdf (lo adjunto para alguien que este en mi misma situacion)
En ese pdf dicen que la mejor manera para comprender los paquetes es viendo como los descifra el cliente. Entonces segui mi camino con el OllyDBG, viendo tutoriales y haciendo pruebas hasta que pude dar con la sección del cliente que cifra el código (y pude obtener el algoritmo, a medias, pero ya lo tengo 'encerrado').

Situacion actual:
Como dije, logre dar con la parte del codigo que cifra el mensaje a ser enviado por el cliente. Por ahora solo probé mientras iniciaba sesión a mi cuenta, y logre ver la parte donde dice mi nombre de usuario y la contraseña, pero el resto del mensaje se ve con simbolos raros (el mensaje antes de cifrar se ve así, y despues obviamente por la encriptacion se ve raro), entonces mi duda es: ¿Puede ser que el mensaje que se envia no este codificado en ASCII y por ello se ve de esa manera? Lo digo porque el juego tengo entendido que esta hecho por taiwaneses, y entonces el codigo ASCII no puede mostrar los caracteres correctamente debido a que no tiene el alfabeto de esos lugares.
En el caso de que sea como lo planteo, ¿Conocen que tipo de codificacion?
Gracias!


#11
Estoy por desarrollar una aplicación que debe conectarse a una bases de datos, por cuestiones de que algún día se quiera hacer un cambio quiero hacer que desde dentro del programa uno pueda cambiar la conexión. Mi duda es donde puedo almacenar los datos de dicha conexión..
El problema es que no se donde almacenar los datos de la conexion, puesto que si los guardo en un .txt cualquiera podria leerlos y ver la contraseña.
Pensé en encriptarlos pero ponerlos a la vista en un archivo también seria algo suicida, entonces me gustaría si me pudiesen dar recomendaciones..

Esto tambien aplica a otra duda que tengo que es tener una unica cuenta para ingresar al programa, si fuesen muchas sería facil y solo utilizaria una base de datos, pero usar una db para una cuenta no tiene sentido.. Si tienen algunas ideas ?
#12
Estoy haciendo un proyecto en el que necesito un sistema de registro de usuarios y estoy elaborando el mio...
Tengo dos cositas que me hacen dudar mucho, la primera es que al tener rangos debo comprobarlos antes de mostrar cada sitio web pero seria molesto tener que agregar en cada pagina el llamado a la base de datos, la comprobacion y la devolucion del resultado.
Siguiendo esta guia:
http://www.phperos.net/foro/index.php?topic=2129.0
Veo que el que la hizo agrego la comprobacion en el config.php, pero cuando yo lo utilizo no me funciona..
Código (php) [Seleccionar]
<?php
// Config.php es la página que nos va a conectar al Servidor y luego a la Base de Datos
$hostname 'TU_HOST'// Host (generalmente es localhost)
$user 'TU_USER'// Usuario de la base de datos (por defecto en MySQL es root)
$pass 'PASSWORD'// Contraseña de la base de datos (por defecto en MySQL se deja en blanco)
$dbnombre 'BASEDEDATOS'// Nombre de la Base de Datos en la que vas a trabajar  devuelve atrás
$rango $_SESSION["nivel"];

 
mysql_connect($hostname$user$pass);
 
mysql_select_db($dbnombre);

// Aqui comenzamos la sesión
session_start();
// Funciones
if($rango == 2) {

$rango 'Moderador Global';
}

elseif(
$rango == 1) {

$rango 'Administrador';
}

elseif(
$rango == 3) {

$rango 'Moderador';
}

elseif(
$rango == 4) {

$rango 'Usuario';
}

?>


Si lo utilizo asi me dice: Notice: Undefined index: nivel in C:\xampp\.... Es tipo que no reconoce lo que esta dentro de $_SESSION['nivel']; lo que me hace pensar que no estoy utilizando correctamente...
O si tienen alguna forma que sea mas facil agradeceria.
Se que debo comprobar en cada pagina pero quiero ahorrarme tener que poner muchas lineas de codigo..

Y otra cosa, que tipo de seguridad puedo implementar al sistema para que no lo jodan? Es decir que recomiendan ustedes.
#13
PHP / Error al usar un sistema de login.
2 Febrero 2013, 03:51 AM
Para un proyecto que tengo estoy intentando crear (o mas bien dicho modificar a mis necesidades) un sistema de registro y login que encontre en internet. Admito que no se 100% ni 20% de PHP pero en la mayoria de las ocasiones comprendo bien un codigo cuando lo leo, y puedo adaptarlo a mis necesidades...

Bueno el error que me da es:
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\index.php on line 12

Y este es mi codigo:
Citar<?php
require_once('config.php');

$username = $_POST['username'];
$password = $_POST['password'];
$bduser;
$bdpass;
if(isset($_POST['ingresar'])) {
$query = mysql_query("SELECT * FROM login WHERE usuario='".$username."' and password='".$password."'");
if(mysql_num_rows($query) > 0){
    session_start();
}else{

}
}
?>

No puedo dar con el error =/!

Les daria las gracias si me pudiesen ayudar con esto..




EDITO:
Ya lo solucione, habia cometido un error, como hace años no leo php habia puesto en config la etiqueta principal como <? y por eso no funcionaba..

Gracias =)
#14
El titulo resume un poco lo que quiero hacer.
Primero explico el problema: En mi pais/provincia existen grupos en facebook para comprar y vender cosas. Muchas personas los utilizan por lo que es muy interesante. Lo malo de este sistema es que debes estar todo el dia en la PC comentando tu post para que este se encuentre entre los primeros y así todos lo vean.

Posible solución: Hace mucho tiempo estuve en busca de como hacer un bot que reconozca imagenes y realice acciones si las encuentra, y en ese tiempo me encontre con codigos para asignar valores a formularios web (HTML). Ahora me puse a pensar y creo que seria ideal crear un programa que escriba un comentario y lo envie, y el mismo tenga un tiempo de descanso de X tiempo cosa que no sea tanto spam.

Ahora bien, con google chrome pude conseguir el ID del textbox de los comentarios, el codigo completo seria:
Código (html4strict) [Seleccionar]
<textarea name="add_comment_text_text" class="textInput mentionsTextarea uiTextareaAutogrow uiTextareaNoResize UFIAddCommentInput DOMControl_placeholder" title="Escribe un comentario..." placeholder="Escribe un comentario..." id=".reactRoot[49].[1][3]..[1]...[0].[1]..[1]." aria-expanded="false" aria-label="Escribe un comentario..." style="">Escribe un comentario...</textarea>

Ahí podemos ver el ID del cuadro de texto, entonces en mi codigo hago la siguiente llamada
WebBrowser1.Document.GetElement(".reactRoot[49].[1][3]..[1]...[0].[1]..[1].").SetAttribute("value", textbox1.Text);
Ese codigo logra llenar el cuadro de texto, cuando lo vi dije no puede ser que lo haya logrado, pero cuando presiono "Enter" para enviar el mensaje facebook me devuelve que hay un error y que estan trabajando para solucionarlo.
Intente cambiar el "value" por "text" pero no logré nada. Por un lado creo que es una forma de seguridad de facebook pero pienso y es muy raro que cuando YO presiono enter no lo envie.

Entonces no se que hacer, ahora probare obtener el foco del cuadro de texto antes de enviar el mensaje, quizás es un sistema de seguridad de facebook para evitar los bots pero lo dudo...

Si alguien tiene una idea para ayudarme le agradeceria.
#15
Bueno simplemente sucede que pronto ire a la universidad tecnologica nacional en resistencia (Argentina) y solamente queria saber si alguien estudió, esta estudiando o va a estudiar en esa universidad..

(Si saben de alguien del foro diganme porque puede ser que nunca vea el post xD)
Saludos =).
#16
A los de argentina saben que desde la pagina de personal se pueden enviar mensajes a numeros de su misma linea pero esta tiene una limitación de 110 caracteres. Luego hay otro programa creado por un chico que puedes enviar un total de 130 caracteres creo y al final el agrega una publicidad, por lo que creo que logró burlar el servicio.
Ahora yo queria hacer algo parecido pero que se puedan enviar todos los caracteres que quieras, pude conseguir el cache de la web y he visto que en un archivo /Scripts/sms_web.js ponen las limitaciones, y luego en el index.php pero mi problema es que este mismo no genera el captcha debido a que lo que yo descargue fue el index.php de la pagina que yo estaba viendo pero no el index.php que genera la pagina, no se si se me entiende.

Solamente queria saber si hay alguna forma de conseguir ese index.php para ver como me genera el captcha y así poder enviar los mensajes.. O si alguien quiere unirse a mi proyecto =).

Saludos.
#17
Solucionado...
#18
Bueno solamente es que un tipo publico un codigo, como el que yo quiero para utilizarlo en la misma finalidad, para pedir ayuda y yo queria saber que consecuencias puedo tener por utilizarlo y entregar mi producto a todo el publico.
En ese foro donde lo puso en ningun lado dice que no se puede utilizar su codigo. En la actualidad el lo modifico (y yo tengo esa modificación pero tengo miedo a usarla por si se entera y me denuncia y sucede algo) y bueno yo queria construir mi codigo (similar al de el) con eso que publico ahí.

Simplemente eso, que consecuencias puedo tener por utilizar ese codigo que dejo en la web (y depaso utilizar el codigo que el esta utilizando que lo obtuve usando un descompilador de .exe)

Saludos y gracias por todo lo que siempre me ayudan N.n
#19
Primero aclaro que lo publique en esta sección porque en realidad no tiene mucho que ver con codigos, solo es una duda.
Resulta que tengo un familiar que esta haciendo la carrera para recibirse de contador y necesitan programas igual o similares al Tango Gestion, y yo que estoy aprendiendo C# se me ocurrió que seria un buen reto hacerlo.

Mis conocimientos no son completos, en si voy aprendiendo mientras programo. Seguramente diran que debo sentarme a leer 50000 libros antes de mandarme con algo tan grande pero mi problema es que leyendo en realidad no aprendo nada salvo que alguien me este enseñando. Es decir, necesito practica.

Bueno de la manera que pense que se podria hacer un programa de esta magnitud (se que se necesitan crear entidades, calcular impuestos, salarios y muchas otras cosas matematicas) pense que lo podria hacer utilizando bases de datos (aun tengo que leer un poco mas sobre eso) y realizando cuentas matemáticas.
Y esa seria mi duda, ¿será que con una base de datos y solo cuentas matematicas para obtener cada valor necesario podré realizar un programa como ese? ¿O creen que necesito aprenderme algo mas para poder tanto?

Bueno espero que puedan asesorarme =).

Saludos.
#20
Bueno la cosa es simple pero las soluciones que encuentro no las entiendo nada.
Tengo un thread que lo inicio: myThread.Start(); pero luego quiero detenerlo y iniciarlo nuevamente desde el comienzo.
Mi thread es un void con un while adentro.
Se que estan los myThread.Susped(); y myThread.Abort(); (el cual no recomiendan) pero esos solo lo pausan, yo quiero que se termine para empezar desde el comienzo de nuevo porque el thread realiza una operacion larga.
#21
Bueno tengo todo el codigo y entiendo bastante bien como se utiliza, mi codigo es:

C#
Código (csharp) [Seleccionar]

[DllImport("user32.dll")]
       static extern bool SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, Int32 lParam);

public static int MakeLParam(int LoWord, int HiWord)
       {
           return ((HiWord << 16) | (LoWord & 0xffff));
       }

       public static int MakeWParam(int LoWord, int HiWord)
       {
           return ((HiWord << 16) | (LoWord & 0xffff));
       }
       #endregion

// DECLARO LOS CLICKS
int MS_IZQUIERDOABAJO = 0x0201,
MS_IZQUIERDOARRIBA = 0x0202;

private void BuscarClic(int x, int y)
{
// ESTABLECE LAS COORDENADAS
Int32 lPara = MakeLParam((int)x, (int)y);
             
               IntPtr wParam = IntPtr.Zero;
               
// PRESIONO EL CLIC Y LO LEVANTO
               SendMessage(handle, MS_IZQUIERDOABAJO , wParam, lPara);
               SendMessage(handle, MS_IZQUIERDOARRIBA, wParam, lPara);

}


El problema es que funciona de una manera rara. Cuando lo ejecuto presiona el boton izquierdo y luego lo levanta pero es como que igualmente sigue presionado , es decir el MS_IZQUIERDOABAJO sigue activo..
Mas claro: Presiona el boton y lo levanta mientras sigue presionado.. ¿Se entiende?

// SE ME OCURRIO UNA MANERA MAS FACIL DE DECIRLO

Esos eventos no trabajan juntos, cada uno es independiente por lo que podriamos decir que cuando se lo llama sucede lo siguiente:
MS_IZQUIERDOABAJO = se activa
MS_IZQUIERDOARRIBA = se activa

Es decir se realizan las dos acciones pero nunca se las desactiva, es como que se levanta el mouse pero se sigue presionando
Es tipo que el mouse virtual se queda pegado a ese lugar y no se suelta mas..

espero que me puedan ayudar. Gracias =).
#22
Bueno para ser simple y rapido, esto es en C#.
Necesito hacer unos combobox "dinamicos", me refiero a por ejemplo esos que te hacen elegir el Pais, y dependiendo cual pongas te muestra una lista de provincias.

Basicamente quiero hacer lo mismo, la unica forma que se me ocurrio y probe fue haciendo lo siguiente:

Código (csharp) [Seleccionar]

private void mision_SelectedIndexChanged(object sender, EventArgs e)
       {

           if (mision.SelectedIndex == 0)
           {
               nmision.Items.Add("1"); // AGREGAR AL SEGUNDO COMBOBOX
           }
       }

pero si luego vuelves a cambiar el primer combobox envez de cambiar la lista, agrega mas opciones.

Me gustaria si me pudiesen ayudar.
Gracias =).

PD: Me falto agregar que cada tipo de opcion debe tener un ID distinto a los anteriores ya que luego tengo que comprobar si esta seleccionado
Código (csharp) [Seleccionar]

 if (mision.SelectedIndex == 0)
{
      if (nmision.SelectedIndex == 15)
{
  // HACER ALGO
}
}

#23
Bueno creo que es algo simple pero no se como hacerlo!
Tengo un boton que realiza una acción pero quiero que realize tantas acciones como el usuario quiera, entonces decidi usar for. El problema esta a la hora de tomar los numeros de la cantidad de veces que quiere el usuario, no se como hacerlo porque me da error.
Código (csharp) [Seleccionar]

private void button1_Click(object sender, EventArgs e)
        {
           
            for(int z = 0; z < (aquí quiero insertar el valor del textbox que sera un numero); z++)
            {
            if (comboBox1.SelectedIndex == 1)
            {
                MessageBox.Show("Se ha elegido el 2");
            }
            if (comboBox1.SelectedIndex == 2)
            {
                MessageBox.Show("Se ha elegido el 3");
            }
            if (comboBox1.SelectedIndex == -1)
            {
                MessageBox.Show("Elige un numero de flotas");
            }
            }
        }


Probe poniendo textBox1.Text pero me da un error que dice:
El operador '<' no se puede aplicar a operandos del tipo 'int' y 'string'

Me gustaria si esta vez me pudiesen ayudar >.<

#24
Bueno resulta que ahora necesito encontrar una imagen, llamemosla "cuadro.bmp" en un WebBrowser.
Tengo un poco de idea de como hacer eso, por ejemplo, con un for para escanear todos los pixeles y determinar cuales son iguales y cuales no, pero el problema es que no se como seguir.
1º Mi codigo inicia con un GetwindowImage que es de alguien que encontre por internet, supongo que lo que hace es crear un nuevo bitmap con la imagen del webbrowser. No se si con WM_ se podria hacerlo de una ventana escondida (mejor dicho sacando solo foto del webbrowser).

2º El segundo codigo es para tomar la foto del WebBrowser.

3º Es el codigo para escanear los pixeles, y aquí es donde esta mi problema. Mi codigo escanea todos los pixeles, ahi vamos bien pero el problema es que el If realiza la acción por cada pixel que encuentra y eso no es lo que quiero. Me gustaria que primero escanee todo y luego realize el If solo 1 vez!

Más me gustaria poder hacer lo siguiente:
Que se realize el GetPixel y el For para ubicar todos los pixeles y que luego me devuelva las coordenadas donde se encuentra mi imagen "cuadro.bmp". No se si se entiende, seria primero el For seguido de el GetPixel para que escanee toda la pantalla y que luego encuentre mi imagen "cuadro.bmp" (con getpixel o otro metodo sencillo) y me de sus coordenadas de inicio.

Este es mi codigo. Espero que se haya entendido, y si me quieren ayudar y no entendieron mi explicación intentare hacerla mas simple.

Código (csharp) [Seleccionar]

private static Bitmap GetWindowImage(IntPtr hWnd, Size size) // CODIGO PARA TOMAR SCREENSHOT (LO ENCONTRE POR INTERNET)
        {
            try
            {
                if (size.IsEmpty || size.Height < 0 || size.Width < 0) return null;

                Bitmap bmp = new Bitmap(size.Width, size.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                Graphics g = Graphics.FromImage(bmp);
                IntPtr dc = g.GetHdc();

                if (PrintWindow(hWnd, dc, 0) == 0)
                {
                    MessageBox.Show("Fallo");
                }

                g.ReleaseHdc();
                g.Dispose();

                CloseHandle(dc);

                return bmp;
            }
            catch { return null; }
        }

        private Bitmap getBrowserSS()  // TOMO UN SCREENSHOT DEL WEBBROWSER
        {
            return GetWindowImage(webBrowser1.Handle, webBrowser1.Size);
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            Bitmap recursos = new Bitmap(@"D:\GO\cuadro.bmp");
            int X, Y;
            for (X = 0; X < getBrowserSS().Width; X++)
            {
                for (Y = 0; Y < getBrowserSS().Height; Y++)
                {
                    if (getBrowserSS().GetPixel(X, Y) == recursos.GetPixel(X, Y))
                    {
                       // ME GUSTARIA QUE ME DEVUELVA DONDE SE ENCUENTRA MI IMAGEN CUADRO.PNG
                    }
                    else
                    {
                        MessageBox.Show("Algo esta mal");
                    }
                }
            }



        }


Desde ya muchas gracias =).
#25
Bueno para que se entienda bien mi objetivo es hacer un programa que haga una serie de clicks en una ventana determinada aunque esta este minimizada.
Busque en google por 3 dias seguidos sin parar y segun entendi con la función SendMessage se puede hacer lo que quiero, es decir, que simule un clic o envie una tecla aunque la ventana este minimizada.
Un simple ejemplo seria enviar una letra al notepad, mi codigo es:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {

        [DllImport("user32.dll")]
        public static extern void SendMessage(Int32 hwnd, Int32 Msg, Int32 dx, Int32 dy);

        [DllImport("user32.dll")]
        public static extern int FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll", SetLastError = true)]
        static extern Int32 FindWindowEx(Int32 hwndParent,
             IntPtr hwndChildAfter,
             string lpszClass,
             string lpszWindow
        );

        const Int32 WM_LBUTTONDOWN = 0x02;
        const Int32 WM_LBUTTONUP = 0x04;
        const Int32 VK_Q = 0x051;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Int32 WindowToFind = FindWindow("notepad", "Sin título: Bloc de notas");
            Int32 cuadro = FindWindowEx(WindowToFind, IntPtr.Zero, "edit", null);
            SendMessage(cuadro, VK_Q, 0, 0);


        }
    }
}


Ese es mi codigo completo, lo que no puedo hacer es que envie la Q al notepad! Intente de varias formas, por ejemplo:

private void button1_Click(object sender, EventArgs e)
        {
            Int32 WindowToFind = FindWindow("notepad", "Sin título: Bloc de notas");
            SendMessage(WindowToFind, VK_Q, 0, 0);
        }


Pero ese hace que cuando se aprieta el boton el programa en este caso notepad se cierre.
Entonces lei en paginas que necesito utilizar la función FindWindowEx (lei algo sobre child, hand y no se que) para seleccionar el cuadro donde se ingresa texto del Bloc de notas, entonces mi codigo queda:

private void button1_Click(object sender, EventArgs e)
        {
            Int32 WindowToFind = FindWindow("notepad", "Sin título: Bloc de notas");
            Int32 cuadro = FindWindowEx(WindowToFind, IntPtr.Zero, "edit", null);
            SendMessage(cuadro, VK_Q, 0, 0);

        }

(los valores como "edit" los obtuve con Spy++)

En este caso al presionar el Button1 el notepad no se cierra pero tampoco se escribe la Q!.
No se que tiene el codigo que no escribe la Q!.

Eso es a modo de prueba pero mi proyecto es crear un BOT para un juego de facebook, ya hice con mouse_event y SetCursorPos pero no es bueno porque no podes usar otros programas mientras el bot este activo.

No se que mas decirles :o! Simplemente si me pueden ayudar les agradeceria porque busque en toda la internet y no puedo solucionar esto..

Utilizo Visual C# 2010 Express
#26
Bueno es una tonteria pero por no hacer nada durante mucho tiempo y como nunca estudie sobre esto me olvide como hacer lo siguiente:
Que mi webbrowser abra, por ejemplo, google.com pero muestre la pagina desde las coordenadas (X, Y). Un ejemplo facil para que se entienda mejor:
Poner esta pagina en el webbrowser http://www.miniclip.com/games/commando-assault/es/ pero solo muestre el cuadro del juego (no me digan que pegue el codigo SWF porque no es ese juego el que quiero, es uno de facebook que no se puede).
Espero que se me haya entendido =).

PD: Para aclarar les digo que era una pabada, nada de codigos dificiles ni nada para que no se rompan la cabeza.

Agradeceria si me pudiesen ayudar.

Saludos.
#27
Hay una persona conocida como "HotNoob" (.com para ingresar al sitio web) que se anda encargando de hacer bots para juegos flash de facebook los cuales reconocen el lugar donde debe hacer clic mediante un mapa de bits. ¿Como se esto? porque una vez dio un bot gratis en el cual traía una carpeta con las imágenes que necesitaba para funcionar, es decir, los mapas de bit donde hacia clic.

Para sintetizar lo de arriba: Un bot que se encargue de comparar un mapa de bits ya guardado con el de la ventana actual, si coincide, realizar la acción, ya sea hacer clic o alguna otra cosa simple.

En un post de este foro encontre esto también:
CitarBueno, no conozco el juego que mencionas, pero no veo complicado el enviarle ordenes si esta hecho en ASx (Flash) y supongo que tiene trucos o combinaciones de teclas para atajos u otros que se pueden aprovechar, pero depende del nivel de proteccion que tenga dicho juego para algun bot, respecto a que el bot pueda reconocer areas o personajes del juego, simplemente con una captura de la pantalla o indicando las coordenadas y un procesado de imagenes (metodo cutre pero sirve para empezar) que en c#.net te lo da practicamente hecho solo implementar un algoritmo adecuado de comparacion de imagenes + una pequeña BD para garantizar el reconocimiento de dichas areas o personajes.
http://foro.elhacker.net/net/c_creacion_de_bots_para_juegos-t296103.0.html

Bueno al fin de todo entonces, como tengo poco conocimiento de programación, quisiera saber si me podrían decir como se llama esta técnica, explicar un poco, o por lo menos decirme en que lenguaje se puede programar asi puedo investigar mas.

Muchas gracias.
#28
Bueno actualmente me dedico a la reparación de PC entre otras cosas. Tengo un cliente que quiso cambiar su PC sin gastar mucho dinero (ya que tenia un AMD Sempron de 1.5 GHz, 768 RAM DDR, un disco de 80 gb, y una video GeForce 5200 FX). Y como le traia problemas la video yo le recomende que envez de cambiarla le convenía armarse una nueva PC porque la de el es muy antigua.
Ahora vamos a que compro un micro Athlon II x2 2.9 GHz (modelo 245) usado, con disipador y cooler, a $260 argentinos = $59 Dolares aproximadamente.
Luego me puse a buscar que Motherboard le convenía por la relación de precio/rendimiento.
Según he leido, a ese micro de Socket AM3 conviene usar memorias de DDR3 para aprovechar mas el funcionamiento. Ahora el problema es que luego de leer un poco me di cuenta que se dice que el Chipset de la mother es algo muy importante, y me puse a leer un poco para informarme y ayudarlo, el problema es que aun no entiendo mucho de cual elegir. He leido si, que determinan casi todo el funcionamiento de la PC pero al dirigirte a una pagina de una marca de mobos te aparecen millones de chipset y no tengo idea de nada.
Aparte de todo eso también el quiere agregarle una placa de video porque quiere para juegos y hasta donde se la mayoria de las integradas no son muy buenas, así que preferiria una mother que también traiga PCI-e 2.0

Sin dar mas vueltas queria saber si me pueden explicar un poco que tener en cuenta para elegir el chipset y también si conocen una mother que:
Sea socket AM3
Tenga slots de DDR3 frecuencia 1333 minima.
PCI-e 2.0 (ya que por las dudas que despues quiera ampliar por una buena video,)
Y un Chipset que bueno, me expliquen un poco.

Y aparte de todo eso, que me digan que placa de video de marca ATI me recomiendan para ese micro.
Muchas gracias.
PD: No esta pensado hacer O.C. ni SLI (que creo que seria tonto xd).
#29
Bueno mi pregunta es la del titulo, quiero hacer un Screenshooter que primero saque la foto y luego la guarde pero todo en un mismo boton haciendo que realize esto precionando una vez. Mi codigo es:

Public Function SaveScreen(ByVal theFile As String) As Boolean
        Try
            Dim data As IDataObject = Clipboard.GetDataObject()

            If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then
                Dim bmp As Bitmap = CType(data.GetData(GetType(System.Drawing.Bitmap)), Bitmap)
                bmp.Save(theFile, Imaging.ImageFormat.Png)
            End If
            Clipboard.SetDataObject(0)      'save memory by removing the image from the clipboard
            Return True
        Catch ex As Exception
            Return False
        End Try

    End Function


    Private Sub screenshot_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles screenshot.Click
        SendKeys.Send("%{PRTSC}")           '<alt + printscreen>
        SaveScreen("C:\Galaxy Pictures\Img.jpeg")


    End Sub


Osea yo quiero que entre:
        SendKeys.Send("%{PRTSC}")           '<alt + printscreen>
        SaveScreen("C:\Galaxy Pictures\Img.jpeg")

Primero haga el SendKeys.Send y luego de eso recien se procese SaveScreen. Me imagino que debe aver algun comando como "Wait" para que haga primero algo y luego otra cosa en un mismo Private Sub.
Espero que me puedan ayudar.
#30
Bueno lo que sucede es que quiero hacer que mi programa saque un screenshot (de solo la ventana del programa) y que vaya guardando imagenes, es decir, que guarde 1 y cuando saque otra le ponga 2, 3 , 4, 5, etc y así infinitamente.
Mi codigo hasta ahora es:
Código (vbnet) [Seleccionar]
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    Private Sub screenshot_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles screenshot.Click
        'Captura la ventana activa
        keybd_event(44, 1, 0&, 0&)
        If Not System.Windows.Forms.Clipboard.GetDataObject() Is Nothing Then
            Dim oDataObj As IDataObject = System.Windows.Forms.Clipboard.GetDataObject()
            If oDataObj.GetDataPresent(System.Windows.Forms.DataFormats.Bitmap) Then
                Dim oImgObj As System.Drawing.Image = oDataObj.GetData(DataFormats.Bitmap, True)
                'To Save as Jpeg
                oImgObj.Save("c:\Galaxy Pictures\Img.jpeg", System.Drawing.Imaging.ImageFormat.Jpeg)
            End If
        End If
    End Sub


Este codigo funciona para sacar la foto y enviarla a la carpeta seleccionada pero no puedo sacar muchsa y que vayan guardandose como 1, 2, 3, etc.
Porfavor espero que me puedan ayudar lo antes posible.