12345下一页
返回列表 发新帖
查看: 732|回复: 46

魔方加密解密测试调试方法

[复制链接]

196

热度

29

元宝

341

贡献

终身ViP

发表于 2018-3-15 13:45:26 | 显示全部楼层 |阅读模式
魔方加密解密测试
调试方法可见文档内注释。
  1. <?php

  2. define("DEBUG", "vv");

  3. /**
  4. * # DEBUG 调试说明
  5. *
  6. * ## 基础设置:
  7. *     DEBUG 设置为v输出eval的指令,vv输出全部虚拟机指令,vvv输出更多扩展信息
  8. *
  9. * ## DEBUG 日志代码缩写对应表
  10. *     s2p String to Pointer, 字符串转指针
  11. *     push 压入堆栈
  12. *     pop 出栈
  13. *     mov 赋值
  14. *     eval执行代码
  15. *
  16. * # 日志格式对应意义
  17. *     $src_index           $method         $code
  18. *     当前代码执行位置     方法缩写        相关信息
  19. *
  20. */

  21. // Discuz 内部模拟
  22. // define("IN_DISCUZ", true);
  23. // define("IN_ADMINCP", true);
  24. // define("DISCUZ_ROOT", 'C:\Users\computer\PhpstormProjects\untitled');
复制代码
  1. <?php
  2. define("DEBUG", "vv");
  3. /**
  4. * # DEBUG 调试说明
  5. *
  6. * ## 基础设置:
  7. *     DEBUG 设置为v输出eval的指令,vv输出全部虚拟机指令,vvv输出更多扩展信息
  8. *
  9. * ## DEBUG 日志代码缩写对应表
  10. *     s2p String to Pointer, 字符串转指针
  11. *     push 压入堆栈
  12. *     pop 出栈
  13. *     mov 赋值
  14. *     eval执行代码
  15. *
  16. * # 日志格式对应意义
  17. *     $src_index           $method         $code
  18. *     当前代码执行位置     方法缩写        相关信息
  19. *
  20. */
  21. // Discuz 内部模拟
  22. // define("IN_DISCUZ", true);
  23. // define("IN_ADMINCP", true);
  24. // define("DISCUZ_ROOT", 'C:\Users\computer\PhpstormProjects\untitled');
  25. /**
  26. * @param $obj object
  27. * @return array
  28. */
  29. function object_to_array($obj)
  30. {
  31.     $obj = (array)$obj;
  32.     foreach ($obj as $k => $v) {
  33.         if (gettype($v) == 'object' || gettype($v) == 'array') {
  34.             $obj[$k] = (array)object_to_array($v);
  35.         }
  36.     }
  37.     return $obj;
  38. }
  39. $var_dict = object_to_array(json_decode('{"$_var_0": "JLWMyIuD", "$file_namespace": "JLWMyJ/D", "$_var_2": "JLWMyJPw", "$file_ns_index": "JLWMyNag", "$_var_4": "JLWMyLfF", "$src_index": "JLWMyLTk", "$encoded_src": "JLWMyOmV", "$tmp": "JLWMyOSx", "$plain_src": "JLWMyPz6", "s_eval(": "ZXZhbCg="}'));
  40. foreach ($var_dict as $var_key => $var_value) {
  41.     $var_dict[$var_key] = base64_decode($var_value);
  42. }
  43. function s_eval($code)
  44. {
  45.     global $var_dict;
  46.     /** @noinspection PhpUnusedLocalVariableInspection */
  47.     global $_var_0, $file_namespace, $_var_2, $file_ns_index, $_var_4, $src_index, $encoded_src, $tmp, $plain_src;
  48.     foreach ($var_dict as $var_key => $var_value) {
  49.         if (strpos($code, $var_value) === false) {
  50.             continue;
  51.         } else {
  52.             $code = str_replace($var_value, $var_key, $code);
  53.         }
  54.     }
  55.     write_log_line('eval', $code);
  56.     dump_vminfo();
  57.     dump_memory();
  58.     $eval_result = eval($code);
  59.     dump_vminfo();
  60.     dump_memory();
  61.     return $eval_result;
  62. }
  63. function write_log_line($method, $code)
  64. {
  65.     if (!defined('DEBUG') || substr_count(DEBUG, 'v') < 1) return;
  66.     if ($method != 'eval' && substr_count(DEBUG, 'v') < 2) return;
  67.     global $src_index;
  68.     print(sprintf('0x%08s', dechex($src_index)) . "\t$method\t $code \r\n");
  69.     return;
  70. }
  71. function dump_memory()
  72. {
  73.     if (!defined('DEBUG') || substr_count(DEBUG, 'v') < 3) return;
  74.     global $file_namespace, $file_ns_index;
  75.     for ($i = 0; $i <= $file_ns_index; $i++)
  76.         echo "  \$file_namespace[$i]: $file_namespace[$i]\n";
  77.     return;
  78. }
  79. function dump_vminfo()
  80. {
  81.     if (!defined('DEBUG') || substr_count(DEBUG, 'v') < 3) return;
  82.     global $file_ns_index, $src_index;
  83.     echo "  \$file_ns_index:$file_ns_index\t\$src_index:$src_index" . sprintf('0x%08s', dechex($src_index)) . "\r\n";
  84.     return;
  85. }
  86. if (isset($_var_0)) {
  87.     array_push($_var_0, $file_namespace, $_var_2, $file_ns_index, $_var_4, $src_index);
  88. } else {
  89.     $_var_0 = array();
  90. }
  91. static $encoded_src = null;
  92. if (empty($encoded_src)) {
  93.     $encoded_src = file_get_contents('pec.vmc');
  94. }
  95. $file_namespace = array(__FILE__);
  96. $_var_2 = array(0);
  97. $file_ns_index = $_var_4 = $src_index = 0;
  98. $tmp = $plain_src = null;
  99. try {
  100.     while (1) {
  101.         while ($src_index >= 0) {
  102.             $plain_src = $encoded_src[$src_index++];
  103.             switch ($plain_src ^ $encoded_src[$src_index++]) {
  104.                 case '1':
  105.                     $tmp = (int)(($plain_src ^ $encoded_src[$src_index]) . ($plain_src ^ $encoded_src[$src_index + 1]));
  106.                     $src_index += 2;
  107.                     break;
  108.                 case '2':
  109.                     $tmp = (int)(($plain_src ^ $encoded_src[$src_index]) . ($plain_src ^ $encoded_src[$src_index + 1]) . ($plain_src ^ $encoded_src[$src_index + 2]) . ($plain_src ^ $encoded_src[$src_index + 3]));
  110.                     $src_index += 4;
  111.                     break;
  112.                 case '3':
  113.                     $tmp = (int)(($plain_src ^ $encoded_src[$src_index]) . ($plain_src ^ $encoded_src[$src_index + 1]) . ($plain_src ^ $encoded_src[$src_index + 2]) . ($plain_src ^ $encoded_src[$src_index + 3]) . ($plain_src ^ $encoded_src[$src_index + 4]) . ($plain_src ^ $encoded_src[$src_index + 5]) . ($plain_src ^ $encoded_src[$src_index + 6]) . ($plain_src ^ $encoded_src[$src_index + 7]) . ($plain_src ^ $encoded_src[$src_index + 8]) . ($plain_src ^ $encoded_src[$src_index + 9]));
  114.                     $src_index += 10;
  115.                     break;
  116.                 case 'a':
  117.                     write_log_line('pop', "$file_ns_index: $file_namespace[$file_ns_index]");
  118.                     unset($file_namespace[$file_ns_index--]);
  119.                     dump_memory();
  120.                     continue 2;
  121.                 case 'b':
  122.                     //花指令
  123.                     $plain_src = null;
  124.                     continue 2;
  125.                 case 'c':
  126.                     write_log_line('push', 'null');
  127.                     $file_namespace[++$file_ns_index] = null;
  128.                     dump_memory();
  129.                     continue 2;
  130.                 case 'd':
  131.                     if (is_scalar($file_namespace[$file_ns_index - 1])) {
  132.                         $plain_src = $file_namespace[$file_ns_index - 1];
  133.                         unset($file_namespace[$file_ns_index - 1]);
  134.                         $file_namespace[$file_ns_index - 1] = $plain_src[$file_namespace[$file_ns_index]];
  135.                     } else {
  136.                         if (!is_array($file_namespace[$file_ns_index - 1])) {
  137.                             $file_namespace[$file_ns_index - 1] = array();
  138.                         }
  139.                         $plain_src =& $file_namespace[$file_ns_index - 1][$file_namespace[$file_ns_index]];
  140.                         unset($file_namespace[$file_ns_index - 1]);
  141.                         $file_namespace[$file_ns_index - 1] =& $plain_src;
  142.                         unset($plain_src);
  143.                     }
  144.                     continue 2;
  145.                 case 'e':
  146.                     //s2p String to Pointer, 字符串转指针
  147.                     write_log_line('s2p', "\$file_namespace[$file_ns_index]");
  148.                     switch ($file_namespace[$file_ns_index]) {
  149.                         case 'this':
  150.                             $file_namespace[$file_ns_index] =& $this;
  151.                             break;
  152.                         case 'GLOBALS':
  153.                             $file_namespace[$file_ns_index] =& $GLOBALS;
  154.                             break;
  155.                         case '_SERVER':
  156.                             $file_namespace[$file_ns_index] =& $_SERVER;
  157.                             break;
  158.                         case '_GET':
  159.                             $file_namespace[$file_ns_index] =& $_GET;
  160.                             break;
  161.                         case '_POST':
  162.                             $file_namespace[$file_ns_index] =& $_POST;
  163.                             break;
  164.                         case '_FILES':
  165.                             $file_namespace[$file_ns_index] =& $_FILES;
  166.                             break;
  167.                         case '_COOKIE':
  168.                             $file_namespace[$file_ns_index] =& $_COOKIE;
  169.                             break;
  170.                         case '_SESSION':
  171.                             $file_namespace[$file_ns_index] =& $_SESSION;
  172.                             break;
  173.                         case '_REQUEST':
  174.                             $file_namespace[$file_ns_index] =& $_REQUEST;
  175.                             break;
  176.                         case '_ENV':
  177.                             $file_namespace[$file_ns_index] =& $_ENV;
  178.                             break;
  179.                         default:
  180.                             $file_namespace[$file_ns_index] =& ${$file_namespace[$file_ns_index]};
  181.                     }
  182.                     dump_memory();
  183.                     continue 2;
  184.                 case 'f':
  185.                     $tmp = $plain_src ^ $encoded_src[$src_index++];
  186.                     if ($tmp == 'd') {
  187.                         $tmp = (int)(($plain_src ^ $encoded_src[$src_index]) . ($plain_src ^ $encoded_src[$src_index + 1]));
  188.                         $src_index += 2;
  189.                     } elseif ($tmp == 'q') {
  190.                         $tmp = (int)(($plain_src ^ $encoded_src[$src_index]) . ($plain_src ^ $encoded_src[$src_index + 1]) . ($plain_src ^ $encoded_src[$src_index + 2]) . ($plain_src ^ $encoded_src[$src_index + 3]));
  191.                         $src_index += 4;
  192.                     } elseif ($tmp == 'x') {
  193.                         $tmp = (int)(($plain_src ^ $encoded_src[$src_index]) . ($plain_src ^ $encoded_src[$src_index + 1]) . ($plain_src ^ $encoded_src[$src_index + 2]) . ($plain_src ^ $encoded_src[$src_index + 3]) . ($plain_src ^ $encoded_src[$src_index + 4]) . ($plain_src ^ $encoded_src[$src_index + 5]) . ($plain_src ^ $encoded_src[$src_index + 6]) . ($plain_src ^ $encoded_src[$src_index + 7]) . ($plain_src ^ $encoded_src[$src_index + 8]) . ($plain_src ^ $encoded_src[$src_index + 9]));
  194.                         $src_index += 10;
  195.                     } else {
  196.                         break 2;
  197.                     }
  198.                     $file_namespace[++$file_ns_index] = '';
  199.                     while ($tmp-- > 0) {
  200.                         $file_namespace[$file_ns_index] .= $plain_src ^ $encoded_src[$src_index++];
  201.                     }
  202.                     write_log_line('mov', "\$file_namespace[$file_ns_index], $file_namespace[$file_ns_index]");
  203.                     dump_memory();
  204.                     continue 2;
  205.                 default:
  206.                     break 2;
  207.             }
  208.             while ($tmp-- > 0) {
  209.                 $plain_src .= $plain_src[0] ^ $encoded_src[$src_index++];
  210.             }
  211.             s_eval(substr($plain_src, 1));
  212.         }
  213.         if ($src_index == -1) {
  214.             break;
  215.         } elseif ($src_index == -2) {
  216.             s_eval($_var_2[$_var_4 - 1]);
  217.             $src_index = $_var_2[$_var_4];
  218.             $_var_4 -= 2;
  219.         } else {
  220.             exit('KIVIUQ VIRTUAL MACHINE ERROR : Access violation at address ' . ($src_index < 0 ? $src_index : sprintf('%08X', $src_index)));
  221.         }
  222.     }
  223. } catch (Exception $plain_src) {
  224.     if (!empty($_var_0)) {
  225.         $src_index = array_pop($_var_0);
  226.         $_var_4 = array_pop($_var_0);
  227.         $file_ns_index = array_pop($_var_0);
  228.         $_var_2 = array_pop($_var_0);
  229.         $file_namespace = array_pop($_var_0);
  230.     }
  231.     /** @noinspection PhpUnhandledExceptionInspection */
  232.     throw $plain_src;
  233. }
  234. if (!empty($_var_0)) {
  235.     $src_index = array_pop($_var_0);
  236.     $_var_4 = array_pop($_var_0);
  237.     $file_ns_index = array_pop($_var_0);
  238.     $_var_2 = array_pop($_var_0);
  239.     $file_namespace = array_pop($_var_0);
  240. }
复制代码
附件下载:
游客,如果您要查看本帖隐藏内容请回复

686

热度

1444

元宝

538

贡献

银牌草根

发表于 2018-3-16 02:40:55 | 显示全部楼层
RE: 魔方加密解密测试调试方法 [修改]

701

热度

2153

元宝

267

贡献

步入草根

发表于 2018-3-16 20:56:34 | 显示全部楼层
看看学习下,谢谢分享

656

热度

2610

元宝

165

贡献

步入草根

发表于 2018-3-16 21:03:31 | 显示全部楼层
看一看啊

607

热度

1860

元宝

68

贡献

终身ViP

发表于 2018-3-17 23:28:03 | 显示全部楼层
学习学习啦!

21

热度

82

元宝

2

贡献

步入草根

发表于 2018-3-20 22:24:05 | 显示全部楼层
好东西哦

814

热度

2476

元宝

69

贡献

步入草根

发表于 2018-3-21 09:24:51 | 显示全部楼层
RE: 魔方加密解密测试调试方法

4

热度

11

元宝

8

贡献

步入草根

发表于 2018-3-25 05:31:44 | 显示全部楼层
魔方加密解密测试调试方法

4

热度

11

元宝

8

贡献

步入草根

发表于 2018-3-25 05:34:52 | 显示全部楼层
模板插件安装服务看看学习下,谢谢分享

272

热度

1564

元宝

116

贡献

终身ViP

发表于 2018-4-14 16:03:47 | 显示全部楼层
啥附件呀,看看
下一页 »
12345下一页
返回列表 发新帖
 懒得打字嘛,点击右侧快捷回复【最新发布】   【赞助草根吧享更多权益】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

收藏帖子 返回列表 搜索

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

小黑屋|手机版|草根吧