通用加密php檔案還原方法

來源:互聯網
上載者:User
前面一篇文章 實戰還原PHP加密檔案 說到我發現了PHP加密檔案方式的不足,所以才有了這篇文章。

背景分析

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

所以PHP的加密方式一般有兩種:混淆和加密。

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

加密分為兩種方式執行:一種是有擴充(Loader)。 另外一種是無擴充。

首先講講無擴充的加密方式。這種加密方式非常的無腦,因為他的解密過程是公開的,而且得利用已知的PHP函數。加密之後的代碼一般類似下面:

即使看起來非常複雜的:

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

另外一種有擴充方式就比較複雜了。擴充在這裡的作用主要是解密跟執行代碼,相比無擴充的形式他將解密跟執行的程式碼後置在擴充裡,所以破解較為複雜。

這裡的擴充一般分為兩種類型的:1、提供解密執行函數的。2、直接覆蓋 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 **/

在php檔案夾下執行:

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

4.如果順利的話PHP已經安裝成功了。

5.我們寫兩個測試檔案:作用是: test.php 執行它去加密 before.php 產生 after.php。

//test.php
//before.php

7.執行以下 php test.php 接著在執行 php after.php。

下面就看吧:

總結

1、沒有破不了的密碼。我們能做的只是增加破解時間。如果這個破解時間大於一個人的壽命,那麼這個加密方式肯定是成功的。
2、對於加密的程式,就像破解者需要瞭解、猜測編寫者的思路一樣,編寫者也需要去瞭解破解者的方法、手段。這樣才能寫出破解難度更高的程式。
3、相比加密我覺得混淆更適合php原始碼的“加密”。
4、如果你的php代碼想要加密發布出去,最好的方式還是提高收費然後直接源碼提供。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.