有时候大家在破解别人的加密算法会遇到加密算法是js的,在php里不能解析,除了将js加密算法用php重写外,还可以用v8js扩展
windows
地址是:https://github.com/phpv8/v8js
扩展下载地址是:https://s3.amazonaws.com/win-phpv8/v8js_vc14_php7_ts.zip
下载完成后,供4个文件,将php_v8js.dll放到php的extension目录下,并在Php.ini中,打开扩展 extension=php_v8js.dll
将剩下的三个文件:v8.dll、icuuc.dll、icui18n.dll 放到apache的bin目录下。
重启apache就可以了。注意,要求PHP版本是7.0以上。还有就是复制上面三个动态库到apache的bin目录,否则会报错:
PHP Warning: PHP Startup: Unable to load dynamic library 'D:\\***\\php7.0.5\\ext\\php_v8js.dll' - \xef\xbf\xbd\xd2\xb2\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xd6\xb8\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xc4\xa3\xef\xbf\xbd\xe9\xa1\xa3\r\n in Unknown on line 0
linux
首先在 Ubuntu 12.04 的安装方法如下:
sudo apt-get install php5-dev php-pear libv8-dev build-essential
sudo pecl install v8js
sudo echo extension=v8js.so >>/etc/php5/cli/php.ini
sudo echo extension=v8js.so >>/etc/php5/apache2/php.ini
php -m | grep v8
下面是一个简单的测试脚本:
<?php
$start = microtime(true);
$array = array();
for ($i=0; $i<50000; $i++) $array[] = $i*2;
$array2 = array();
for ($i=20000; $i<21000; $i++) $array2[] = $i*2;
foreach ($array as $val) {
foreach ($array2 as $val2) if ($val == $val2) {}
}
echo (microtime(true)-$start)."\n"; // 8.60s
$start = microtime(true);
$v8 = new V8Js();
$JS = <<< EOT
var array = [];
for (i=0; i<50000; i++) array.push(i*2);
var array2 = [];
for (i=20000; i<21000; i++) array2.push(i*2);
for (key=0; key<array.length; key++) {
for (key2=0; key2<array2.length; key2++) if (array[key] == array2[key2]) {}
}
print('done.');
EOT;
$v8->executeString($JS, 'basic.js');
echo ' '.(microtime(true)-$start)."\n"; // 3.49s
在 PHP 中使用 JavaScript 处理某些操作时性能会比较好。
下面是在 node.js 中运行相同 js 代码的比较:
time node /tmp/test.js
real 0m0.729s
而 v8js 当时是 beta 版本,希望在正式版方面性能能有更多提升。
下面是 PHP 在使用 V8 引擎中一个使用数据库、会话和请求处理的例子:
// v8js currently crashes with mysqli_result, so wrap it
class DB extends MySQLi {
public function query($sql) {
return parent::query($sql)->fetch_all(MYSQLI_ASSOC);
}
}
// v8js currently has no support for references or magic __set(), so wrap it
class Session {
public function set($key, $value) {
$_SESSION[$key] = $value;
}
public function __get($key) {
if (isset($_SESSION[$key])) return $_SESSION[$key];
return null;
}
public function toJSON() {
return $_SESSION;
}
}
session_start();
$js = new V8Js();
$js->db = new DB('localhost', 'root', '', 'mydb');
$js->session = new Session();
$js->request = $_REQUEST;
$js->executeString(<<<EOT
print( PHP.db.query('select * from some_table limit 1')[0].some_column );
print( PHP.request.hello );
print( JSON.stringify( PHP.session ) ); // calls toJSON
print( PHP.session.invalid ); // null
print( PHP.session.hello );
PHP.session.set('hello', 'world');
EOT
);
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
windows:
首先检查您的PHP是线程安全性的还是非安全性的,因为我们需要知道要下载正确的模块。你可以在Windows中运行一个简单的命令来检查这个。代码如下:
php -i | findstr "Thread"
如果结果输出是Thread Safety => enabled
,那说明你的PHP版本是线程安全性的,反之亦然。
当然你也可以新建个PHP文件,用php_info();
来获取你PHP的信息。
接下来,在Jan-E这里下载完整的编译好的PHP版本:
https://www.apachelounge.com/viewtopic.php?t=6359
然后你可以从里面提取出你需要的文件,将它们解压到各自的文件夹中:\php\
文件夹:
- v8.dll
- v8_libbase.dll
- v8_libplatform.dll
- icui18n.dll (php7)
- icuuc.dll (php7)
\php\ext\
文件夹:
- php_v8js.dll
还有最后一步,配置你的php.ini
文件:
; V8 Javascript Engine Module extension=php_v8js.dll
最后重启你的服务就可以了!!!
提供个简单的例子:
<?php $v8 = new V8Js(); /* basic.js */ $JS = <<< EOT var string1 = 'Hello' + ' ' + 'World!'; len = print(string1+"\\n"); var string2 = 'Hello' + ' ' + 'World2!'; len2 = print(string2+"\\n"); string1+","+string2; EOT; try { $temp = $v8->executeString($JS, 'basic.js'); $temp = explode(",",$temp); print_r($temp); } catch (V8JsException $e) { print_r($e); }
运行结果如下:
[Running] php "e:worktest.php"
Hello World!
Hello World2!
Array
([0] => Hello World! [1] => Hello World2!)
[Done] exited with code=0 in 0.622 seconds