Xcache баг-трекер декомпилятора

Статус
В этой теме нельзя размещать новые ответы.
Небольшие обновления: Для просмотра ссылки Войди или Зарегистрируйся
1. Пофиксено определение try-catch, если они начинались с первого опкода в блоке
PHP:
function myfn() {
  try {
    print "a";
  } catch (Exception $e) {
        throw $e;
  }
}
[/spoil]
2. Строки практически полноценно заработали, остался баг с $c = $kk . $escape. $hex["{$h2}"]. $hex["{$h1}"]; (выводит $c = $hex["{$h2}"]. $hex["{$h1}"]; )
[spoil]
Исходник:
PHP:
<?php
 
$v = "{$a}";
$c = $d;
$c = $kk . $escape. $hex["{$h2}"]. $hex["{$h1}"];// . $hex["{$h1}"];
$r = "kk $q->e {$a->b} \n\ra{$v[0]}a\ta $b\0asd".$v."\$te\\st";
$r = "aaa ' bbb \' \\ \\\'";
 
?>
Результат:
PHP:
<?php
 
$v = "{$a}";
$c = $d;
$c = $hex["{$h1}"] . $hex["{$h1}"];
$r = "kk {$q->e} {$a->b} \n\ra{$v[0]}a\ta {$b}\000asd" . $v . "\$te\\st";
$r = "aaa ' bbb \' \\ \\\'";
 
?>
[/spoil]
3. Причина падения кода - рекурсия в Decomipler_Dim, нужно разбираться откуда она берется, временно поставил проверку с ассертом, чтобы не дамповал. upd. Исправлено.

[spoil]
PHP:
<?php
  function getPageInfo($z) {
    global $rubrics;
    // $v = 1;
    $rubrics[$p['q']]['w'];
  }
?>
 
прочекал 2
PHP:
<?php
$v = "{$a}";
$c = $d;
$c = $escape . $hex["{$h2}"] . $hex["{$h1}"];
$r = "{$a} \n\ra{$v}a\ta $b\0".$v."\$te\\st";
 
$v = "{$a}";
$c = $d;
$c = $kk . $escape. $hex["{$h2}"]. $hex["{$h1}"];// . $hex["{$h1}"];
$r = "kk $q->e {$a->b} \n\ra{$v[0]}a\ta $b\0asd".$v."\$te\\st";
$r = "aaa ' bbb \' \\ \\\'";
 
?>
Без имениййййй-1.jpg
 
\000 - правильно, это безопасная конструкция \0 (вдруг после нее будут цифры), глюк в 5.2 поправил Для просмотра ссылки Войди или Зарегистрируйся
и несколько упростил код
Для просмотра ссылки Войди или Зарегистрируйся

Но вообще FETCH_DIM_R нужно чинить, вот на таком коде тоже рекурсия:
PHP:
class a {
  function fn() {
    $a = 1;
    if ($q) {
      $c = $escape. $hex["{$h2}"]. $hex["{$h1}"];// . $hex["{$h1}"];
      }
  }
}
 
$escape все равно отсутствует на 3 строке примера, > 1 отоборажаются все
PHP:
$c = $escape .$escape .$escape .$escape .$escape .$escape .$kk . $hex["{$h2}"] . $hex["{$h1}"];
а так нет
$c = $escape . $hex["{$h2}"] . $hex["{$h1}"];
 
$escape все равно отсутствует на 3 строке примера, > 1 отоборажаются все
Да, я в курсе этой проблемы, пока не починил, хотя такая же строчка в другом скрипте корректно отображается. Нужно копать.

Последний апдейт на сегодня Для просмотра ссылки Войди или Зарегистрируйся, теперь работают:
PHP:
$c->{'aaa::aaa'.'bbb'}();
$c->{'aaa'.'bbb'} = 123;
 
со свтчами какойто лаг, проверил на 13 дате тоже самое
оригинал
PHP:
function _charset_count_bad($s)
{ //count "bad" symbols in russian, in windows-1251
  $r=0;
  for($i=0;$i<strlen($s);$i++)
  {
    switch($s[$i])
    {
      case 'ё':
      case 'Ё':
      case '«':
      case '»':
        break;
      default:
        $c=ord($s[$i]);
        if($c>=0x80&&$c<0xc0||$c<32)
          $r++;
    }
  }
  return $r;
}
[/spoil]
выход
[spoil]
PHP:
function _charset_count_bad($s)
{
    $r = 0;
    $i = 0;
 
    for (; $i < strlen($s); $i++) {
        switch ($s[$i]) {
        case "ё":
        case "Ё":
        case "«":
        case "»":
            break;
 
        default:
            $c = ord($s[$i]);
            if (((128 <= $c) && ($c < 192)) || ($c < 32)) {
                $r++;
            }
        }
 
        switch ($s[$i]) { /////// double :)
        } ////////
    }
 
    return $r;
}
буду еще смотреть лаги, если что буду дополнять
 
со свтчами какойто лаг, проверил на 13 дате тоже самое
Пофиксил в Для просмотра ссылки Войди или Зарегистрируйся
оригинал
PHP:
switch($q[1])
{
  case '1': print 1;
}
switch ($b[2]) {
  default: print "2";
}
switch ($a) {
  default: print 3;
}
switch (fn()) {
}
[/spoil]
выход
[spoil]
PHP:
switch ($q[1]) {
case "1":
        print(1);
}
switch ($b[2]) {
default:
        print("2");
}
switch (1) { // тут переменная вообще в опкоде не сохраняется как таковая (нет связи с операцией)
default:
        print(3);
}
switch (fn()) {
}
}
 
возможно и правильно, что свитч нельзя вешать на дефалт, т.к. переменная терятся только на нем, либо смотреть работу с дефолтами
PHP:
<?php
 
switch ($q) {
case "1":
        print(1);
}
switch ($q) {
case "2":
        print(1);
}
switch ($q) {
default:
        print(1);
}
 
?>
[/spoil]
выход тотже
[spoil]
PHP:
<?php
 
switch ($q) {
case "1":
        print(1);
}
 
switch ($q) {
case "2":
        print(1);
}
 
switch (1) {
default:
        print(1);
}
 
?>
[/spoil]
такой же работает
[spoil]
PHP:
<?php
 
switch ($q) {
case "1":
        print(1);
}
 
switch ($q) {
case "2":
        print(1);
}
 
switch ($q) {
case "3":
default:
        print(1);
}
?>
 
В zend_do_default_before_statement переменная вообще не сохраняется, т.е. переменную можно выдернуть только если был не пустой CASE (вызывалась zend_do_case_before_statement) или же создавалась переменная IS_VAR или IS_TMP_VAR (тогда можно выдернуть ее имя из ZEND_FREE или ZEND_SWITCH_FREE), но это уже небольшой хак.
 
В zend_do_default_before_statement переменная вообще не сохраняется, т.е. переменную можно выдернуть только если был не пустой CASE (вызывалась zend_do_case_before_statement) или же создавалась переменная IS_VAR или IS_TMP_VAR (тогда можно выдернуть ее имя из ZEND_FREE или ZEND_SWITCH_FREE), но это уже небольшой хак.
на VLD vars компилируются нормально с таким кодом
PHP:
switch($q[1])
{
  case '1': print 1;
}
switch ($b[2]) {
  default: print "2";
}
switch ($a) {
  default: print 3;
}
[/spoil]
ops
[spoil]filename: G:\VLD\sw.php
function name: (null)
number of ops: 20
compiled vars: !0 = $q, !1 = $b, !2 = $a
line # * op fetch ext return operands
--------------------------------------------------------------------------------
-
2 0 > FETCH_DIM_R $0 !0, 1
4 1 CASE ~1 $0, '1'

2 > JMPZ ~1, ->6

3 > PRINT ~2 1
4 FREE ~2
5 5 > JMP ->6
6 > SWITCH_FREE $0
6 7 FETCH_DIM_R $3 !1, 2
7 8 > JMP ->12
9 > PRINT ~4 '2'
10 FREE ~4
8 11 > JMP ->13
12 > > JMP ->9
13 > SWITCH_FREE $3
10 14 > JMP ->18
15 > PRINT ~5 3
16 FREE ~5
11 17 > JMP ->19
18 > > JMP ->15
13 19 > > RETURN 1


G:\VLD>
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху