Для просмотра скрытого содержимого вы должны войти или зарегистрироваться.
Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
Пофиксил обработку данной конструкции. На самом деле, там не столько баг обработки while (хотя эту обработку тоже патчить пришлось), сколько недоработка в логике recognizeAndDecompileClosedBlocks, из-за которой для данного примера некоректно определялся конец блока по ['jmpins'] (некоректно относительно практически идентичной по опкодам конструкции - if ($elem == '' && count($parts)) { } ).PHP:while ($elem == '' && count($parts)) { }
for ($i = $starti; $i <= $range[1]; ) {
if (!empty($opcodes[$i]['jmpins']) || !empty($opcodes[$i]['jmpouts'])) {
$blockFirst = $i;
for ($i = $starti; $i <= $range[1]; ) {
if ((!empty($opcodes[$i]['jmpins']) && $i > $starti) || !empty($opcodes[$i]['jmpouts'])) { // << строка 1176 (фиксим логику =) )
$blockFirst = $i;
&& $lastOp['opcode'] == XC_JMP && !empty($lastOp['jmpouts'])
&& $lastOp['jmpouts'][0] == $range[0]) {
$this->removeJmpInfo($EX, $firstJmp);
&& $lastOp['opcode'] == XC_JMP && !empty($lastOp['jmpouts'])
&& $lastOp['jmpouts'][0] < $range[0]) { // << строка 1115 (здесь достаточно зафиксировать переход по коду назад, а не вперед, как в конструкции if() )
$this->removeJmpInfo($EX, $firstJmp);
$rvalue = $container . "->" . unquoteVariableName($dim);
$rvalue = str($container) . "->" . unquoteVariableName($dim); // << строка 1697 (конструкции вида $controller->$prop; )
$rvalue = $container . '[' . str($dim) .']';
$rvalue = str($container) . '[' . str($dim) .']'; // << строка 1700 (конструкции вида $_SERVER['PHP_SELF'] )
Не туда. Сейчас засунуто ввнес в класс все патчи на на эту дату с подписями тех кто их делал, благодарю тех кто в этом участвует, в хайдах правок нет правки открытые
вот что у нас получилось на этот день
кстати dima2k почему то wile не сработал может я его не туда засунул,, внутри функции он попрежнеу не хочет работать а отдельно работает, IF работает в 2 случаях как отдельно так и внутри функций
// {{{ do/while
if ($lastOp['opcode'] == XC_JMPNZ && !empty($lastOp['jmpouts'])
&& $lastOp['jmpouts'][0] < $range[0]) { //dima2k fix
// {{{ while
if (isset($firstJmpOp)
&& $firstJmpOp['opcode'] == XC_JMPZ
&& $firstJmpOp['jmpouts'][0] > $range[1]
&& $lastOp['opcode'] == XC_JMP && !empty($lastOp['jmpouts'])
&& $lastOp['jmpouts'][0] < $range[0]) { //dima2k fix
// {{{ do/while
if ($lastOp['opcode'] == XC_JMPNZ && !empty($lastOp['jmpouts'])
&& $lastOp['jmpouts'][0] == $range[0]) {
function readMailboxParent($haystack, $needle) {
if ($needle == '') {
$ret = '';
} else {
$parts = explode($needle, $haystack);
$elem = array_pop($parts);
/////////////////////////////////////////////////////////////
while ($elem == '' && count($parts)) {
$elem = array_pop($parts);
}
$ret = join($needle, $parts);
}
return( $ret );
}
// {{{ do/while
if ($lastOp['opcode'] == XC_JMPNZ && !empty($lastOp['jmpouts'])
&& $lastOp['jmpouts'][0] == $range[0]) {
$this->removeJmpInfo($EX, $range[1]);
if(0){
echo 'false';
} else {
echo 'test';
if(1) {
echo 'true';
}
}
if (0) {
echo 'false';
}
else if (1) {
echo 'true';
}
$isElseIf = true;
// search for else if
$range[0] = $ifRange[1] + 1;
for ($i = $ifRange[1] + 1; $i <= $range[1]; ++$i) {
// find first jmpout
if (!empty($opcodes[$i]['jmpouts'])) {
if ($this->isIfCondition($EX, array($i, $range[1]))) {
$this->dasmBasicBlock($EX, array($range[0], $i));
$range[0] = $i;
}
break;
}
}
// search for else if
$range[0] = $ifRange[1] + 1;
for ($i = $ifRange[1] + 1; $i <= $range[1]; ++$i) {
$this->dasmBasicBlock($EX, array($i, $i));
if (isset($EX['opcodes'][$i]['php'])) break;
$isElseIf = true;
// find first jmpout
if (!empty($opcodes[$i]['jmpouts'])) {
if ($this->isIfCondition($EX, array($i, $range[1]))) {
$this->dasmBasicBlock($EX, array($range[0], $i));
$range[0] = $i;
}
break;
}
}
$this->error .= "\n" . $this->backends[$bnum]->error; //тут не отображается все с this, только .= 'error'
else if (isset($this->binops[$opc])) { // {{{
$this->usedOps[$opc] = true;
$op1val = $this->getOpVal($op1, $EX);
$op2val = $this->getOpVal($op2, $EX);
$rvalue = new Decompiler_Binop($this, $op1val, $opc, $op2val);
$resvar = $rvalue;
// }}}
}
else if (isset($this->binops[$opc])) { // {{{
$this->usedOps[$opc] = true;
$op1val = $this->getOpVal($op1, $EX);
$op2val = $this->getOpVal($op2, $EX);
if (!isset($op1val)) {
$op1val = '$this';
}
if ($opcodes[$i+1]['opcode'] == XC_OP_DATA) {
++ $i;
if ($opcodes[$i]['op2']['op_type'] == 4) {
$lvalue = str($op1val) . '[' . str($op2val) .']';
}
else {
$lvalue = str($op1val) . "->" . unquoteVariableName($op2val);
}
$rvalue = $this->getOpVal($opcodes[$i]['op1'], $EX);
$op1val = $lvalue;
$op2val = $rvalue;
}
$rvalue = new Decompiler_Binop($this, $op1val, $opc, $op2val);
$resvar = $rvalue;
// }}}
}
<?php
function error($code)
{
echo 'LICENSE ERROR: ' . "\n";
switch ($code) {
case KC_NO_KEY:
exit('Specified key file not found: ' . $this->keyFile);
break;
case KC_NO_KEY:
exit('Format of specified key file is incorrect.');
break;
case KC_NO_KEY:
exit('Incorrect signature of key file.');
break;
case KC_NO_KEY:
exit('Key expired: expiration date = ' . date('Y-m-d H:i:s', $this->key['until']) . '.');
break;
case KC_NO_KEY:
exit('Incorrect system partitions, check linux distributive.');
break;
default:
exit('Unknown error.');
break;
}
}
?>
class Engine {
var $config;
var $db;
var $settings;
var $lang;
var $smarty;
var $page;
var $user;
var $rubrics;
var $templates;
//////////////////
class Engine
{
public $config;
public $db;
public $settings;
public $lang;
public $smarty;
public $page;
public $user;
<?php
class Engine {
function getPageInfo(&$page) {
global $rubrics; ////////// тут
if (isset($rubrics[$page["position"]][$page["id_category"]]["categories"])) {
$page["categories"]=$rubrics[$page["position"]][$page["id_category"]]["categories"];
} else {
$page["categories"]=0;
}
if (isset($rubrics[$page["position"]][$page["id_category"]]["level"])) {
$page["level"]=$rubrics[$page["position"]][$page["id_category"]]["level"];
}
return true;
}
}
?>
Их есть у нас вот пример обработки конструкций CASE, как я понял числа пишутся без кавычек, а слова в кавычках, но из под бинарника Зенда обрабатывается без кавычек 1 значение, в остальных значенях CASE ошибка ОФсета (бинарный файл архива 1 поста 53.php )
if ($caseOp['opcode'] == XC_CASE) {
echo 'case ';
echo str($this->getOpVal($caseOp['op2'], $EX), $EX);
echo ':', PHP_EOL;
if ($caseOp['opcode'] == XC_CASE) {
if ($opcodes[$caseFirst - 1]["opcode"] == XC_FETCH_CONSTANT) {
if ($opcodes[$caseFirst - 1]['op1']['op_type'] == XC_IS_UNUSED) {
$resvar = $this->stripNamespace($opcodes[$caseFirst - 1]['op2']['constant']);
}
else if ($opcodes[$caseFirst - 1]['op1']['op_type'] == XC_IS_CONST) {
$resvar = $this->stripNamespace($opcodes[$caseFirst - 1]['op1']['constant']);
}
else {
$resvar = $this->getOpVal($opcodes[$caseFirst - 1]['op1'], $EX);
}
}
else {
$resvar = $this->getOpVal($caseOp['op2'], $EX);
}
echo 'case ';
echo str($resvar, $EX);
echo ':', PHP_EOL;