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

#31
Programación C/C++ / Código basura de GCC?
1 Marzo 2013, 01:12 AM
EI: del Cache de Google:
cache:http://foro.elhacker.net/programacion_cc/codigo_basura_de_gcc-t384404.0.html





Hola a todos. A ver a ver cómo empezar...

Antes que nada, me disculpo de la forma cómo hablo ya que no soy muy bueno escribiendo en foros (sí en blogs, por ejemplo el mío). No quiero ofender a nadie.

Bueno, estoy programando un sistema operativo de 32 bits como hobby (No soy un novato más). Estuve como 5 meses leyendo y leyendo (claro, aparte del tiempo que estuve estudiando por mi cuenta asm de 16 bits - no mucho pero me sirvió para hacer un micro-so :P), haciendo pruebas y encontré un manual de paso a paso cómo iniciar un kernel. Bueno ya tengo mi kernel que inicia el GDT, IDT, el teclado, la disquetera, y algunas otras cosas (no menos importantes).

La cosa es que estuve programando y re-programando (volviendo a programar para corregir errores y mejorarlos) algunos drivers básicos (ya saben) y como tenía tanto código cada compilada se comenzaba a demorar más y más en compilar (y nada en ejecutar :D) y se me ocurrió cargar un archivo en la memoria y luego ejecutarlo (call).

Como siempre estuve haciendo pruebas tras pruebas, investigando como loco y cuando me puse a descansar un rato se me vino la solución a la cabeza y listo! pude ejecutar un archivo ensamblado con nasm en mi kernel usando una interrupción del IDT (int 0x80 - mostrar un texto en la pantalla) y todo funciona ok.

Ahora quise que un programa compilado con un lenguaje de alto nivel (C) se pudiera ejecutar en mi kernel y después de 2 días pude lograrlo.. A medias... Lo que pasa es que me ejecuta el código pero cuando termina la ejecución se genera un page fault (excepción) y estuve revisando el por qué, adjunto el código del archivo de C, el linker script, el batch y las imágenes que tengo:


LINKER SCRIPT (los comentarios que ves los agregué al postear)

ENTRY("_inicio")
SECTIONS
{
   . = 0x10000; // Aquí es donde ubica el kernel al programa
//lo demás no lo entiendo (no voy a mentir) aunque me solucionó un problema anterior (googleando lo encontré)
   .text :
   {
       code = .;
       *(.text)
       text_end = .;
   }
   .rodata :
   {
       rodata = rodata_end;
       *(.rodata)
       rodata_end  = .;    
   }  
   .rdata :
   {
       rdata = rdata_end;
       *(.rodata)
       rdata_end  = .;    
   }
   .data :
   {
       data = data_end;
       *(.data)
       data_end = .;
   }
   .bss :
   {
       bss = bss_end;
       *(.bss)
       bss_end = .;
   }
   end = .;
           /DISCARD/ :{
               *(.note*)
               *(.indent)
               *(.comment)
               *(.stab)
               *(.stabstr)
       }
}


PROGRAMA EN C (GCC)
void inicio(){
char* imprimir = "Hola mundo desde GCC (Intel Syntax, programa.exe) v2!";
asm(
"xor eax, eax\n" // función 0
"mov ebx, %0\n" // cadena
"int 0x80\n" // llama a la interrupción del kernel
:
: "m"(imprimir)
);
return;
}


BATCH

// Yo mismo lo hice xD

:X
cls

gcc -march=i686 -std=gnu99 -ffreestanding -c test.c -masm=intel // aquí hay un problema a mi parecer
ld -o test -Tlink.ld test.o //creo el archivo PE
objcopy -S -O binary test ..\programa.exe //genero un archivo binario en base al archivo PE
pause
goto X


Bueno acá van las imágenes.

1. Aquí veo un código "basura" el cual me parece que mi kernel no lo entiende o no sé que sea :S

CÓDIGO OBJETO OBTENIDO POR GCC. Lo seleccionado es lo que me parece que es el problema.



2. Aquí se repite el código. Extrañamente se fue al final del archivo binario :¬¬




Cuando borro el código seleccionado manualmente en el binario se ejecuta mi programa normalmente.

Por cierto mis primeros lenguajes de programación entre comillas fueron HTML, javascript (tenía 9 años xD), después a los 13 aprendí VB.NET que es el lenguaje que siento que soy muy bueno (llevo años..) y a los 17 (masomenos) aprendí C++ (me adapté al C luego :p) y asm tuve que estudiarlo a la fuerza (obviamente no soy tan bueno pero me defiendo). Todo esto fue por mi cuenta.

No sé si alguien podría ayudarme o darme una pista para poder entender qué cosa es ese código que sobra y cómo podría eliminarlo o no ejecutarlo.

POSDATA: Mi kernel ejecuta desde el indice 0 del archivo (no ejecuta PE ni ELF, sólo binarios)

Gracias por haber leído tal discurso :)
#32
Programación C/C++ / Driver kernel x64
21 Noviembre 2012, 02:29 AM
Hola, aquí estaba retomando la programación de un driver que dejé a la mitad.

Resulta que como ya sabrán muchos no se puede hookear api's (por lo que he entendido en foros y por experiencia propia) en sistemas x64. Lo que quisiera es creo yo cambiar la dirección de memoria (perdonen si no es como digo, es lo que creo) donde está por ejemplo la API NtCreateProcess y así aceptar o denegar el acceso a algún proceso mientras se esté creando.

Bueno, lo que pido es que si alguien conoce, aunque sea cómo se llama, cómo se podría hacer lo que estaba mencionando. Pido aunque sea una idea. Gracias :)
#33
ASM / Bootloader 32-bit y segmentación
2 Septiembre 2012, 04:53 AM
Buenas.

Les cuento que hace un tiempo comencé a aprender asm (assembly) por motivos que me pareció bastante interesante poder decirle a la computadora lo que quería y esta lo hacía sin ningún límite :o, así que como los sistemas de 32-bit como windows (por cierto tengo win8 de 64bits que no me deja hacer mucho...) y linux estaban limitados quise hacer un programa que corriera al inicio de la computadora, que muestre un mensaje y algo más... ;)

Bueno la cosa es que estuve a full averiguando ;-), imprimiendo manuales completos de asm.. y bueno he aprendido varias cosas pero existen algunos temas que no los entiendo por nada >:( como son La Segmentación que se requiere creo yo en el bootloader y en un kernel ( digo kernel porque queria un bootloader y un archivo ejecutable ). Digo esto debido a que por ejemplo quiero mostrar un mensaje y no lo muestra o lo hace incompleto.

He programado con FASM MASM y NASM pero más me gusta el nasm ya que es multisistema (así se llama creo).

Ya estaba trabajando en un minisistema operativo (resaltando "mini") que muestre un mensaje y pida una o mas teclas y todo funciona a la "perfección" a excepción que no puedo trabajar con 32 bits.

Cuando intento entrar al famoso modo protegido lógicamente no me deja usar interrupciones ya que está "protegido". Al tener este problema investigué y encontré algunos temas (en inglés por cierto) que tengo que escribir directamente en la memoria pero tampoco no me funciona...

Bueno esas son todas mis dudas por el momento. :)

Lo que quiero hacer en conclusión es un bootloader de 16 bits que lea un kernel.bin y este kernel pase de 16 bits a 32 bits y muestre un mensaje. NADA MÁS :xD

¿Alguien me podría explicar por favor? y disculpen la molestia ;D
#34
pero tengo una sola máquina... ¿podrá ser virtual o hay otra manera?
#35
Una pregunta si no es de mucha molestia...

Para depurar creo que es el WinDbg pero el driver ¿lo compilo con Free Build? creo  :huh:

Referencias:
http://msdn.microsoft.com/en-us/library/ff543450.aspx
http://msdn.microsoft.com/en-us/library/ff544635.aspx
#36
Hola de nuevo. Bueno ahorita no estoy en mi casa :P

En un driver en C se declara el ZwQueryInformationProcess? y la variable que incluye el dato es ProcessInformation?

Porque eso es lo que he hecho y el driver finaliza inesperadamente y la pc se apaga por error del kernel driver. u.u

De todas maneras hoy voy a intentar de nuevo.... Tal vez no sólo es la declaración sino que ¿debo asignar algo? o explícame si me entiendes :xD
#37
Voy a hacer unas pruebas y te cuento. Muchas gracias y perdona por haberme expresado mal, como te digo soy nuevo y estoy algo desorientado. Gracias
#38
ahh ok :)

y lo del NtQueryInformationProcess  :huh: no logro usarlo correctamente

Te pido por favor que me ayudes ( lo que descubrí: PROCESSINFOCLASS no me deja usar ProcessImageFileName )

Perdona la ignorancia por lo de NtQueryInformationProcess 
#39
Lo tengo compilado. Te lo paso si quieres :P  :laugh:  :silbar:  :xD

EI: juntando mensajes.

Bueno el error de comparación sí me di cuenta
#40
OK.. pero tranquilo  ::)  una pregunta ¿el código que he escrito entonces no debería funcionar?  solo por curiosidad ;)