<progress id="yueoz"><code id="yueoz"><xmp id="yueoz">

      1. 吾愛破解 - LCG - LSG |安卓破解|病毒分析|www.13ee.cn

         找回密碼
         注冊[Register]

        QQ登錄

        只需一步,快速開始

        搜索
        查看: 1356|回復: 32
        上一主題 下一主題

        [調試逆向] php解混淆加密:簡單說明一下,具體是什么加密我也不知道,可能是phpjm2

        [復制鏈接]
        跳轉到指定樓層
        樓主
        芊雨千尋 發表于 2020-6-22 22:19 回帖獎勵
        本人php水平比較爛,由于在PU系干了多年二次開發導致水平很不行啊。也不會vscode+xdebug進行調試,純粹是在網上找的。外加自己寫的。代碼比較爛,希望不要批評。
        昨天買了一套源碼,發現商家加密了,想更改改不了;藥讐K錢使用了網上破解平臺,破解了7個文件,發現源碼里還有好多加密文件,實在不想花錢了,窮,自己研究了一下。寫的文檔也不好,我已經不知道我寫的是啥了,大家見諒。最后我寫了一個解碼文件。
        ———————————言歸正傳*手動分析過程—————————————
        此加密方式我也不知道叫啥,有的php解密平臺顯示phpjm2、zym、新版phpjm我也不知道是那個,知道的可以評論我改一下標題。
        加密文件里面有#!/usr/bin/php -q標識和一堆類似于base64代碼,以及混淆的亂碼變量。

        加密文件如下圖:
        install.rar (4.01 KB, 下載次數: 11) (install.php 加密前的完整源碼文件)。
        變量比較雜亂,手動分析,那里是換行,都不知道,不過在網上看到。
        phpjm的函數變量命名都是 \$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* 這個范圍的。
        來源:https://blog.csdn.net/sbdx/article/details/70677197  提供的代碼無法解密,不過我使用了他一小部分代碼。
        [PHP] 純文本查看 復制代碼
        <?php
        $filename='install'; //文件名,不要添加后綴
        $str = file_get_contents("$filename.php");
        preg_match_all('|[a-zA-Z_\x7f-\xff][\w\x7f-\xff]*|', $str, $params) or die('err 1.');
        $params = array_unique($params[0]); // 去重復
        $replace = array();
        foreach ($params as $k=>$v){
            if(preg_match('/[a-zA-Z_]+/',$v,$re)){//過濾掉正常的英文變量名
                unset($params[$k]);
        		continue;
            }
            $replace[] = 'MD5_'.md5($v);
        }
        $str = str_replace($params, $replace, $str);
        file_put_contents($filename."_2.php", $str);  //新生成一個文件
        echo 'Done.';
        exit();
        

        通過上述代碼,把比較亂的混淆文件變成了新文件install_2.php,如下圖一樣。電腦顯示器小,截圖接不全面,盡量口述了


        格式化一下源代碼,手動調試就很方便了。

        __FILE__ 改成最原始文件的路徑,因為新文件發生改變偏移也改變了。


        把eval的變量存儲一個新的文件 install_3.php。

        又獲得一個新的混淆亂碼文件install_3.php。

        通過最上面的php代碼把install_3.php這個混淆文件,在變成一個稍微正常點的新文件install_3_2.php。

        繼續php代碼格式化一下,接著手動分析。

        紅框內都是判斷,IP,域名,使用時間,是不是命令行調試php,如果相應信息不匹配,就會實行一個 @MD5_7e42a98c08b947087c388b9b3318d52b();  不存在的方法,達到不顯示錯誤且終止運行的目的。
        把所有@MD5_7e42a98c08b947087c388b9b3318d52b(); 已@開頭的方法,替換成NULL; 這樣就不會影響下面獲取最終源碼了。

        這個文件中有很多參數給,最終混淆源碼文件用的,每一次混淆加密之間都有關聯,有點惡心啊。
        把eval的變量存儲一個新的文件 install_4.php,需要install_2.php中的函數和變量依賴引用進來。

        獲得最終亂碼文件install_4.php。

        給install_4.php整整容,通過上面的源碼,變成一個正常文件install_4_2.php。

        這就是最終的內容,很多依賴都是上面的文件中的參數。手動通過上面解析出來的參數和方法替換一下,就是源文件了,有些變量不可逆的,但是不影響使用。

        ---------------------肯定不少人聽我說的云里霧里*沒辦法敘述就是這樣啊-------------------------------
        最后我把我自己寫的巨丑的解碼文件,分享出來。寫完我就要睡覺去了,農村父母睡覺早啊。
        大佬通道: phpjm.rar (898 Bytes, 下載次數: 22)
        [PHP] 純文本查看 復制代碼
        <?php
        $filename='FirstendAction.class';//文件名 不要后綴
        $str = file_get_contents("$filename.php");
        preg_match_all('|[a-zA-Z_\x7f-\xff][\w\x7f-\xff]*|', $str, $params) or die('err 1.');
        $params = array_unique($params[0]); // 去重復
        $replace = array();
        foreach ($params as $k=>$v){
            if(preg_match('/[a-zA-Z_]+/',$v,$re)){//過濾掉正常的英文變量名
                unset($params[$k]);
        		continue;
            }
            $replace[] = 'MD5_'.md5($v);
        }
        $str = str_replace($params, $replace, $str);
        $file_url = str_replace("\\", "/", dirname(__FILE__))."/$filename.php";
        $str = str_replace('__FILE__',"'$file_url'", $str);
        $str = str_replace('return(eval(',"\$aaa=((", $str);
        $str = str_replace(' ?>','return $aaa; ?>', $str);
        $str = str_replace('<?php ','', $str);
        $str_array = explode(' ?>',$str);
        //print_r($str_array[0]);
        $cc = eval($str_array[0]);
        
        preg_match_all('|[a-zA-Z_\x7f-\xff][\w\x7f-\xff]*|', $cc, $params) or die('err 1.');
        $params = array_unique($params[0]); // 去重復
        $replace2 = array();
        foreach ($params as $k=>$v){
            if(preg_match('/[a-zA-Z_]+/',$v,$re)){//過濾掉正常的英文變量名
                unset($params[$k]);
        		continue;
            }
            $replace2[] = 'MD5_'.md5($v);
        }
        $str = str_replace($params, $replace2, $cc);
        //$str = str_replace('{', '{/*', $str);
        //$str = str_replace('}', '*/}', $str);
        $str = str_replace('return(eval(',"\$bbb=((", $str);
        $str = str_replace(' ?>','return $bbb;', $str);
        
        preg_match_all('|\@MD5\_[a-z0-9]{32}\(\);|', $str, $params) or die('cccc');
        $params = array_unique($params[0]); // 去重復
        $str = str_replace($params, 'NULL;', $str);
        
        $dd = eval($str);
        
        preg_match_all('|[a-zA-Z_\x7f-\xff][\w\x7f-\xff]*|', $dd, $params) or die('err 1.');
        $params = array_unique($params[0]); // 去重復
        $replace3 = array();
        foreach ($params as $k=>$v){
            if(preg_match('/[a-zA-Z_]+/',$v,$re)){//過濾掉正常的英文變量名
                unset($params[$k]);
        		continue;
            }
            $replace3[] = 'MD5_'.md5($v);
        }
        $str = str_replace($params, $replace3, $dd);
        $str = str_replace(';?><?php','<?php', $str);
        
        preg_match_all('|MD5\_[a-z0-9]{32}\(\'.*?\',\'.*?\'\)|', $str, $params) or die('cccc');
        $params1 = array_unique($params[0]); // 去重復
        $replace_a1 = array();
        foreach ($params1 as $v){
        	eval("\$replace_a1[]=\"'\".".$v.".\"'\";");
        }
        $str = str_replace($params1, $replace_a1, $str);
        
        //print_r($replace_a1);
        //exit();
        preg_match_all('|\$GLOBALS\[\'MD5\_[a-z0-9]{32}\'\]\[\'MD5\_[a-z0-9]{32}\'\]|', $str, $params) or die('cccc');
        $params2 = array_unique($params[0]); // 去重復
        
        $replace_a2 = array();
        foreach ($params2 as $v){
        	eval("\$replace_a2[]=".$v.";");
        }
        //print_r($replace_a2);
        //exit();
        $str = str_replace($params2, $replace_a2, $str);
        
        //print_r($params2);
        echo $str;
        file_put_contents($filename.".de.php", $str);
        echo 'Done.';
        
        //print_r($GLOBALS);
        
        //print_r($params);
        //echo $str;


        使用說明:
        把上面代碼保存一個文件,與需要解密的文件放在同一個目錄。
        修改$finame使用文件名,使用瀏覽器訪問保存的這個解密文件,會生成一個 “文件名.de.php”的新文件。
        $filename='FirstendAction.class';//文件名 不要后綴
        ————————————————————————
        給大家看看,付費解密的和我手動解密的文件對比
        付費平臺解密的源文件

        自己解密的源文件(沒格式化)

        免費評分

        參與人數 8威望 +1 吾愛幣 +29 熱心值 +7 收起 理由
        vistal + 1 + 1 我很贊同!
        a472691 + 1 我很贊同!
        j8250347 + 1 + 1 用心討論,共獲提升!
        Hmily + 1 + 20 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
        yongkun + 1 + 1 用心討論,共獲提升!
        濤之雨 + 3 + 1 用心討論,共獲提升!
        zpy2 + 1 + 1 謝謝@Thanks!
        kk1212 + 1 + 1 謝謝@Thanks!

        查看全部評分

        本帖被以下淘專輯推薦:

        發帖前要善用論壇搜索功能,那里可能會有你要找的答案或者已經有人發布過相同內容了,請勿重復發帖。

        推薦
        saobee 發表于 2020-6-22 22:57
        思路就是把非正常字符集的變量名或方法名替換成可以勉強看明白的代碼,再一層層的解
        推薦
         樓主| 芊雨千尋 發表于 2020-6-24 10:42 |樓主
        vistal 發表于 2020-6-24 10:31
        哦哦好的謝謝大佬 這個您能解嗎 我想解密 收F也行啊

        不想解了,費事費力啊。
        你可以把下面的這個代碼,把變量轉換成可識別的。
        [PHP] 純文本查看 復制代碼
        <?php
        $filename='install'; //文件名,不要添加后綴
        $str = file_get_contents("$filename.php");
        preg_match_all('|[a-zA-Z_\x7f-\xff][\w\x7f-\xff]*|', $str, $params) or die('err 1.');
        $params = array_unique($params[0]); // 去重復
        $replace = array();
        foreach ($params as $k=>$v){
            if(preg_match('/[a-zA-Z_]+/',$v,$re)){//過濾掉正常的英文變量名
                unset($params[$k]);
                continue;
            }
            $replace[] = 'MD5_'.md5($v);
        }
        $str = str_replace($params, $replace, $str);
        file_put_contents($filename."_2.php", $str);  //新生成一個文件
        echo 'Done.';
        exit();

        然后一定一點的手動分析
        沙發
        Cyntec 發表于 2020-6-22 22:46
        4#
        kk1212 發表于 2020-6-22 23:09
        大佬,厲害!
        5#
        kingwl 發表于 2020-6-23 00:17
        厲害,不過一開始就格式化一下會不會好處理?
        6#
        濤之雨 發表于 2020-6-23 06:16
        本帖最后由 濤之雨 于 2020-6-23 06:19 編輯

        哈哈,
        樓主辛苦了。
        巧了,最近在杠jsjiami,v6的。。。
        這玩意能把三句話給“加密”到25k。。。
        手動拆開一看,注入的定時器,cookie,正則表達式(防止一鍵格式化,需要手動格式化。。。),花指令,方法抽取,多層嵌套
        解密這玩意是真的費勁

        樓主這寫的調試過程再詳細一點,再多配幾張圖應該會精華帖吧
        過程有點省略的太多了
        7#
         樓主| 芊雨千尋 發表于 2020-6-23 06:59 |樓主
        kingwl 發表于 2020-6-23 00:17
        厲害,不過一開始就格式化一下會不會好處理?

        最開始格式化會亂啊,我用兩個編輯器顯示的亂碼字符串
        8#
         樓主| 芊雨千尋 發表于 2020-6-23 07:03 |樓主
        濤之雨 發表于 2020-6-23 06:16
        哈哈,
        樓主辛苦了。
        巧了,最近在杠jsjiami,v6的。。。

        不行啊電腦截圖不全,太費事了,大家就湊合看吧,最后分享的解密文件,如果看的懂,就是我解密的思路了,其實把最開始混淆的文件變成正常的變量文件,自己手動解就快很多了
        9#
         樓主| 芊雨千尋 發表于 2020-6-23 07:06 |樓主
        Cyntec 發表于 2020-6-22 22:46
        大佬,要的是解密思路啊....

        不想在改這文檔了,好費事寫文檔好久,就是把混淆文件改成正常文件,一步一步手動解密的,可以直接下載我最后共享的文件,那個就是我手動解密的思路。
        10#
         樓主| 芊雨千尋 發表于 2020-6-23 07:08 |樓主
        saobee 發表于 2020-6-22 22:57
        思路就是把非正常字符集的變量名或方法名替換成可以勉強看明白的代碼,再一層層的解

        少俠,就是這樣把比較亂的變量文件替換成正常的,然后手動解密,之所以用md5命名,就是上下加密文檔有依賴,直接搜索md5值就找到了
        您需要登錄后才可以回帖 登錄 | 注冊[Register]

        本版積分規則 警告:本版塊禁止灌水或回復與主題無關內容,違者重罰!

        快速回復 收藏帖子 返回列表 搜索

        RSS訂閱|小黑屋|聯系我們|吾愛破解 - LCG - LSG ( 京ICP備16042023號 | 京公網安備 11010502030087號 )

        GMT+8, 2020-6-28 21:03

        Powered by Discuz!

        Copyright © 2001-2020, Tencent Cloud.

        快速回復 返回頂部 返回列表
        快三开奖结果