Skip to content

Instantly share code, notes, and snippets.

@cecekpawon
Created August 9, 2017 08:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cecekpawon/b767243ddf17fa8b361284b4b333800f to your computer and use it in GitHub Desktop.
Save cecekpawon/b767243ddf17fa8b361284b4b333800f to your computer and use it in GitHub Desktop.
Naked Apple FirmwareUpdate.pkg
#!/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