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ú

Mensajes - SnakeDrak

#1
Hola,

Pues para calcular el hash md5 en linux existe md5sum por consola, a parte el DLL que hice también lo calcula.

La fecha, hora, minutos y segundos imagino.. ya que compilo dos en el mismo minuto y me aparece un hash md5 diferente, quería asegurarme porque hice un generador de DLLs para mis clientes por PHP y por lo visto a uno le falló, entonces quería revisar si se compilaba correctamente porque el código fuente estaba bien, pensé que tal vez lo compilaba mal desde PHP pero será otro tipo de problema.

Muchas gracias por tu ayuda.

Saludos.
#2
Hola,

Quisiera saber si es normal que cada vez que compilo me de una biblioteca (ya que lo que compilo es un DLL desde Linux para windows) con un md5 distinto.

makefile:
Código (bash) [Seleccionar]

# Comando con el que se compilará
CC = i586-mingw32msvc-gcc
# Opciones compilador
CFLAGS=-Wall -shared -DBUILDING_DLL
# Nombre del resultado
name = archivo.dll
# Biblioteca socket
linker = ws2_32

$(name) : md5.o archivo.o
$(CC) $(CFLAGS) -o $@ $? -l$(linker)

clean :
rm -f *.o *~ $(name)


Imagino que será normal, pero querría asegurarme, muchas gracias.

Saludos.
#3
Hola,

Muchas gracias como siempre Alex :3.

Aquí explico la solución, yo había leído sobre xhost y claro como bien dijiste después de xhost queda xauth. Copié el fichero .Xauthority al directorio home de www-data (/var/www), le cambie el usuario y grupo por www-data, accedí desde consola y funciona sin problemas.

Pero desde PHP con la función exec no se ejecutaba, entonces como bien pone en la documentación que me pasaste, le dije donde se encontraba el fichero .Xauthority porque desde PHP no lo tomaba.. con lo cual quedó:

Código (php) [Seleccionar]
exec("export XAUTHORITY=/var/www/.Xauthority; programa :0.0");

Como se observa tuve que poner:
Código (bash) [Seleccionar]
export XAUTHORITY=/var/www/.Xauthority

Muchas gracias de nuevo por tu ayuda y saludos!
#4
Hola,

Mi pregunta es cómo puedo decirle al servidor X que ejecute un programa desde un usuario por consola.

Usuario en concreto: www-data
Usuario con el servidor X: snake

Al programa le puedo pasar el display: programa :0.0, pero esto no funciona:

Código (bash) [Seleccionar]

programa: could not open display ":0.0", aborting.


También probé con export DISPLAY (que es lo mismo que pasarle el display al programa) y tampoco. Es posible que no entienda bien como funciona eso de los displays...

Un saludo y muchas gracias por su colaboración.
#5
Hola ctlon,

Vale ahora sí creo que te he entendido, con esta línea:

Cita de: ctlon
hijo mio, es precisamente lo que te estoy explicando. para que lo entiendas, pilla el codigo de la msdn y compilalo tal cual y observa que espera hasta que el servidor responde. ahora bien aplicale lo que te digo y veras que no espera y que deja la espera retornando WSAETIMEDOUT una vez obtienes el timeout si quieres puedes hacer creer al cliente que le a llegado informacion..... y repito copias los datos al buffer y le devuelves el numero de bytes copiados.

Pensaba que siempre esperaba, fallo mío, es decir mi fallo era la función que te dije que no conocía y es la que debía aplicar. Pues muchas gracias =D ahora si que me cuadra todo, luego probaré y te comentaré aunque imagino que si funcionará si no espera como yo pensaba (no sabía eso del WSAETIMEDOUT).

Tu idea del Proxy también me ha parecido bastante interesante xD, si en un futuro necesito hacer muchas más operaciones utilizaré al dll como proxy.

Saludos y gracias!
#6
Hola ctlon,

Cita de: ctlon
Hookeas socket = Guardas el manejador.

No he dicho que no tenga el manejador, el manejador lo tengo la cosa es como enviar al cliente por el socket ya abierto puesto que send envía al servidor.

Cita de: ctlon
setsockopt activas SO_RCVTIMEO = Ya no queda "enganchado" y te llamara todo el rato. esta funcion tiene que estar escrita perfectamente para evitar fallos de conexion.

Esta función no la conocía.

Cita de: ctlon
Y no me digas que no funciona pq lo he probado aproposito. esto haciendolo simple, para mas detalles te lees la documentacion.

No sé como dices que de la manera que explicas te funcione, posiblemente sigues sin entender el problema que tengo.

Cita de: ctlon
de primeras tu no ejecutas nada, es el programa el que llama a la funcion y no tiene que leer nada, es la funcion la que copia los datos en el buffer.

Vuelves a no entenderlo o tal vez soy yo, te hago un apunte :p:


/*********************************************************************
* Hook a la función "RECV", aquí es donde haremos todo el proceso del antibot
*********************************************************************/
int WINAPI __stdcall recibir(SOCKET s, char* buf, int len, int flags)
{
int RecvBytes = (!announce)?_recv(s, buf, len, flags):Kami(buf);
if(RecvBytes == SOCKET_ERROR) return RecvBytes;
if((*(unsigned short*)buf)==0x283) CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&Kami, 0, 0, 0);
if((*(unsigned short*)buf)==0x0041) RecvBytes=antibot(s, buf, RecvBytes, len, flags); // Si el packet recibido es del antibot lo ejecutamos
return RecvBytes;
}


Este es la función hookeada, el packet 0x283 es el de cuando el jugador accede al juego, lo que hace es crear otro thread para enviar el broadcast una vez que ha entrado al juego (esto es lo que hice rápido a tu manera pero de la forma que yo quiero).

Tu lo que dices es que ahí modifique el BUF, el cual luego obtiene el EXE, pero entonces el packet 0x283 no será recibido (ya que lo modifico por el 0x9a) por el EXE así que lo que yo quiero es que cuando entre al juego el DLL envíe un nuevo packet al EXE por eso te comenté lo de ejecutar recibir (que obviamente no funciona así) porque habrá que ejecutar la función (la cual no sé cómo será, tal vez estoy hoy espeso) para enviarle los datos al EXE.

Ese recibir es el que he hecho rápido según tu manera (sin modificar el BUF de ningún packet) y obviamente no funciona porque la función no es ejecutada por el EXE, aquí te dejo la función kami:

/**********************************************************************
* La función Kami envía al cliente un mensaje
**********************************************************************/
int Kami(char* buf){
char msg[] = "Mensaje de prueba";
int len = 4+sizeof(msg);

if(!announce){
char* almacen = (char*)malloc(len);
Sleep(1000); // Esperar 1 segundo una vez entrado al juego antes de enviar el mensaje
announce = 1;
recibir((SOCKET)NULL, (char*)almacen, len, 0);
free(almacen);
ExitThread(0);
return 0;
}

announce = 0;
*(unsigned short*)buf = 0x9a; // Packet broadcast
*(unsigned short*)(buf+2) = len; // Tamaño del packet
memcpy(buf+4, msg, sizeof(msg)); // Añadimos el mensaje
return len;
}


Tal vez con las funciones entiendas por qué no funciona tu manera.

Cita de: ctlon
El codigo es precisamente de la MSDN. a mi me sorprende que como no sabiendo usar punteros a funciones seas capaz de hacer un hook.

Tal vez porque la función recv sé que se encuentra en Ws2_32.dll y que se llama recv, entonces puedo llamar a la dirección de memoria con GetProcAddres y el handle GetModuleHandle y así modificar los primeros 5 bytes para que apunte a mi función. No hay que ser un genio para hacer esto... si sé hacer punteros a funciones, en todo caso no sé como saber cual es la función que el EXE ejecuta cuando envía un broadcast :p.

Puedes seguir pensando que soy un idiota, la verdad es que me da igual pero creo que si no lo pensases tal vez avanzaríamos más rápido, más que nada porque el hecho de demostrarte que sé utilizar la función recv (que con mirar la doc basta) es una pérdida de tiempo, gracias por tu ayuda y espero que entiendas con ese código rápido que hice por qué es que no funciona lo que dices (o tal vez yo no te entiendo a ti).

P.D: Para que me entiendas, yo no quiero modificar lo que recibe el EXE (esto ya lo hago para otras cosas), lo que quiero es enviar algo nuevo al EXE desde el dll.
Saludos!
#7
Hola,

¿Mm pero imagino que si no es por el mismo socket no funcionará no? No lo sé pero voy a probar como dices, tal vez funcione la verdad, muchas gracias por tu respuesta Hacker_Zero.

Saludos!
#8
Hola ctlon,

Ya me rindo en explicártelo, así no se puede, no se puede porque aunque ejecutas el recibir del EXE (el hookeado) EL BUFFER RESULTANTE no lo LEERÁ el EXE porque has ejecutado la función desde otra función en el DLL, la única manera de hacerlo como he dicho 10 veces es que cuando SE EJECUTE el recibir, modifiques el buffer y así el buf resultante pase al EXE.

Ese código que me pusiste me resulta un poco tonto, tengo poco nivel de ingeniería inversa pero sé leer la documentación de msdn y ejecutar recv.. de hecho sin eso nunca podría haber hecho un hook.

Ya que me has "explicado" tu manera de hacerlo y he he explicado que eso NO se puede así hacer lo que yo digo, te doy las gracias por tu ayuda pero si no puedes aportar más esperaré a que alguien más responda, de verdad es que insistes en lo mismo, que ya había llegado a pensar que era otra cosa y por eso te pregunté cómo hacerlo pero tu manera no es más que la que te dije que no me sirve.

Saludos y gracias!!
#9
Hola ctlon,

Sé que esa es la forma correcta, de hecho lo comento en mi primer post, pero no sé hacerla y como me urge prisa pensé hacerlo de esa manera.

A ver ctlon es que no me estás entendiendo, si lees mi primer post lo entenderás, la única manera que hay para hacer llegar al EXE lo que yo quiera es SACRIFICANDO un packet, es decir, cuando reciba algo modificarlo antes de finalizar la función hook y entonces le llegará lo que yo quiera, pero NO quiero esto, quiero que directamente reciba algo del DLL sin necesidad de que le llegue algo.

Si después de esta explicación aún insistes en que se puede, ¿podrías explicarme cómo?

Saludos.
#10
Hola,

¿Perdona? Desde que empezaste a responder en el tema sabía que no podías resolverme mi duda principal (o tal vez no lo entendiste) y no te he faltado el respeto en ningún momento, al contrario, te lo he agradecido y te lo agradezco de nuevo por intentar ayudarme.

A y si te interesa te explico por qué no se puede hacer lo que dices: El hook que he hecho (bueno es básicamente lo que es un hook) lo que hace es cambiar la función recv que lee el EXE del winsock por la mía del DLL, con esto puedo recibir, modificar lo que recibe el EXE, leer lo que recibe.. etc, pero no puedo hacer que reciba algo nuevo al EXE..

Ahora mi duda es como enviar al EXE algo, o hacer que reciba algo nuevo :), eso no sé hacerlo, aunque ejecute el recv original este está en el winsock y el EXE no se interpone.. es decir no le llega nada al EXE.

De nuevo gracias por tu ayuda, no soy ningún experto pero sé perfectamente lo que he hecho y hago (para eso me costó aprender).