elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Mensajes
Páginas: 1 [2] 3 4 5 6 7
11  Programación / Ingeniería Inversa / Re: Inyeccion DLL para extender una funcion en: 28 Octubre 2015, 16:52 pm
Hola!

Lo mejor que puedes hacer es: correr el programa cuya DLL modificas con un debugger (Parece que estás en 32 bits, así que aconsejo Olly), le pongas un BP al inicio de la misma (HBP si modificas los bytes) y veas qué pasa cuando el HBP salta.

Es la mejor opción para comprender qué estás haciendo mal.

Saludos!

Eso habia hecho y era que cuando ingresaba a la funcion (como yo hacia un jump) el prologo y el epilogo me destrozaban los registros.
Ahora encontre que tengo que poner al comienzo de la definicion de mi funcion a la cual hago el jump lo siguiente
__declspec(naked) definicion(parametros) {}

Eso hace que evite el prologo y el epilogo de manera que salta directo a las instrucciones.
12  Programación / Ingeniería Inversa / Inyeccion DLL para extender una funcion en: 28 Octubre 2015, 00:34 am
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
  1. void JmpPatch(void *pDest, void *pSrc, int nNops = 0) {
  2.  
  3. DWORD OldProt;
  4. VirtualProtect(pSrc, 5 + nNops, PAGE_EXECUTE_READWRITE, &OldProt);
  5. PointTo = (DWORD)pSrc + 8;
  6. *(char*)pSrc = (char)0xE9;
  7. *(DWORD*)((DWORD)pSrc + 1) = (DWORD)pDest - (DWORD)pSrc - 5;
  8.  
  9. for (int i = 0; i < nNops; ++i) { *(BYTE*)((DWORD)pSrc + 5 + i) = 0x90; }
  10.  
  11. VirtualProtect(pSrc, 5 + nNops, OldProt, &OldProt);
  12. }

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
  1. DWORD dir = 0x62632B;
  2. void ImprimirLog()
  3. {
  4. __asm {
  5. mov edi, [esp + 4 + DWORD PTR 0Ch]
  6. shr edi, 2
  7. push dir
  8. ret
  9. }
  10. }

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.
13  Programación / Ingeniería Inversa / Re: Inyeccion de DLL para obtener acceder a parametros de una funcion en: 26 Octubre 2015, 02:07 am
Si no sabes el nombre y parametros de las funciones  de la dll sera muy complicado hacer lo que estas pensando me imagino que es una dll hecha en c++

Hay programas que permiten obtener el nombre de la funcion pero no asi sus parametros asi lo que te queda es revisar si hay documentacicon oficial sobre las funciones de la dll.

Saludos....

La DLL la voy a hacer yo, lo que quiero es inyectarla a un juego en una funcion de dicho juego, conozco los parametros porque la abri con OllyDBG.

Si quieres loguear todo, entonces deberás guadar el buffer en algún lado (memoria o disco). Sinó, deberás filtrar la data de acuerdo a lo que quieras loguear.
No pense eso de guardarlo en la RAM. Como voy a capturar todos los mensajes que se encripten pense que seria mucho aunque no lo es (muchos tienen menos de 50 bytes de largo).
Estaba pensando la posibilidad de hacer un archivo xml e ir añadiendo un nodo cada vez que se cifra un mensaje, el tema es que cada vez voy a tener que abrir el archivo xml, escribir y cerrarlo, no se si es optimo.
14  Programación / Ingeniería Inversa / Inyeccion de DLL para obtener acceder a parametros de una funcion en: 25 Octubre 2015, 14:57 pm
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.
15  Programación / Scripting / Re: DuDas sobre funciones Python" en: 9 Febrero 2015, 13:47 pm
Te dejo una idea y con esto te alcanza para hacer lo que necesitas:
Concatenación de dos strings
Código
  1. # Creamos dos strings
  2. hola = "Hola"
  3. mundo = "Mundo!"
  4.  
  5. # Los concatenamos
  6. concatenar = hola + mundo
  7.  
  8. # Es lo mismo que
  9. concatenar = "Hola" + "Mundo!"
Si haces print(concatenar) va a imprimir:
HolaMundo!

(pista: en el primer problema puedes ir concatenando los numeros y dejando un espacio entre ellos, asi despues haces return "Los factores de {} son: {}".format(nb, stringDeNumeros) )

Y una ayuda para el reloj de arena (observa el \n):
Código
  1. # Creamos dos strings
  2. hola = "Hola\n" # Observa el \n
  3. mundo = "Mundo!"
  4.  
  5. # Los concatenamos
  6. concatenar = hola + mundo
Si haces print(concatenar) va a imprimir:
Hola
Mundo!

Al poner el "Escape Character" (no se el nombre en español xd) \n lo que hace es indicar que la parte que sigue ira en una nueva linea.

Creo que con eso es suficiente como para hacer esos trabajos.
Igual si tenes dudas en esta pagina hay buena informacion sobre los strings:
http://www.tutorialspoint.com/python/python_strings.htm
16  Programación / Scripting / Re: DuDas sobre funciones Python" en: 9 Febrero 2015, 13:24 pm
Ahh entonces si, podes usar un string para almacenar los números. Los vas concatenando y listo  :D

Y por lo que entiendo en la segunda pregunta, ¿La figura la tenes que devolver o imprimir?
Si solo lo tienes que imprimir desde la función que hiciste, entonces no debe devolver nada, es decir, va a devolver None (debido a que si no escribís return, implícitamente devuelven None, creo...)
Ahora, si necesitas que te devuelva el reloj sin imprimirlo (para que si vos haces print(afficher_sablier(5)) te lo dibuje), lo que tenes que hacer es "dibujarlo" en un string, me refiero a que en vez de imprimirlo dentro de los ciclos, vas concatenando en un string, que después al final de la función, lo devolves con el return.

Si no se entiende, preguntame de nuevo  ;D


17  Programación / Scripting / Re: DuDas sobre funciones Python" en: 9 Febrero 2015, 05:03 am
¿Por que razón no quieres almacenar los resultados en una lista?
No tienes otra forma, a menos que sepas la cantidad de elementos que quieras almacenar y crees una variable para cada uno.
Lo que vos necesitas es referenciar a un objeto que te permita acceder a un numero variable de referencias de otros objetos y ese es el rol que cumple una lista.
Existen variantes de listas, como pilas o colas, pero al final siguen siendo lo mismo. Podrías usar un diccionario pero también estarías cayendo en las listas nuevamente, y encima necesitarías definir una clave para cada elemento.
Quizás me equivoque pero que yo sepa no hay forma de hacer esto si no es con una lista..
EDITO: Podrías almacenarlos en un string poniendo alguna marca para después saber donde termina cada elemento, pero no tiene mucho sentido.

Y con respecto a lo segundo, pon el codigo así es mas facil saber que es lo que pasa,

PD: cuando pongas codigos, tenes que ponerlo entre etiquetas. Las de python son: [ code=python][/ code] (sin los espacios).

18  Programación / Scripting / Re: Duda muy básica en: 7 Febrero 2015, 17:13 pm
Debes colocar una coma al final del print para indicar que sigue en la misma linea.
Código
  1. x = 1
  2. while x <= 30:
  3. print x,
  4. x += 1
  5.  

Un tip de programacion:
Cuando vas a iterar una cantidad de veces determinada, o mejor dicho conocida antes de iniciar el bucle, se recomienda usar "for":
Código
  1. for x in range(1, 30):
  2. print x,
  3.  

La funcion range(start, stop[, step]) https://docs.python.org/2/library/functions.html#range crea una lista que empieza en start, finaliza en stop y avanza tanto como step indique.
Si pasas un solo argumento sera stop, y start comenzara automaticamente en 0.
Si pasas dos argumentos el primero será start, el segundo stop.
Si pasas tres argumentos sera como el anterior nada mas que el ultimo indicara cuanto avanzar.
19  Programación / .NET (C#, VB.NET, ASP) / Re: [C#] detectar imagen y obtener coordenadas en: 7 Febrero 2015, 15:43 pm
Yo una vez hice (copie en parte) un algoritmo ImageSearch bastante eficiente como para una imagen 1024 x 768.
El algoritmo se basa en ir pixel por pixel comparando el primer pixel de la imagen X (imagen a buscar) con los pixeles de la imagen B (imagen base).
Por primera vez yo lo había hecho con GetPixel (funcion de la libreria grafica de C#) pero era muy lento. Buscando en internet encontré que a través de punteros podes acceder directamente a la memoria donde se encuentran almacenados cada pixel, haciendo que la velocidad aumente considerablemente.

Acá te dejo un link con la información necesaria:
http://bobpowell.net/lockingbits.aspx

Nunca probé AForge pero el metodo que yo te digo lo podes comprobar acá:


Quizas te parezca algo lento pero eso se debe a que la imagen la obtiene de un WebBrowser, si la sacas de algún archivo estático y comparás, va a ser muy veloz.

Obviamente se podria optimizar mucho mas, haciendo por ejemplo, lo que dice Elektro, dividir en partes de 100x100.

Saludos
20  Programación / Programación General / Re: Denme buneos consejos para ser programador en: 28 Enero 2015, 03:51 am
Desde mi punto de vista, la condición necesaria para ser un buen programador es estar muy interesado en el tema.
No conozco ningun libro para recomendarte, yo cuando era chico aprendí todo por prueba y error a través de proyectos personales, y ahora todo se puso mas claro con los conceptos que me dan en la facultad..
Lo que sí te digo que no es tan importante aprenderte un lenguaje, sino que es mas importante aprenderte las bases y técnicas de los algoritmos (ej, estructuras repetitivas, manejo de punteros) y con eso ya puedes aprender cualquier lenguaje por vos misma..
Ojo, yo no soy un profesional (apenas te llevo 4 años), sigo siendo un novato en el tema, pero ese es mi pensamiento..

Y sobre la UTN, para mi es una muy buena universidad (estudio en la FRRe).
Te doy una introduccion por si no sabias de esta facultad (hablando de la que yo conozco, la de resistencia). En la mia no se aprende ningun lenguaje de programacion, hemos visto Pascal y Smalltalk, pero simplemente para lo mismo que dije arriba, explicar las distintas tecnicas de programacion y los algoritmos.
Yo estoy en 2do año y todavia no nos ha tocado hacer algun programa por obligacion, creo que la carrera se trata mas una introduccion al mundo de los sistemas para que despues vos te puedas manejar solo, lo cual creo mucho mas valioso.
Es solo mi opinión, quizas alguien piense distinto..
Páginas: 1 [2] 3 4 5 6 7
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines