Created
August 9, 2017 08:58
-
-
Save cecekpawon/b767243ddf17fa8b361284b4b333800f to your computer and use it in GitHub Desktop.
Naked Apple FirmwareUpdate.pkg
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/php | |
<?php | |
/* | |
--- | |
Naked Apple FirmwareUpdate.pkg | |
--- | |
- chmod+x.script. | |
- Place FirmwareUpdate.pkg & UEFIExtract into same directory as script. | |
- UEFIExtract: https://github.com/LongSoft/UEFITool/releases | |
--- | |
- Thanks to @savvamitrofanov, where are you man? | |
--- | |
@cecekpawon Mon Jun 26 18:14:15 2017 | |
--- | |
*/ | |
$cdir = __DIR__; | |
$FU = "FirmwareUpdate.pkg"; | |
$FUTMP = "FUTMP"; | |
$SCRIPTS = "Scripts"; | |
$UEFIExtract = "UEFIExtract"; | |
$aSMC = $aModels = $aFF = array(); | |
$aUEFIExtract = array("825880CC-DBB5-4955-8AFF-B26FA33C84AA", "CC582C73-F48F-4B62-83E8-A586B4C88F84"); | |
$gFMM = "00000000"; | |
function rsearch($folder, $pattern) { | |
$iti = new RecursiveDirectoryIterator($folder); | |
foreach(new RecursiveIteratorIterator($iti) as $file) { | |
if(strpos($file, $pattern) !== false) { | |
return $file->__toString(); | |
} | |
} | |
return false; | |
} | |
function flip($b) { | |
return implode("", array_reverse(str_split($b, 2))); | |
} | |
function readFF($file, $model) { | |
global $aFF, $cdir, $gFMM; | |
$f = file_get_contents("$file"); | |
$a = unpack("H*", $f)[1]; | |
preg_match("#B8([a-f0-9]{8})482145D8B8([a-f0-9]{8})#i", $a, $c); | |
if (count($c == 3) && !empty($c[1]) && !empty($c[2])) { | |
$gFMM = $aFF[$model]["FirmwareFeaturesMask"] = flip($c[1]); | |
$aFF[$model]["FirmwareFeatures"] = flip($c[2]); | |
} else { | |
preg_match("#4883EC48BF([a-f0-9]{8})#i", $a, $c); | |
if (count($c == 2) && !empty($c[1])) { | |
$aFF[$model]["FirmwareFeaturesMask"] = $gFMM; | |
$aFF[$model]["FirmwareFeatures"] = flip($c[1]); | |
} | |
} | |
} | |
function getFF($file, $model, $i) { | |
global $UEFIExtract, $aUEFIExtract, $cdir; | |
if ($i > count($aUEFIExtract)) return; | |
passthru("cd $cdir;"); | |
passthru("$cdir/$UEFIExtract $file $aUEFIExtract[$i];"); | |
$b = basename($file); | |
$ddir = "$cdir/$b.dump"; | |
if (!is_dir($ddir)) return getFF($file, $model, ++$i);; | |
$filepath = rsearch($ddir, "body.bin"); | |
if (file_exists("$filepath")) { | |
readFF("$filepath", $model); | |
passthru("rm -rf $ddir"); | |
return; | |
} | |
return getFF($file, $model, ++$i); | |
} | |
chdir("$cdir"); | |
if (!file_exists("$FU")) { | |
echo "$FU not exists!\n"; | |
exit; | |
} | |
if (is_dir("$cdir/$FUTMP")) { | |
passthru("rm -rf $cdir/$FUTMP"); | |
} | |
passthru("cd $cdir; mkdir -p $FUTMP; cd $FUTMP; xar -xf ../$FU; cat $SCRIPTS | gunzip -dc |cpio -i"); | |
if (is_dir("$cdir/$FUTMP")) { | |
$tdir = "$cdir/$FUTMP/Tools"; | |
$bUEFIExtract = file_exists("$cdir/$UEFIExtract"); | |
$n = "EFIPayloads"; | |
$files = glob("$tdir/$n/*.{scap,fd}", GLOB_BRACE); | |
foreach ($files as $key => $value) { | |
//if (!preg_match("#locked#i", $value)) continue; | |
$b = file_get_contents($value); | |
preg_match("#\\\$IBIOSI\\\$(.+)Copyright#", $b, $a); | |
if (empty($s = trim(preg_replace('/[[:^print:]]/', '', $a[1])))) continue; | |
$aModels[] = $s; | |
if ($bUEFIExtract) getFF($value, $s, 0); | |
} | |
if (count($aModels)) { | |
echo "\n\n$n:\n\n"; | |
foreach ($aModels as $value) { | |
echo " - " . $value . "\n"; | |
} | |
} | |
$n = "SMCJSONs"; | |
$files = glob("$tdir/$n/*.json"); | |
foreach ($files as $key => $value) { | |
$b = file_get_contents($value); | |
preg_match("#smc-version\": \"([^\"]+)#", $b, $a); | |
if (empty($s = trim($a[1]))) continue; | |
$value = basename($value, ".json"); | |
$aSMC[$value] = preg_replace('/[[:^print:]]/', '', $s); | |
} | |
if (count($aSMC)) { | |
echo "\n\n$n:\n\n"; | |
foreach ($aSMC as $key => $value) { | |
echo " - $key: " . $value . "\n"; | |
} | |
} | |
if (count($aFF)) { | |
echo "\n\nFirmwareFeatures(Mask):\n\n"; | |
foreach ($aFF as $key => $value) { | |
$ffm = $aFF[$key]["FirmwareFeaturesMask"]; | |
$ff = $aFF[$key]["FirmwareFeatures"]; | |
echo " - $key: FirmwareFeaturesMask=0x$ffm | FirmwareFeatures=0x$ff\n"; | |
} | |
} | |
passthru("rm -rf $cdir/$FUTMP"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment