首页
/
每日頭條
/
科技
/
php解密技巧
php解密技巧
更新时间:2026-01-05 03:42:55

  實驗樣本 http://www.phpjiami.com/

  

  據說“加密效果同行最高”?

  到 http://www.phpjiami.com/phpjiami.html 随意上傳一個 php 文件,然後下載加密後的文件,這就是我們要解密的文件。

  

  簡單分析一下 先看看加密後的文件

  可以看出這是一個正常的 php 文件,隻不過所有的變量名都是亂碼,還真虧了 php 引擎支持任意字符集的變量名,這個加密後的文件變量名的字節部都在 ASCII 範圍以外,全是 0x80以上的字符。

  我們看到中間有一個 php 代碼段結束标簽 ?,而他的前面還有一個 return $xxx;來結束腳本運行,這說明結束标簽後面的數據都不會被正常輸出,後面極可能是源文件加密後的數據,而前面的 php 代碼隻是用來解密的。

  調試之前的準備 這裡使用的 IDE 是 VSCode(最開始我使用的是 PHPStorm,後來我發現 VSCode的效果更好)。首先,安裝 PHP Debug 插件。

  

  然後,按照 htt文件)(4)" />

  然後,執行 php format.php。

  使用這個方法格式化的 php 文件内容并沒有被損壞,我們可以繼續分析了。

  

  如果,還不行,那就隻能用十六進制編輯器查找 ; 和 } 手動替換了,添加 \r\n 了。

  調試 最前面這兩行我們得先注釋掉,不然出了什麼錯誤的話會莫名其妙的。

  error_reporting(0);

  ini_set("display_errors", 0);

  保存。然後完蛋了,代碼又亂了。

  我們需要一個支持非可顯示字符的編輯器,或者...更改顯示編碼,選擇一個不是多字節的字符集,比如 Western (ISO 8859-1)

  

  現在,開始我們的調試。

  在第一行下斷點。執行 php 2.php運行程序。然後單步調試,一邊執行,一邊注意變量的值,分析函數的執行流程。

  

  使用 VSCode的調試功能,我們可以方便的查看變量的具體内容。

  

  單步調試到這一行,似乎有些不對勁。

  

  php_sapi_name() == 'cli' ? die() : '';

  我們用命令行運行的,所以執行完這一句,肯定程序就結束了。

  那就讓他結束吧,我們把這一行注釋掉,在他下面下斷點。重新運行程序。

  下面這行是就是讀取當前文件,這句話沒有什麼問題。

  $f = file_get_contents(constant('rnfzwpch'));

  然後就又是驗證運行環境。

  if(!isset($_SERVER['HTTP_HOST']) !isset($_SERVER['SERVER_ADDR']) !isset($_SERVER['REMOTE_ADDR'])) {

  die();

  }

  注釋掉,保存,重新運行。

  當然,也可以通過調試控制台,執行類似 $_SERVER['HTTP_HOST'] = '127.0.0.1'; 這類指令,來讓驗證通過。

  

  再看下面的代碼,我想到 exe 反調試了,不得不佩服想這個方法的人。防止下斷點調試的,如果下斷點調試,這裡就超過 100 毫秒了。

  $t = microtime(true) * 1000;eval("");if (microtime(true) * 1000 - $t 100) {

  die();

  }

  我們直接在這條語句之後下斷點,讓他們一連串執行完,這樣就不會超過 100 毫秒了。當然,直接注釋掉是最粗暴的方法。

  下面的 eval我們需要通過“單步進入”來研究,不過結果是對我們的影響不大,當然注釋掉也沒問題。

  

  接下來這個就是校驗數據完整性的了

  !strpos(decode_func(substr($f, -45, -1)), md5(substr($f, 0, -46))) ? $undefined1() : $undefined2;

  這裡的$undefined1和 $undefined2都沒有定義。如果驗證失敗,就會調用 $undefined1會直接 Error退出程序。而如果驗證成功,雖然 $undefined2變量不存在,但是隻是一個 Warning,并沒有太大問題。decode_func就是文件中最後一個函數,專門負責字符串解碼的。

  這個驗證方法就是把文件尾部分解密和前面的文件主體部分的 md5 對比,這次執行肯定又不能通過。

  退出程序,注釋掉,再重新運行。

  $decrypted = str_rot13(@gzuncompress(decode_func(substr($f, -2358, -46))));

  我們找到了這個解碼的關鍵語句了,可以看到解密之後的代碼已經出來了。

  

  到了代碼的最後,終于要執行腳本了。

  $f_varname = '_f_';$decrypted = check_and_decrypt(${$f_varname});

  set_include_path(dirname(${$f_varname}));$base64_encoded_decrypted = base64_encode($decrypted);$eval_string = 'eval(base64_decode($base64_encoded_decrypted));';$result = eval($eval_string);

  set_include_path(dirname(${$f_varname}));return $result;

  折騰了半天,還是 eval語句。如何把内容輸出呢。直接在 $decrypted後面加上一行 file_put_contents就可以了。

  

  成果

  通用解密程序 我們可以繼續分析一下他的解密算法

  

  算法是固定的,隻是其中内聯了一個秘鑰,我們隻要通過字符串函數截取出這個秘鑰就可以了。

  

  最後的解碼程序如下。

  

  這個程序可以解密此網站全部免費加密的代碼。

  使用方法:php decrypt.php 1.php

  總結 php 這種動态解釋語言還想加密?做夢去吧。不過混淆還是有可能的。

  這個代碼中的暗樁挺有意思,算是學到了點知識。

  php 這種東西為什麼要加密?php 的開源社區多麼龐大。

  附錄 代碼賞析

  

  

  

  ,

Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
加濕器原理
加濕器原理
加濕器在一些幹燥的地方比較多見,因為幹燥的空氣對人體的皮膚是有一定的傷害,如果置身在幹燥的空氣當中,自己感覺也是會很難受的。使用加濕器的話,大家應該要先了解加濕器的原理,知道加濕器是怎樣工作的,這樣才可以更好的去了解加濕器的用法,對自己有一定的幫助。使用加濕器要注意的是要控制好空氣中的濕度,如果濕度...
2026-01-05
燃氣熱水器
燃氣熱水器
直排式燃氣熱水器在使用的時候,其實和強直排式的熱水器有什麼區别呢。強排式熱水器在使用的時候,是可以使用一些特别長的傳熱管,還有金屬接觸面積特别多的一種熱交換器,工作的原理,其實是将燃燒了之後的氣體熱量很好的傳給金屬片加熱而工作的,希望我們加以了解的。燃氣熱水器的分類其實是比較多的,家用的燃氣快速使用...
2026-01-05
櫃式空調如何清理
櫃式空調如何清理
在清洗之前我們要關閉空調電源,拔去插頭,打開窗戶,保持室内空氣流通。然後取下過濾網,露出散熱片,使用專業的空調消毒劑,充分搖勻,在離散熱片約5厘米處,對準散熱片按上下順序徹底噴洗,噴洗結束後等候15分鐘左右,然後裝好過濾網,蓋上外殼,再運轉空調制冷程序15-30分鐘就可以了。
2026-01-05
電熨鬥漏水
電熨鬥漏水
人們的衣服穿着時間長了,難免會出現褶皺的現象,而解決這個問題最好的方法就是使用電熨鬥進行熨燙,不過現在大多數家庭使用的電熨鬥都是蒸汽式的電熨鬥,雖然在使用的時候非常的方便,但是卻很容易導緻一種情況的出現,就是電熨鬥漏水。那麼,如果是出現這種情況要如何解決呢?蒸汽式的電熨鬥正常工作需要蒸汽孔和水箱保持...
2026-01-05
燃氣熱水器不打火
燃氣熱水器不打火
現在的家庭裡,隻要是安裝天然氣的,家裡的熱水器都不會使用耗電的熱水器,畢竟電費要比燃氣費貴出很多。不過在使用燃氣熱水器的時候,很容易出現一種問題,比較讓人惱火,就是燃氣熱水器不打火的情況。為了幫你解決這個問題,在這裡就為您介紹一下燃氣熱水器不打火的可能性。燃氣熱水器不打火是非常常見的一種問題,而導緻...
2026-01-05
Copyright 2023-2026 - www.tftnews.com All Rights Reserved