rendered paste body<?php// arc.php//// by drx, based on xose's notes// <hacking-cult.org>$dir = $argv[1];$arc = $argv[2];$method = $argv[3];$method = ($method) ? $method : 3;if (!$dir || !$arc) {echo "arc.php\n\nby drx, thanks to xose for most of the format breakdown\nhacking-cult.org\n\nusage: arc.php?dir=DIR&arc=OUTPUT&method=METHOD\n\nDIR - directory to be compressed\nOUTPUT - output .arc file\nMETHOD - \n<b>1</b> - never compress\n<b>3</b> - force compression (default)";die();}$i = 0;$fni = 1;$fndata = "\0";$datai = 0;$data = "";$entries = array();function do_dir($dn, $parent) { global $i, $entries, $fni, $fndata, $datai, $data, $method; $dp = opendir($dn); while ($file = readdir($dp)) { if ($file != '.' && $file != '..') { $i++; $fnpos = $fni; $fndata .= $file."\0"; $fni += strlen($file)+1; if (is_dir($dn."/".$file)) { $entries[] = array("folder" => 1, "fn" => $fnpos, "parent_data" => $parent, "length" => 0000, "ulength" => 0); $l = count($entries); echo"<b>".$i.": $dn/$file ($parent)</b>\n"; do_dir($dn."/".$file, $i); $entries[$l-1]["length"] = $i+1; } else { for (;($datai&0x1f);$datai++) $data .= "\0"; $datapos = $datai; $cmp = 0; if ($method == 3) $cmp = 1; $filedata = fread(fopen("$dn/$file","r"),filesize("$dn/$file")); if ($cmp) {$ulength=strlen($filedata);$filedata=gzcompress($filedata,6);$length=strlen($filedata);} else {$length = strlen($filedata);$ulength=0;} $data .= $filedata; $datai += strlen($filedata); $entries[] = array("folder" => 0, "fn" => $fnpos, "parent_data" => $datapos, "length" => $length, "ulength" => $ulength); echo $i.": ".$dn."/".$file . "\n"; } } } }do_dir($dir, 0);//echo "<pre>";//print_r($entries);$fp = fopen("./".$arc, "wb");$fnlen=count($entries)*0x10+0x10;for (;($fnlen&0x1f);$fnlen++);$fnlen += strlen($fndata);$datastart = $fnlen;for (;($datastart&0x1f);$datastart++) $fndata .= "\0";$datastart += 0x20;fwrite($fp, pack("N*", 0x55AA382D, 0x20, $fnlen, $datastart,0,0,0,0)); //the headerarray_unshift($entries, array("folder" => 1, "fn" => 0, "parent_data" => 0, "length" => $i+1, "ulength" => 0));for ($i=0;$i<count($entries);$i++) fwrite($fp, pack("CxnNNN", $entries[$i]["folder"], $entries[$i]["fn"], ($entries[$i]["folder"])?$entries[$i]["parent_data"]:($entries[$i]["parent_data"]+$datastart), $entries[$i]["length"], $entries[$i]["ulength"]));fwrite($fp,$fndata);fwrite($fp,$data);?>