一个获取google chrome扩展crx文件信息的PHP操作…
2018-06-22 04:56:54来源:未知 阅读 ()
此类中实现了从crx文件获取扩展的Appid、获取manifest.json文件内容、将crx文件转换为一般zip文件
代码如下:
<?php class CrxParserException extends Exception { } /** * Chrome crx 解析器,用于获取扩展、皮肤ID * */ class CrxParser { const MAX_PUBLIC_KEY_SIZE = 65535; const MAX_SIGNATURE_SIZE = 65535; const HEADER_MAGIC_PREFIX = 'Cr24'; const CURRENT_VERSION = 2; private $fp = null; //文件指针 private $filename = ''; //文件路径 private $_header = array(); //crx 文件的头信息 public function __construct($filename){ $this->parse($filename); } /** * 获取此应用的ID * @return string */ public function getAppid() { $hash = hash('sha256',$this->_key); $hash = substr($hash,0,32); $length = strlen($hash); $ascii_0 = ord('0'); $ascii_9 = ord('9'); $ascii_a = ord('a'); $data = ''; for($i=0;$i<$length;$i++) { $c = ord($hash[$i]); if($c >= $ascii_0 && $c <= $ascii_9) { $d = chr($ascii_a + $c - $ascii_0); } else if($c >= $ascii_a && $c < $ascii_a + 6) { $d = chr($ascii_a + $c - $ascii_a + 10); } else { $d = 'a'; } $data .= $d; } return $data; } /** * 从crx文件中获取manifest.json文件的配置信息 * @param unknown $zip_file * @return mixed[] */ function getConfig($key=null){ $zip_file=tempnam(dirname($this->filename),'zip'); $manifest_arr=array(); if($this->convertToZip($zip_file)){ $zip=zip_open($zip_file); if(is_resource($zip)){ while($zip_entry=zip_read($zip)){ $entry_name=zip_entry_name($zip_entry); if(preg_match('/manifest\.json$/', $entry_name)){ $content=zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); $content_j=json_decode($content, true); if(!empty($content_j)){ $manifest_arr=$content_j; } } } } zip_close($zip); unlink($zip_file); } return is_null($key) ? $manifest_arr : $manifest_arr[$key]; } /** * 将文件转换为zip文件 * @param unknown $target_path */ public function convertToZip($target_path=null){ $offset=16+$this->_header['key_size']+$this->_header['sig_size']; $data=$this->getContent($this->filename,$offset); return !is_null($target_path) ? file_put_contents($target_path, $data) : $data; } /** * 开始解析该 crx 文件 */ private function parse($filename) { if(strpos($filename, '://')!==false && !file_exists($filename)) { throw new CrxParserException("parser init: crx file does not exisit"); } $this->filename=$filename; $this->fp = fopen($filename, 'r'); $this->parse_header(); // 解析头部信息 $this->parse_key(); $this->parse_sig(); fclose($this->fp); } /** * 解析头部信息,并设置 $_header 数组 * @throws CrxParserException 解析错误抛出异常 */ private function parse_header() { $data = fread($this->fp, 16); // HEADER 头信息有16个字节 if($data) { $data = @unpack('C4prefix/Vversion/Vkey_size/Vsig_size',$data); }else{ throw new CrxParserException("header parse: error reading header"); } // 前四个字节拼合 prefix $data['prefix'] = chr( $data['prefix1'] ).chr( $data['prefix2'] ).chr( $data['prefix3'] ).chr( $data['prefix4'] ); unset($data['prefix1'],$data['prefix2'],$data['prefix3'],$data['prefix4']); if($data['prefix'] != self::HEADER_MAGIC_PREFIX) { throw new CrxParserException("header parse: illegal prefix"); } if( $data['version'] != self::CURRENT_VERSION ) { throw new CrxParserException("header parse: illegal version"); } if( empty($data['key_size']) || $data['key_size'] > self::MAX_PUBLIC_KEY_SIZE || empty($data['sig_size']) || $data['sig_size'] > self::MAX_SIGNATURE_SIZE ){ throw new CrxParserException("header parse: illegal public key size or signature size"); } $this->_header = $data; } /** * 解析key * @throws CrxParserException */ private function parse_key() { $key = fread($this->fp,$this->_header['key_size']); if($key) { $this->_key = $key; }else{ throw new CrxParserException("key parse: error reading key"); } } /** * 解析sig * @throws CrxParserException */ private function parse_sig() { $sig = fread($this->fp,$this->_header['sig_size']); if($sig) { $this->_sig = $sig; }else{ throw new CrxParserException("sig parse: error reading sig"); } } /** * 从文件中获取指定位置及大小的内容 * @param unknown $filename * @param number $offset * @param unknown $length * @return string */ private function getContent($filename,$offset=0,$length=-1){ $stream = fopen($filename, 'rb'); $content = stream_get_contents($stream, $length, $offset); fclose($stream); return $content; } }
使用方法:
<?php $crxParser=new CrxParser('abc.crx'); echo $crxParser->getAppid(); var_dump($crxParser->getConfig()); //$crxParser->convertToZip('abc.zip');
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- PHP获取数组中单列值的方法 2020-03-13
- 利用PHP获取汉字首字母并且分组排序详解 2020-02-08
- Laravel中获取路由参数Route Parameters的五种方法示例 2020-02-07
- PHP 获取 ping 时间的实现方法 2019-12-28
- PHP高效获取远程图片尺寸和大小的实现方法 2019-12-14
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash