') $src = substr($src, 0, strlen($src) - 2); $src = trim($src); $cmds = explode(';', $src); foreach($cmds as $key => $cmd) { $cmds[$key] = trim($cmds[$key]); if ($cmds[$key] == '') unset($cmds[$key]); } // here is place for some hi-tech decision tree FSM ;) // find strings $strings = array(); $count = 0; foreach($cmds as $key=> $cmd) { $arr = array(); if (eregi('\'([^\']*)\'', $cmd, $arr)) { $strings[$count] = $arr[1]; $cmds[$key] = eregi_replace('\'([^\']*)\'', '__STR-'.$count++.'__', $cmd); } } // make string table $strs = array(); $offset = 0; $string_table = ''; foreach($strings as $key => $str) { $str .= '$'; $strs[$key] = $offset; $offset += strlen($str); $string_table .= $str; } //make header of binary file $header = "\xE9"; // jmp $header .= chr($offset%256).chr($offset/256); // after string_table // parse code $code = "\x0E\x1F"; // push cs, pop ds foreach($cmds as $key => $cmd) { if (substr($cmd, 0, 4) == 'echo') { $cmd = trim(substr($cmd, 4, strlen($cmd)-4)); $number = array(); if (eregi('^__STR-([0123456789]*)__$', $cmd, $number)) { $addr = $strs[$number[1]] + strlen($header) + 256; $code .= "\x31\xC0"; // xor ax, ax $code .= "\xB4\x09"; // mov ah, 9 $code .= "\xBA".chr($addr%256).chr($addr/256); // mov dx, adr_of_string $code .= "\xCD\x21"; // int 21 ; DOS function - print string } else die('Unrecognize string '.$cmd.PHP_EOL); } else die('Unrecognize command "'.$cmd.'" on pseudo-line '.$key.PHP_EOL); } $code .= "\xC3"; // ret $data = $header; $data .= $string_table; $data .= $code; file_put_contents($output, $data); echo 'Compiled for x86.'.PHP_EOL; echo 'Compiling ok :)'.PHP_EOL; ?>