PHP令牌 - 查找用户定义的常量

时间:2010-07-12 09:46:10

标签: php constants token

得到了一个令人震惊的头脑。我试图制作PHP混淆器(http://www.actwebdesigns.co.uk/web-design-blog/actobfuscator-free-open-source-php-obfuscator/

我遇到了一个小问题。我找不到找到用户定义常量的保证方法。

我的一些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", "support@activbiz.co.uk"); define("VDC5565EDE9405AA", "nnn_accounts"); }else{ header("location: http://www.actvbiz.co.uk"); exit; } ?>

(忽略&lt; + foobar +&gt;作为其他东西)

非常感谢任何帮助。

3 个答案:

答案 0 :(得分: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!
    }
}

答案 1 :(得分:0)

我意识到问题是什么......在我删除的整个文档中(让我们说)DOMAIN常量并且只留下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++;
        }
    }
}

如果在定义的()函数中,这只会将值作为常量添加。输出:

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
)

答案 2 :(得分:-1)

请格式化您的代码,这样它的可读性不是很高。

您可以检查该函数是否定义了常量:defined

if (defined('V566B1DF8B3B32D1')) {
}

这就是你要找的东西吗?