• Obtener la clave OSK de un Mac mediante su SMC

    Dado que vamos a necesitar el compilador GCC, antes que nada asegúrate de tener XCode instalado en el Mac. Una vez comprobada la instalación de XCode, abre una terminal y ejecuta lo siguiente:

    echo "#include <stdio.h>" > ~/Desktop/LeerClaveOSK.c
    echo "#include <IOKit/IOKitLib.h>" >> ~/Desktop/LeerClaveOSK.c
    echo "" >> ~/Desktop/LeerClaveOSK.c
    echo "typedef struct {" >> ~/Desktop/LeerClaveOSK.c
    echo " uint32_t key;" >> ~/Desktop/LeerClaveOSK.c
    echo " uint8_t __d0[22];" >> ~/Desktop/LeerClaveOSK.c
    echo " uint32_t datasize;" >> ~/Desktop/LeerClaveOSK.c
    echo " uint8_t __d1[10];" >> ~/Desktop/LeerClaveOSK.c
    echo " uint8_t cmd;" >> ~/Desktop/LeerClaveOSK.c
    echo " uint32_t __d2;" >> ~/Desktop/LeerClaveOSK.c
    echo " uint8_t data[32];" >> ~/Desktop/LeerClaveOSK.c
    echo "} AppleSMCBuffer_t;" >> ~/Desktop/LeerClaveOSK.c
    echo "" >> ~/Desktop/LeerClaveOSK.c
    echo "int" >> ~/Desktop/LeerClaveOSK.c
    echo "main(void)" >> ~/Desktop/LeerClaveOSK.c
    echo "{" >> ~/Desktop/LeerClaveOSK.c
    echo " io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault," >> ~/Desktop/LeerClaveOSK.c
    echo ' IOServiceMatching("AppleSMC"));' >> ~/Desktop/LeerClaveOSK.c
    echo ' if (!service)' >> ~/Desktop/LeerClaveOSK.c
    echo " return -1;" >> ~/Desktop/LeerClaveOSK.c
    echo "" >> ~/Desktop/LeerClaveOSK.c
    echo " io_connect_t port = (io_connect_t)0;" >> ~/Desktop/LeerClaveOSK.c
    echo " kern_return_t kr = IOServiceOpen(service, mach_task_self(), 0, &port);" >> ~/Desktop/LeerClaveOSK.c
    echo " IOObjectRelease(service);" >> ~/Desktop/LeerClaveOSK.c
    echo " if (kr != kIOReturnSuccess)" >> ~/Desktop/LeerClaveOSK.c
    echo " return kr;" >> ~/Desktop/LeerClaveOSK.c
    echo "" >> ~/Desktop/LeerClaveOSK.c
    echo " AppleSMCBuffer_t inputStruct = { 'OSK0', {0}, 32, {0}, 5, }, outputStruct;" >> ~/Desktop/LeerClaveOSK.c
    echo " size_t outputStructCnt = sizeof(outputStruct);" >> ~/Desktop/LeerClaveOSK.c
    echo "" >> ~/Desktop/LeerClaveOSK.c
    echo " kr = IOConnectCallStructMethod((mach_port_t)port, (uint32_t)2," >> ~/Desktop/LeerClaveOSK.c
    echo " (const void*)&inputStruct, sizeof(inputStruct)," >> ~/Desktop/LeerClaveOSK.c
    echo " (void*)&outputStruct, &outputStructCnt);" >> ~/Desktop/LeerClaveOSK.c
    echo " if (kr != kIOReturnSuccess)" >> ~/Desktop/LeerClaveOSK.c
    echo " return kr;" >> ~/Desktop/LeerClaveOSK.c
    echo "" >> ~/Desktop/LeerClaveOSK.c
    echo " int i = 0;" >> ~/Desktop/LeerClaveOSK.c
    echo " for (i = 0; i < 32; i++)" >> ~/Desktop/LeerClaveOSK.c
    echo ' printf("%c", outputStruct.data[i]);' >> ~/Desktop/LeerClaveOSK.c
    echo "" >> ~/Desktop/LeerClaveOSK.c
    echo " inputStruct.key = 'OSK1';" >> ~/Desktop/LeerClaveOSK.c
    echo " kr = IOConnectCallStructMethod((mach_port_t)port, (uint32_t)2," >> ~/Desktop/LeerClaveOSK.c
    echo " (const void*)&inputStruct, sizeof(inputStruct)," >> ~/Desktop/LeerClaveOSK.c
    echo " (void*)&outputStruct, &outputStructCnt);" >> ~/Desktop/LeerClaveOSK.c
    echo " if (kr == kIOReturnSuccess)" >> ~/Desktop/LeerClaveOSK.c
    echo " for (i = 0; i < 32; i++)" >> ~/Desktop/LeerClaveOSK.c
    echo ' printf("%c", outputStruct.data[i]);' >> ~/Desktop/LeerClaveOSK.c
    echo "" >> ~/Desktop/LeerClaveOSK.c
    echo ' printf("\n");' >> ~/Desktop/LeerClaveOSK.c
    echo "" >> ~/Desktop/LeerClaveOSK.c
    echo " return IOServiceClose(port);" >> ~/Desktop/LeerClaveOSK.c
    echo "}" >> ~/Desktop/LeerClaveOSK.c

    Se te habrá creado un archivo llamado LeerClaveOSK.c en el escritorio. Compílalo pegando y ejecutando lo siguiente en la terminal:

    gcc -Wall -o ~/Desktop/LeerClaveOSK ~/Desktop/LeerClaveOSK.c -framework IOKit

    Una vez compilado, podrás ejecutarlo pegando lo siguiente en la terminal:

    ~/Desktop/LeerClaveOSK

    El resultado será una cadena de autentificación que tiene su historia con el TPM y que podrás copiar y pegar donde lo requieras. 🙂