У меня есть некоторый код PHP, который я расшифровываю (де-обфускацирует) в течение 2 часов. Я, наконец, преобразовал его обратно в читаемый код, но у меня все еще есть некоторые проблемы с пониманием алгоритма, используемого здесь, из-за недостатка знаний о некоторых вещах в коде ниже.
<?php
$posted = isset($_POST['posted']) ? $_POST['posted'] : (isset($_COOKIE['posted']) ? $_COOKIE['posted'] : NULL);
if ($posted!==NULL) {
$posted= md5($posted) . substr(md5(strrev($posted)), 0, strlen($posted));
for ($counter=0; $counter < 15324; $counter++) {
$idk[$counter] = chr((ord($idk[$counter]) - ord($posted[$counter])) % 256);
$posted.=$idk[$counter];
}
if($idk = @gzinflate($idk)) {
if (isset($_POST['posted']))
@setcookie('posted', $_POST['posted']);
$counter = create_function('', $idk);
unset($idk, $posted);
$counter();
}
}
$idk
переменная уже является значением, которое содержит длинную строку, которая декодируется в base64.
Я понимаю почти весь код, но я не понимаю, что % 256
здесь, а также я не знаю, что gzinflate()
делает.
Так, gzinflate()
распаковывает входные данные, которые сжимаются zlib DEFLATE
алгоритм. Соответствующая функция компресс или же выкачивать несжатая строка называется gzdeflate()
, и эта страница руководства содержит немного больше информации:
Эта функция сжимает данную строку, используя формат данных DEFLATE.
Подробнее об алгоритме сжатия DEFLATE смотрите в документе «DEFLATE Спецификация формата сжатых данных версия 1.3«(RFC 1951). Сохраняя несколько деталей, это похоже на сжатие файла с использованием
gzip myfile.txt
в командной строке Linux, которая создаст сжатый файлmyfile.txt.gz
, Короче говоря, это распаковка сжатых данных, назначенных$idk
,
$variable % 256
возвращает остаток от деления $variable
от 256
, Если я установлю $variable
в 258
, $variable % 256
было бы 2
, Это часто используется, когда вы хотите увидеть, является ли число чисто делимым на другое число. Если бы я хотел показать обновление состояния каждый 100
времена цикла, например, я мог бы сделать:
<?php
for ($i = 1; $i <= 1000; ++$i)
{
// Do something on each loop.
if (($i % 100) == 0)
{
echo sprintf("Loop %d of 1000; %d percent complete.\n", $i, $i / 1000 * 100);
}
}
Но, очевидно, есть много других применений.
Чтобы помочь вам выяснить, что именно делает этот исходный код, я бы рекомендовал пройтись по нему шаг за шагом с реальным вводом и посмотреть, что происходит после каждого шага. Мне будет трудно понять гораздо больше о том, что он делает, без большого контекста.
Других решений пока нет …