Skip to content

Instantly share code, notes, and snippets.

@nubs
Last active December 21, 2015 21:39
Show Gist options
  • Save nubs/6369405 to your computer and use it in GitHub Desktop.
Save nubs/6369405 to your computer and use it in GitHub Desktop.
<?php
$code = '';
$code = preg_replace('/^<\?/', '', $code);
$specialChars = implode('', array_unique(str_split(preg_replace('#[a-z0-9+/]+#i', '', $code))));
file_put_contents('php://stderr', "Special Characters: " . var_export($specialChars, true) . "\n");
$unusedChars = implode('', array_diff(
str_split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/+'),
array_unique(array_diff(str_split($code), str_split($specialChars)))
));
$unusedChars = substr($unusedChars, 0, strlen($specialChars));
file_put_contents('php://stderr', "Unused Characters: " . var_export($unusedChars, true) . "\n");
if (strlen($specialChars) > strlen($unusedChars)) {
die("not enough unused chars!\n");
}
$escapedCode = strtr($code, $specialChars, $unusedChars);
$encodedCode = base64_decode($escapedCode);
$iterations = 0;
while (substr(strtr(base64_encode($encodedCode), $unusedChars, $specialChars), -1) !== ';') {
$code .= ';';
$escapedCode = strtr($code, $specialChars, $unusedChars);
$encodedCode = base64_decode($escapedCode);
$iterations++;
}
file_put_contents('php://stderr', "Padding: {$iterations}\n");
$encodedCode = str_replace("'", "\\'", $encodedCode);
$codeTemplate = "<?eval(strtr(base64_encode('%s'),%s,%s));";
printf($codeTemplate, $encodedCode, $unusedChars, '~' . ~$specialChars);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment