[PHP] Обфусцируем число

Как иногда хочется сделать сложнее работу тем, кто разбирает запутанный тобою код. Вроде бы уже и имена переменных абсолютно нечитабельные, и «хитрые» вызовы функций подобавляли, и только одни числа остались.. Стоп! Числа… Их то тоже можно «усложнить». Вот с такими мыслями и появился скрипт, который показан ниже.

function num_obf($num) {
 
	$num_rezerv = $num;
	$operations = array("+", "-", "<<", "~");
	$expression = "";
 
	if ($num == 0) {
		$expression = "0";
	}
	else {
		$r = rand(1, ((int)($num/4)));
		$expression .= $r;
		$num -= $r;
	}
 
	while ($num > 0) {
		$op = rand(0, count($operations)-1);
		switch ($op) {
			case 0: {/* + */
				if ($num < $num_rezerv / 10) {
					$r = $num;
				}
				else {
					if ($num == 1) {
						$r = 1;
					}
					else {
						$r = rand(1, ((int)($num / 5)));
					}
				}
				$expression .= $operations[$op].$r;
				$num -= $r;
				break;
			}
			case 1: {/* - */
				$v = rand(1,100);
				if ($v < 50) {
					if ($num == 1) {
						$r = 1;
					}
					else {
						$r = rand(1, ((int)($num / 20)));
					}
					$expression .= $operations[$op].$r;
					$num += $r;
				}
				break;
			}
			case 2: {/* << */
				if ($num > ($num_rezerv / 2)) {
					if ($expression[0] == "(" && $expression[strlen($expression) - 1] == ")") {
						$expression = "(".$expression.$operations[$op]."1)";
					}
					else {
						$expression = "((".$expression.")".$operations[$op]."1)";
					}
					$e = 2*($num_rezerv - $num);
					$num = $num_rezerv - $e;
 
				}
				else {
					if ($num >=4 && rand(0,100) < 50) {
						if (rand(0,1)) $expression .= "+(1".$operations[$op]."1".$operations[$op]."1)";
						else $expression .= "+(1".$operations[$op]."2)";
						$num -= 4;
					}
					else {
						if ($num >= 2) {
							$expression .= "+(1".$operations[$op]."1)";
							$num -= (1<<1);
						}
						else {
							if ($num - (1) >= 0) {
								$expression .= "+1";
								$num--;
							}
						}
					}
				}
				break;
			}
			case 3: {/* ~ */
				$r = rand(1, ((int)($num / 8)));
				$expression .= "-".$operations[$op].$r;
				$num += ~$r;
				break;
			}
		}
	}
	return $expression;
}

Вводим число, а получаем на выходе выражение, которое включает в себя 4 действия (+, -, <<, ~) в разных комбинациях. Да, результатом выполнения выражения является исходное число (это естественно). Живая демка доступна по ссылке.

Несколько примеров для числа 160:

21-4-2+20-~4-~3+10-~4-~12+2+10-~6+1-2-~5+(1<<1)+3-1-~2+5-~6+6+(1<<1)-~3-~1+(1<<1<<1)+4-~1+(1<<1<<1)+(1<<1)+15
(((39)<<1)<<1)+4
(((14+16)<<1)<<1)+(1<<1)+2-~4-~3-~1-~3+(1<<1)+2-~1-1-~1+14
(((27-~1-5)<<1)<<1)-2-2+2+(1<<1)+8+3-~3-~5+(1<<2)+7+4+5-1-~3-~2+3-~1+12
((39-~8+2-~5-~11)<<1)+(1<<1)+(1<<1)-1+3-~1+(1<<1<<1)+12

, ,

Оставить комментарий

Top ↑ | Main page | Back