青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

使用PHP Embed SAPI實現Opcodes查看器

http://www.laruence.com/2008/09/23/539.html

 

PHP提供了一個Embed SAPI,也就是說,PHP容許你在C/C++語言中調用PHP/ZE提供的函數。本文就通過基于Embed SAPI實現一個PHP的opcodes查看器。
首先,下載PHP源碼以供編譯, 我現在使用的是PHP5.3 alpha2
進入源碼目錄:

  1. ./configure --enable-embed --with-config-file-scan-dir=/etc/php.d --with-mysql --with-config-file-path=/etc/
  2. ./make
  3. ./make instal

最后,記得要將生成的libphp5.so復制到運行時庫的目錄,我直接拷貝到了/lib/, 否則會在運行你自己的embed程序的時候報錯:

  1. ./embed: error while loading shared libraries: libphp5.so: cannot open shared object file: No such file or director

如果你對PHP的SAPI還不熟悉的話,我建議你看看我的這篇文章:深入理解Zend SAPIs(Zend SAPI Internals)
這個時候,你就可以在你的C代碼中,嵌入PHP腳本解析器了, 我的例子:

  1. #include "sapi/embed/php_embed.h"
  2.  
  3. int main(int argc, char * argv[]){
  4.     PHP_EMBED_START_BLOCK(argc,argv);
  5.     char * script = " print 'Hello World!';";
  6.     zend_eval_string(script, NULL,
  7.                                       "Simple Hello World App" TSRMLS_CC);
  8.     PHP_EMBED_END_BLOCK();
  9.     return 0;
  10. }
  11.  

然后就是要指明include path了,一個簡單的Makefile

  1. CC = gcc
  2. CFLAGS = -I/usr/local/include/php/ \
  3.             -I/usr/local/include/php/main \
  4.             -I/usr/local/include/php/Zend \
  5.             -I/usr/local/include/php/TSRM \
  6.             -Wall -g
  7. LDFLAGS = -lstdc++ -L/usr/local/lib -lphp5
  8. ALL:
  9.     $(CC) -o embed embed.cpp $(CFLAGS) $(LDFLAGS

編譯成功以后, 運行,我們可以看到, stdout輸出 Hello World!

基于這個,我們就可以很容易的實現一個類似于vld的Opcodes dumper:
首先我們定義opcode的轉換函數(全部的opcodes可以查看Zend/zend_vm_opcodes.h);

  1. char *opname(zend_uchar opcode){
  2.     switch(opcode) {
  3.         case ZEND_NOP: return "ZEND_NOP"; break;
  4.         case ZEND_ADD: return "ZEND_ADD"; break;
  5.         case ZEND_SUB: return "ZEND_SUB"; break;
  6.         case ZEND_MUL: return "ZEND_MUL"; break;
  7.         case ZEND_DIV: return "ZEND_DIV"; break;
  8.         case ZEND_MOD: return "ZEND_MOD"; break;
  9.         case ZEND_SL: return "ZEND_SL"; break;
  10.         case ZEND_SR: return "ZEND_SR"; break;
  11.         case ZEND_CONCAT: return "ZEND_CONCAT"; break;
  12.         case ZEND_BW_OR: return "ZEND_BW_OR"; break;
  13.         case ZEND_BW_AND: return "ZEND_BW_AND"; break;
  14.         case ZEND_BW_XOR: return "ZEND_BW_XOR"; break;
  15.         case ZEND_BW_NOT: return "ZEND_BW_NOT"; break;
  16.         /*...省略 ....*/
  17.         default : return "UNKNOW"; break;

然后定義zval和znode的輸出函數:

  1.  char *format_zval(zval *z)
  2. {
  3.     static char buffer[BUFFER_LEN];
  4.     int len;
  5.  
  6.     switch(z->type) {
  7.         case IS_NULL:
  8.             return "NULL";
  9.         case IS_LONG:
  10.         case IS_BOOL:
  11.             snprintf(buffer, BUFFER_LEN, "%d", z->value.lval);
  12.             return buffer;
  13.         case IS_DOUBLE:
  14.             snprintf(buffer, BUFFER_LEN, "%f", z->value.dval);
  15.             return buffer;
  16.         case IS_STRING:
  17.             snprintf(buffer, BUFFER_LEN, "\"%s\"", z->value.str.val);
  18.             return buffer;
  19.         case IS_ARRAY:
  20.         case IS_OBJECT:
  21.         case IS_RESOURCE:
  22.         case IS_CONSTANT:
  23.         case IS_CONSTANT_ARRAY:
  24.             return "";
  25.         default:
  26.             return "unknown";
  27.     }
  28. }
  29.  
  30. char * format_znode(znode *n){
  31.     static char buffer[BUFFER_LEN];
  32.  
  33.     switch (n->op_type) {
  34.         case IS_CONST:
  35.             return format_zval(&n->u.constant);
  36.             break;
  37.         case IS_VAR:
  38.             snprintf(buffer, BUFFER_LEN, "$%d", n->u.var/sizeof(temp_variable));
  39.             return buffer;
  40.             break;
  41.         case IS_TMP_VAR:
  42.             snprintf(buffer, BUFFER_LEN, "~%d", n->u.var/sizeof(temp_variable));
  43.             return buffer;
  44.             break;
  45.         default:
  46.             return "";
  47.             break;
  48.     }
  49. }
  50.  

然后定義op_array的輸出函數:

  1. void dump_op(zend_op *op, int num){
  2.     printf("%5d %5d %30s %040s %040s %040s\n", num, op->lineno,
  3.             opname(op->opcode),
  4.             format_znode(&op->op1),
  5.             format_znode(&op->op2),
  6.             format_znode(&op->result)) ;
  7. }
  8.  
  9. void dump_op_array(zend_op_array *op_array){
  10.     if(op_array) {
  11.         int i;
  12.         printf("%5s %5s %30s %040s %040s %040s\n", "opnum", "line", "opcode", "op1", "op2", "result");
  13.         for(i = 0; i < op_array->last; i++) {
  14.             dump_op(&op_array->opcodes[i], i);
  15.         }
  16.     }
  17. }

最后,就是程序的主函數了:

  1. int main(int argc, char **argv){
  2.     zend_op_array *op_array;
  3.     zend_file_handle file_handle;
  4.  
  5.     if(argc != 2) {
  6.         printf("usage: op_dumper <script>\n");
  7.         return 1;
  8.     }
  9.     PHP_EMBED_START_BLOCK(argc,argv);
  10.     printf("Script: %s\n", argv[1]);
  11.     file_handle.filename = argv[1];
  12.     file_handle.free_filename = 0;
  13.     file_handle.type = ZEND_HANDLE_FILENAME;
  14.     file_handle.opened_path = NULL;
  15.     op_array = zend_compile_file(&file_handle, ZEND_INCLUDE TSRMLS_CC);
  16.     if(!op_array) {
  17.         printf("Error parsing script: %s\n", file_handle.filename);
  18.         return 1;
  19.     }
  20.     dump_op_array(op_array);
  21.     PHP_EMBED_END_BLOCK();
  22.     return 0;
  23. }

編譯,運行測試腳本(sample.php):
sample.php:

  1.    echo "laruence";

命令:

  1. ./opcodes_dumper sample.ph

得到輸出結果(如果你對下面的結果很迷惑,那么建議你再看看我的這篇文章:深入理解PHP原理之Opcodes):

  1. Script: sample.php
  2. opnum line opcode op1 op2 result
  3.     0 2 ZEND_ECHO "laruence"
  4.     1 4 ZEND_RETURN

呵呵,怎么樣,是不是很好玩呢?
源碼地址:http://code.google.com/p/opcodesdumper/

posted on 2011-06-19 20:53 肥仔 閱讀(525) 評論(0)  編輯 收藏 引用 所屬分類: Web-后臺

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品久久久久久久久久久久| 一区二区免费在线观看| 99re这里只有精品6| 久久久久高清| 国产欧美日韩精品在线| 亚洲欧洲另类| 久久在线免费视频| 亚洲欧美日本日韩| 欧美三区在线视频| 一本一本久久| 欧美国产精品人人做人人爱| 性8sex亚洲区入口| 国产女精品视频网站免费| 亚洲免费人成在线视频观看| 91久久精品网| 欧美日韩国产123| 99视频一区二区| 亚洲经典在线| 欧美精品一区二区三区高清aⅴ| 91久久精品国产| 亚洲二区三区四区| 欧美高清一区二区| 亚洲精品在线视频观看| 亚洲乱码国产乱码精品精可以看 | 宅男精品视频| 国产精品欧美一区喷水| 欧美一区二区三区另类| 亚洲在线观看| 国产精品视频大全| 欧美亚洲视频在线观看| 午夜在线成人av| 黑人一区二区三区四区五区| 模特精品裸拍一区| 欧美成人精品1314www| 日韩亚洲视频| 亚洲手机成人高清视频| 国产精品美女久久久久av超清| 欧美一区二视频在线免费观看| 欧美一区三区三区高中清蜜桃| 精品999成人| 亚洲精品欧美日韩专区| 国产精品一二一区| 欧美成年人视频网站| 欧美日韩亚洲高清| 久久久一二三| 欧美日本精品一区二区三区| 欧美一区二区三区免费大片| 裸体歌舞表演一区二区| 在线视频欧美日韩精品| 一区二区不卡在线视频 午夜欧美不卡'| 国产农村妇女精品一区二区| 免费亚洲网站| 国产精品成人一区二区网站软件 | 久久亚洲不卡| 欧美日韩综合| 久久亚洲一区二区| 欧美日韩精品一区二区三区四区| 欧美一区二区三区播放老司机 | 亚洲一区欧美一区| 韩日成人在线| 亚洲免费观看高清在线观看| 激情综合色综合久久| 亚洲午夜一区| 亚洲三级影院| 久久成人精品| 亚洲欧美一区二区原创| 欧美麻豆久久久久久中文| 久久一综合视频| 国产精品社区| 亚洲伦理久久| 亚洲国产裸拍裸体视频在线观看乱了中文 | 久久国产精品一区二区| 欧美性色视频在线| 99在线精品视频| 噜噜噜91成人网| 老司机免费视频一区二区三区| 国产麻豆精品theporn| 日韩视频免费| 中文日韩在线| 欧美精品www在线观看| 亚洲第一综合天堂另类专| 伊人精品久久久久7777| 久久精品99无色码中文字幕 | 亚洲国产第一| 久久野战av| 另类亚洲自拍| 韩日在线一区| 久久综合久久美利坚合众国| 国产精品久久久久久久久婷婷 | 亚洲一卡久久| 久久久久久网站| 狠狠色香婷婷久久亚洲精品| 欧美制服丝袜第一页| 久久久水蜜桃| 在线播放亚洲| 欧美成年人网| 亚洲精品一区在线观看| 亚洲午夜激情在线| 国产精品一香蕉国产线看观看| 午夜亚洲伦理| 欧美激情在线狂野欧美精品| 亚洲理论电影网| 国产精品v片在线观看不卡| 亚洲免费影视第一页| 久久在线91| 亚洲午夜激情| 激情久久综艺| 欧美激情欧美激情在线五月| 亚洲天堂成人在线视频| 男女激情久久| 亚洲一区成人| 韩国一区二区在线观看| 欧美国产日本在线| 亚洲欧美视频一区二区三区| 欧美大片在线影院| 午夜国产精品视频| 亚洲第一福利社区| 国产欧美日韩激情| 狼人社综合社区| 99国产精品久久| 久久精品一区二区国产| 亚洲三级色网| 狠狠久久综合婷婷不卡| 欧美日韩亚洲国产精品| 久久嫩草精品久久久精品| 亚洲精品视频二区| 欧美mv日韩mv国产网站| 欧美综合第一页| 亚洲四色影视在线观看| 亚洲精品免费网站| 国产一区深夜福利| 国产精品视频大全| 欧美视频一区二区三区在线观看| 午夜精品影院| aa国产精品| 亚洲第一成人在线| 久久丁香综合五月国产三级网站| 99精品欧美一区二区蜜桃免费| 狠狠色狠狠色综合人人| 国产欧美一区二区精品仙草咪 | 99国产精品久久久久老师| 另类国产ts人妖高潮视频| 欧美在线一级视频| 欧美日韩麻豆| 欧美激情bt| 欧美成人精品在线| 美女精品一区| 久久夜色精品国产噜噜av| 久久精品一区二区三区不卡| 亚洲欧美日韩专区| 亚洲女同在线| 午夜天堂精品久久久久| 亚洲男女自偷自拍图片另类| 亚洲午夜精品| 亚洲一卡二卡三卡四卡五卡| av成人手机在线| 日韩一级片网址| 在线亚洲国产精品网站| 一区二区激情小说| 亚洲一区二区三| 日韩午夜在线视频| 在线视频亚洲一区| 亚洲欧美国产日韩天堂区| 香蕉久久精品日日躁夜夜躁| 欧美一区二区网站| 老司机久久99久久精品播放免费 | 久久www成人_看片免费不卡 | 韩日精品视频| 亚洲激情影院| 中文国产成人精品| 亚洲欧美精品| 久久久久国色av免费观看性色| 久久久久高清| 亚洲国产精品黑人久久久| 亚洲精品日韩久久| 亚洲伊人网站| 久久九九国产精品怡红院| 欧美99久久| 国产精品护士白丝一区av| 国产一区激情| 亚洲最新视频在线| 亚洲欧美大片| 欧美freesex交免费视频| 亚洲另类在线视频| 欧美一区二区三区啪啪| 麻豆freexxxx性91精品| 欧美午夜精品久久久久久超碰| 国产欧美一区二区色老头| 亚洲国产日韩一区| 亚洲主播在线观看| 免费观看不卡av| 在线视频欧美日韩| 久久精品免费| 国产精品大片免费观看| 在线观看三级视频欧美| 午夜精品网站| 亚洲日本中文字幕| 久久精品亚洲一区二区| 国产精品激情av在线播放| 亚洲激情欧美激情|