新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Linux系統軟件加殼保護技術的改進設計

        Linux系統軟件加殼保護技術的改進設計

        作者: 時間:2012-11-16 來源:網絡 收藏

        是對內核一種很有效的方式。目前下的方法,多是直接繼承Windows 程序的理論和方法,在傳統加殼工具上進行了有限的擴展, 單純在LINUX 下實現的加殼工具還是很少的。如何在 下盡量減少內核信息的暴露,增加有難度的反逆向手段來提升破解難度,對加殼程序進行很好的隱藏,都是目前主要攻克的難題。

        本文引用地址:http://www.104case.com/article/148245.htm

        根據加載外殼程序方式的不同將現有加殼分為:嵌入式、附加式和包含式。嵌入式中最經典的是Upx,支持多種文件類型加殼,且壓縮算法先進。但該方法缺少反動態跟蹤功能,破解者可用動態跟蹤調試方法對Upx 進行破解[1]。文獻[2]中描述了附加式加殼(SELF 加殼):在原elf 文件格式中添加處理安全操作的代碼段,但不內置解壓縮,容易暴漏殼的位置。包含式結合了壓縮和兩種類型的殼,但殼加載的過程中會改變入口地址。結合上述三種加殼方法的優缺點,文章提出了在 系統下一種的加殼保護方法—加殼并重構可執行文件———SRELF[3]。后的算法將殼程序和目標可執行文件中代碼段,數據段等關鍵部分相結合,引入多態變形,使程序呈現出多態性,提高了殼程序的反破解能力,同時還很好的隱藏了加殼的信息。通過實驗證明,后的方法解決了加殼中入口地址易被改變的問題,使得加殼的程序以多態的形式出現,很大程度上提高了反破解的難度。

        1 加殼原理

        加殼實質上就是把一段特殊程序附加到應用程序中,并把程序的執行入口指向附加的特殊殼程序。殼的加載過程如圖1 所示,首先殼程序需要獲得應用程序編程接口———即API 地址。在加殼程序的代碼中用顯示鏈接方式動態的加載所需的API 地址。通過殼程序后,對各個區塊的數據按照定義進行解密;若加殼時用到了壓縮,那么在解密之前先要進行解壓縮,然后將解壓文件映像到指定內存地址中。修改原程序文件的輸入表后填充HOOK—API 表中的代碼地址,間接的獲得程序的控制權,進行校驗和測試完后跳轉到原入口點(OEP)[3]。

        現有的加殼技術方法大多都改變了原有文件結構,在重定位的過程中改變程序的入口地址,加載的過程中把部分程序映射到地址空間中,若破解者知道如何在一個加殼程序中尋址,那么當文件被加載進內存時就可以找到加殼程序的信息。文章針對上述問題,提出了一種改進的加殼方法SRELF。

        2 SRELF 加殼方法

        2.1 SRELF 方法原理

        SRELF———加殼并重構可執行文件,最大特點是重構變形使得重構的程序呈現多態性。首先將目標elf 文件中的核心部分提取出來,然后與準備好的解密或解壓縮程序,反靜態分析和反動態跟蹤程序結合在一起,讓加殼程序呈現出多態變形性,最后遍歷整合程序,按照elf 文件標準格式重新構造一個全新的elf 可執行文件。

        2.2 SRELF 方法實現

        如圖2 所示:SRELF 加殼方法實現的基本程序框圖。首先了解應用程序二進制接口文件(即擴展名為elf 文件)結構。圖3 所示為標準elf 文件的結構圖。從圖中可以看到:一個ELF 頭在文件的開始,保存了路線圖描述了文件組織情況。隨后是一些段(segments)或者一些區段(sections)。段中包含文件運行所需的信息,而保存著object 文件的信息,用于鏈接和重定位。

        第一步:提取目標文件中的核心部分

        提取核心部分的可執行指令、動態鏈接表、段或節等信息。由于匯編程序中存在間接跳轉使得反匯編生成控制流圖中斷,影響了提取核心代碼的準確性,這里引入了一種間接跳轉程序方式[4]。

        1)從殼運行到原始程序的OEP 進行單步向下跟蹤,遇到拋出異常后,修改溢出標志;

        2)分析操作數的類型。若是直接尋址類型,進入4);否則進入3);

        3)找到定義的語句或函數入口,設置CREAT_SUSPENDED計數器,若計數器加一,則將宿主進程作為一個掛起的子進程打開,調用GetThreadContext()獲取子進程初始化線程的上下文;

        4)判斷后的程序進行輸入鎖定,在語句序列上模擬執定義位置與目標間接跳轉運算,對獲取寄存器內容進行復制。使用間接跳轉語句獲取elf 頭文件中的信息后, 定位到GetElfCore 的頭表,然后定位到所需代碼段的核心位置,將其中的數據復制出來。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 安义县| 潢川县| 奉化市| 河西区| 新巴尔虎右旗| 阜新| 宜都市| 永宁县| 南和县| 营山县| 安多县| 新营市| 斗六市| 呼和浩特市| 商水县| 长汀县| 凌源市| 青阳县| 瑞昌市| 东乌珠穆沁旗| 牙克石市| 朝阳县| 丘北县| 封开县| 九江县| 望都县| 隆昌县| 怀远县| 东乡| 海阳市| 商洛市| 武川县| 双流县| 赤城县| 石首市| 定安县| 马关县| 崇礼县| 阿拉善左旗| 子长县| 扶风县|