<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Linux軟件加殼保護技術(shù)的改進(jìn)

Linux軟件加殼保護技術(shù)的改進(jìn)

作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò ) 收藏

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

本文引用地址:http://dyxdggzs.com/article/201610/305669.htm

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

1 加殼原理

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

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

2 SRELF 加殼方法

2.1 SRELF 方法原理

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

2.2 SRELF 方法實(shí)現

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

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

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

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

2)分析操作數的類(lèi)型。若是直接尋址類(lèi)型,進(jìn)入4);否則進(jìn)入3);

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

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

第二步:對提取的核心代碼加密并結合多態(tài)變形技術(shù)

采用進(jìn)程注入加密技術(shù),逆向阻止脫殼軟件附加在受保護的進(jìn)程上。先讓CONTEXT.EBX 獲取子進(jìn)程的PEB 地址,讀出PEB 子進(jìn)程的映像地址后,將基礎地址參數指向檢索到的映像基址,最終完成對各種外部中斷的監視工作。對加密后的核心代碼進(jìn)多態(tài)變形技術(shù)改進(jìn),讓其改變自身代碼,從而使搜索字符串的識別技術(shù)失去效果。文章采用的代碼變換加密壓縮來(lái)隱藏自身,為了防止搜索字符串的方法檢測到,解密代碼引動(dòng)代碼模塊,程序將其插入其本身,調用代碼模塊中包含的函數,移動(dòng)例程周?chē)闹噶?,隨機增加無(wú)用的指令,使用不同的寄存器和操作碼,使得解密例程對應的二進(jìn)制代碼在不同的感染體內完全不一樣[5]。多態(tài)變形引擎過(guò)程如圖4 所示。

第三步:將目標文件的核心部分和加殼部分整合

整合目標文件的核心部分和加殼部分需要進(jìn)行精確的計算,設置正確的elf 文件頭、程序頭表、節頭表等的數據。這樣新生成的elf 文件才能正常運行。在整合elf 等數據時(shí)采用遍歷整合的方法,對前面提取的的核心代碼塊逐一進(jìn)行分析。采用循環(huán)回繞整合加殼后的核心代碼。

1)先設立一個(gè)狀態(tài)表,記錄每個(gè)變量的狀態(tài)類(lèi)型。記錄物理文件的大小和載入內存所占內存的大小。首先執行函數的初始狀態(tài),將除去入口函數的所有函數都設置為untainted。若一個(gè)變量在多個(gè)正向前序代碼段的狀態(tài)表中出現,則重新計算其大小,并更新?tīng)顟B(tài)表。


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>