Шифруем php скрипт с помощью пароля

Discussion in 'PHP' started by Dr.Z3r0, 11 Nov 2007.

  1. Dr.Z3r0

    Dr.Z3r0 Leaders of the World

    Joined:
    6 Jul 2007
    Messages:
    284
    Likes Received:
    595
    Reputations:
    567
    Вообщем может народ сразу не догнал поясню. Данный скрипт шифрует любой php скрипт с помощью пароля без которого вы ни запустите скрипт, ни почитаете его сорцы(Я думаю вы поняли отличие от Зенда)...
    Зачем? Ну собственно я это писал на заказ для того чтобы зашифровать админ панель одного типа, удобно знаете ли ведь пасс впринципе то нигде не хранится, и если найти его, то только перебором, что также весьма проблематично :))
    А вариантов масса для того же криптования веб-шелла и вроде как и антивирь не учует, и без пасса ваш веб шел никто не заюзает...или создание чего то типа контейнера с БД какого нить похеканного сайта..вообщем сами придумаете...

    Я думаю многим пригодится. Вот собсно сам скрипт для шифрования:
    Code:
    <?php
    function crypting($str,$pas){
    	$sum_pas=0;
    	for($i=0;$i<strlen($pas);$i++)$sum_pas+=ord($pas[$i]);
    	$intp=0;
    	$crypt_str='';
    	for($i=0;$i<strlen($str);$i++){
    		$new_str[$i]=ord($str[$i])+(($sum_pas+ord($pas[$intp]))%255);
    		if($new_str[$i]<100)$crypt_str.='0'.$new_str[$i];
    		else $crypt_str.=$new_str[$i];
    		if($intp===strlen($pas)-1)$intp=0;
    		else $intp++;
    	}
    	return $crypt_str;
    }
    
    $set['version']='1.0';
    $set['comment_cop']=true;
    $set['key_name']='key';
    
    if((!empty($_POST['file']))&&(!empty($_POST['pass']))){
    	$fff=$_POST['file'];	$new_file=gzuncompress(base64_decode('eJxtUEFuwjAQPAeJP/hgFG8dIBBxavclKEIQnNZS6kS2o6qq+HttJwFHcLF2Z2fGu7Nc1L2qrGwVqfRvZ6X6ZNRYndHubOBvuUhkzVzfCBVwICtSIOZhlFCpbIf5e6iV+Dk5Bqbp0Jv+++RMxnHdakala6j8mPz8F67nHCYyx1Zfw+BIZQlPytkq22JUh10S2jZXv4BXoukvrhxOKd6ozIrBzJ8TE495iYhpnsJLeYRlu2w/esyo1dect2bsfk10jAuqBFjtDweYXMbANhjLH1uGbBHjsNY7iCNPRGMECQjnAbn5Rwvba0Umfz9w+O0f5g2Nsw==')).'
    if(!empty($_GET["'.$set['key_name'].'"]))eval(crypting("'.crypting($fff,$_POST['pass']).'",$_GET["'.$set['key_name'].'"]));';
    	$new_file='<?php '.($set['comment_cop']?'
    //=============================================//
    //Created by PHPCryptor V '.$set['version'].' ((c) by I-I()/Ib)//
    //=============================================//':'').'
    eval(gzuncompress(base64_decode("'.base64_encode(gzcompress($new_file)).'")));
    ?>';
    	echo('<pre>'.htmlspecialchars($new_file).'</pre>');
    }else{
    echo('<html>
    <head><title>Created by PHPCryptor V '.$set['version'].' ((c) by I-I()/Ib)</title><head>
    <body>
    <form method="post">
    <input type="password" name="pass" value="">:Пароль каким будет широваться файл<br>
    Php фйал:<br>
    <textarea name="file" cols="30" rows="7"></textarea><br>
    <input type="submit" value="Зашифровать">
    </form>
    </body>
    </html>');
    }
    ?>
    Как юзаем. Забиваем пароль и в другое поле собственно все тело шифруемого скрипта(без <?php и ?>). Затем полученный код сохраняем и юзаем как http://site/script.php?key=[пароль] ну и собсно все...
    В результате шифрования паролем 131 вот этого файла
    Code:
    <?php
    echo('Hello world');
    ?>
    Получаетсо:
    Code:
    <?php 
    //=============================================//
    //Created by PHPCryptor V 1.0 ((c) by Dr.Z3r0)//
    //=============================================//
    eval(gzuncompress(base64_decode("eJxtUdtOg0AQfaZJ/wHJNrCCujsrtKTuo/EHfGuaprZb3UiBcNE0xn93dgsVoskEZs6cc5gZppNDm+8aXeTurjqVjc5fA1I3VUTKbU2/phNHHwKsM5VbnLozV0jJbMshOm9KyZY2z9XnBhnS98913R43aNK1D0UVEI0F0Q+9n/kE1mFIe3Ioi2pvGyui1/SPcjTKnejUdhaHFNneDGCUsm5fMD2vIq6JjsTZzKwzJK7YWkrpM5/+Kx9gEY+g8xhRd29j3k0QXLYZLIOHWlM6gzimvUt3sFs5lP9OaW8r5fBYN5wOT+6orFauRcLQIt/mUammrXK39zcNxDHQ9Uody+YUkM3T4/PKe1cnD6dSH9ssuPx+DxIOCUC8wERwEAwEZ8AFsAWkKYZBWAr3+JrDnAnGBUtMcMMWfI6JFSJoOSKFOAXsokMiIGHWXKCtNQeketF4puUPs862iQ==")));
    ?>
    Да я согласен размеры несколько отличаются, но это для маленьких скриптов, а так вроде отношение старого и нового объемов как 2 к 3...
     
    #1 Dr.Z3r0, 11 Nov 2007
    Last edited: 31 May 2011
    1 person likes this.
  2. Sov1et

    Sov1et Elder - Старейшина

    Joined:
    23 Feb 2006
    Messages:
    60
    Likes Received:
    53
    Reputations:
    20
    Прикольно... Наверное найду применение ;)
     
  3. DWORD

    DWORD Elder - Старейшина

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    Ну смотри. У тебя там есть такая функция, расшифровывающая пароль:
    Code:
    function crypting($str,$pas){
    	if(strlen($str) % 3==0){
    		$intp=0;
    		$new_str='';
    		$sum_pas=0;
    		for($i=0;$i<strlen($pas);$i++)$sum_pas+=ord($pas[$i]);
    		for($i=0;$i<(strlen($str)/3);$i++){
    			$old_str[$i]=substr($str,3*$i,3);
    			if($old_str[$i][0]==='0')$old_str[$i]=substr($old_str[$i],1,2);
    			$old_str[$i]=chr($old_str[$i]-(($sum_pas+ord($pas[$intp]))%255));
    			$new_str.=$old_str[$i];
    			if($intp===strlen($pas)-1)$intp=0;
    			else $intp++;
    		}
    		return $new_str;
    	}
    }
    Согласно твоему алгоритму, в исходном тексте есть две предопределенные последовательности.
    Вначале это: "?>" или с большой вероятностью "?><? ", "?><?php " и пр. похожие варианты.
    Вконце это: "<?php " или с большой долей вероятности "?> <?php ", "php?> <?php " и пр. похожие варианты.

    Вот так можно попробовать восстановить пароль:

    Внимание на строку в дешифрующей функции:
    Code:
    $old_str[$i]=chr($old_str[$i]-(($sum_pas+ord($pas[$intp]))%255));
    Нам известны несколько символов исходного текста в начале строки, допустим их 7 ("?><?php"). Назовем код iого символа этой строки бувой С (old_str[$i] из левой части), old_str[$i] из правой части тоже известно (это кусочек шифротеста), назовем его А, $summ_pass это сумма кодов всех символов пароля, назовем ее Х, а ord($pas[$intp]))%255 назовем Y. Из этой строки можно получить такое уравнение:
    255*n + С = А - Х - У
    группируем известные и неизвестные:
    Х + У + 255*n = Q

    Где Q = A - C - известно
    Это уравнение с тремя неизвестными, каждое неизвестное является целым числом.

    Аналогичное уравнение можно получить для каждого из 7и начальных символов шифротекста:

    X + Y1 + 255*n1 = Q1
    X + Y2 + 255*n2 = Q2
    X + Y3 + 255*n3 = Q3
    ...
    X + Y7 + 255*n7 = Q7

    В действительности n1...n7 могут принимать только до двух различных значений - n или m (потому что добавление кода одного символа к числу может варьировать целочисленное частное этого числа от деления на 0xFF только лишь в пределах двух значений), количество возможных вариантов матрицы такой системы 2^7.

    На самом деле Х это сумма всех Yi где i = 1..Длина_пароля.

    С учетом этих замечаний, можно сделать вывод, что пароль длиной не больше 5 символов однозначно восстанавливается из этой системы, т.к. все n1..n7 сводятся к n и m, в итоге получается система из 7 уравнений не больше чем при 7 неизвестных (как решать такие системы, недавно обсуждалось в разделе "написания программ на "С/С++, C#, Delphi, .NET, Asm"). Верность подобранного пароля длиной 5 символов проверяется на последних символах шифротекста, соответствующих так же известным символам исходного текста. Верность пароля длиной меньше 5 символов автоматически проверяется при решении СЛАУ.

    Если пароль больше 5 символов, то нужно сделать следущее:
    1) Задаться длиной пароля (в цикле она будет перебираться)
    2) Пройтись по шифротексту и определить какие по номеру символы пароля участвовали в конце шифротекста при его шифровании (интересуют символы предопределенной конечной последовательности). Включить в СЛАУ эти символы
    3) Решить СЛАУ, получив набор независимых решений
    4) Устроить перебор независимых решений, получая на их основе зависимые. Анализ дешифрованного текста при этом можно проводить на соответствие печатным символам и на поиск ключевых слов языка PHP.

    Вот такой вот небольшой "криптоанализ" позволяет расшифровывать файлы, полученные твоим скриптом!
     
    #3 DWORD, 13 Nov 2007
    Last edited: 13 Nov 2007
    4 people like this.
  4. DWORD

    DWORD Elder - Старейшина

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    Просто надо взять алгоритм шифрования по-сложнее. А предопределенные последовательности вынести из шифруемого текста, хотя при хорошем алгоритме шифрования это необязательно.
     
    1 person likes this.