#!/usr/bin/php 16384) { $buffer = substr($buffer, -8192); } } function fromBuffer($jumpCmd) { global $buffer; // for ($x = 0; $x < strlen($buffer); $x++) // echo bin2hex(substr($buffer, $x, 1)) . ' '; $length = binNumber($jumpCmd, 6, 5) + 4; $jumpWidth = binNumber($jumpCmd, 11, 13); // echo $length . ' ' . (0 - $jumpWidth) . ' '; // Compensate for the fact that once every 256 jump values, // two values (0xFE and 0xFF) are not used. $subtract = floor($jumpWidth / 0x100) * 2; $jumpWidth -= $subtract; $ret = substr($buffer, 0 - $jumpWidth, $length); // for ($x = 0; $x < strlen($ret); $x++) // echo bin2hex(substr($ret, $x, 1)) . ' '; return $ret; } function hexifyAddress($inAddr) { $outAddr = strtoupper(base_convert($inAddr, 10, 16)); $outAddr = str_pad($outAddr, 8, '0', STR_PAD_LEFT); $outAddr = substr($outAddr, 0, 4) . '-' . substr($outAddr, 4, 4); return $outAddr; } function readString() { global $I, $stop; $outStr = ''; $x = 0; while (!feof($I) && (ftell($I) <= $stop)) { $inChr = fread($I, 1); $outStr .= $inChr; if (ord($inChr) == 0xFE) { return $outStr; } } return $outStr; } function xlateString($inStr, $buffer = true) { global $COMPRESSION; $outStr = ''; for ($i = 0; $i < strlen($inStr); $i++) { $curChr = ord($chunk = substr($inStr, $i, 1)); if ($curChr < 0x0A) $outStr .= chr($curChr + 0x30); elseif ($curChr < 0x24) $outStr .= chr($curChr + 0x37); elseif ($curChr < 0x3E) $outStr .= chr($curChr + 0x3D); switch ($curChr) { case 0x3E: $outStr .= '!'; break; case 0x40: $outStr .= '?'; break; case 0x42: $outStr .= '+'; break; case 0x44: $outStr .= '/'; break; case 0x46: $outStr .= ':'; break; case 0x5F: $outStr .= '!'; break; case 0x8D: $outStr .= '('; break; case 0x8E: $outStr .= ')'; break; case 0x91: $outStr .= '"'; break; case 0x93: $outStr .= "'"; break; case 0xD0: $chunk = substr($inStr, $i, 2); $i++; $curChr = ord(substr($inStr, $i, 1)); switch ($curChr) { case 0x3E: $outStr .= '!'; break; case 0x40: $outStr .= '?'; break; case 0x42: $outStr .= '+'; break; case 0x44: $outStr .= '/'; break; case 0x46: $outStr .= ':'; break; case 0x5F: $outStr .= '.'; break; case 0x8D: $outStr .= '('; break; case 0x8E: $outStr .= ')'; break; case 0x91: $outStr .= '"'; break; case 0x93: $outStr .= "'"; break; case 0xE9: $outStr .= '.'; break; case 0xEA: $outStr .= '!'; break; case 0xEC: $outStr .= '.'; break; case 0xFA: $outStr .= ' '; break; } continue; break; case 0xD1: $chunk = substr($inStr, $i, 2); $i++; $curChr = ord(substr($inStr, $i, 1)); switch ($curChr) { case 0x19: $outStr .= '.'; break; case 0x1A: $outStr .= '!'; break; case 0x1C: $outStr .= '.'; break; case 0x2A: $outStr .= ' '; break; } continue; break; case 0xD2: case 0xD3: case 0xD4: case 0xD5: case 0xD6: case 0xD7: case 0xD8: case 0xE2: case 0xE3: $chunk = substr($inStr, $i, 2); $i++; continue; break; case 0xF0: case 0xF1: case 0xF2: case 0xF3: $chunk = substr($inStr, $i, 3); if ($COMPRESSION) $outStr .= xlateString(fromBuffer($chunk), false); $i+=2; continue; break; case 0xD9: $chunk = substr($inStr, $i, 2); $i++; $curChr = ord(substr($inStr, $i, 1)); switch ($curChr) { case 0xB6: $outStr .= '.'; break; case 0xB7: $outStr .= '&'; break; case 0xB8: $outStr .= '%'; break; case 0xBD: $outStr .= ':'; break; case 0xBE: $outStr .= '('; break; case 0xBF: $outStr .= ')'; break; case 0xC0: $outStr .= '"'; break; case 0xC1: $outStr .= "'"; break; case 0xC6: $outStr .= '/'; break; case 0xC9: $outStr .= '?'; break; } continue; break; case 0xDA: $chunk = substr($inStr, $i, 2); $i++; $curChr = ord(substr($inStr, $i, 1)); switch ($curChr) { case 0x73: $outStr .= ' '; break; case 0x74: $outStr .= ','; break; case 0x75: $outStr .= ';'; break; case 0x76: $outStr .= "'"; break; case 0x77: $outStr .= '"'; break; } continue; break; case 0xE9: $outStr .= '.'; break; case 0xEA: $outStr .= '!'; break; case 0xEC: $outStr .= '.'; break; case 0xF8: $outStr .= ' '; break; case 0xFA: $outStr .= ' '; break; } if ($buffer) toBuffer($chunk); } if (strlen($outStr)) return $outStr; else return ''; } $args = $_SERVER['argv']; $self = array_shift($args); $filename = array_shift($args); $start = array_shift($args); $stop = array_shift($args); $I = fopen($filename, 'r'); if (!$I) exit('Could not open file: ' . $filename . "\n"); if ($start) fseek($I, $start); if (!$stop) $stop = filesize($filename); while (!feof($I) && ftell($I) <= $stop) { echo hexifyAddress(ftell($I)) . ' '; $inStr = readString(); echo substr(xlateString($inStr), 0, 60) . "\n"; } fclose($I); ?>