2010-07-12 42 views
1

得到了一個reall頭scratcher。我試圖做一個PHP混淆器(http://www.actwebdesigns.co.uk/web-design-blog/actobfuscator-free-open-source-php-obfuscator/PHP令牌 - 查找用戶定義的常量

我碰到了一個小問題壽。我不能找到一個確保用戶定義常量的方法。

我的一些token_name()的返回值爲T_STRING,其他值爲T_CONSTANT_ENCAPSED_STRING,它與我的代碼一樣不會改變所有常量,如下所示;

<?php 
//ACTObfuscator - Created by ACT Web Designs 
//http://www.actwebdesigns.co.uk 
?> 
<?php 
@define("V566B1DF8B3B32D1", false); if(V566B1DF8B3B32D1) { define('DB_USERNAME', "wefghgfh"); define('DB_PASSWORD', "mulfghgfh"); define('DB_SERVER', "gfhgst"); define("V2FC1E4F930A251A", "webfghgfh"); define("VDA9E0DAA31346F8", "<+ site_name +>"); define("V4424E58002D8BE7", "actvbiz.co.uk"); define("VBE72B58F4FE19A6", '<img src="./?0000=jpg&0001=0001&0002=pic" width="277" style="position:relative; z-index:5; background:url(./?0000=png&0001=shade&0002=pic) bottom repeat-x;" height="167" alt="ACTvBiz Logo" />'); define("V7052A961BF53D55", "http://www.actvbiz.co.uk"); define("V692CD2C3D40F692", "[email protected]"); define("VDC5565EDE9405AA", "nnn_accounts"); }else{ header("location: http://www.actvbiz.co.uk"); exit; } ?> 

(忽略< + foobar的+>爲別的東西,多數民衆贊成)

任何的幫助深表感謝。

+2

通常'define'應該是'T_STRING'。還有:請不要使用'token_name($ token [0])=='T_STRING''使用'$ token [0] == T_STRING'來代替。這就是爲什麼PHP定義了它的常量......請使用'file_get_constants'而不是'implode''file()'。你能指出你正在註冊常量的混淆器代碼中的哪個位置?找不到它。 – NikiC 2010-07-12 09:54:39

+0

$ token [0]返回一個數值,其中token_name轉換爲解析器令牌,即'T_CONSTANT_ENCAPSED_STRING' – 2010-07-12 09:58:24

+0

'} elseif(is_int($ token [0])&& token_name($ token [0])=='T_STRING'&& preg_match(「#^ [A-Z _] + $#」,$ token [1])){' – 2010-07-12 10:00:02

回答

-1

請格式化您的代碼,這樣它不太可讀。

您可以檢查一個常數是否由該函數定義:defined

if (defined('V566B1DF8B3B32D1')) { 
} 

這是你在找什麼?

+0

上面的代碼是從我的代碼輸出的內容(顯示在鏈接中)V566B1DF8B3B32D1由於其標記名稱已正確返回而被更改。有一些tho返回T_CONSTANT_ENCAPSED_STRING,這是不正確的anyideas任何人爲什麼? '請格式化您的代碼,這樣它不可讀。 '多數民衆贊成的想法;-) – 2010-07-12 09:54:14

0

我將如何找到用戶定義的常量(使用define誰,而不是那些const):

foreach (token_get_all($source) as $token) { 
    if (!is_array($token)) continue; 
    list($id, $content) = $token; 
    if ($id == T_STRING && $content == 'define') { 
     // and now extract the constant name! 
    } 
} 
+0

仍然是相同的... – 2010-07-12 10:39:33

0

我知道是什麼問題...在整個我的文檔我已刪除的(讓說)域名常量,只剩下DEFINE('DOMAIN');所以從理論上講,因爲它不在任何地方使用,所以不需要「改變」。但要在走到這一步,只有改變「定義」常量,而不是「出現」的內容(被定義沒有它的證明)是恆定的,我寫了這個:

foreach($tokens as $key => $packet) { 
    $x = $key + 1; 
    if(is_array($packet) && $packet[0] == T_STRING && $packet[1] == 'define') { 
     while(true) { 
      if(is_array($tokens[$x]) && $tokens[$x][0] == T_CONSTANT_ENCAPSED_STRING) { 
       $constants[] = str_replace(array("\s", "'", '"'), '', $tokens[$x][1]); 
       break; 
      } 
      $x++; 
     } 
    } 
} 

這隻會增加值如果在defined()函數中是常數。輸出:

Array 
(
    [0] => VIA_SITE 
    [1] => DB_USERNAME 
    [2] => DB_PASSWORD 
    [3] => DB_SERVER 
    [4] => DB_NAME 
    [5] => SITE_NAME 
    [6] => PROFILE_URL 
    [7] => _LOGO 
    [8] => DOMAIN 
    [9] => SUPPORT_EMAIL 
    [10] => ACCOUNT_TABLE 
) 
+0

我想在某種程度上獲取定義名稱的第一種方式顯示它是否在整個腳本中使用。 – 2010-07-12 11:54:55