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

#1
Hola,

Recuerdo que ya habia comentado esto... Me habian respondido que "Dependiendo del sistema operativo en cuestion, el tema va en un subforo o en otro" Okay lo proceso...

Queria responder pero al final me dio palo. Ahora pregunto: Y si se quiere hablar de sistemas operativos en general? Me explico: Dese el caso en el que se preguta sobre operaciones multiproceso... Esto no es especifico de un OS. O sobre el arranque UEFI, o sobre la comunicacion DMA... Sobre la carga de procesos, sobre programacion de sistemas operativos (O bootloaders/bootstraps), sobre bootloaders en si, sobre comunicacion con la BIOS y los perifericos, sobre programacion de sistemas de archivos... No se... Creo que son miles de cosas que se podrian hablar al respecto en un subforo asi.

Que no critico la estructura actual del foro ni al foro en general. Es el unico foro en el que he entrado y el otro dia me puse a revisar los que hay por ahi y j*der... Bendito sea EHN.

Solo sugiero...

Buenas noches y un saludo.
#2
Foro Libre / Define a un loco
26 Noviembre 2021, 00:41 AM
Hola,

Crees que el hecho de no compartir las creencias mas arraigadas a una sociedad te puede convertir en un enfermo mental ante los ojos particulares?

Es curioso que la sociedad este compuesta de individuos, pero esta no sean los individuos en si, sino una masa de ideas que revolotea y se transforma y se "Transvalora" de forma diferente todo el tiempo. En una sociedad, el yo depende del tu y el tu del yo, porque si yo dependiese de mi, no seria una sociedad; no seria un acuerdo entre tu y yo sino una "Suficiencia" conmigo mismo.

Puede llamarsele loca a una persona cuyo yo depende de mi? Es asi todo el tiempo?

Hasta que punto una enfermedad mental es una patologia real?

Se que hay un diccionario y que la mayoria se vera tentado a citarlo, pero los significados no tienen un diccionario porque se valen por si mismos; de forma que uno los conoce sin aprenderlos y a esto me refiero con:

Define a un loco
#3
Hola,

Estoy jugando con un depurador y cuando intente hacer una llamada a CreateFileA, LastError se setea a ERROR_NOACCESS y LastStatus a STATUS_DATATYPE_MISALIGNMENT. No entiendo que significa...

Pense que se referia a que la referencia al nombre del archivo ("hello.txt") se encontraba en una posicion de memoria desalineada a 4 bytes, pero aun cuando la alinee a 4 bytes sigue retornando lo mismo.

Aqui esta el disassemble:

Citar00007FF755211016 | mov qword ptr ss:[rsp+30],0             |
00007FF75521101F | mov dword ptr ss:[rsp+28],80            |
00007FF755211027 | mov dword ptr ss:[rsp+20],2             |
00007FF75521102F | mov r9d,0                               |
00007FF755211035 | mov r8d,0                               |
00007FF75521103B | mov edx,40000000                        |
00007FF755211040 | lea rcx,qword ptr ds:[7FF7552110A4]     | 00007FF7552110A4:"hello.txt"
00007FF755211047 | mov rax,qword ptr ds:[<&CreateFileA>]   |
00007FF75521104E | call rax                                |
00007FF755211050 | mov qword ptr ss:[rbp-8],rax            |

(el handle lo guardo en rbp-8)

Arquitectura x86_64

7FF7552110A4: direccion del nombre del archivo ("hello.txt")

Equivalente en C:

hFile=CreateFileA("hello.txt",
                      GENERIC_WRITE,
                      0,
                      NULL,
                      CREATE_ALWAYS,
                      FILE_ATTRIBUTE_NORMAL,
                      NULL);


Gracias...
#4
Un archivo en disco que puede cargarse en memoria para ser ejecutado, es un archivo cargable, que en memoria si que es ejecutable, solo que en disco no se estructura de la misma forma que en memoria, no?

Se que puede parecer trivial esto, pero me perturba decir ejecutable cuando es un programa que es realmente ejecutable solo cuando esta en memoria principal. Mientras se encuentra en el disco no es ejecutable, porque no puedes mapear, por ejemplo, un PE en un procesador compatible porque no reconocera la signature "MZ" como una instruccion (Y tampoco deberia, porque no es un dato ejecutable, precisamente, sino cargable) Gran parte incluso de los programas que llamamos ejecutables dependen no solo de un cargador, sino de librerias que se toman por dispuestas.

Un COM es ejecutable, un EXE es cargable. Me equivoco?
#5
Hola,

Con Dios me refiero al loader de Windows.

Bueno, es una pregunta rapida: Modifique "Un poquis" explorer.exe. La cosa es que ya no me arranca  :xD

Me asegure de cambiar DLL Characteristics en el Optional Header del ejecutable para que no se forzaran chequeos de integridad, y tambien calcule el checksum.

¿Hay algo de lo que me estoy perdiendo?

¿Es que Dios no lee DLL Characteristics?  :-(




PD: Corria bien en el depurador.
#6
Se que .idata mantiene una tabla de las direcciones a las funciones de las importaciones... Mi pregunta es... ¿Todas las importaciones?

Hice un programa "Hello world" para analizar esta tabla y veo un millon de direcciones, cuando mi programa usa pocas funciones (en relacion).

Entonces, ¿Se carga todo?

Esto es trabajo del dynamic linker por lo que me imagino que no tiene idea de que funciones son las que va a utilizar el programa, por lo que las carga todas, ¿No?
#7
Hola,

Hace poco que tengo Linux y una de las cosas que aun me "Amarran" a Windows es que me gusta analizar malware para esta plataforma. Es como leer novelas...

Entonces, antes de que pienses que mi pregunta es tonta, tiene una razon: Hace no mucho tenia Ubuntu (Ya se que digo que recientemente lo tengo, pero antes no era usuario de Linux sino "Usuario" de Linux, ¿Entiendes? Entiendes...), ahora tengo Debian, y me quiero deshacer poco a poco de Windows como sistema "De usuario". A priori se me ocurrio utilizar Wine para poder correr los malwares, la cosa es que obviamente no quiero correrlos si no depurarlos.

Entonces, ¿Wine vale para esto? (Analisis de malware)

Gracias




PD importante: Recuerdo que intente correr el instalador de VirtualBox (solo queria ver si funcionaria) en Wine y se colgo  :xD :xD Luego se cerro solo. Esto es lo que me hace dudar de que vaya a correr un malware (Algunos son algo picky con los recursos que utilizan).




PD2: Respuesta frecuente: "Haz una maquina virtual" Claro, pero me gusta depurarlos. No puedo depurarlos con maquinas virtuales (Que si... puedo usar el comando experimental virtualboxvm --startvm <maquina> --debug, pero no me vale en este caso porque no te imaginas lo engorroso que es). Solo quiero saber si puedo hacer esto especificamente en Linux

Agradezco de antemano su atencion...




PD3: Creo que concretamente la pregunta seria: ¿Que es lo que no se puede hacer en Wine?
Perdonen las molestias.

Un saludo.
#8
Hola,

Citar'Linux Now Powers 100% of the World's Top 500 Supercomputers'. Isn't this mind-boggling?

Estaba leyendo esto y segui leyendo hasta ese momento de 'Espera un segundo..." la verdad es que  si. Es de hecho algo increible.

Ya se que tal vez estoy preguntando algo casi obvio, pero me pregunto por que Linux esta tan presente en supercomputadoras, servidores grandes, etc.

Llevo toda mi vida programando y "tocando" Windows. Que si... hay que tocarlo por las malas para hacer ciertas cosas que en Linux no hace falta indagar para notar que tienes en la palma de la mano. Si quisieras modificar el NTLDR por ejemplo, preparate para una buena. Aun de los sistemas antiguos.

Pero, en fin, a que se debe esta "Magnificiencia" de Linux en los sistemas mas importantes? Que es eso que lo diferencia tanto? Solo el hecho de ser software libre?

Que si... Eso ya es algo grande y agradezco tanto que dejen leer el codigo en un lenguaje como C y modificarlo a tu gusto, es algo de nada menos que agradecer, pero es eso solamente?
#9
Hola,

En total he hecho ejercicio (seriamente) desde hace unos tres años. La eventualidad es que ultimamente me he planteado hacerlo con mas medida.

Sinceramente luego de los ultimos 8 meses estoy conforme con los resultados que he tenido, y no se si esta sea una "Crisis normal" de esto, pero comienzo a pensar que podria avanzar mejor. Cuento mi problema:

Despues de cada serie, descanso unos treinta segundos. La cosa es que no se si deberia descansar "Tanto", porque cada dia de entrenamiento entreno tres musculos diferentes, por lo que no se si durante el entrenamiento de uno, ya estoy descansando el otro, por lo que no tendria sentido "Descansar" algo que ya esta descansado.

Por ejemplo: Durante un dia concreto podria hacer tanto la espalda, como los abdominales y los triceps. La cuestion es: Lo hago secuencial, asi que, mientras hago el segundo y el tercero, estaria descansando el primero, si es que lo que se cansa son los musculos y no el cuerpo en general.

No he encontrado una respuesta mas o menos precisa a esta pregunta en concreto. No se si lo que se cansa en el cuerpo es el cuerpo en si o una parte de el... Creo que me explique bien... Perdonad si se lee un poco engorroso...

Gracias por su atencion.

Buenas noches.
#10
Hola,

Como saben, la funcion gets generalmente imprime el salto de linea final, por lo que el cursor salta de linea cuando se presiona [Enter] ademas de solo guardar la cadena. Lo que me gustaria saber es si hay una funcion como esta que no imprima este salto de linea, sino que se quede en la misma linea

Gracias...
#11
Tengo este codigo:

#include <stdio.h>
#include <windows.h>

int error(char *szErr, int errcode)
{
   printf("\r\nError: RTL: %s: %d", szErr, errcode);
   return errcode;
}

DWORD AsynchronouslyListen (HANDLE *phPipeOutRd)
{
   BYTE szBuffer[BUFSIZ];
   DWORD dwBytesn;

   while(ReadFile(*phPipeOutRd,
                  szBuffer,
                  BUFSIZ,
                  &dwBytesn,
                  NULL))
   {
       szBuffer[dwBytesn]='\0';
       printf("%s", szBuffer);
   }

   return 0;
}

int main()
{
   HANDLE hPipeOutRd, hPipeOutWr,
          hPipeInRd, hPipeInWr;

   SECURITY_ATTRIBUTES sa;
   STARTUPINFO si;
   PROCESS_INFORMATION pi;

   DWORD dwBytesn;
   BYTE szBuffer[BUFSIZ];

   HANDLE hAsynchronouslyListenT;

   printf("\r\nCreating pipes for communication... ");

   sa.nLength=sizeof(SECURITY_ATTRIBUTES);
   sa.lpSecurityDescriptor=NULL;
   sa.bInheritHandle=TRUE;

   if(!CreatePipe(&hPipeInRd, &hPipeInWr, &sa, 0))
   {
       error("CreatePipe()", GetLastError());
   }

   if(!CreatePipe(&hPipeOutRd, &hPipeOutWr, &sa, 0))
   {
       error("CreatePipe()",GetLastError());
   }

   printf("ok ");

   printf("\r\nCreating process... ");

   ZeroMemory(&si, sizeof(STARTUPINFO));
   si.cb=sizeof(STARTUPINFO);
   si.dwFlags=STARTF_USESTDHANDLES;

   si.hStdError=si.hStdOutput=hPipeOutWr;
   si.hStdInput=hPipeInRd;

   if(!CreateProcess("C:\\Windows\\System32\\cmd.exe",
                     NULL,
                     NULL,
                     NULL,
                     TRUE,
                     0,
                     NULL,
                     NULL,
                     &si,
                     &pi))
   {
       error("CreateProcess()", GetLastError());
   }

   printf("ok ");

   printf("\r\nCreating thread... ");

   sa.nLength=sizeof(SECURITY_ATTRIBUTES);
   sa.lpSecurityDescriptor=NULL;
   sa.bInheritHandle=TRUE;

   if((hAsynchronouslyListenT=CreateThread(&sa,
                                           0,
                                           (LPTHREAD_START_ROUTINE)AsynchronouslyListen,
                                           &hPipeOutRd,
                                           0,
                                           NULL))==NULL)
   {
       error("CreateThread()", GetLastError());
   }

   printf("ok ");

   printf("\r\n");

   while(strcmp(szBuffer, "exit")&&\
         strcmp(szBuffer, "end"))
   {
       printf("\r\n");

       ZeroMemory(szBuffer, BUFSIZ);
       gets(szBuffer);
       szBuffer[strlen(szBuffer)]='\n';
       szBuffer[strlen(szBuffer)+1]=0;

       if(!WriteFile(hPipeInWr,
                     szBuffer,
                     strlen(szBuffer),
                     &dwBytesn,
                     NULL))
       {
           error("WriteFile()", GetLastError());
       }
   }

   ExitProcess(0);
}


El cual produce esta salida:

Citar
Creating pipes for communication... ok
Creating process... ok
Creating thread... ok

Microsoft Windows [Version 10.0.19043.1348]
(c) Microsoft Corporation. All rights reserved.

C:\Users\Programming\Documents\Pipe exercise\1>echo hola

echo hola
hola

C:\Users\Programming\Documents\Pipe exercise\1>

Imprime la cadena del input a la tuberia  :huh: :huh: :huh: :huh: :huh: :huh:

He puesto breakpoints (improvisados) aldededor del programa y nada que doy con la parte que imprime esto. Se que no es WriteFile y sospecho que es ReadFile pero no puedo estar seguro porque se esta ejecutando al mismo tiempo que el main thread

¿Alguien sabe a que se debe?




Es el proceso hijo.

CMD.EXE hace eco del comando de entrada... Porque hay dos "gets" aqui... El del proceso hijo mas el del proceso padre... Mira tu que interesante...
#12
Que pregunta ¿No?  :xD

Pues eso... ¿Alguien sabe si hay netcat para IOS?

Solo quiero establecer conexiones TCP "RAW" desde un movil que tengo y no se como. Lo solia hacer con mi Android (Que no estaba rooteado). Claro, no podias hacer listen, pero eso no es lo que quiero, sino conectarme nada mas




Solucion:

TCPConsole
#13
Hola,

Estoy intentando escribir la entrada y leer la salida de un proceso (independientemente hijo o "detached") como cmd.exe (da igual que proceso es, porque estoy haciendo esto por practica) y mi programa se estanca en ReadFile:

#include <stdio.h>
#include <windows.h>

int main()
{
   HANDLE hPipeOutWr, hPipeOutRd,
          hPipeInWr, hPipeInRd;

   char szBuffer[BUFSIZ];
   char szAns[BUFSIZ];
   DWORD dwRead;

   STARTUPINFO si;
   PROCESS_INFORMATION pi;
   SECURITY_ATTRIBUTES sa;

   ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));

   printf("\r\nCreating pipes... ");

   sa.nLength=sizeof(SECURITY_ATTRIBUTES);
   sa.lpSecurityDescriptor=NULL;
   sa.bInheritHandle=TRUE;

   if(!CreatePipe(&hPipeInRd, &hPipeInWr, &sa, 0))
   {
       return ("\r\nError: Windows RTL: CreatePipe(): %d", GetLastError());
       return -1;
   }

   if(!CreatePipe(&hPipeOutRd, &hPipeOutWr, &sa, 0))
   {
       return ("\r\nError: Windows RTL: CreatePipe(): %d", GetLastError());
       return -1;
   }

   printf("ok ");


   ZeroMemory(&si, sizeof(STARTUPINFO));
   ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
   ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));

   si.cb=sizeof(STARTUPINFO);
   si.dwFlags=STARTF_USESTDHANDLES;

   si.hStdError=hPipeOutWr;
   si.hStdInput=hPipeInRd;
   si.hStdOutput=hPipeOutWr;

   printf("\r\nCreating process... ");

   if(!CreateProcess("C:\\Windows\\System32\\cmd.exe",
                     NULL,
                     NULL,
                     NULL,
                     TRUE,
                     0,
                     NULL,
                     NULL,
                     &si,
                     &pi))
   {
       printf("\r\nError: Windows RTL: CreateProcess: %d", GetLastError());
       return -1;
   }

   printf("ok ");

   CloseHandle(hPipeOutWr);
   CloseHandle(hPipeInRd);

   printf("\r\nStarting communication... ");

   while(strcmp(szBuffer, "exit")&&\
         strcmp(szBuffer, "end"))
   {

       if(ReadFile(hPipeOutRd,
                       szAns,
                       BUFSIZ,
                       &dwRead,
                       NULL))
       {
           while(ReadFile(hPipeOutRd,
                           szBuffer,
                           BUFSIZ,
                           &dwRead,
                           NULL))
           {
                   zBuffer[dwRead]='\0';
               strcat(szAns, szBuffer);
           }
       }
       printf("%s", szAns);
       ZeroMemory(szAns, BUFSIZ);

       gets(szBuffer);
       szBuffer[strlen(szBuffer)]='\n';
       szBuffer[strlen(szBuffer)+1]='\0';
       if(!WriteFile(hPipeInWr,
                     szBuffer,
                     strlen(szBuffer),
                     &dwRead,
                     NULL))
       {
           printf("\r\nError: Windows RTL: WriteFile(): %d", GetLastError());
       }
   }

   TerminateProcess(pi.hProcess, 0);
   return 0;
}


Se como hacer que funcione, el punto es que no quiero que funcione de esa manera porque es una manera no optima. Si pongo un Sleep(1000); antes de ReadFile, el programa funciona, porque le da tiempo al proceso (hijo, en este caso) de ejecutarse y meter datos en el buffer de la tuberia.

Esto no tiene sentido. Es un segundo de ejecucion que no esta haciendo nada.

¿Alguien sabe una forma eficiente de hacer tuberias en Windows?

He hecho tuberias nombradas y no he tenido ningun problema, aunque tambien es cierto que el programa hijo en ese momento lo hice yo especificamente para ser un programa hijo con tuberias, asi que no aplica en este caso.

En realidad me gustaria saber como hacer una tuberia anonima, asincrona y estable. No encuentro ningun ejemplo de ello en Windows.

Cualquier informacion me seria util.

Gracias.

Buenas noches.




PD: El problema no esta en el while(ReadFile... Porque ya lo quite y tampoco funciona asi. Ademas eso solo confirma que no hay mas entradas.

Si la funcion no detecta ningun byte deberia fallar y ya. No quedarse en un ciclo infinito  :huh: :huh: :huh:




Solucion:

Ya quisieramos tu y yo que fuera posible hacer async listen con tuberias en Windows. La unica forma aparentemente es crear hilos que escuchen

Como se que me explico como el c*** mejor dejo el codigo y ya:

    #include <stdio.h>
    #include <windows.h>

    DWORD AsyncListen(HANDLE hPipeOutRd)
    {
        char szBuffer[BUFSIZ];
        DWORD dwRead;

        while(ReadFile(hPipeOutRd,
                       szBuffer,
                        BUFSIZ,
                        &dwRead,
                        NULL))
        {
            szBuffer[dwRead]='\0';
            printf("%s", szBuffer);
        }
    }

    int main()
    {
        HANDLE hPipeOutWr, hPipeOutRd,
               hPipeInWr, hPipeInRd;

        char szBuffer[BUFSIZ];
        char szAns[BUFSIZ];
        DWORD dwRead;

        HANDLE hAsyncReadT;

        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        SECURITY_ATTRIBUTES sa;

        ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));

        printf("\r\nCreating pipes... ");

        sa.nLength=sizeof(SECURITY_ATTRIBUTES);
        sa.lpSecurityDescriptor=NULL;
        sa.bInheritHandle=TRUE;

        if(!CreatePipe(&hPipeInRd, &hPipeInWr, &sa, 0))
        {
            return ("\r\nError: Windows RTL: CreatePipe(): %d", GetLastError());
            return -1;
        }

        if(!CreatePipe(&hPipeOutRd, &hPipeOutWr, &sa, 0))
        {
            return ("\r\nError: Windows RTL: CreatePipe(): %d", GetLastError());
            return -1;
        }

        printf("ok ");


        ZeroMemory(&si, sizeof(STARTUPINFO));
        ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
        ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));

        si.cb=sizeof(STARTUPINFO);
        si.dwFlags=STARTF_USESTDHANDLES;

        si.hStdError=hPipeOutWr;
        si.hStdInput=hPipeInRd;
        si.hStdOutput=hPipeOutWr;

        printf("\r\nCreating process... ");

        if(!CreateProcess("C:\\Windows\\System32\\cmd.exe",
                          NULL,
                          NULL,
                          NULL,
                          TRUE,
                          0,
                          NULL,
                          NULL,
                          &si,
                          &pi))
        {
            printf("\r\nError: Windows RTL: CreateProcess(): %d", GetLastError());
            return -1;
        }

        printf("ok ");

        CloseHandle(hPipeOutWr);
        CloseHandle(hPipeInRd);

        printf("\r\nStarting communication... ");

        ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
        sa.nLength=sizeof(SECURITY_ATTRIBUTES);
        sa.lpSecurityDescriptor=NULL;
        sa.bInheritHandle=TRUE;

        if((hAsyncReadT=CreateThread(&sa, 0, (LPTHREAD_START_ROUTINE)AsyncListen, (PHANDLE)hPipeOutRd, 0, NULL))==NULL)
        {
            printf("\r\nError: Windows RTL: CreateThread(): %d", GetLastError());
            return -1;
        }

        while(strcmp(szBuffer, "exit")&&\
              strcmp(szBuffer, "end"))
        {
            printf("\r\n");
            gets(szBuffer);
            szBuffer[strlen(szBuffer)]='\n';
            szBuffer[strlen(szBuffer)+1]='\0';
            if(!WriteFile(hPipeInWr,
                          szBuffer,
                          strlen(szBuffer),
                          &dwRead,
                          NULL))
            {
                printf("\r\nError: Windows RTL: WriteFile(): %d", GetLastError());
            }
        }

        TerminateProcess(pi.hProcess, 0);
        return 0;
    }


Aun asi!!!! Si alguien conoce una forma mas eficiente, "Navaja-suiziosa" de hacer esto, le agradeceria un comentario.

Y gracias de antemano, sin embargo.

Un saludo y buenas noches.
#14
Hardware / Eliminar una partición
9 Noviembre 2021, 19:14 PM
He hecho varias particiones logicas en mi disco que ya no necesito. Ahora quiero eliminarlas. Solo he encontrado información sobre como liberarlas, asi que supongo que no se puede... ¿O si?
#15
¿Que distribucion de Linux usas?

¿Por que la usas?

¿Por que usas Linux?


A mi me gusta el aire puro que se huele en Debian. Aunque el olor a cafe de oficina de Ubuntu tambien es agradable. Me gustaria leer sus opiniones  ;D




PD ya se que existe esto  :xD
Citarhttps://foro.elhacker.net/gnulinux/iquestque_distro_elegir-t321226.0.html
#16
Hola,

Quiero instalar Linux en una segunda particion de mi disco junto a Windows. Queria saber si alguien podria ayudarme con alguna duda al respecto:

¿Me recomiendan hacer un backup de mi sistema en otro disco, por si acaso?

¿Si por casualidad el instalador de Linux falla y se pasa, puede sobreescribir Windows?

¿Alguna sugerencia...?

Gracias de antemano por sus respuestas y
Buenas noches
#17
Windows / Algunas dudas sobre el formato PE
7 Noviembre 2021, 14:52 PM
Hola. Tengo algunas dudas que no termino de concluir sobre este formato... si alguien tiene la respuesta aunque sea a alguna de ellas, la agradecería...

¿Como exactamente se hace referencia a una cadena en un ejecutable si el ejecutable no sabe en donde se va a cargar en memoria? ¿Llama a una función de relocalizaciones o algo asi? ¿Cual es esta función (Si es una función. Si no, lo que sea)?

¿El campo AddressOfEntryPoint de la cabecera IMAGE_OPTIONAL_HEADER que representa exactamente dado que justamente no se sabe en donde se va a cargar el programa? ¿Por que es típicamente 0x400000?

¿Cual es la diferencia entre el campo PointerToRawData de IMAGE_SECTION_HEADER cuando hablamos de la sección .text, y el campo AddressOfEntryPoint de IMAGE_OPTIONAL_HEADER?

¿Cual es la diferencia entre el campo VirtualAddress de IMAGE_SECTION_HEADER y el campo BaseOfCode de IMAGE_SECTION_HEADER cuando la sección es .text?

¿Por que hay una union entre PhysicalAddress y VirtualSize en IMAGE_SECTION_HEADER? ademas se llama Misc, me imagino que de Minimal Instruction Set Computer ¿Que tiene que ver eso? Pregunto por que estan en una union porque si se accede a uno se perdera el otro, entonces que sentido tiene eso si son practicamente en absoluto diferentes parametros...

Hay mas pero estas son las mas importantes...

Antes lo que le leido es que BaseOfCode seria "A pointer to the beginning of the code section, relative to the image base." mientras que VirtualAddress "The address of the first byte of the section when loaded into memory, relative to the image base. For object files, this is the address of the first byte before relocation is applied."

No entiendo que diferencia hay. A mi me parece lo mismo con otras palabras

Gracias y buenas noches

         
#18
ASM / Direccionar 65kb en modo real
6 Noviembre 2021, 21:41 PM
Hola,

¿Es posible direccionar mas de 0FFFFh bytes en modo real, aunque hablemos de un i386 u otro procesador con arquitectura x86?

Leia esta respuesta de Stackoverflow:

CitarI believe "...but you won't be able to get the [eax] memory cell." is not true. My understanding is that in real mode, if the value of eax is less than or equal to 0x0000FFFF, then [eax] is a perfectly valid access. Larger values of eax will generate a protection fault when you attempt to access [eax] (though notably [ax] need not generate a protection fault if [eax] would)
https://stackoverflow.com/questions/6917503/is-it-possible-to-use-32-bits-registers-instructions-in-real-mode

Y no me queda claro eso del "Protected fault". ¿Proteger de que si estas en modo real? ¿Aun asi trabaja la GDT?

Gracias...
#19
Hola,

Segun Wikpedia:

Citarand the sector number (6 bits, possible values are 1 to 63).
https://en.wikipedia.org/wiki/INT_13H

Ya que el direccionamiento esta limitado a 6 bits.

¿Como puedo acceder al sector #64?
#20
Hola,

Esto fue algo que llevaba buscando desde hace tiempo y de lo cual no encontre respuesta alguna, al menos no con NTFS. Como todo humano que tienda a llenar el vacio, lo hare yo aqui.

Lo que hare concretamente es un basico analisis de un volumen NTFS desde el sector 0 con el objetivo de llegar a un archivo concreto, en este caso "CMD.EXE", al mas bajo nivel, sin utilizar ninguna herramienta mas que un editor hexadecimal y una imagen de disco. cuidando que no se me escape ningun concepto, o al menos buenas referencias a ellos.




PRELIMINARES

Debo mencionar que se asume una lectura al menos superficial del sistema y me gustaria comenzar aclarando lo que se acerca a lo imprescindible saber para entender este pequeño caso de estudio. En pocas palabras, se recomienda conocer el funcionamiento de:


  • Sistemas operativos
  • Sistemas de archivos
  • Nocion clara y recomendable experiencia programando arboles
  • Endianness
  • Estructuras de datos

NTFS

NTFS (New Technology File System) es un sistema de archivos basado en "m-way search trees" (https://en.wikipedia.org/wiki/M-tree) que tiene su peculiaridad de ser muy integro en su definicion: En NTFS, un sistema de archivos, todo es un archivo. Incluso el volumen en si es un archivo como se vera en seguida. Los archivos estan compuestos por un concepto muy inteligente llamado atributo. Los atributos estan compuestos a su vez por una cabecera y un "Data stream". Este ultimo representa los datos que contiene el atributo. Un ejemplo de un pseudo-archivo NTFS podria ser:

CitarATRIBUTO_NOMBRE
"CMD.EXE"

ATRIBUTO_DATOS
MZ...

En NTFS, casi como en FAT (File Allocation Table, https://es.wikipedia.org/wiki/Tabla_de_asignaci%C3%B3n_de_archivos, otro sistema de archivos) existe una tabla para descripcion y listado de los archivos. Esta tabla se llama MFT (Master File Table) y en ella se listan todos los archivos presentes en el volumen, incluyendose a si misma (una referencia recursiva). (Esto no es asi en FAT).

Con esto ultimo quiero decir que, para esta tabla, la tabla misma es una entrada en la tabla. Como decir que tenemos una libreta con los nombres de los miembros de este foro, y se nos muestra asi:

Citar"Libreta"
"Pepe"
"Paco"

En el listado, aparecen tanto Pepe, como Paco y la libreta misma. Esto es asi para asegurar la integridad antes mencionada (Todo es un archivo, y esta tabla lista archivos; silogismo: todo esta en la tabla). Hago enfasis en este punto porque se que esta entre los muchos de facil confusion en este sistema de archivos.

Los atributos antes mencionados estan localizados en las entradas de esta tabla, cuyo tamaño cada una suele ser de 400h bytes (1024 bytes).

Notas:


  • A partir de ahora representare todas las cifras en notacion hexadecibal XXh, ya que andar de decimal a hexadecimal y viceversa puede burlar la vista demasiado...
  • No me voy a meter en archivos como $Bitmap, $Volume, $MftMirr... Porque no vienen al caso de esta tarea. Sin embargo, mencionare a algunas. Al final podran verse referencias a estas estructuras
  • Tampoco me metere en temas de analisis forense, para lo que este sistema parece estar muy bien diseñado en comparacion a sus antecesores, por cierto
  • Representare los nomnbres de archivo con mayusculas por costumbre a FAT. Espero no moleste.




CABECERAS DE ATRIBUTOS

Las cabeceras de los atributos, estos que pueden ser: residentes y nombrados, residentes y no nombrados, no residentes y nombrados o no residentes y no nombrados, describen las caracteristicas de los atributos mismos. Esto de nombrados, residentes... Lo explicare en seguida, pero cabe mencionar de inmediato que son un ejemplo de caracteristicas definidas por la cabecera que estoy ahora describiendo.

Tomando el ejemplo anterior, podemos decir que estan estructuradas asi:

Citar
CABECERA_ATRIBUTO ATRIBUTO_NOMBRE
"CMD.EXE"
CABECERA_ATRIBUTO ATRIBUTO_DATOS
MZ...

La cabecera DEFINE el atributo en si. Que tamaño tiene, en donde se encuentra, si tiene nombre, si no tiene nombre, sus correspondientes flags...


RESIDENCIA DE ATRIBUTOS

La residencia es eso... Estar o no estar. La cuestion es en donde: La residencia indica si se encuentra DENTRO del atributo, o en otro cluster (cluster: conjunto de sectores. Sector: Conjunto de bytes minimo para la comunicacion entre el disco y el sistema. Suelen ser 200h bytes por sector. En el caso de este estudio el cluster y el sector son del mismo tamaño, para simplificar) del disco. ¿Por que estaria fuera del mismo atributo al cual ya tienes acceso? ¿POR QUE COMPLICARNOS LA VIDA? Te preguntas... La simpleza es la mayor expresion de sofisticacion, dijo Da Vinci...
Hablando en serio, un atributo contiene datos, y una caracteristica intrinseca de los datos es que tienen tamaño, un tamaño que puede ser mas o menos grande, por lo que puede o no caber en el lugar en el cual lo quieres meter; En este caso: Los 400h bytes disponibles en su correspondiente MFT. En este caso, el atributo se hace "No residente" y se indica su direccion con un concepto que explicare en seguida, llamado "Runs" ("Corridas" xd).


CLUSTER RUNS

Estas "Corridas" representan direcciones relativas de datos en el disco: Quiero decir, direcciones que dependen de algo mas que el numero que representan como desplazamiento en si. Podriamos entonces representarlo con nuestro ejemplo anterior asi:

Citar
CABECERA_ATRIBUTO ATRIBUTO_NOMBRE
"CMD.EXE"
CABECERA_ATRIBUTO:NO_RESIDENTE ATRIBUTO_DATOS
CLUSTER_RUNS:01,02,03

Si el archivo "CMD.EXE" es no residente, segun su cabecera, entonces nos proporcionara sus "Cluster Runs". Efectivamente: 01, 02 y 03. Quisiera que prestes especial atencion a esto:

Creeras que 01, 02 y 03 quieren decir que el contenido del archivo se encuentra en los clusters contiguos 01, 02 y 03, pero recordemos que son RELATIVOS. Es decir: El primer cluster es el 01, el segundo cluster es el 02 (mas el primero, lo que seria 01+02=03, el segundo cluster es el 03) y el tercero es el 03 (mas el anterior, 03+03=06, el tercer cluster en el que se encuentran los datos de "CMD.EXE" es el 06).

Todo esto se hara mas claro cuando veamos el caso real.




CONCEPTOS GENERALES

Hemos cubierto el attribute header (cabecera de atributo). Ahora continuaremos con otros conceptos de esencial importancia. Luego procederemos de inmediato con el ejemplo real, que me extiendo c*ño...

Notas:

Pondre los titulos en ingles. Asi en el caso de que a alguien le interese y quiera continuar investigando, tenga familiaridad con los terminos.


  • Attribute ID
  • B-Trees (Arboles B)
  • File Reference
  • File Record
  • Index Entry
  • Index Node Header
  • Index Record


ATTRIBUTE ID

Cada atributo antes mencionado, tiene un ID asignado dentro de cada entrada MFT. Mantiene la integridad numerando a cada uno.

B TREES

CitarA B-tree is a specialized multiway tree designed especially for use on disk. In a B-tree each node may contain a large number of keys. The number of subtrees of each node, then, may also be large. A B-tree is designed to branch out in this large number of directions and to contain a lot of keys in each node so that the height of the tree is relatively small. This means that only a small number of nodes must be read from disk to retrieve an item. The goal is to get fast access to the data, and with disk drives this means reading a very small number of records. Note that a large node size (with lots of keys in the node) also fits with the fact that with a disk drive one can usually read a fair amount of data at once.
https://cis.stvincent.edu/html/tutorials/swd/btree/btree.html

Seria bueno leer el articulo, aunque no es necesario. Es "Considerable" saber que la forma en la que se conoce la arquitectura en si de NTFS es como arbol B (o milti-way search tree). Puntos de relevancia en el articulo:

CitarIn a B-tree each node may contain a large number of keys.
CitarIn a B+ tree, data records are only stored in the leaves. Internal nodes store just keys.
CitarWhen a B+ tree is implemented on disk, it is likely that the leaves contain key, pointer pairs where the pointer field points to the record of data associated with the key.

Estos tres puntos se cumplen para NTFS.

Cabe mencionar que:


  • Para NTFS, un nodo equivale a un directorio.

Y resaltar que:

Los nodos internos son solo CLAVES (en terminologia de arboles). Los datos se almacenan en las hojas.

No profundizare mucho en arboles porque en este caso NTFS no es siquiera un B tree ideal. Llamemosle una "Implementacion practica".


FILE REFERENCE

Una referencia a un archivo. Tal cual. Como referenciar una estructura en C a traves de un puntero, de la misma forma se referencia a un archivo (que tambien es una estructura) solo que en este caso no con su direccion sino con un identificador asignado previamente por el sistema.


FILE RECORD

La estructura antes mencionada con la que nos referimos al archivo. En este caso, hablamos de cada entrada MFT. ;)


INDEX ENTRY

De la misma forma que en la tabla MFT existen entradas que describen archivos en el volumen, existen entradas que describen archivos en los directorios, estas entradas son llamadas, hablando de NTFS, Index Entry.


INDEX NODE HEADER

Como mencionado anteriormente, un nodo hace referencia a un directorio, por lo que esto seria una cabecera para los directorios. Similar a las cabeceras de los atributos.


INDEX RECORD

En NTFS, las entradas en la MFT de archivos de datos hacen referencia a sus datos; Sin embargo cuando se trata de directorios, hacen referencia a una estructura llamada Index Record, la cual hace descripcion de los ficheros que contiene el directorio en cuestion. Cabe mencionar que este fichero es util en actividades de analisis forense (En este sistema todo parece serlo, pero especialmente esto lo es).


He cubierto hasta ahora todo lo necesario al respecto de NTFS para lograr dar con un archivo. Desde luego, hare especificaciones en el camino. Ahora si, lo divertido:




ACCEDIENDO AL ARCHIVO SIN CreateFile
(Broma)

Ahora seguiremos el rastro de CMD.EXE. Lo primero que tenemos que hacer es leer el sector 0 o, en nomenclatura NTFS, el archivo $Boot con el editor hexadecimal:



De aqui necesitamos tres cosas:


  • La localizacion de la tabla MFT
  • La cantidad de bytes por sector
  • La cantidad de sectores por cluster

Estos datos se encuentran en los offsets 30h, 0bh y 0dh, respectivamente.

Cabe mencionar que este sector es parecido al de los sistemas FAT.



En este caso, la localizacion de la MFT esta representada en clusters (y en little-endian, obviamente). Es decir, nuestra tabla se encuentra en el Cluster @ LCN 0215D3h. (LCN de Logical Cluster Number. Hasta aqui esto es evidente pero por si acaso: A logical cluster number (LCN) describes the offset of a cluster from some arbitrary point within the volume. LCNs should be treated only as ordinal, or relative, numbers. There is no guaranteed mapping of logical clusters to physical hard disk drive sectors. An extent is a run of contiguous clusters.)

La cantidad de bytes por sector es 200h (como dije que era comun, aunque NO siempre es asi).
La cantidad de sectores por cluster es 1. (Facilito ;D)

Si tenemos 200h bytes por sector, y 1 sector por cluster, la MFT se encuentra en el byte 200h*1*0215D3h=42BA600h

Vamos alla...



Mira lo que tenemos aqui. Que belleza, ¿No? Esto fue amor a primera vista para mi...

Volviendo a lo serio: ¿Recuerdas lo que comentaba sobre la residencia de los datos (residente, no residente...)?

Pues la cosa es asi: Si los atributos dejan espacio suficiente en la entrada MFT en cuestion para el contenido del archivo, este queda RESIDENTE dentro de la MFT. Asi no tenemos que hacer calculos y accesos al disco fastidiosos para todos... En este caso CMD.EXE no es residente, BWAHAHAHAHAHAHAHAHAHAHAHAHAHAHA. Pero bueno, los directorios tampoco, asi que doble BWAHAHAHAHAHAHAHAHAHAHA.

Como dije antes, en la MFT esta incluso la propia MFT listada. Podemos leer por ahi $MFT en codigo Unicode. (Nota: NTFS soporta namespaces en Unicode, lo que le permite ser un sistema de archivos portable a todo el mundo).

Vamos a ver que es lo que esconde:



Pido mil disculpas por mi mal pulso.

Lo que pueden ver son los atributos del archivo en cuestion. En este caso $MFT (la tabla).
Lo que necesitamos es dar con SYSTEM32, que es el directorio en el que se encuentra CMD.EXE.

Para esto vamos a recorrer entrada por entrada. Sera facil, ya que esta cerca del directorio raiz (C:\).

Y ojo que a mi me encanta correr antes de caminar, y darme unas cuantas ostias dulces como el azucar, pero tendremos que detenernos aqui para analizar un poco los atributos en profunidad. Si no, no sabremos ni lo que estamos haciendo.
Y yo que queria correr...




ATTRIBUTE HEADER

(Residente, sin nombre)


(Resindente, con nombre)


(No residente, sin nombre)


(No residente, con nombre)


Dejare estas imagenes aqui como referencias rapidas.

$DATA

Este es el atributo que mas nos interesa. Vamos a analizarlo.



Analicemos el header. Podemos ver, segun lo anteriormente mencionado respecto a los attribute headers, este es el atributo con identificador 080h y usa 078h bytes, segun la tabla de la cabecera de atributos (y sabemos que no esta nombrado porque el tamaño del campo "Nombre", desplazamiento 09h, es cero). Bien...

Si vemos el offset 08h que (segun nuestra tabla sobre attributes headers), representa si los datos del atributo (tambien llamado data stream) NO, enfatizo, NO SE ENCUENTRA RESIDENTE, vemos el valor 01. Esto significa que no hay datos, hay data runs; Un indice a los datos.

Segun el attribute header los data runs se encuentran en el offset 040h. Su contenido es:

31 20 D3 15 02 32 72 0F 61 39 02 21 6E FC 12 12 60 01 72 21 40 90 01 12 A0 00 44 22 80 00 A4 00 21 60 84 00 11 20 68 12 E0 00 24 22 00 05 20 02 00

¿Que significa todo esto? Vamos a decodificarlo pero, primero, algo sobre los data runs:

¿Recuerdan que les mencione que en los data runs los clusters estan representados de forma relativa? Pues el formato de un data run es:

<bytes para el LCN (4 bits)> <bytes para la longitud en clusters (4 bits)> <Longitud en clusters> <Logical Cluster Number>

Por ejemplo:

Si los primeros 4 bits son "3" y los segundos 4 bits son "1", significa que los siguientes 1 bytes seran para la longitud en cluster de este data stream y los segundos dos bytes seran para el offset LCN. ¿Por que al reves? Lo mismo me pregunto yo.

Lo que venga despues seguiran siendo data runs siempre que no sea 0. En caso de ser 0, hemos llegado al final (como una cadena ZS).

Cabe mencionar:

No hace falta una calculadora, ya que nuestro divino sistema hexadecimal hace una buena representacion de bits en factores de 4. Recordemos que cada caracter hexadecimal representa 4 bits en una cadena de caracteres hexadecimales, por lo que extraer cuatro bits de 32 no es tan dificil. Me explico:

0A 04 3F 2A

Primeros cuatro bits: 0
Segundos cuatro bits: A
Terceros cuatro bits: 0
Quintos  cuatro bits: 4
Sextos   cuatro bits: 3
Septimos cuatro bits: F
Octavos  cuatro bits: 2
Novenos  cuatro bits: A

Retomando nuestro analisis del atributo $DATA en la entrada (record) de la MFT en la MFT, decodificando:

31 = 3 bytes para el offset, 1 byte para longitud
20 = Longitud es 20 clusters para el actual data run
D3 15 02 = offset del actual data run

20 Clusters @ LCN 0215D3

(Recordemos que la notacion del ordenador en disco (y memoria principal) de los datos es little-endian)

Si hacemos un calculo rapido, y multiplicamos el tamaño en bytes de cada cluster (en este caso 200h) por el LCN del primer data run del archivo $MFT en la MFT obtenemos:

0215D3h*200h=42BA600h

¿Esta no es la misma direccion que vimos de la MFT anteriormente? Si. Como dije, la MFT se lista a si misma como archivo.

Enlace a una descripcion de los atributos:

http://inform.pucp.edu.pe/~inf232/Ntfs/ntfs_doc_v0.5/attributes/index.html




SEAMOS SHERLOCK HOLMES

Ahora toca la fase de busqueda y captura. Antes, tengamos en cuenta la direccion del archivo al cual queremos acceder. Cabe añadir que el sistema en cuestion es Windows NT 4.0. Tomo este sistema porque "Es simple". Ademas de que el tamaño de cluster es el mismo que el de los sectores, por lo que se nos hace facil hacer los calculos, pero es fundamentalmente lo mismo en otros sistemas NTFS. "Pocas" modificaciones se han hecho. Puede comprobarse revisando Windows 10. But anyways...

La direccion del archivo en cuestion en este sistema es:

C:\WINNT\System32\cmd.exe

Entonces, por logica, lo que debemos hacer es:


  • Localizar WINNT en la MFT
  • Buscar la referencia a SYSTEM32 en sus datos
  • Localizar a SYSTEM32 en la MFT
  • Buscar la referencia a CMD.EXE en sus datos
  • Localizar a CMD.EXE en la MFT
  • Calcular la direccion de sus datos
  • Acceder

Se puede apreciar un patron mas o menos ciclico, ¿Verdad?

Comencemos por el principio, equis de.




LOCALIZAR WINNT EN LA MFT

Toca buscar xd. El procedimiento seria buscar en la MFT por el directorio WINNT. Al encontrarlo, se veria algo asi:



Echemosle un vistazo a la cabecera de una entrada MFT:



Podemos ver que el offset 16h de la cabecera indica los flags. Los cuales son:


  • 0x1 este record esta en uso.
  • 0x2 este record es un directorio.

En este caso, en el offset 16h de WINNNT podemos ver que tanto esta en uso como es un directorio:



En el caso de un directorio, no esperamos data runs (ya que no contiene datos, contiene archivos u otros nodos, nodo=directorio).
Esperamos una estructura llamada $INDEX_ALLOCATION, la cual nos indica informacion sobre los sub-nodos respectivos al nodo en cuestion, del arbol del sistema. Este atributo nunca esta residente, y tiene un identificador A0.

Vamos a echarle un vistazo a este atributo en esta MFT particular:



Segun la estructura del atributo $INDEX_ALLOCATION:


(Se pueden ver mas estructuras a las que hare referencia en seguida)

Nos encontramos con un attribute header y los data runs. Facilongo. Vamos a echarle un vistazo a los data runs:

31 04 0A 62 04 - 04 clusters @ LCN 4620A
11 04 20          - 04 clusters @ LCN 20       +4620A=4622A
21 04 F8 01      - 04 clusters @ LCN 1F8     +4620A=46402
00                   - Llegamos al final ;)

Dirijamonos al primer cluster logico (LCN 4620A, addr 8C41400):



Podemos ver varias entradas, con una firma INDX en una especie de cabecera (lo cual es). Esta es la INDX Record. Este registro guarda referencias a los subnodos de un nodo. Echemosle un pequeño vistazo a su estructura:


(Abajo dice: "(b) Has children". Perdonen el recorte)

Falta poco para llegar al archivo...

Necesitamos de esta estructura solo una cosa: El desplazamiento a las index entries, esto es, las referencias a los subnodos que contiene. En este caso, es 38h.

Conviene tomar en cuenta la nota (a) que se aprecia en la imagen: "These values are relative to 18h", "Estos valores son relativos a 18h". Quiere decir que esta vez no vamos a contar a partir del inicio de la estructura, sino a partir de 18h o, lo que seria lo mismo, a partir del inicio de la estructura + 18h.

Vamos alla:



Vemos algunos datos que tienen la siguiente estructura:



De aqui nos interesan dos cosas: El nombre del subnodo, las caracteristicas (tenemos que saber si estamos tratando con una "Hoja" (archivo) o un "Nodo" (directorio) en este arbol) y una referencia a la MFT.

Busquemos la entrada correspondiente a SYSTEM32:



Debo decir que el campo MFT Reference of the file deberia corresponder al campo File Reference to the base MFT record de la entrada respectiva en la MFT, sin embargo, debido a la necesidad de encontrar el archivo y al malentendido de esta referencia, me di la libertad de identificarlo segun ciertos atributos del atributo $FILE_NAME en la MFT: Creation time, Altered time, MFT Changed y Read time, ya que casualmente cada conjunto de estos datos en la respectiva entrada INDX corresponde con tal. Asi pues, vamos a buscar la incidencia de lo que serian del desplazamiento 18h al desplazamiento 18h+20h (20h es el tamaño de esta estructura de fechas completa), es decir, esta estructura de fechas. Nos encontramos con la cadena:

CitarE0 79 98 BC 8F 46 CE 01 C8 57 E8 5C 46 B8 D7 01 C8 57 E8 5C 46 B8 D7 01 C8 57 E8 5C 46 B8 D7 01

Busquemos la incidencia de esta cadena en la MFT en su respectivo campo:



Nos encontramos con su MFT, precisamente. Ahora, ya que este tambien es un directorio, accedamos a su atributo $ALLOCATION_TABLE:



Decodifiquemos sus data runs:

32 2C 01 86 60 04 - 12C  Clusters @ LCN 46086 (addr 8C10C00)
21 04 EC 03          - 4      Clusters @ LCN 2EC
21 04 A4 00           - 4     Clusters @ LCN A4
21 04 10 01           - 4     Clusters @ LCN 110
00                         - Final de los cluster runs

Accedamos:



Busquemos la entrada correspondiente del archivo CMD.EXE:



Bingo. Segun sus campos de fechas, busquemos la incidencia de este archivo en la MFT:



BingoX2. Ahora paseemos por la tabla hasta su $DATA attribute:



Perfecto, ahora estamos solo a un paso de acceder al contenido del archivo. Segun lo que podemos ver, este es un atributo no residente y sin nombre. Segun la tabla de atributos no residentes y sin nombre, mencionada en "ATTRIBUTE HEADER", los data run se encontrarian en el offset 40h; como puede apreciarse en la imagen de la cabecera. Decodifiquemos estos data runs:

32 A0 01 73 1E 04 - 1A0 Clusters @ LCN 41E73 (addr 83CE600)
00
(Facilongo ;)

Ahora podemos, finalmente, acceder a los contenidos del archivo:




NOTAS FINALES

Esta es una muy resumida explicacion del funcionamiento del sistema NTFS y del recorrido hasta un archivo; mas que una lectura educativa, puede ser un divertido primer contacto con el sistema y su funcionamiento, previo a un estudio mas profundo de las catacumbas de los DBMS como lo son, entre los desarrollados por Microsoft y mas populares, NTFS, FAT y sus extensiones, entre otros.

Me gustaria terminar con una sugerencia... Deberia haber un subforo de sistemas operativos en general, en donde se puedan preguntar cosas relacionadas a los diferentes OSs y sus subsistemas, cosas relacionadas a firmware, programacion de sistemas operativos (Ya que no tiene nada que ver con "Programacion en general", no es lo mismo programar para un sistema operativo que programar para una arquitectura de hardware, sea esta estandar o no), gestion de procesos, gestion de memoria... Etc.; en general, temas no solo relacionados sino con una relacion estrecha con los OS y su desarrollo.

En el caso de haberme equivocado, ruego me corrija quien haya reconocido mi error. Y si queda algun hueco, mencioarlo para que asi pueda llenarlo.

Gracias por su atencion, un saludo y

Buenas noches.

Fuentes:

https://bromiley.medium.com/a-journey-into-ntfs-part-1-e2ac6a6367ec
http://inform.pucp.edu.pe/~inf232/Ntfs/ntfs_doc_v0.5/index.html
https://www.youtube.com/watch?v=aZjYr87r1b8
https://cis.stvincent.edu/html/tutorials/swd/btree/btree.html
https://flatcap.org/linux-ntfs/ntfs/index.html
Nota sobre las fuentes: flatcap.org y inform.pucp.edu.pe son paginas similares pero tienen informacion diferente.
#21
Hola,

Queria saber si alguien sabe como (mas bien enlazar) codigo de C a un binario puro, me explico:


int main()
{
   int x;
   x=0;
}


Watcom C puede producir un .COM del viejo MS-DOS a partir de este codigo y lo compila a algo asi:

Código (asm) [Seleccionar]


org 100h

mov bp, sp
sub sp, 4

mov ax, 0
mov [sp], ax



Hasta aqui todo bien.

Tengo dos problemas:

El codigo que genera Watcom C es precisamente para correr en MS-DOS y me estoy jalando los cabellos modificandolo para que termine en un binario puro, entre referencias al segmento de datos y etcetera...

Mi pregunta concreta es:

Imaginese que tengo el codigo anteriormente mencionado en C, y su respectivo archivo .OBJ

¿Como enlazo este .OBJ de forma tal que pueda especificar el ORGigen del programa (obviamente diferente a 100h) a, por ejemplo, 7c00h en el caso de un bootstrap? O lo que sea...

¿Como hago esto?

Gracias por adelantado.




[EDIT]

Lo que he descubierto hasta ahora es que puedo utilizar el comando ld.exe que viene con GCC para esto:

Citarld --oformat binary

La cuestion es que no se como.  :xD

No se como especificar ni relocalizaciones ni nada.




[EDIT 2]

Tambien se que las opciones respecto a relocalizaciones para ld.exe son:

Citar-q, --emit-relocs           Generate relocations in final output
 -r, -i, --relocatable       Generate relocatable output
 --embedded-relocs           Generate embedded relocs
 --split-by-reloc [=COUNT]   Split output sections every COUNT relocs
 --base_file <basefile>             Generate a base file for relocatable DLLs
 --enable-runtime-pseudo-reloc      Work around auto-import limitations by
                                      adding pseudo-relocations resolved at
 --disable-runtime-pseudo-reloc     Do not add runtime pseudo-relocations for
 --dynamicbase                  Image base address may be relocated using
 --base_file <basefile>             Generate a base file for relocatable DLLs
 --enable-runtime-pseudo-reloc      Work around auto-import limitations by
                                      adding pseudo-relocations resolved at
 --disable-runtime-pseudo-reloc     Do not add runtime pseudo-relocations for
 --dynamicbase                  Image base address may be relocated using

Sincera y apenadamente no se cual usar.




Despues de un millon de años lo logre:

Primer paso: Compilar el codigo a codigo objeto
Segundo paso: Convertir el codigo objeto a codigo ensamblador
Tercer paso: Hacer las modificaciones respectivas al ensamblador resultante
Cuarto paso: Ensamblar
Quinto paso: Enjoy
#22
Hola,

Estoy programando un bootloader pequeño... Me estoy ayudando de un pequeño compilador de C para esto ya que el ensamblador se me termino haciendo engorroso no, lo siguiente...

La cuestion es que como una solucion a un problema X que tuve, que no comento para no hacer la pregunta mas larga, se me ocurrio utilizar funciones inline. Funciona bien, el problema es que como sabran no tengo muchas posibilidades de depuracion programando a tan bajo nivel, entonces me estoy asegurando de hacer las cosas bien.

Cuando estudie las funciones inline me quede con una duda y no profundize porque nunca pense que las fuese a utilizar, la duda es: Cuando defines una funcion como inline, ¿Es siempre inline? ¿No hay NINGUN caso en el que el compilador se la piensa y hace otra cosa por "Optimizar" o algo asi?

Necesito que las funciones sean inline absolutamente todo el tiempo y que eso no dependa del tiempo de compilacion. ¿Existen estas optimizaciones o segundas opciones?

Espero haberme expresado claramente... Despues de ver tanto numero siento que no puedo escribir sin confundirme.

Saludos y gracias...




[EDIT]

Ya vi que cuando se pasan parametros a la funcion ignora el inline. En fin. Que basura
#23
Hola,

Hay muchos sitios en Internet, especialmente en los foros de la MSDN y Stack Overflow, en donce se dice que esto "No es posible".

Esto es parcialmente cierto, porque yo lo hice, con dos Hello World haciendo merge a las secciones de codigo y datos y modificando las referencias a funciones y datos. Ahora, se que es muy poco practico hacer esto con un PE grande, estarias meses calculando referencias... Pero recuerdo que hace años en la biblioteca de underc0de habia un programa binder que lograba hacer esto. Recuerdo que lo hice con dos EXEs complejos y efectivamente se abrieron dos programas al ejecutar el programa resultante. Para ser honesto, no tengo idea de como este programa logro empaquetarlos a los dos de esa manera...

Ya no tengo el programa.

Vengo a preguntar si alguien tiene idea de como lo hizo.

Gracias.
#24
Foro Libre / Anuncian "Gran apagon"
26 Octubre 2021, 20:29 PM
Hola,

No he investigado mucho al respecto y me gustaria saber la opinion de los miembros del foro.
Llevan ya rato anunciando de un supuesto apagon a nivel mundial...

¿A que exactamente se debe esto? ¿Sobrecarga, supersticion...?

Buenas noches.




A nivel europeo* perdon.
#25
 Hola,

Me he dado cuenta de que cuando un programa tarda mucho en un ciclo (haciendo algo util o no) Windows reduce la velocidad de ejecucion del programa (imagino que para evitar denegaciones del servicio). Quisiera saber como hacer excepciones de esto para algunos programas ya que se esta tardando literalmente cuarenta y un minutos en cargar veinte megabytes de un archivo  :huh: lo cual me parece descomunalmente demasiado. Me da igual que se realentice el sistema.

Gracias, un saludo.
#26
Dudas Generales / $MFT y NTFS
3 Octubre 2021, 15:23 PM
Hola.

He googleado mucho esta tabla y no encuentro mas que definiciones. Que si, es una tabla que describe cada archivo del volumen... Que si, incluso la propia $MTF es un archivo segun la filosofia taoista de NTFS, pero ¿Alguien tiene una respuesta mas tecnica? Concretamente:

¿Que hay en una MTF?

¿Por que un simbolo de dolar?  :huh: :huh: :huh: :huh: :huh: :huh: :huh: Esta es la pregunta menos importante y la duda que mas me revienta, jajaja...

¿Como puedo llegar al contenido del archivo a partir de su MTF si es que no esta residente?

¿Que son los "Atributos" y por que los pintan como algo tan dinamico?

Gracias... No estoy menos que confundido.
#27
Hola,

Analizando el bootloader primario de Windows NT 4.0 vi que la primera unidad se representa con el numero 80h (128) y no con el 1. ¿A que se debe esto?

Gracias
#28
Hola,

Estoy feliz de haber descubierto el Debugger de VirtualBox. Funciona de maravilla. Sin embargo tengo un problema con el: Cuando inicia la maquina virtual, inicia en modo protegido (de 32 bits). Es decir, no comienza a depurar desde el arranque de la maquina (lo que deberia ser 0000:7c00) en modo real. ¿Esto a que se debe y como podria solucionarlo?

Gracias




debugger***  ;D ;D ;D
#29
Dudas Generales / Depurar el proceso de booteo
29 Septiembre 2021, 18:05 PM
Hola,

No se si haya una forma de hacerlo con VirtualBox, o en general tienes que arreglartelas a prueba y error cuando escribes un bootloader, pero me gustaria saber si alguien tiene idea de como depurar el arranque del ordenador.

Sin conectar la ejecucion a puertos seriales, redes LAN o cosas "Innecesariamente" costosas. Hablo de emular el arranque nada mas. Es imposible que especificamente esto no se pueda hacer. Asi como un depurador del "Hola, mundo" pero de bajo nivel... No puede ser mucho pedir...

Muchas gracias y un saludo




Como el emu8086 pero de 32 bits
He intentado Bochs mil veces y sinceramente me da mas errores que ganas de vivir


CitarOracle VM VirtualBox includes a built-in VM debugger, which advanced users may find useful. This debugger enables you to examine and, to some extent, control the VM state.
https://www.virtualbox.org/manual/ch12.html

ALELUYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA


Si alguien sabe igualmente de un emulador, le ruego me lo diga. Gracias
#30
Hola,

Acabo de descubrir Bochs. Era justamente lo que estaba buscando: Una maquina virtual con depurador incluido para poder hacer pruebas con controladores sin usar el WinDbg que me parece innecesariamente costoso (tienes que adjuntar una maquina a la otra cuando puedes simplemente emular).

La cuestion es, ahora que lo tengo no se usarlo y en la documentacion no encuentro precisamente lo que estoy buscando.

Lo estoy corriendo en Windows.

Me gustaria saber si alguien sabe usarlo o si me podrian pasar algun manual...

Muchas gracias de antemano.
#31
Foro Libre / ¿Te gusta el flamenco?
26 Septiembre 2021, 00:04 AM
Buenas noches para los del este.

Llevo viviendo un tiempo medio en España y nunca me habia fijado en en lo bello del flamenco. Sin dedicarme a un monologo... solo queria preguntar cuales son sus canciones favoritas, a quienes lo oigan.

Algunas de las mias (incluyo musica española en general):

[youtube=640,360]https://www.youtube.com/watch?v=d2UNwx8X12s[/youtube]

[youtube=640,360]https://www.youtube.com/watch?v=y_goHl-GuNk[/youtube]

[youtube=640,360]https://www.youtube.com/watch?v=8EcIxJmKCQQ[/youtube]

[youtube=640,360]https://www.youtube.com/watch?v=lUXZqAUpoMc[/youtube]

[youtube=640,360]https://www.youtube.com/watch?v=QFuJP68htXI[/youtube]

[youtube=640,360]https://www.youtube.com/watch?v=2spk_XCyrXY[/youtube]

(Ya se que Cook no es precisamente un autor español pero su estilo arabe de la musica esta obviamente basado en el estilo Andaluz. Destruya mi obviedad quien me corrija).

x_x                                                                  x_x                                                                  x_x                                                                  x_x                                                                  x_x                                                                  
#32
 Hola,

Queria saber si alguien podria o tiene acceso a una explicacion del codigo de un bootstrap. Aunque sea el del MS-DOS o Windows 3.1. Cualquiera.

(Windows)

Muchas gracias.

Respuesta a mi pregunta: https://www.alanfoster.me/posts/writing-a-bootloader/


x_x                                                                  x_x                                                                  x_x                                                                  x_x                                                                  x_x                                                                  
#33
Hola,

¿Alguien tiene idea de una herramienta para Windows con la que pueda desensamblar el codigo en ensamblador del x86 de un archivo (puramente) binario? Por Dios que dificil es encontrar una en Google.

Muchisimas gracias de antemano
#34
Que bien se siente volver...

xd

LO IMPORTANTE

Hola,

Queria saber si alguien podria ayudarme a analizar el bootstrap de Windows NT 4.0 Workstation. Lo he desensamblado (?) con esta pagina: https://onlinedisassembler.com/ ya que no se que programa podria utilizar para hacer esto. Probablemente incluso tenga uno ya instalado pero no conozca la funcion. El codigo hexadecimal del mismo es:

Citar00 00 00 00 00 00 00 00 00 FA 33 C0 8E D0 BC 00 7C FB B8 C0 07 8E D8 C7 06 54 00 00 00 C7 06 56 00 00 00 C7 06 5B 00 10 00 B8 00 0D 8E C0 2B DB E8 07 00 68 00 0D 68 66 02 CB 50 53 51 52 06 66 A1 54 00 66 03 06 1C 00 66 33 D2 66 0F B7 0E 18 00 66 F7 F1 FE C2 88 16 5A 00 66 8B D0 66 C1 EA 10 F7 36 1A 00 88 16 25 00 A3 58 00 A1 18 00 2A 06 5A 00 40 3B 06 5B 00 76 03 A1 5B 00 50 B4 02 8B 16 58 00 B1 06 D2 E6 0A 36 5A 00 8B CA 86 E9 8A 36 25 00 B2 80 CD 13 58 72 2A 01 06 54 00 83 16 56 00 00 29 06 5B 00 76 0B C1 E0 05 8C C2 03 D0 8E C2 EB 8A 07 5A 59 5B 58 C3 BE 59 01 EB 08 BE E3 01 EB 03 BE 39 01 E8 09 00 BE AD 01 E8 03 00 FB EB FE AC 3C 00 74 09 B4 0E BB 07 00 CD 10 EB F2 C3 1D 00 45 72 72 6F 72 20 64 65 20 6C 65 63 74 75 72 61 64 65 20 64 69 73 63 6F 2E 20 20 0D 0A 00 29 00 46 61 6C 74 61 20 75 6E 20 61 72 63 68 69 76 6F 20 64 65 20 6E A3 63 6C 65 6F 20 65 6E 20 65 6C 20 64 69 73 63 6F 2E 0D 0A 00 25 00 41 72 63 68 69 76 6F 20 64 65 6C 20 6E A3 63 6C 65 6F 20 65 73 20 64 69 73 63 6F 6E 74 69 67 75 6F 2E 20 0D 0A 00 33 00 49 6E 73 65 72 74 65 20 75 6E 20 64 69 73 71 75 65 74 65 20 64 65 20 73 69 73 74 65 6D 61 20 79 20 72 65 69 0D 0A 6E 69 63 69 65 2E 20 20 20 20 20 0D 0A 00 15 00 5C 4E 54 4C 44 52 20 65 73 74 A0 20 63 6F 6D 70 72 69 2E 0D 0A 00 00 00 00 00 00

Espero perdonen lo cutre de la consulta sin exponer propiamente el desensamblaje del codigo, pero lo dicho, no se exactamente como hacerlo si no online o escribiendo un ensamblador (que palo ._.)

Concretamente me gustaria saber que hace cada linea del ensamblador, pero primero que alguien me sugiera un buen desensamblador de binarios "raw" para poder exponerles mis dudas citando lineas de codigo (no pido que me lo hagan todo)

Muchas gracias por tu atencion




FINALMENTE pude hacer un dump de los comandos. Use el Ollydbg:

CitarAddress   Hex dump          Command                                                         Comments
00401000      0000          ADD BYTE PTR DS:[EAX],AL
00401002      0000          ADD BYTE PTR DS:[EAX],AL
00401004      0000          ADD BYTE PTR DS:[EAX],AL
00401006      0000          ADD BYTE PTR DS:[EAX],AL
00401008      00FA          ADD DL,BH
0040100A      33C0          XOR EAX,EAX
0040100C      8ED0          MOV SS,EAX                                                      ; Modification of segment register
0040100E      BC 007CFBB8   MOV ESP,B8FB7C00                                                ; Suspicious use of stack pointer
00401013      C007 8E       ROL BYTE PTR DS:[EDI],8E                                        ; Shift out of range
00401016      D8C7          FADD ST,ST(7)
00401018      06            PUSH ES
00401019      54            PUSH ESP
0040101A      0000          ADD BYTE PTR DS:[EAX],AL
0040101C      00C7          ADD BH,AL
0040101E      06            PUSH ES
0040101F      56            PUSH ESI
00401020      0000          ADD BYTE PTR DS:[EAX],AL
00401022      00C7          ADD BH,AL
00401024      06            PUSH ES
00401025      5B            POP EBX
00401026      0010          ADD BYTE PTR DS:[EAX],DL
00401028      00B8 000D8EC0 ADD BYTE PTR DS:[EAX+C08E0D00],BH
0040102E      2BDB          SUB EBX,EBX
00401030      E8 07006800   CALL 00A8103C
00401035      0D 686602CB   OR EAX,CB026668
0040103A      50            PUSH EAX
0040103B      53            PUSH EBX
0040103C      51            PUSH ECX
0040103D      52            PUSH EDX
0040103E      06            PUSH ES
0040103F      66:A1 5400660 MOV AX,WORD PTR DS:[3660054]
00401045      06            PUSH ES
00401046      1C 00         SBB AL,0
00401048      66:33D2       XOR DX,DX
0040104B      66:0FB70E     MOVZX ECX,WORD PTR DS:[ESI]                                     ; Superfluous operand size prefix
0040104F      1800          SBB BYTE PTR DS:[EAX],AL
00401051      66:F7F1       DIV CX
00401054      FEC2          INC DL
00401056      8816          MOV BYTE PTR DS:[ESI],DL
00401058      5A            POP EDX
00401059      0066 8B       ADD BYTE PTR DS:[ESI-75],AH
0040105C      D066 C1       SHL BYTE PTR DS:[ESI-3F],1
0040105F      EA 10F7361A 0 JMP FAR 8800:1A36F710                                           ; Far jump or call
00401066      16            PUSH SS
00401067      25 00A35800   AND EAX,0058A300
0040106C      A1 18002A06   MOV EAX,DWORD PTR DS:[62A0018]
00401071      5A            POP EDX
00401072      0040 3B       ADD BYTE PTR DS:[EAX+3B],AL
00401075      06            PUSH ES
00401076      5B            POP EBX
00401077      0076 03       ADD BYTE PTR DS:[ESI+3],DH
0040107A      A1 5B0050B4   MOV EAX,DWORD PTR DS:[B450005B]
0040107F      028B 165800B1 ADD CL,BYTE PTR DS:[EBX+B1005816]
00401085      06            PUSH ES
00401086      D2E6          SHL DH,CL
00401088      0A36          OR DH,BYTE PTR DS:[ESI]
0040108A      5A            POP EDX
0040108B      008B CA86E98A ADD BYTE PTR DS:[EBX+8AE986CA],CL
00401091      36:25 00B280C AND EAX,CD80B200                                                ; Superfluous segment override prefix
00401097      1358 72       ADC EBX,DWORD PTR DS:[EAX+72]
0040109A      2A01          SUB AL,BYTE PTR DS:[ECX]
0040109C      06            PUSH ES
0040109D      54            PUSH ESP
0040109E      0083 16560000 ADD BYTE PTR DS:[EBX+5616],AL
004010A4      2906          SUB DWORD PTR DS:[ESI],EAX
004010A6      5B            POP EBX
004010A7      0076 0B       ADD BYTE PTR DS:[ESI+0B],DH
004010AA      C1E0 05       SHL EAX,5
004010AD      8CC2          MOV EDX,ES
004010AF      03D0          ADD EDX,EAX
004010B1      8EC2          MOV ES,EDX                                                      ; Modification of segment register
004010B3    ^ EB 8A         JMP SHORT 0040103F
004010B5      07            POP ES                                                          ; Modification of segment register
004010B6      5A            POP EDX
004010B7      59            POP ECX
004010B8      5B            POP EBX
004010B9      58            POP EAX
004010BA      C3            RETN
004010BB      BE 5901EB08   MOV ESI,8EB0159
004010C0      BE E301EB03   MOV ESI,3EB01E3
004010C5      BE 3901E809   MOV ESI,9E80139
004010CA      00BE AD01E803 ADD BYTE PTR DS:[ESI+3E801AD],BH
004010D0      00FB          ADD BL,BH
004010D2      EB FE         JMP SHORT 004010D2
004010D4      AC            LODS BYTE PTR DS:[ESI]
004010D5      3C 00         CMP AL,0
004010D7      74 09         JE SHORT 004010E2
004010D9      B4 0E         MOV AH,0E
004010DB      BB 0700CD10   MOV EBX,10CD0007
004010E0    ^ EB F2         JMP SHORT 004010D4
004010E2      C3            RETN
004010E3      1D 00457272   SBB EAX,72724500
004010E8      6F            OUTS DX,DWORD PTR DS:[ESI]                                      ; I/O command
004010E9      72 20         JB SHORT 0040110B
004010EB      64            FS:                                                             ; Two prefixes from the same group
004010EC      65:206C65 63  AND BYTE PTR GS:[EBP+63],CH
004010F1      74 75         JE SHORT 00401168
004010F3      72 61         JB SHORT 00401156
004010F5      64            FS:                                                             ; Two prefixes from the same group
004010F6      65:206469 73  AND BYTE PTR GS:[EBP*2+ECX+73],AH
004010FB      636F 2E       ARPL WORD PTR DS:[EDI+2E],BP
004010FE      2020          AND BYTE PTR DS:[EAX],AH
00401100      0D 0A002900   OR EAX,0029000A
00401105      46            INC ESI
00401106      61            POPAD
00401107      6C            INS BYTE PTR ES:[EDI],DX                                        ; I/O command
00401108      74 61         JE SHORT 0040116B
0040110A      2075 6E       AND BYTE PTR SS:[EBP+6E],DH
0040110D      2061 72       AND BYTE PTR DS:[ECX+72],AH
00401110      6368 69       ARPL WORD PTR DS:[EAX+69],BP
00401113      76 6F         JBE SHORT 00401184
00401115      206465 20     AND BYTE PTR SS:[EBP+20],AH
00401119      6E            OUTS DX,BYTE PTR DS:[ESI]                                       ; I/O command
0040111A      A3 636C656F   MOV DWORD PTR DS:[6F656C63],EAX
0040111F      2065 6E       AND BYTE PTR SS:[EBP+6E],AH
00401122      2065 6C       AND BYTE PTR SS:[EBP+6C],AH
00401125      206469 73     AND BYTE PTR DS:[EBP*2+ECX+73],AH
00401129      636F 2E       ARPL WORD PTR DS:[EDI+2E],BP
0040112C      0D 0A002500   OR EAX,0025000A
00401131      41            INC ECX
00401132      72 63         JB SHORT 00401197
00401134      68 69766F20   PUSH 206F7669
00401139      64            FS:                                                             ; Two prefixes from the same group
0040113A      65:6C         INS BYTE PTR ES:[EDI],DX                                        ; Superfluous segment override prefix
0040113C      206E A3       AND BYTE PTR DS:[ESI-5D],CH
0040113F      636C65 6F     ARPL WORD PTR SS:[EBP+6F],BP
00401143      2065 73       AND BYTE PTR SS:[EBP+73],AH
00401146      206469 73     AND BYTE PTR DS:[EBP*2+ECX+73],AH
0040114A      636F 6E       ARPL WORD PTR DS:[EDI+6E],BP
0040114D      74 69         JE SHORT 004011B8
0040114F      67:75 6F      JNE SHORT 004011C1                                              ; Superfluous address size prefix
00401152      2E:200D 0A003 AND BYTE PTR CS:[33000A],CL
00401159      49            DEC ECX
0040115A      6E            OUTS DX,BYTE PTR DS:[ESI]                                       ; I/O command
0040115B      73 65         JAE SHORT 004011C2
0040115D      72 74         JB SHORT 004011D3
0040115F      65:2075 6E    AND BYTE PTR GS:[EBP+6E],DH
00401163      206469 73     AND BYTE PTR DS:[EBP*2+ECX+73],AH
00401167      71 75         JNO SHORT 004011DE
00401169      65:74 65      JE SHORT 004011D1                                               ; Superfluous segment override prefix
0040116C      206465 20     AND BYTE PTR SS:[EBP+20],AH
00401170      73 69         JAE SHORT 004011DB
00401172      73 74         JAE SHORT 004011E8
00401174      65:6D         INS DWORD PTR ES:[EDI],DX                                       ; Superfluous segment override prefix
00401176      61            POPAD
00401177      2079 20       AND BYTE PTR DS:[ECX+20],BH
0040117A      72 65         JB SHORT 004011E1
0040117C      690D 0A6E6963 IMUL ECX,DWORD PTR DS:[63696E0A],202E6569
00401186      2020          AND BYTE PTR DS:[EAX],AH
00401188      2020          AND BYTE PTR DS:[EAX],AH
0040118A      0D 0A001500   OR EAX,0015000A
0040118F      5C            POP ESP
00401190      4E            DEC ESI
00401191      54            PUSH ESP
00401192      4C            DEC ESP
00401193      44            INC ESP
00401194      52            PUSH EDX
00401195      2065 73       AND BYTE PTR SS:[EBP+73],AH
00401198    ^ 74 A0         JE SHORT 0040113A
0040119A      2063 6F       AND BYTE PTR DS:[EBX+6F],AH
0040119D      6D            INS DWORD PTR ES:[EDI],DX                                       ; I/O command
0040119E      70 72         JO SHORT 00401212
004011A0      692E 0D0A0000 IMUL EBP,DWORD PTR DS:[ESI],0A0D
004011A6      0000          ADD BYTE PTR DS:[EAX],AL
004011A8      0000          ADD BYTE PTR DS:[EAX],AL

Mi primera pregunta es:

¿Por que los primeros bytes del bootstrap estan rellenados con ceros? ¿Que sentido tiene que el procesador ejecute eso?

x_x                                                                  x_x                                                                  x_x                                                                  x_x                                                                  x_x                                                                 
#35
Buen dia,

Queria saber si alguien podria ayudarme con una pequeña duda. Soy una persona con pesimas habilidades sociales. No soy una mala persona (se que esto se lee muy win_7 pero yo hablo honestamente) pero es dificil para mi expresarme correctamente y sentir "Empatia" (digamos, para vender cosas o convencer a alguien de algo que no quiere en un momento dado) por lo que puedo repugnar a otros, ademas creo que sufro de alguna forma de depresion por lo que no se como transmitir alegria al cliente respecto al producto (o a algo en general). Vivo en España, y hasta ahora solo me he encontrado con ofertas de trabajo en las que debo relacionarme de esta u otra forma con personas (y he evidentemente fracasado en ello), y queria saber si alguien conoce alguna labor que no impliquen tareas sociales. No se si sea una pregunta dificil o tonta porque no estoy al tanto de si puede ser o no.

Gracias de antemano por sus respuestas.
Un saludo.

PD: Se que en el foro hay personas inteligentes que me recomendaran resolver el problema en vez de intentar adaptarme a el, pero por el momento prefiero adaptarme a el. Gracias por su interes si alguien lo tuvo.
#36
Redes / Distancia y tiempo
26 Junio 2021, 17:50 PM
Buenas tardes

Queria preguntar... ¿Que tanta es la diferencia de tiempo en el que se transmiten los datos segun la distancia en Internet?

Supongase: ¿Cual es la diferencia entre transmitir un mensaje a America del Norte desde America del Sur y enviar un mensaje a Asia desde America del Norte?

Se que es una cuestion de milisegundos pero es precisamente lo que quiero saber... en la medida que sea, cuanto
#37
Foro Libre / Naturaleza caotica del mundo
25 Junio 2021, 21:36 PM
Hola,

En el mundo hay mas caos que orden. Se puede notar porque la simetria es imaginaria y la prediccion exacta es imposible pero, ¿Por que es esto? Me lo estuve preguntando y he llegado a la conclusion de aunque una causa conlleva solo a una consecuencia, una consecuencia puede tener muchas diferentes causas.

Ejemplos:

2+2 = 4

La causa 2+2 conlleva siempre al resultado 4, sin embargo, el resultado 4 puede ser causa de 2+2 o de 500-496.

Una tormenta

Una lluvia puede producirse por un numero casi infinito de posibles movimientos de nubes en una determinada zona, sin embargo al ver una lluvia no podemos determinar exactamente que la produjo.

Podria decirse que la razon por la cual esto es asi es porque no se tiene suficiente conocimiento a priori al momento de la observacion pero, con conocimiento a priori o a posteriori, siempre se cumple: aunque una causa conlleva solo a una consecuencia, una consecuencia puede tener muchas diferentes causas

Creo que en el mundo en general los humanos sufren constantemente a causa ( :xD) de esto. Somos capaces de observar consecuencias, no causas. Por eso nos equivocamos en un mayor numero de veces respecto a tener razon. Si fuesemos capaces de observar causas, nuestros deseos serian perfectos porque seria imposible estar en disonancia con el flujo causal de las cosas



¿A que viene esto? Tu dime. Es el foro libre
#38
Buenas tardes,

Hay gente que tiene una predisposicion al riesgo mayor que otra.

¿Es cierto que en los humanos, los machos con mayor predisposicion al riesgo tienden mas a atraer hembras, por lo que se reproducen mas?

Si es asi, ¿Por que existen machos con poca predisposicion al riesgo en la especie, es decir, que tienden a la seguridad en mayor medida que al riesgo?

Saludos.
#39
Hola,

La pregunta es: Cuando un ser inteligente recibe informacion, hablese de visual, auditiva; finalmente, sensorial, ¿Es recibida esta en flujos o en particulas? No se como llamarle a la cuantia de informacion mas pequeña posible si no quantum.

Saludos.
#40
Foro Libre / Pregunta trivial.
16 Mayo 2021, 12:15 PM
A las personas les gusta que seas conciso, que no expliques demasiado lo que quieres demostrar, expresar, etc. Sin embargo, si eres demasiado conciso, exprimes el significado de la idea hasta dejarla en pocas palabras, se estresan del malentendido y podrian llamarte loco.

¿A que se debe esta ironia?

FAQ (Frequent Answers to my Question):


  • Existe un punto medio: El punto medio es relativo a cada quien, por lo que aplicar una filosofia del "Punto medio" es ineficiente en terminos generales.
  • Es cuestion de sentido comun: No entendiste mi pregunta.

Saludos y gracias,
Marax.
#41
Hola,

Queria saber si alguien conoce algun comando avanzado de Google o algo parecido que resulte en la omision de los sitios ya visitados (los que aparecen en color morado, en vez de azul) en la busqueda de Google.

Gracias y saludos,
marax.
#42
Redes / CURL en Windows. SSL
13 Mayo 2021, 16:34 PM
Tengo este codigo:

#include <stdio.h>
#include "curl/include/curl/curl.h"

size_t dataSize=0;
size_t curlWriteFunction(void* ptr, size_t size/*always==1*/,
                         size_t nmemb, void* userdata)
{
    char** stringToWrite=(char**)userdata;
    const char* input=(const char*)ptr;
    if(nmemb==0) return 0;
    if(!*stringToWrite)
        *stringToWrite=malloc(nmemb+1);
    else
        *stringToWrite=realloc(*stringToWrite, dataSize+nmemb+1);
    memcpy(*stringToWrite+dataSize, input, nmemb);
    dataSize+=nmemb;
    (*stringToWrite)[dataSize]='\0';
    return nmemb;
}

int main()
{
    char* data=0;
    CURL*const curl=curl_easy_init();
    if(!curl)
    {
        fprintf(stderr, "error: Initialization");
        return 1;
    }
    curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com");
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &curlWriteFunction);
    if(curl_easy_perform(curl)!=CURLE_OK)
    {
        fprintf(stderr, "error: get web page\n");
        return 1;
    }
    curl_easy_cleanup(curl);

    if(!data)
    {
        fprintf(stderr, "error: Got no data\n");
        return 1;
    }

    printf("Page data:\n\n%s\n", data);
    free(data);
}


En Linux, al especificar https: en el URL, no hace ninguna diferencia, sin embargo cuando lo hago en Windows falla la funcion curl_easy_perform. ¿Alguien tiene idea de por que?

Gracias y saludos,
marax.
#43
Foro Libre / ¿Magnetismo o aceleracion?
22 Abril 2021, 11:05 AM
Hola,

Me parece prudente comentar que he llegado hasta esta duda a partir de la curiosidad por el fenomeno del magnetismo y de las llamadas lineas de campo magnetico.

Segun la fisica moderna, el magnetismo no es una fuerza que se ejerce sino una interaccion entre bosones. Es decir que la interaccion resulta por el momento de un boson, y esto a su vez es lo que hace que se repelan los imanes.
Sin embargo esto me presenta algunas curiosidades, y me pregunto si alguno sabe las respuestas, y decirmelas si no es ninguna molestia:

¿que es un polo entonces?
Segun la definicion de polo hablamos de en donde se concentra la mayoria de la energia de algo. Antes de que parezca que estoy dando la respuesta en la pregunta... de esta manera, ¿cual es la diferencia entre polos opuestos? ¿que mientras uno emite bosones el otro los absorbe (por asi decirlo)?
Y si es asi, ¿que tiene que ver que uno emita y el otro los absorba, con la manifestacion del movimiento en el mundo real? Me he hecho un modelo mental para intentar contestarme a mi mismo esta pregunta y resulto lo siguiente (hecho en Paint):



Entonces, ¿recae la diferencia en que el hecho de que una de las particulas absorba fotones (digamos que el espaciotiempo de los bosones funciona asi, si, me refiero a la mecanica/dinamica cuantica) afecta el espaciotiempo de cierta manera en la que la segunda particula queda atraida (la que absorbe)? es decir, ¿estoy en lo correcto?. Y esto podria ser representado en un modelo matematico con la definicion newtoniana de aceleracion, ¿verdad?.

Tal vez parezca engorroso... se ve mejor en mi cabeza. Si alguien intuye tener la respuesta pero se pierde en el caos que solo pregunte...

Gracias de antemano y saludos.
#44
Hola,

Hace unos dias pregunte sobre alguna HTTP API que ahora estoy probando. La cosa es que al hacer solicitudes a servidores, me envian este mensaje a traves del HTML:

CitarPlease enable JS and disable any ad blocker

Evidentemente no puedo "Activar" javascript o "Desactivar" algun ad blocker porque estoy intentando hacer solicitudes HTTP simples; det texto plano. Como si utilizara Firefox con el sufijo "view-source:" antepuesto a la URL. De hecho... exactamente lo que quiero experimentar es eso... Que pueda obtener el codigo fuente exactamente como si hiciera eso.

Gracias de antemano.
Saludos.
#45
Hola,

¿Es GCC un compilador o un linker?
Tengo entendido que son programas diferentes, sin embargo un codigo fuente puede ser compilado y enlazado con el comando simple gcc prog.c -o prog.exe

¿Existe una opcion -l que especifica una libreria como archivo por separado, o cuando se especifica por ejemplo -lwinhttp esta libreria esta integrada de antemano en gcc.exe?