1.Este codigo tan secillo me compila bien, pero sin embargo me da un error en timepo de ejecucion, la tipica ventanita de windows diciendo q aplicacion.exe a detectado un problema y debe cerrarse...A q se puede deber?
2.Mira este code, funciona sin problema pero me gustaria interpretarlo al depurarlo (utilizo ollydbg).
3. Que funcion del SO tengo q utilizar para imprimir una cadema de caracteres por la linea de comandos, como si fuera el system("cadena"); del lenguaje C?
4. Y que funcion para almacenar una cadena de caracteres q escriba por el teclado?
Y me da un error en tiempo de ejecucion (ya puse el ret ). MI pregunta es, como debo poner el codigo para que me funcione? Y para que hay que hacer un push NULL en muchas ocasiones antes de llamar a la funcion? Esque lo vi en muchos codigos en internet y nose el porque hay que pornerlo..Y el de ReadFile?No sabes de algun sitio donde te diga los parametros que hay que meterles a las funciones y como hay que utilizarlas?
4. Otra cosa, como se ponen las etiquetas y sus referencias en masm para 32 bits?Esque cuando programaba para win16, bastaba con poner las etiquetas asi::etiqueta, y te referias a ella con su nombre, jmp etiqueta... como se hace ahora?
Y otra pregunta, que significa el "NOP" que pone muchas veces cuando debugeas un codigo??
La respuesta es simple: correctamente.
Al debugearlo, que de esa manera me ayuda, y hasta te dice el orden el que hay que meter los parametros, me devuelve en eax un handle con el valor 00000, que ya es raro.. lugo lei donde me dijiste que lpNumberOfBytesWritten y lpOverlapped no pueden valer los 2 NULL. En fin, el codigo debe ser bastante sencillo xD... Aunque en la pagina que me diste esta todo en ingles, tampoco tengo soltura para el ingles y ademas las funciones apis estan para otros lenguaje, aunque supongo que dara igual...
4.ok, esque ayer lo probe y no me funcionaba, y hoy, misteriosamente si
Cuando te sale el cuadro ese de tuaplicacion.exe a detectado un problema y debe cerrarse, a que puede deberse? Quiero decir, que cuales son las causas fundamentales?
PEro lo que no entiendo es, el que ejecuta, para que detecte un problema y se cierre, que secuencia de codigo
Gracias, y me funciona prefectamente el programa, bueno solo un pequeño detalle...Que cuando intenta mostrar por la shell la cadena que introduci previamente se come algunas letras :ej:escribo: hola, que tal?me sale:hola, (espacios) tal?...pero bueno al menos sale algo.. xD...
Respecto al tema de las excepciones. Supongo que el tema ira asi:El control de excepciones del SO detecta una excepcion en el codigo(stack overflow, se agota la mem,asignacion a una variable un valor no valido...) , y entonces lanza la excepcion e intenta encontrar un manejador de excepciones dentro del ejecutable, que como no lo encuentra, aborta la ejecucion del programa y muestra el cuadro ese de la aplicacion.exe ha detectado un problema, indicandote el offset donde lo encontro. (no si te referias a eso con el manejador por defecto). Esto es lo que yo entiendo, corrijeme si estoy equivocado. Entonces utilice un hex editor, para borrar lo que se me antojara, sin borrar la cabecera, y luego lo abri con el debugger para ver ejemplos de excepcion generados por casualidad ( es bastante facil generar errores xD). El primero que encontre fue en esta linea "OR DWORD PTR DS:[EAX],EBP". Esto por lo visto es un error. Lo que me gustaria que me dijeras, son ejemplo de errores, y explicarlos brevemente, como este, para no cometerlos yo al programar.
Otra cosilla, que me viene a la cabeza, jejej, como es posible desbordar el buffer asignado a una variable? EJ: pongo en la zona de .data algo asi : dd 2, y por muy larga que sea la cadena de caracteres que meto, no me salta el cuadrito de la excepcion. POr cierto, que significa declarar datos asi : dd 0h, porque se pone el 0h? es el tamaño del buffer? (no creo....)
Y la ultima cosa, (perdona por tantas preguntas xD,..) cuando un programa se carga en memoria, cada vez se carga a partir de un offset, que le asigna el SO vd? no siempre en el mismo... Entonces si por ej, te salta un cuadro de excepcion, indicandote el offset donde esta el error, si tu lo abres con un debugger, no tiene porque estar en el mismo offset, o si? Y cuando lo abres con un hex editor?
No, los ejecutables suelen tener una direccion de carga unica que es repestada por el loader de Windows, proba a ponerle la direccion base de Kernel32 o NTDLL y vas a ver lo que pasa ...
POngo el codigo por si ves algo mal. cadena2 "dd 20h", no es necesario, vd?
Y el que se carguen 2 programas a la vez, y no se pisen al cargarse en la misma direccion (0040100), es por el tema de la memoria virtual, vd?
Cada proceso tiene su propio espacio de direccion totalmente independiente de los demas.
Cual era la instruccion del entry point, y donde hay q situarla?
PUes cargue varios procesos con el olly, y se me cargan siempre en 00401000...
No se a que te referis con eso realmente.
Es la direccion por defecto del enlazador de Microsoft, eso te demuestra lo que te dije, si no fuera asi todos esos programas sobreescribirian a los demas ...
Me refiero, a, la instruccion que debo poner en la cabecera del archivo, para que el programa comience a ejecutarse a partir de una direccion, no a partir de la direccion donde se cargue el archivo, y en que seccion hay que situar dicha intruccion.... cambiar el entry point y situaro en otro lugar del codigo.....
Oye, y porque no puedo utilizar ExitWindowsEx? Esque corro el programa con el debug y me dice q no tengo privilegios......y soy el admn...
Y si yo quiero que el procesador empiece a ejecutar en la instruccion "mov eax,ebp" por ej, que pongo?? Eso del entry:funcion, lo puse con readfile y se me fue directamente al jmp readfile de abajo.MSDN? donde esta eso? donde esta el ejemplo?