Advertisement
Guest User

Untitled

a guest
Aug 25th, 2018
331
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.53 KB | None | 0 0
  1. #include "opdumper.h"
  2. #include "php.h"
  3. #include "zend_execute.h"
  4.  
  5. static intptr_t handlers_base_address = 0;
  6.  
  7. void dump_oparray(FILE* fp, zend_op_array* oparray)
  8. {
  9. fwrite(&(oparray->type), sizeof(oparray->type), 1, fp);
  10. fwrite(&(oparray->arg_flags), sizeof(oparray->arg_flags[0]), 3, fp);
  11. fwrite(&(oparray->fn_flags), sizeof(oparray->fn_flags), 1, fp);
  12. dump_zend_string(fp, oparray->function_name);
  13. dump_class_entry(fp, oparray->scope);
  14. dump_zend_function(fp, oparray->prototype);
  15. fwrite(&(oparray->num_args), sizeof(oparray->num_args), 1, fp);
  16. fwrite(&(oparray->required_num_args), sizeof(oparray->required_num_args), 1, fp);
  17. dump_arg_info(fp, oparray->arg_info);
  18. fwrite(&(oparray->this_var), sizeof(oparray->this_var), 1, fp);
  19. fwrite(&(oparray->last), sizeof(oparray->last), 1, fp);
  20. dump_opcodes(fp, oparray->opcodes, oparray->last);
  21. fwrite(&(oparray->last_var), sizeof(oparray->last_var), 1, fp);
  22. fwrite(&(oparray->T), sizeof(oparray->T), 1, fp);
  23. dump_vars(fp, oparray->vars, oparray->last_var);
  24. fwrite(&(oparray->last_brk_cont), sizeof(oparray->last_brk_cont), 1, fp);
  25. fwrite(&(oparray->last_try_catch), sizeof(oparray->last_try_catch), 1, fp);
  26. dump_brk_cont_array(fp, oparray->brk_cont_array, oparray->last_brk_cont);
  27. dump_try_catch_array(fp, oparray->try_catch_array, oparray->last_try_catch);
  28. dump_hashtable(fp, oparray->static_variables);
  29. dump_zend_string(fp, oparray->filename);
  30. fwrite(&(oparray->line_start), sizeof(oparray->line_start), 1, fp);
  31. fwrite(&(oparray->line_end), sizeof(oparray->line_end), 1, fp);
  32. dump_zend_string(fp, oparray->doc_comment);
  33. fwrite(&(oparray->early_binding), sizeof(oparray->early_binding), 1, fp);
  34. fwrite(&(oparray->last_literal), sizeof(oparray->last_literal), 1, fp);
  35. dump_literals(fp, oparray->literals, oparray->last_literal);
  36. fwrite(&(oparray->cache_size), sizeof(oparray->cache_size), 1, fp);
  37. dump_runtime_cache(fp, oparray->run_time_cache, oparray->cache_size);
  38. }
  39.  
  40. void dump_opcodes(FILE* fp, zend_op* opcodes, uint32_t count)
  41. {
  42. uint32_t i;
  43.  
  44. fwrite(&(opcodes), sizeof(void*), 1, fp);
  45. for (i = 0; i < count; i++) {
  46. dump_zend_op(fp, opcodes[i]);
  47. }
  48. }
  49.  
  50. void dump_zend_op(FILE* fp, zend_op op)
  51. {
  52. intptr_t offset = handler_offset(op.handler);
  53.  
  54. size_t pos = ftell(fp);
  55. fwrite(&offset, sizeof(offset), 1, fp);
  56. dump_znode_op(fp, op.op1, op.op1_type);
  57. dump_znode_op(fp, op.op2, op.op2_type);
  58. dump_znode_op(fp, op.result, op.result_type);
  59. fwrite(&(op.extended_value), sizeof(op.extended_value), 1, fp);
  60. fwrite(&(op.lineno), sizeof(op.lineno), 1, fp);
  61. fwrite(&(op.opcode), sizeof(op.opcode), 1, fp);
  62. }
  63.  
  64. void dump_znode_op(FILE* fp, znode_op node, zend_uchar type)
  65. {
  66. fwrite(&type, sizeof(type), 1, fp);
  67. switch(type) {
  68. case IS_UNDEF:
  69. case IS_UNUSED:
  70. break;
  71. case IS_CONST:
  72. case IS_VAR:
  73. case IS_TMP_VAR:
  74. case IS_CV:
  75. case 36: // SPEC(RETVAL)
  76. fwrite(&(node.var), sizeof(node.var), 1, fp);
  77. break;
  78. default:
  79. php_printf("UNKNOWN TYPE => %d\n", type);
  80. }
  81. }
  82.  
  83. void dump_literals(FILE* fp, zval* literals, int count)
  84. {
  85. int i;
  86.  
  87. fwrite(&(literals), sizeof(void*), 1, fp);
  88. for (i = 0; i < count; i++) {
  89. dump_zval(fp, literals[i]);
  90. }
  91. }
  92.  
  93. void dump_zval(FILE* fp, zval val)
  94. {
  95. fwrite(&(val.u1), sizeof(val.u1), 1, fp);
  96. fwrite(&(val.u2), sizeof(val.u2), 1, fp);
  97. switch(Z_TYPE(val)) {
  98. case IS_NULL:
  99. case IS_TRUE:
  100. case IS_FALSE:
  101. break;
  102. case IS_LONG:
  103. fwrite(&(val.value.lval), sizeof(val.value.lval), 1, fp);
  104. break;
  105. case IS_DOUBLE:
  106. fwrite(&(val.value.dval), sizeof(val.value.dval), 1, fp);
  107. break;
  108. case IS_STRING:
  109. dump_zend_string(fp, val.value.str);
  110. break;
  111. default:
  112. php_printf("ZVAL type not implemented yet: %d\n.", Z_TYPE(val));
  113. }
  114. }
  115.  
  116. void dump_vars(FILE* fp, zend_string** vars, int count)
  117. {
  118. int i;
  119.  
  120. fwrite(&vars, sizeof(vars), 1, fp);
  121. for (i = 0; i < count; i++) {
  122. dump_zend_string(fp, vars[i]);
  123. }
  124. }
  125.  
  126. void dump_zend_string(FILE* fp, zend_string* str)
  127. {
  128. fwrite(&(str), sizeof(void*), 1, fp);
  129. if (str != NULL) {
  130. fwrite(&(str->len), sizeof(str->len), 1, fp);
  131. fwrite(str->val, sizeof(char), str->len, fp);
  132. }
  133. }
  134.  
  135. void dump_class_entry(FILE* fp, zend_class_entry* ce)
  136. {
  137. fwrite(&(ce), sizeof(void*), 1, fp);
  138. if (ce != NULL) {
  139. php_printf("NON-NULL class entry!");
  140. }
  141. }
  142.  
  143. void dump_zend_function(FILE* fp, zend_function* func)
  144. {
  145. fwrite(&(func), sizeof(void*), 1, fp);
  146. if (func != NULL) {
  147. php_printf("NON-NULL zend_function!\n");
  148. }
  149. }
  150.  
  151. void dump_arg_info(FILE* fp, zend_arg_info* info)
  152. {
  153. fwrite(&(info), sizeof(void*), 1, fp);
  154. if (info != NULL) {
  155. php_printf("NON-NULL zend_arg_info!\n");
  156. }
  157. }
  158.  
  159. void dump_brk_cont_array(FILE* fp, zend_brk_cont_element* array, int count)
  160. {
  161. int i;
  162.  
  163. fwrite(&(array), sizeof(void*), 1, fp);
  164. for (i = 0; i < count; i++) {
  165. dump_brk_cont_element(fp, array[i]);
  166. }
  167. }
  168.  
  169. void dump_brk_cont_element(FILE* fp, zend_brk_cont_element elem)
  170. {
  171. php_printf("dump_brk_cont_element NOT IMPLEMENTED yet.\n");
  172. }
  173.  
  174. void dump_try_catch_array(FILE* fp, zend_try_catch_element* array, int count)
  175. {
  176. int i;
  177.  
  178. fwrite(&(array), sizeof(void*), 1, fp);
  179. for (i = 0; i < count; i++) {
  180. dump_try_catch_element(fp, array[i]);
  181. }
  182. }
  183.  
  184. void dump_try_catch_element(FILE* fp, zend_try_catch_element elem)
  185. {
  186. php_printf("dump_try_catch_element NOT IMPLEMENTED yet.\n");
  187. }
  188.  
  189. void dump_hashtable(FILE* fp, HashTable* table)
  190. {
  191. fwrite(&(table), sizeof(void*), 1, fp);
  192. if (table != NULL) {
  193. php_printf("dump_hashtable NOT IMPLEMENTED yet.\n");
  194. }
  195. }
  196.  
  197. void dump_runtime_cache(FILE* fp, void** cache, int count)
  198. {
  199. fwrite(&(cache), sizeof(void*), 1, fp);
  200. if (cache != NULL) {
  201. php_printf("dump_runtime_cache NOT DONE: %d.\n", count);
  202. }
  203. }
  204.  
  205. intptr_t handler_offset(const void* handler)
  206. {
  207. const void* base_handler;
  208. zval str;
  209.  
  210. if (handlers_base_address == 0) {
  211. ZVAL_STRING(&str, "echo 1;");
  212. base_handler = zend_compile_string(&str, "")->opcodes[0].handler;
  213. handlers_base_address = (intptr_t)base_handler;
  214. }
  215.  
  216. return ((intptr_t)handler) - handlers_base_address;
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement