當前位置:首頁 » 編程軟體 » 編譯器堆棧保護安卓

編譯器堆棧保護安卓

發布時間: 2022-05-30 06:23:05

Ⅰ 什麼是堆棧及堆棧的作用是什麼

在計算機領域,堆棧是一個不容忽視的概念,堆棧是兩種數據結構。堆棧都是一種數據項按序排列的數據結構,只能在一端(稱為棧頂(top))對數據項進行插入和刪除。在單片機應用中,堆棧是個特殊的存儲區,主要功能是暫時存放數據和地址,通常用來保護斷點和現場。要點:堆,隊列優先,先進先出 。棧,先進後出(First-In/Last-Out)。

1. 棧(stack)與堆(heap)都是Java用來在Ram中存放數據的地方。與C++不同,Java自動管理棧和堆,程序員不能直接地設置棧或堆。
2. 棧的優勢是,存取速度比堆要快,僅次於直接位於CPU中的寄存器。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。另外,棧數據可以共享,詳見第3點。堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由於要在運行時動態分配內存,存取速度較慢。
3.Java中的數據類型有兩種。
一種是基本類型(primitivetypes), 共有8種,即int,short, long, byte, float, double, boolean, char(注意,並沒有string的基本類型)。這種類型的定義是通過諸如int a= 3; long b = 255L;的形式來定義的,稱為自動變數。值得注意的是,自動變數存的是字面值,不是類的實例,即不是類的引用,這里並沒有類的存在。如int a= 3; 這里的a是一個指向int類型的引用,指向3這個字面值。這些字面值的數據,由於大小可知,生存期可知(這些字面值固定定義在某個程序塊裡面,程序塊退出後,欄位值就消失了),出於追求速度的原因,就存在於棧中。

Ⅱ 有安卓手機端的c語言編譯器嗎

有一款叫做「c4droid」的軟體可以在安卓手機上編譯c語言。

Ⅲ 我在安卓手機上用C4droid編寫C語言程序,編譯器是GCC+Bionic,定義普通的字元串cha

手機上的編譯器有很多缺陷,盡量用電腦吧

Ⅳ 堆棧的功能,操作過程和特點

堆棧其實是數據結果中的兩個概念 ,是存放數據的方式,堆:順序隨意;棧:後進先出(Last-In/First-Out)。要說用處,那就是在寫代碼的時候,有時數據存取肯定是要有規定的順序的,這個是你自己規定的,然後按照你所寫程序的用處的特點來用堆還是棧還是隊列之類的順序 追問: 程序設計時,為什麼要對堆棧指針SP重新賦值? 回答: 這不是初始化嘛
堆棧是個特殊的存儲區,主要功能是暫時存放數據和地址,通常用來保護斷點和現場。它的特點是按照先進後出的原則存取數據,這里的進與出是指進棧與出棧操作。
80C51片內RAM的部分單元可以用做堆棧。有一個8位的堆棧指針寄存器SP,專用於指出當前堆棧頂部是片內RAM的哪一個單元。80C51單片機系統復位後SP的初值為07H,也就是將從內部RAM的08H單元開始堆放信息。
但是,80C51系列的棧區不是固定的,只要通過軟體改變SP寄存器的值便可更動棧區。為了避開工作寄存器區和位定址區,SP的初值可置為2FH或更大的地址值。如果CPU在操作中要使用兩組工作寄存器,如果不使用位變數,SP的初值至少應為0FH或更大的值;如果使用位變數,SP的初值至少應為2FH或更大的值;KeilC51編譯器會自動計算SP的初始設定值,無需編程者關心。

Ⅳ 安卓開發用什麼編譯器………

android studio以及eclipse

Android Studio 是一個Android開發環境,基於IntelliJ IDEA. 類似 Eclipse ADT,Android Studio 提供了集成的 Android 開發工具用於開發和調試。
而Eclipse 是一個開放源代碼的、基於Java的可擴展開發平台。就其本身而言,它只是一個框架和一組服務,用於通過插件組件構建開發環境。幸運的是,Eclipse 附帶了一個標準的插件集,包括Java開發工具(Java Development Kit,JDK)。

Ⅵ IAR編譯器調試時出現如下警告(堆棧指針超出范圍)請問怎麼解決啊

極有可能是數組越界了,或者申請了空間沒有釋放。總之是指針的問題,你好好查查

Ⅶ 網路安全-----緩沖區溢出的保護方法有哪些

目前有四種基本的方法保護緩沖區免受緩沖區溢出的攻擊和影響。

編寫正確的代碼 非執行的緩沖區 數組邊界檢查 程序指針完整性檢查

一、編寫正確的代碼 Top

編寫正確的代碼是一件非常有意義但耗時的工作,特別像編寫C語言那種具有容易出錯傾向的程序(如:字元串的零結尾),這種風格是由於追求性能而忽視正確性的傳統引起的。盡管花了很長的時間使得人們知道了如何編寫安全的程序組具有安全漏洞的程序依舊出現。因此人們開發了一些工具和技術來幫助經驗不足的程序員編寫安全正確的程序。

最簡單的方法就是用grep來搜索源代碼中容易產生漏洞的庫的調用,比如對strcpy和sprintf的調用,這兩個函數都沒有檢查輸入參數的長度。事實上,各個版本C的標准庫均有這樣的問題存在。為了尋找一些常見的諸如緩沖區溢出和操作系統競爭條件等漏洞,一些代碼檢查小組檢查了很多的代碼。然而依然有漏網之魚存在。盡管採用了strcpy和sprintf這些替代函數來防止緩沖區溢出的發生,但是由於編寫代碼的問題,仍舊會有這種情況發生。比如lprm程序就是最好的例子,雖然它通過了代碼的安全檢查,但仍然有緩沖區溢出的問題存在。

為了對付這些問題,人們開發了一些高級的查錯工具,如faultinjection等。這些工具的目的在於通過人為隨機地產生一些緩沖區溢出來尋找代碼的安全漏洞。還有一些靜態分析工具用於偵測緩沖區溢出的存在。雖然這些工具可以幫助程序員開發更安全的程序,但是由於C語言的特點,這些工具不可能找出所有的緩沖區溢出漏洞。所以,偵錯技術只能用來減少緩沖區溢出的可能,並不能完全地消除它的存在,除非程序員能保證他的程序萬元一失。

二、非執行的緩沖區 Top

通過使被攻擊程序的數據段地址空間不可執行,從而使得攻擊者不可能執行被植入被攻擊程序輸入緩沖區的代碼,這種技術被稱為非執行的緩沖區技術。事實上,很多老的Unix系統都是這樣設計的,但是近來的Unix和MS Windows系統為實現更好的性能和功能,往往在數據段中動態地放人可執行的代碼。所以為了保持程序的兼容性不可能使得所有程序的數據段不可執行。但是我們可以設定堆棧數據段不可執行,這樣就可以最大限度地保證了程序的兼容性。Linux和Solaris都發布了有關這方面的內核補丁。因為幾乎沒有任何合的
程序會在堆棧中存放代碼,這種做法幾乎不產生任何兼容性問題,除了在Linux中的兩個特例,這時可執行的代碼必須被放入堆棧中:

1.信號傳遞

Linux通過向進程堆棧釋放代碼然後引發中斷來執行在堆棧中的代碼進而實現向進程發送Unix信號.非執行緩沖區的補丁在發送信號的時候是允許緩沖區可執行的.

2.GCC的在線重用

研究發現gcc在堆棧區里放置了可執行的代碼以便在線重用。然而,關閉這個功能並不產生任何問題.只有部分功能似乎不能使用。非執行堆棧的保護可以有效地對付把代碼植入自動變數的緩沖區溢出攻擊,而對於其他形式的攻擊則沒有效果。通過引用一個駐留
的程序的指針,就可以跳過這種保護措施。其他的攻擊可以採用把代碼植入堆或者靜態數據段中來跳過保護。

三、數組邊界檢查 Top

植入代碼引起緩沖區溢出是一個方面,擾亂程序的執行流程是另一個方面。不像非執行緩沖區保護,數組邊界檢查完全沒有了緩沖區溢出的產生和攻擊。這樣,只要數組不能被溢出,溢出攻擊也就無從談起。為了實現數組邊界檢查,則所有的對數組的讀寫操作都應當被檢查以確保對數組的操作在正確的范圍內。最直接的方法是檢查所有的數組操作,但是通常可以來用一些優化的技術來減少檢查的次數。目前有以下的幾種檢查方法:

1、Compaq C編譯器

Compaq公司為Alpha CPU開發的C編譯器支持有限度的邊界檢查(使用—check_bounds參數)。這些限制是:只有顯示的數組引用才被檢查,比如「a[3]」會被檢查,而「*(a
+3)"則不會。由於所有的C數組在傳送的時候是指針傳遞的,所以傳遞給函數的的數組不會被檢查。帶有危險性的庫函數如strcpy不會在編譯的時候進行邊界檢查,即便是指定了邊界檢查。在C語言中利用指針進行數組操作和傳遞是非常頻繁的,因此這種局限性是非常嚴重的。通常這種邊界檢查用來程序的查錯,而且不能保證不發生緩沖區溢出的漏洞。

2、Jones&Kelly:C的數組邊界檢查

Richard Jones和Paul Kelly開發了一個gcc的補丁,用來實現對C程序完全的數組邊界檢查。由於沒有改變指針的含義,所以被編譯的程序和其他的gcc模塊具有很好的兼容性。更進一步的是,他們由此從沒有指針的表達式中導出了一個「基」指針,然後通過檢查這個基指針來偵測表達式的結果是否在容許的范圍之內。當然,這樣付出的性能上的代價是巨大的:對於一個頻繁使用指針的程序,如向量乘法,將由於指針的頻繁使用而使速度慢30倍。這個編譯器目前還很不成熟,一些復雜的程序(如elm)還不能在這個上面編譯、執行通過。然而在它的一個更新版本之下,它至少能編譯執行ssh軟體的加密軟體包,但其實現的性能要下降12倍。

3、Purify:存儲器存取檢查

Purify是C程序調試時查看存儲器使用的工具而不是專用的安全工具。Purify使用"目標代碼插入"技術來檢查所有的存儲器存取。通過用Purify連接工具連接,可執行代碼在執行的時候帶來的性能的損失要下降3—5倍。

4、類型——安全語言

所有的緩沖區溢出漏洞都源於C語言的類型安全。如果只有類型—安全的操作才可以被允許執行,這樣就不可能出現對變數的強制操作。如果作為新手,可以推薦使用具有類型—安全的語言如JAVA和ML。

但是作為Java執行平台的Java虛擬機是C程序.因此攻擊JVM的一條途徑是使JVM的緩沖區溢出。因此在系統中採用緩沖區溢出防衛技術來使用強制類型—安全的語言可以收到預想不到的效果。

四、程序指針完整性檢查 Top

程序指針完整性檢查和邊界檢查有略微的不同。與防止程序指針被改變不同,程序指針完整性檢查在程序指針被引用之前檢測到它的改變。因此,即便一個攻擊者成功地改變程序的指針,由於系統事先檢測到了指針的改變,因此這個指針將不會被使用。與數組邊界檢查相比,這種方法不能解決所有的緩沖區溢出問題;採用其他的緩沖區溢出方法就可以避免這種檢測。但是這種方法在性能上有很大的優勢,而且兼容性也很好。

l、手寫的堆棧監測

Snarskii為FreeBSD開發丁一套定製的能通過監測cpu堆棧來確定緩沖區溢出的libc。這個應用完全用手工匯編寫的,而且只保護libc中的當前有效紀錄函數.這個應用達到了設計要求,對於基於libc庫函數的攻擊具有很好的防衛,但是不能防衛其它方式的攻擊.

2、堆棧保護

堆棧保護是一種提供程序指針完整性檢查的編譯器技術.通過檢查函數活動紀錄中的返回地址來實現。堆棧保護作為gcc的一個小的補丁,在每個函數中,加入了函數建立和銷毀的代碼。加入的函數建立代碼實際上在堆棧中函數返回地址後面加了一些附加的位元組。而在函數返回時,首先檢查這個附加的位元組是否被改動過,如果發生過緩沖區溢出的攻擊,那麼這種攻擊很容易在函數返回前被檢測到。但是,如果攻擊者預見到這些附加位元組的存在,並且能在溢出過程中同樣地製造他們.那麼它就能成功地跳過堆棧保護的檢測。通常.我們有如下兩種方案對付這種欺騙:

1.終止符號

利用在C語言中的終止符號如o(null,CR,LF,—1(Eof)等這些符號不能在常用的字元串函數中使用,因為這些函數一旦遇到這些終止符號,就結束函數過程了。

2.隨機符號

利用一個在函數調用時產生的一個32位的隨機數來實現保密,使得攻擊者不可能猜測到附加位元組的內容.而且,每次調用附加位元組的內容都在改變,也無法預測。通過檢查堆棧的完整性的堆棧保護法是從Synthetix方法演變來的。Synthetix方法通過使用准不變數來確保特定變數的正確性。這些特定的變數的改變是程序實現能預知的,而且只能在滿足一定的條件才能可以改變。這種變數我們稱為准不變數。Synthetix開發了一些工具用來保護這些變數。攻擊者通過緩沖區溢出而產生的改變可以被系統當做非法的動作。在某些極端的情況下,這些准不變數有可能被非法改變,這時需要堆棧保護來提供更完善的保護了。實驗的數據表明,堆棧保護對於各種系統的緩沖區溢出攻擊都有很好的保護作用.並能保持較好的兼容性和系統性能。分析表明,堆棧保護能有效抵禦現在的和將來的基於堆棧的攻擊。堆棧保護版本的Red Hat Linux 5.1已經在各種系統上運行了多年,包括個人的筆記本電腦和工作組文件伺服器。

3、指針保護

在堆棧保護設計的時候,沖擊堆棧構成了緩沖區溢出攻擊的常見的一種形式。有人推測存在一種模板來構成這些攻擊(在1996年的時候)。從此,很多簡單的漏洞被發現,實施和補丁後,很多攻擊者開始用更一般的方法實施緩沖區溢出攻擊。指針保護是堆錢保護針對這種情況的一個推廣。通過在所有的代碼指針之後放置附加位元組來檢驗指針在被調用之前的合法性,如果檢驗失敗,會發出報警信號和退出程序的執行,就如同在堆棧保護中的行為一樣。這種方案有兩點需要注意:

(1)附加位元組的定位
附加位元組的空間是在被保護的變數被分配的時候分配的,同時在被保護位元組初始化過程中被初始化。這樣就帶來了問題:為了保持兼容性,我們不想改變被保護變數的大小,因此我們不能簡單地在變數的結構定義中加入附加字。還有,對各種類型也有不同附加位元組數目。

(2)查附加位元組
每次程序指針被引用的時候都要檢查附加位元組的完整性。這個也存在問題因為「從存取器讀」在編譯器中沒有語義,編譯器更關心指針的使用,而各種優化演算法傾向於從存儲器中讀人變數.還有隨著變數類型的不同,讀入的方法也各自不同。到目前為止,只有很少—部分使用非指針變數的攻擊能逃脫指針保護的檢測。但是,可以通過在編譯器上強制對某一變數加入附加位元組來實現檢測,這時需要程序員自己手工加入相應的保護了。

Ⅷ 為什麼安卓的AIDE編譯器編譯好的app反編譯發現裡面多了一個幾個類, ADRTsender

左配置文件里設置Debug=false

熱點內容
android藍牙列印列印圖片 發布:2024-05-17 18:58:31 瀏覽:463
android年齡 發布:2024-05-17 18:51:33 瀏覽:197
termux安裝python 發布:2024-05-17 18:44:55 瀏覽:655
手機流量上傳 發布:2024-05-17 18:44:06 瀏覽:551
伺服器怎麼證明是好的 發布:2024-05-17 18:39:28 瀏覽:683
樹莓派如何搭建mqtt伺服器 發布:2024-05-17 18:27:38 瀏覽:437
門口機sip伺服器ip是什麼 發布:2024-05-17 17:38:27 瀏覽:554
光遇安卓區是什麼服 發布:2024-05-17 17:22:25 瀏覽:25
linux驅動開發教程 發布:2024-05-17 17:19:52 瀏覽:501
抖音中秋節視頻腳本 發布:2024-05-17 17:19:51 瀏覽:194