一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - 神盾加密解密教程(一)PHP變量可用字符

神盾加密解密教程(一)PHP變量可用字符

2020-07-01 13:46PHP教程網 PHP教程

這篇教程首先講PHP變量可用字符,是因為要解密神盾加密的程序,了解PHP變量可用字符是解密的首要條件,好了,廢話不多說,直接進入正題

先來說說php變量的命名規則,百度下一抓一大把:
(1) PHP的變量名區分大小寫;
(2) 變量名必須以美元符號$開始;
(3) 變量名開頭可以以下劃線開始;
(4) 變量名不能以數字字符開頭.

其實所有編程都類似的命名規范就是:
1. 變量第一個字符最好是 字母或_,不能以數字開頭
2. 第二個字符開始允許 數字,字母,_

好了,差不多就是這樣了,但是這不是我們要說的重點。
今天我們說說 PHP 變量的可用字符,不僅僅是 數字,字母,_ 哦。

前幾天QQ上一朋友發我一個shell,是加密過的,通篇亂碼,不過上面有注釋,叫做 “神盾加密” 好霸氣的樣子。
里面用了一些比較生僻的知識點,其中最明顯的就是變量名,所以今天我們先從變量開始講。

當然網上我也沒找到權威的質料強有力的說明PHP的變量名可用字符的信息,所以我只能自己測試了。(英文不好,沒辦法谷歌到有利的證據)
先來看下我所用的方法,(如果你有更好的方法,希望分享下。)

 

復制代碼 代碼如下:

<?php
if ($_POST) {
    $chr = chr($_POST['chr']);
    eval('$'.$chr."=1;");
    echo 'ok';
    exit;
}
?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.js"></script>
</head>
<body>
    <script>
    for(var i = 0x00; i <= 0xFF; i++) { // 0x00 - 0xFF  255個字符
        $.ajaxSettings.async = false; // 同步模式, 為了按順序返回數據
        $.post( "?", {chr: i}, (function (data) { // post i 給 php 解析
            data === 'ok' && console.log( "\\x"+(i).toString(16) ); // 如果只返回 ok 說明能正常執行,否則會拋出異常
        });
    }
    </script>
</body>
</html>

 

代碼還算比較簡單,PHP 部分只負責解析每一個字符當作變量名的執行結果是否會拋出溢出。
比如 字符 a 那么會解析  eval('$a=1;');  這樣的結果肯定沒問題,所以不會拋出異常,返回結果就是 ok 字符。
如果 字符 - 那么會解析  eval('$-=1;');  這明顯是不對的,所以會拋出  PHP Parse error: syntax error, unexpected '-', expecting T_VARIABLE or '$'  和 ok 字符。
而下面的 ajax 部分者正是利用返回結果是否為 'ok' 而判斷是否是有效的變量名。
看看執行后的結果是什么吧:

 

復制代碼 代碼如下:

"\x41, \x42, \x43, \x44, \x45, \x46, \x47, \x48, \x49, \x4a, \x4b, \x4c, \x4d, \x4e, \x4f, \x50, \x51, \x52, \x53, \x54, \x55, \x56, \x57, \x58, \x59, \x5a, \x5f, \x61, \x62, \x63, \x64, \x65, \x66, \x67, \x68, \x69, \x6a, \x6b, \x6c, \x6d, \x6e, \x6f, \x70, \x71, \x72, \x73, \x74, \x75, \x76, \x77, \x78, \x79, \x7a, \x7f, \x80, \x81, \x82, \x83, \x84, \x85, \x86, \x87, \x88, \x89, \x8a, \x8b, \x8c, \x8d, \x8e, \x8f, \x90, \x91, \x92, \x93, \x94, \x95, \x96, \x97, \x98, \x99, \x9a, \x9b, \x9c, \x9d, \x9e, \x9f, \xa0, \xa1, \xa2, \xa3, \xa4, \xa5, \xa6, \xa7, \xa8, \xa9, \xaa, \xab, \xac, \xad, \xae, \xaf, \xb0, \xb1, \xb2, \xb3, \xb4, \xb5, \xb6, \xb7, \xb8, \xb9, \xba, \xbb, \xbc, \xbd, \xbe, \xbf, \xc0, \xc1, \xc2, \xc3, \xc4, \xc5, \xc6, \xc7, \xc8, \xc9, \xca, \xcb, \xcc, \xcd, \xce, \xcf, \xd0, \xd1, \xd2, \xd3, \xd4, \xd5, \xd6, \xd7, \xd8, \xd9, \xda, \xdb, \xdc, \xdd, \xde, \xdf, \xe0, \xe1, \xe2, \xe3, \xe4, \xe5, \xe6, \xe7, \xe8, \xe9, \xea, \xeb, \xec, \xed, \xee, \xef, \xf0, \xf1, \xf2, \xf3, \xf4, \xf5, \xf6, \xf7, \xf8, \xf9, \xfa, \xfb, \xfc, \xfd, \xfe, \xff"

 

整理后發現是這樣的16進制數據,當然看不懂沒關系,看下轉義后的結果:

 

復制代碼 代碼如下:

"A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, _, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, , ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,  , ¡, ¢, £, ¤, ¥, ¦, §, ¨, ©, ª, «, ¬, ­, ®, ¯, °, ±, ², ³, ´, µ, ¶, ·, ¸, ¹, º, », ¼, ½, ¾, ¿, À, Á, Â, Ã, Ä, Å, Æ, Ç, È, É, Ê, Ë, Ì, Í, Î, Ï, Ð, Ñ, Ò, Ó, Ô, Õ, Ö, ×, Ø, Ù, Ú, Û, Ü, Ý, Þ, ß, à, á, â, ã, ä, å, æ, ç, è, é, ê, ë, ì, í, î, ï, ð, ñ, ò, ó, ô, õ, ö, ÷, ø, ù, ú, û, ü, ý, þ, ÿ"

 

除了前面的 A-Z_a-z 是我們熟悉的,后面的那些亂七八糟的東西竟然也能當作正常的變量名,簡直不可思議。
其實只是PHP拓展了變量名的字符范圍,在 A-Z_a-z 之上,將變量可用字符范圍拓展到了 \x7f-\xff。
所以,第一個字符范圍應該是 [a-zA-Z_\x7f-\xff]
那么第二個字符是否也是這樣能,我們繼續測試下。
將上面 php 代碼里的  eval('$'.$chr."=1;");  改成  eval('$a'.$chr."=1;");  保存測試、

 

復制代碼 代碼如下:

"\x9, \xa, \xd, \x20, \x30, \x31, \x32, \x33, \x34, \x35, \x36, \x37, \x38, \x39, \x41, \x42, \x43, \x44, \x45, \x46, \x47, \x48, \x49, \x4a, \x4b, \x4c, \x4d, \x4e, \x4f, \x50, \x51, \x52, \x53, \x54, \x55, \x56, \x57, \x58, \x59, \x5a, \x5f, \x61, \x62, \x63, \x64, \x65, \x66, \x67, \x68, \x69, \x6a, \x6b, \x6c, \x6d, \x6e, \x6f, \x70, \x71, \x72, \x73, \x74, \x75, \x76, \x77, \x78, \x79, \x7a, \x7f, \x80, \x81, \x82, \x83, \x84, \x85, \x86, \x87, \x88, \x89, \x8a, \x8b, \x8c, \x8d, \x8e, \x8f, \x90, \x91, \x92, \x93, \x94, \x95, \x96, \x97, \x98, \x99, \x9a, \x9b, \x9c, \x9d, \x9e, \x9f, \xa0, \xa1, \xa2, \xa3, \xa4, \xa5, \xa6, \xa7, \xa8, \xa9, \xaa, \xab, \xac, \xad, \xae, \xaf, \xb0, \xb1, \xb2, \xb3, \xb4, \xb5, \xb6, \xb7, \xb8, \xb9, \xba, \xbb, \xbc, \xbd, \xbe, \xbf, \xc0, \xc1, \xc2, \xc3, \xc4, \xc5, \xc6, \xc7, \xc8, \xc9, \xca, \xcb, \xcc, \xcd, \xce, \xcf, \xd0, \xd1, \xd2, \xd3, \xd4, \xd5, \xd6, \xd7, \xd8, \xd9, \xda, \xdb, \xdc, \xdd, \xde, \xdf, \xe0, \xe1, \xe2, \xe3, \xe4, \xe5, \xe6, \xe7, \xe8, \xe9, \xea, \xeb, \xec, \xed, \xee, \xef, \xf0, \xf1, \xf2, \xf3, \xf4, \xf5, \xf6, \xf7, \xf8, \xf9, \xfa, \xfb, \xfc, \xfd, \xfe, \xff"

 

發現結果多了好多字符,其實有一部分我們是要去掉的,比如 \x20 其實就是 空格,相當于  eval('$a =1;');  而已,當然是能正常執行的。
除了空格,還有 \t\r\n 都去掉因為這些也是PHP語法說允許的 \t=\x9,\n=\xa,\r=\xd,所以我們要去掉結果中的前4個數據\x9, \xa, \xd, \x20,
最終得到的結果其實只是多了  \x30, \x31, \x32, \x33, \x34, \x35, \x36, \x37, \x38, \x39  熟悉 ascii 的人也許一眼就看出來了,這就是數字 0-9
所以第一個字符范圍應該是 [\w\x7f-\xff] 對正則不熟的也許會覺得怎么不是 [0-9a-zA-Z_\x7f-\xff],其實 \w 就是 0-9a-zA-Z_

也許有人會說  $$a; ${$a};  這樣的變量呢?
我覺得這個已脫離了變量命名的范圍了,不是么。

好了,關于 php 變量可用字符的知識點分享完畢了,如果有哪說的不對的,請留言,我會及時改正以免誤導大家。

我的猜測: ascii 范圍 0-127(\x00-\x7f), latin1 范圍 0-255(\x00-\xff),也許PHP就是將范圍擴充到 latin1 字符集了,當然我沒看過PHP源碼,只能說是個猜想而已。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国语第一次处破女 | 特级www | 成人嗯啊视频在线观看 | 99精品国产综合久久久久 | 亚洲成色www久久网站 | 99re这里只有精品在线观看 | 114级毛片免费观看 1024亚洲天堂 | 欧美人妖大啪啪 | 污黄在线观看 | 美国女艳星brandilove | 操破苍穹小说 | 国产一区二区三区丶四区 | 国产成人愉拍精品 | 国产精品视频第一页 | 女人爽到喷水的视频免费看 | 免费我看视频在线观看 | gayxxx视频| 91高清在线视频 | 99国产情在线视频 | 9420高清完整版在线观看国语 | 亚洲一区二区福利视频 | 236zz宅宅最新伦理 | 精品无人区麻豆乱码无限制 | 国产一区二区三区久久精品 | а天堂中文最新版在线 | 变态人shou交小说 | 无遮免费网站在线入口 | 超级毛片 | 国产亚洲玖玖玖在线观看 | 午夜福利理论片高清在线 | 亚洲无限 | 婷婷99视频精品全部在线观看 | ady@ady9.映画网| tube62hdxxxx日本 | 99re这里只有精品在线观看 | 免费精品国产在线观看 | 波多野结衣伦理在线观看 | 亚洲国产在线观看免费视频 | 俄罗斯引擎首页进入 | 欧美成人精品福利网站 | 2014天堂 |