source: trunk/disassembler.c @ 749

Last change on this file since 749 was 749, checked in by moo, 4 years ago

decompiler: massive improvements for php 5 and 5.3

  • Property svn:eol-style set to native
File size: 4.6 KB
Line 
1#include "disassembler.h"
2#include "xcache.h"
3#include "utils.h"
4#include "processor.h"
5
6#define return_value dst
7
8/* sandbox {{{ */
9#undef TG
10#undef OG
11#define TG(x) (sandbox->tmp_##x)
12#define OG(x) (sandbox->orig_##x)
13/* }}} */
14
15#ifndef HAVE_XCACHE_OPCODE_SPEC_DEF
16#error disassembler cannot be built without xcache/opcode_spec_def.h
17#endif
18static void xc_dasm(xc_sandbox_t *sandbox, zval *dst, zend_op_array *op_array TSRMLS_DC) /* {{{ */
19{
20    Bucket *b;
21    zval *zv, *list;
22    xc_compile_result_t cr;
23    int bufsize = 2;
24    char *buf;
25
26    xc_compile_result_init_cur(&cr, op_array TSRMLS_CC);
27
28    xc_apply_op_array(&cr, (apply_func_t) xc_undo_pass_two TSRMLS_CC);
29    xc_apply_op_array(&cr, (apply_func_t) xc_fix_opcode TSRMLS_CC);
30
31    /* go */
32    array_init(dst);
33
34    ALLOC_INIT_ZVAL(zv);
35    array_init(zv);
36    xc_dasm_zend_op_array(zv, op_array TSRMLS_CC);
37    add_assoc_zval_ex(dst, ZEND_STRS("op_array"), zv);
38
39    buf = emalloc(bufsize);
40
41    ALLOC_INIT_ZVAL(list);
42    array_init(list);
43    b = TG(internal_function_tail) ? TG(internal_function_tail)->pListNext : TG(function_table).pListHead;
44    for (; b; b = b->pListNext) {
45        int keysize, keyLength;
46
47        ALLOC_INIT_ZVAL(zv);
48        array_init(zv);
49        xc_dasm_zend_function(zv, b->pData TSRMLS_CC);
50
51        keysize = BUCKET_KEY_SIZE(b) + 2;
52        if (keysize > bufsize) {
53            do {
54                bufsize *= 2;
55            } while (keysize > bufsize);
56            buf = erealloc(buf, bufsize);
57        }
58        memcpy(buf, BUCKET_KEY_S(b), keysize);
59        buf[keysize - 2] = buf[keysize - 1] = ""[0];
60        keyLength = b->nKeyLength;
61#ifdef IS_UNICODE
62        if (BUCKET_KEY_TYPE(b) == IS_UNICODE) {
63            if (buf[0] == ""[0] && buf[1] == ""[0]) {
64                keyLength ++;
65            }
66        } else
67#endif
68        {
69            if (buf[0] == ""[0]) {
70                keyLength ++;
71            }
72        }
73
74        add_u_assoc_zval_ex(list, BUCKET_KEY_TYPE(b), ZSTR(buf), keyLength, zv);
75    }
76    add_assoc_zval_ex(dst, ZEND_STRS("function_table"), list);
77   
78    ALLOC_INIT_ZVAL(list);
79    array_init(list);
80    b = TG(internal_class_tail) ? TG(internal_class_tail)->pListNext : TG(class_table).pListHead;
81    for (; b; b = b->pListNext) {
82        int keysize, keyLength;
83
84        ALLOC_INIT_ZVAL(zv);
85        array_init(zv);
86        xc_dasm_zend_class_entry(zv, CestToCePtr(*(xc_cest_t *)b->pData) TSRMLS_CC);
87
88        keysize = BUCKET_KEY_SIZE(b) + 2;
89        if (keysize > bufsize) {
90            do {
91                bufsize *= 2;
92            } while (keysize > bufsize);
93            buf = erealloc(buf, bufsize);
94        }
95        memcpy(buf, BUCKET_KEY_S(b), keysize);
96        buf[keysize - 2] = buf[keysize - 1] = ""[0];
97        keyLength = b->nKeyLength;
98#ifdef IS_UNICODE
99        if (BUCKET_KEY_TYPE(b) == IS_UNICODE) {
100            if (buf[0] == ""[0] && buf[1] == ""[0]) {
101                keyLength ++;
102            }
103        } else
104#endif
105        {
106            if (buf[0] == ""[0]) {
107                keyLength ++;
108            }
109        }
110        add_u_assoc_zval_ex(list, BUCKET_KEY_TYPE(b), ZSTR(buf), keyLength, zv);
111    }
112    efree(buf);
113    add_assoc_zval_ex(dst, ZEND_STRS("class_table"), list);
114
115    /*xc_apply_op_array(&cr, (apply_func_t) xc_redo_pass_two TSRMLS_CC);*/
116    xc_compile_result_free(&cr);
117
118    return;
119}
120/* }}} */
121void xc_dasm_string(zval *dst, zval *source TSRMLS_DC) /* {{{ */
122{
123    int catched;
124    zend_op_array *op_array = NULL;
125    xc_sandbox_t sandbox;
126    char *eval_name = zend_make_compiled_string_description("runtime-created function" TSRMLS_CC);
127
128    xc_sandbox_init(&sandbox, eval_name TSRMLS_CC);
129
130    catched = 0;
131    zend_try {
132        op_array = compile_string(source, eval_name TSRMLS_CC);
133    } zend_catch {
134        catched = 1;
135    } zend_end_try();
136
137    if (catched || !op_array) {
138        goto err_compile;
139    }
140
141    xc_dasm(&sandbox, dst, op_array TSRMLS_CC);
142
143    /* free */
144    efree(eval_name);
145#ifdef ZEND_ENGINE_2
146    destroy_op_array(op_array TSRMLS_CC);
147#else
148    destroy_op_array(op_array);
149#endif
150    efree(op_array);
151    xc_sandbox_free(&sandbox, 0 TSRMLS_CC);
152    return;
153
154err_compile:
155    efree(eval_name);
156    xc_sandbox_free(&sandbox, 0 TSRMLS_CC);
157
158    RETURN_FALSE;
159}
160/* }}} */
161void xc_dasm_file(zval *dst, const char *filename TSRMLS_DC) /* {{{ */
162{
163    int catched;
164    zend_op_array *op_array = NULL;
165    xc_sandbox_t sandbox;
166    zval *zfilename;
167
168    MAKE_STD_ZVAL(zfilename);
169    zfilename->value.str.val = estrdup(filename);
170    zfilename->value.str.len = strlen(filename);
171    zfilename->type = IS_STRING;
172
173    xc_sandbox_init(&sandbox, zfilename->value.str.val TSRMLS_CC);
174
175    catched = 0;
176    zend_try {
177        op_array = compile_filename(ZEND_REQUIRE, zfilename TSRMLS_CC);
178    } zend_catch {
179        catched = 1;
180    } zend_end_try();
181
182    if (catched || !op_array) {
183        goto err_compile;
184    }
185
186    xc_dasm(&sandbox, dst, op_array TSRMLS_CC);
187
188    /* free */
189#ifdef ZEND_ENGINE_2
190    destroy_op_array(op_array TSRMLS_CC);
191#else
192    destroy_op_array(op_array);
193#endif
194    efree(op_array);
195    xc_sandbox_free(&sandbox, 0 TSRMLS_CC);
196    zval_dtor(zfilename);
197    FREE_ZVAL(zfilename);
198    return;
199
200err_compile:
201    xc_sandbox_free(&sandbox, 0 TSRMLS_CC);
202
203    zval_dtor(zfilename);
204    FREE_ZVAL(zfilename);
205    RETURN_FALSE;
206}
207/* }}} */
Note: See TracBrowser for help on using the repository browser.