通用加密php文件還原方法

只是技術交流,並無惡意,請不要濫用此技術。若是有疑問歡迎跟我交流。php

前面一篇文章 實戰還原PHP加密文件 說到我發現了PHP加密文件方式的不足,因此纔有了這篇文章。node

背景分析

衆所周知 PHP 是一種腳本語言,腳本語言主要是使用解釋運行而非編譯運行。因此相對於編譯型語言(C、C#、C++),它沒有直接生成exedll的能力。因此傳統型的加密方式加殼它使用不上。linux

因此PHP的加密方式通常有兩種:混淆和加密。git

混淆這種嚴格意義上不算加密,這種代碼就像用拼音縮寫命名變量的代碼,只是你看起來費勁了點。這種不在咱們討論範圍。github

加密分爲兩種方式執行:一種是有擴展(Loader)。 另一種是無擴展。小程序

首先講講無擴展的加密方式。這種加密方式很是的無腦,由於他的解密過程是公開的,並且得利用已知的PHP函數。加密以後的代碼通常相似下面:segmentfault

<?php
eval(base64_decode("cGhwaW5mbygpOw=="));

即便看起來很是複雜的:微信小程序

jm2.jpg

也不過是上面的變式而已。像這種解密形式公開的很是好破解,只要找到 eval 改爲 echo 就行微信

另一種有擴展方式就比較複雜了。擴展在這裏的做用主要是解密跟執行代碼,相比無擴展的形式他將解密跟執行的代碼隱藏在擴展裏,因此破解較爲複雜。app

這裏的擴展通常分爲兩種類型的:一、提供解密執行函數的。二、直接覆蓋 zend_compile_file 實現解析自定義的php文件功能。

第一種最典型的例子就是我上篇文章提到的 zoeeyguard,主要使用了 zend_eval_string 這個函數來執行php代碼。

第二種表明的有:Zend Guard 和 鬆哥的 php-beast

能夠說兩種破解思路都差很少。能夠優先嚐試我上一篇文章裏面的思路。

固然若是我上一篇沒有解決的狀況下怎麼辦呢?

這個時候就須要奉上大殺器了。

你會發現我在前文一直說到兩個的函數 zend_compile_file 和 zend_eval_string,有些聰明的phper已經想到了,對!思路仍是 只要找到 eval 改爲 echo 就行

實戰例子

我們不能光打嘴炮,光說不作。來個例子:

此次我們拿鬆哥的 php-beast 來下手。鬆哥的代碼寫得很是漂亮,知道 AES DES 解密耗費時間還寫了個 Cache 。

1.下載 linux 的 php 源碼包(版本最好在5.6跟5.5之間選擇一個,7不支持,BTW:7的改動仍是挺大的,不少東西都沒兼容,Zend Guard 也不支持7。這裏我走了彎路。)

2.找到文件 Zendzend_language_scanner.c 中的函數:zend_op_array *compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) 大概在500多行的樣子,將以下的代碼加在前面(代碼寫得爛,切勿吐槽):

ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type TSRMLS_DC)
{
    zend_lex_state original_lex_state;
    zend_op_array *op_array = (zend_op_array *) emalloc(sizeof(zend_op_array));
    zend_op_array *original_active_op_array = CG(active_op_array);
    zend_op_array *retval=NULL;
    int compiler_result;
    zend_bool compilation_successful=0;
    znode retval_znode;
    zend_bool original_in_compilation = CG(in_compilation);

    /** BEGIN **/
    //加在這裏的含義就是每次php編譯php源碼的時候都把這份源碼打印一份
    char *buf;
    size_t size;
    zend_stream_fixup(file_handle, &buf, &size);
    printf("\n#######\nFILE TYPE: %d  FILE NAME: %s CONTENT: %s\n#######\n", (*file_handle).type, (*file_handle).filename, buf);
    /** END **/
  1. 在php文件夾下執行:

//節省點時間
./configure --disable-ipv6 --disable-all
make
make install

4.若是順利的話PHP已經安裝成功了。

5.咱們寫兩個測試文件:
做用是: test.php 執行它去加密 before.php 生成 after.php。

//test.php
<?php
$path = __DIR__ . '/before.php';
$newPath = __DIR__ . '/after.php';
$result = beast_encode_file($path, $newPath, 0, BEAST_ENCRYPT_TYPE_DES);
var_dump($result);
//before.php
<?php
print 'http://wx-app.com.cn/' . PHP_EOL;

7.執行如下 php test.php 接着在執行 php after.php。

下面就看截圖吧:

執行加密

after.php 已經看不出源碼的樣子

執行after.php 成功獲得源碼

總結

一、沒有破不了的密碼。咱們能作的只是增長破解時間。若是這個破解時間大於一我的的壽命,那麼這個加密方式確定是成功的。
二、對於加密的程序,就像破解者須要瞭解、猜想編寫者的思路同樣,編寫者也須要去了解破解者的方法、手段。這樣才能寫出破解難度更高的程序。
三、相比加密我以爲混淆更適合php源代碼的「加密」。
四、若是你的php代碼想要加密發佈出去,最好的方式仍是提升收費而後直接源碼提供。

廣告

若是你以爲好 隨便支持一點吧

若是您以爲寫的好,隨便支持一點吧!

http://wx-app.com.cn 是一個微信小程序的資訊站點。

相關文章
相關標籤/搜索