茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1671292 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_DPP_0070.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

PHP特區 : [轉貼]安裝 PHP bcompile 做 編譯/加密 原始碼

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]安裝 PHP bcompile 做 編譯/加密 原始碼

安裝 PHP bcompile 做 編譯/加密 原始碼

PHP 的程式在公司在交付程式中, 比較麻煩的就是要如何把原始碼編譯或加密, 免費的方案, 可以考慮用 bcompiler(PHP bytecode Compiler).

不過這套於 PHP5 的物件寫法, 繼承等等, compiler 後執行會有問題, 純 function / include 等等, 是正常的.

PHP bcompiler 安裝步驟

下述環境於 Debian / Ubuntu Linux 安裝

  1. apt-get install libbz2-dev php-pear php5-dev # 因為 pecl compile bcompiler 需要 libbz2(bz2 library)
  2. pecl install channel://pecl.php.net/bcompiler-0.8 # 因為 bcompiler 是 beta, 不是 stable, 所以需要完整路徑.
  3. echo "extension=bcompiler.so" >> /etc/php5/conf.d/bcompile.ini
  4. /etc/init.d/apache2 restart

確認 Module 是否載入

  • php -m | grep bcompiler
  • phpinfo(); # 看是否有載入 bcompiler module

PHP bcompiler 使用

先寫一個編譯程式, 準備把 example.php 編譯成 example.phb (或 xxx.php 都可以), 詳細可見:
bcompiler_write_file.

編譯其他程式用的檔案 bcompiler.php
<?php
$fh = fopen("example.phb", "w");
bcompiler_write_header($fh);
bcompiler_write_file($fh, "example.php");
bcompiler_write_footer($fh);
fclose($fh);
?>
hello.php
<?php
function hello()
{
   echo "hello\n";
}
?>
example.php
<?php
include('hello.php');
hello();
?>
  1. 編譯: php bcompiler.php # 會發現有產生出 example.phb (或於 bcompiler.php 有另外取名字的 xxx.php)
  2. 執行: php example.phb # 會秀 hello, 然後此檔案已經是編譯過的 php code.

另外查到
使用 bcompiler 來編譯(加密)您的 PHP 原始碼 這篇的作者, 寫了一個 bencoder 的好用程式, 可以 compile 整個目錄, 詳細可見: BENCODER v1.3 - Encode your PHP script using bcompiler

Bencoder 安裝使用

  1. wget http://bencoder.urdada.net/bencoder
  2. chmod +x ./bencoder
  3. vim bencoder # 修改 php 執行路徑, Debian PHP 存放路徑在 /usr/bin/php
    #!/usr/local/bin/php 改成 #!/usr/bin/php
  4. 執行: ./bencoder -f -o php/Breadcrumb_ben/ -s php/Breadcrumb/ -r
    encoded: php/Breadcrumb_ben//first.php
    encoded: php/Breadcrumb_ben//index.php
    encoded: php/Breadcrumb_ben//bread.php
    encoded: php/Breadcrumb_ben//second.php



原文出處:安裝 PHP bcompile 做 編譯/加密 原始碼 | Tsung's Blog
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]使用 bcompiler 來編譯(加密)您的 PHP 原始碼

使用 bcompiler 來編譯(加密)您的 PHP 原始碼

Using bcomipler to compile (encode) your PHP script (in FreeBSD)

eAccelerator 的 encoder 在 PHP 5.1 以後就無法運作了,使是最新的版本 0.9.5 也不行,因此如果您還想用 eAccelerator 的 encoder,乖乖待在 PHP 4.x or PHP 5.0 吧,相關資訊可參考之前的兩篇文章:

根據 mailing list 上面作者最新的 說法,短期內應該都還不會修復,甚至有可能還會放棄支援 encoder 部份,作者還推薦大家改用
bcompiler ... orz
所以如果你跟我一樣必須要用 PHP 5.1 的話,就跟我一起來玩看看 bcompiler

附帶一提,原本是要買 ionCube 公司開發的 PHP Encoder 的,這看來是目前編譯(加密)PHP 原始碼最好的選擇,價格也不算貴,而且花的是公司的錢,不過還是先試用看看 bcompiler 好了,真的不好用的話,再來買囉

以下的安裝與使用說明均以 FreeBSD 為範例,其他作業系統應該也差不多,請自己試看看吧

在正式安裝之前提醒你, bcompiler 會用到 bzip2 這個 extension,所以先安裝一下 php5-bz2:


# cd /usr/ports/archivers/php5-bz2
# make install clean

bcompiler 是一個收容於 PECL 的 PHP extension,您可以直接使用 pecl 這個命令來安裝,而 pecl 的使用方法與 pear 相同,因此你必須先安裝 pear :


# cd /usr/ports/devel/pear
# make install clean

pear 安裝好後,同時會有一個 pecl 命令可用 (/usr/locel/bin/pecl),可用它來安裝 bcompiler

pecl install channel://pecl.php.net/bcompiler-0.8

不過呢,我發現直接執行 pecl 會發生錯誤(至少在 FreeBSD 下是如此):


# pecl
Fatal error: Call to undefined function preg_match() in ...

問題出在 /usr/local/bin/pecl 這個 script 的最後一行:

exec $PHP -C -n -q $INCARG -d output_buffering=1 -d safe_mode=0 ...

這一行的 -n 這個選項代表不載入 php.ini 設定檔,因此 pcre.so 就沒有被載入,
然後你就看到上面的錯誤了,所以自己去改一下程式把 -n 拿掉吧....

拿掉之後,安裝程式應該就可以正常運作了了:

pecl install channel://pecl.php.net/bcompiler-0.8

安裝好後,記得要改設定把 bcompiler 這個 extension 載入

> /usr/local/etc/php/extensions.ini

bcompiler 全名是 PHP bytecode Compiler,詳細的使用方法可以參考 PHP 網站上的詳細說明: PHP bytecode Compiler: http://www.php.net/manual/en/ref.bcompiler.php

看不懂的話, bcompiler_write_file() 這個 function 的說明裡面有範例:


bcompiler_write_header($fh);
bcompiler_write_file($fh, "example.php");
bcompiler_write_footer($fh);
fclose($fh);

為了易於使用,我寫了一個簡單的 script,使用方法如下:


BENCODER v1.3 - Encode your PHP script using bcompiler
Usage: bencoder [-f] [-q] -o FILE file1.php
bencoder [-f] [-q] -o OUTDIR file1.php file2.php ...
bencoder [-f] [-q] -o OUTDIR -s SRCDIR [-e SUFFIX] [-r] [-c] [-l]
-o FILE : the file name to write the encoded script
(default to '-encoded.XXX' suffix)
-o OUTDIR : the directory to write all encoded files
-a SRCDIR
-s SRCDIR : encode all files in this source directory
-r : encode directories recursively (no by default)
-f : force overwriting even if the target exists
-e SUFFIX : encode the files with the SUFFIX extension only (default: php)
(regular expression allowed, ex: "php|inc")
-c : copy files those shouldn't be encoded (no by default)
-l : follow symbolic link (no by default)
-q : do not print the file name while encoding or copying
-b
-bz2 : compress the encoded files with bz2 (needs bzip2-extension)

想用的人到 這邊 自己抓回去玩玩看吧


# wget http://bencoder.urdada.net/bencoder
# chmod 755 bencoder
# mv bencoder /usr/local/bin/

在把程式使用 bcompiler 編碼之後,執行的時候發覺 $_SERVER 以及 $_ENV 的變數都不見了,後來查了資料,才發現要把 auto_globals_jit 關掉 (Off) 才行,請直接修改您的 php.ini :


; When enabled, the SERVER and ENV variables are created when they're first
; used (Just In Time) instead of when the script starts. If these variables
; are not used within a script, having this directive on will result in a
; performance gain. The PHP directives register_globals, register_long_arrays,
; and register_argc_argv must be disabled for this directive to have any affect.
auto_globals_jit = Off


原文出處: 使用 bcompiler 來編譯(加密)您的 PHP 原始碼 | Dada's Blog
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]使用bcompiler將PHP加密

使用bcompiler將PHP加密

公司最近說要將PHP原始碼加密@_@,我之前壓根都沒想到這事,所以今天花了一整天拜請google大仙,找到有一種使用bcompiler的方法,趴了官方文件後,索性就寫了一個加密的class,或許以會有機會用到。


//載入函式
include_once('phpCodeZip.php');
//建立加密物件
$encryption = new PhoCodeZip('sourceDir','targetDir');
//執行加密
$encryption->zip();
//如此一來,你就可以在targetDir找到經過加密的PHP原始碼





/*
* @license:MIT & GPL
*/

class PhpCodeZip{
//欲進行壓縮加密的來源資料夾
var $sourceDir = '.';
//進行壓縮加密的存放的資料夾
var $targetDir = 'tmp';
//是否進行加密
var $bcompiler = true;
//是否去除空白註解斷行
var $strip = true;
//來源資料夾檔案路徑陣列
var $sourcefilePaths = array();
//目的資料夾檔案路徑陣列
var $targetPaths = array();
//進行壓縮加密前的資料夾大小
var $sizeBeforeZip = null;
//進行壓縮加密後的資料夾大小
var $sizeAfterZip = null;
//斷行的輸出
var $newline = '';
/**
* 建構子
*
* @param string $sourceDir 來源資料夾
* @param string $targetDir 目的資料夾
* @param boolean $bcompiler 是否進行加密
* @param boolean $strip 是否去除空白註解斷行
* @return boolean
*/

public function PhpCodeZip($sourceDir='.',$targetDir='tmp',$bcompiler=true,$strip=true){
//配置初始變數
$this->sourceDir = $sourceDir;
$this->targetDir = $targetDir;
$this->bcompiler = $bcompiler;
//檢查來源資料是否存在
 
if(!is_dir($this->sourceDir)){
die('指定的來源資料夾'.$this->sourceDir.'不存在,請重新設定');
} else {
//如果指定的目的資料夾存在,砍掉重練
if(is_dir($this->targetDir)){
echo '【初始化目的地資料夾】'.$this->newline.$this->newline;
$this->cleanDir($this->targetDir,true);
}
//建立與來源資料夾結構一樣的目的資料夾
mkdir($this->targetDir,0777);
$dir_paths = $this->getPaths($this->sourceDir,'*',GLOB_ONLYDIR);
foreach($dir_paths as $key => $path){
$path = explode('/',$path);
$path[0] = $this->targetDir;
echo '=> '.join('/',$path).$this->newline;
mkdir(join('/',$path),0777);
}
//取得來源資料夾的檔案路徑清單
$this->sourcefilePaths = $this->getPaths($this->sourceDir,'*');
//配對應目的地的檔案路徑清單
foreach($this->sourcefilePaths as $key => $path){
//設定目的資料夾檔案路徑
$path = explode('/',$path);
$path[0] = $this->targetDir;
$this->targetPaths[$key] = join('/',$path);
}
//記錄執行前的資料夾大小
$this->sizeBeforeZip = $this->getSizeUnit($this->getDirSize($this->sourceDir),2);
echo $this->newline.$this->newline;
}
}
/**
* 進行壓縮加密
* @return boolean
*/

public function zip(){
$this->newline = '';
echo '【開始進行加密程序】(資料夾大小:'.$this->sizeBeforeZip.')'.$this->newline.$this->newline;
//將來源檔案進行壓縮
foreach($this->sourcefilePaths as $key => $path){
if(is_file($path)){
//取得檔案資訊
$pathInfo = pathInfo($path);
echo '讀取來源檔:'.$path.$this->newline;
//取得壓縮後的內容
echo '=>去除空白註解..........';
if($this->strip && $pathInfo['extension'] == 'php'){
$fileAterZip = php_strip_whitespace($path);
} else {
$fileAterZip = file_get_contents($path);
}
echo '完畢'.$this->newline;
 
//取壓縮後的內容寫到目的位置
$fp = fopen($this->targetPaths[$key],'w+');
echo '=>寫入目的檔..........';
fwrite($fp,$fileAterZip);
fclose($fp);
echo '完畢'.$this->newline;
//是否若選擇進行加密
if($this->bcompiler && $pathInfo['extension'] == 'php'){
echo '=>加密原始檔..........';
//複製原始檔
$fh = fopen($this->targetPaths[$key].'encrypt.php', "w");
bcompiler_write_header($fh);
bcompiler_write_file($fh, $this->targetPaths[$key]);
bcompiler_write_footer($fh);
fclose($fh);
//刪除未加密的原始檔
 
unlink($this->targetPaths[$key]);
//重新命名加密過後的檔案
 
rename($this->targetPaths[$key].'encrypt.php',$this->targetPaths[$key]);
echo '完畢'.$this->newline;
}
echo $this->newline.$this->newline;
}
}
//重新計算壓縮加密後的資料夾大小
$this->sizeAfterZip = $this->getSizeUnit($this->getDirSize($this->targetDir),2);
echo '【結束加密程序】'.$this->newline.$this->newline;
 
echo '《報告資訊》'.$this->newline;
echo '來源資料夾:'.$this->sourceDir.'('.$this->sizeBeforeZip.')'.$this->newline;
echo '目的資料夾:'.$this->targetDir.'('.$this->sizeAfterZip.')'.$this->newline;
echo '檔案大小增幅:+'.$this->getSizeUnit(($this->getDirSize($this->targetDir) - $this->getDirSize($this->sourceDir))).$this->newline;
echo '檔案總數:'.count($this->sourcefilePaths).'個'.$this->newline;
 
}
/**
* 刪除目錄夾所有檔案
*
* @param string $dir 欲刪除的資料夾
* @param boolean $deleteSelf 同時刪除資料夾
* @return void
*/

private function cleanDir($dir='.',$deleteSelf=true){
if(!$dh = @opendir($dir)) return;
while (($obj = readdir($dh))) {
if($obj=='.' || $obj=='..') continue;
if (!@unlink($dir.'/'.$obj)) $this->cleanDir($dir.'/'.$obj, true);
}
if ($deleteSelf){
closedir($dh);
@rmdir($dir);
}
}
/**
* 取得資料夾的總檔案大小
*
* @param string $dir 欲剖析的資料夾
* @return int 位元組
*/

private function getDirSize($dir='.'){
//取得檔案路徑清單
$filePaths = $this->getPaths($dir,'*');
//初始化計數器
$sizeCounter = 0;
foreach($filePaths as $key => $path){
$sizeCounter = $sizeCounter + filesize($path);
}
return ($sizeCounter);
}
/**
* 取得資料夾所有配對的路徑
*
* @param string $start_dir 欲剖析的資料夾
* @return array 檔案路徑陣列
*/

private function getPaths($sDir, $sPattern, $nFlags = NULL){
$sDir = escapeshellcmd($sDir);
$aFiles = glob("$sDir/$sPattern", $nFlags);
foreach (glob("$sDir/*", GLOB_ONLYDIR) as $sSubDir) {
$aSubFiles = $this->getPaths($sSubDir, $sPattern, $nFlags);
$aFiles = array_merge($aFiles, $aSubFiles);
}
return $aFiles;
}
/**
* 檔案大小單位轉換函式
*
* @param int 檔案大小
* @param int 小數點位數
* @param boolean 是否要將資料切成陣列
* @return mix 字串或陣列
*/

public function getSizeUnit($size,$decimal=2,$split=false){
//設定單位序列
$unit = array('Bytes','KB','MB','GB','TB','PB','EB','ZB','YB');
//初始化索引
$flag = 0;
//進行簡化除算
while($size >= 1024){
$size = $size / 1024;
$flag++;
}
//是否要將數值與單位分開
if($split){
$sizeUnit = array(
'size' => number_format($size,$decimal),
'unit' => $unit[$flag]
);
} else {
$sizeUnit = (number_format($size,$decimal)).$unit[$flag];
}
//回傳大小與單位
return ($sizeUnit);
}


原文出處:我的網頁設計: 使用bcompiler將PHP加密 - 網頁設計教學,網站規劃,平面設計分享,PHP程式,SEO,CSS,FLASH設計,排前技術
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]CentOS5上安裝bcompiler的方法
來分享一下冷日在CentOS5上安裝bcompiler的方法:
1.安裝bzip
yum install bzip2* -y 

2.安裝php-pear
yum install php-pear* -y 

3.安裝php-dev
yum install php-devel -y 

4.安裝bcompiler
pecl install channel://pecl.php.net/bcompiler-0.8

5.編輯php.ini
vi /etc/php.ini

在最後面加入一行如下
extension=bcompiler.so

6.重新啟動Apache
/etc/rc.d/init.d/httpd restart

7.檢查bcompiler是否有順利掛載成module
php -m |grep bcompiler

應該要看到以下這一行
bcompiler

8.也可以寫一頁phpinfo來檢查
應該要看到:

bcompiler







bcompiler supportenabled
bcompiler version 0.8s
current bytecode version 0.14
can parse bytecode version 0.7, 0.9, 0.11, 0.12, 0.14


剩下的,就可以參考上面前輩所寫得Code來替你的php做壓縮加密啦!
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|