→ tsairay:原po大概沒在寫code,變數用完是可以手動清記憶體的 01/02 14:09
→ tsairay:麻煩而已,不是辦不到 01/02 14:09
推 f1234518456:那還不是要載到記憶體... 01/02 14:25
推 tsairay:原po是寫說會留存到其他資料蓋掉為止,我是針對這點提出 01/02 15:32
推 TAKO321:樓上說得就是被資料蓋掉啊XD要嘛自己蓋掉要嘛被系統蓋掉 01/02 15:47
→ TAKO321:所以原PO說得留存到被蓋掉為止沒錯啊。 01/02 15:48
推 tsairay:留存到被蓋掉是被動,手動去清是主動 01/02 15:49
推 f1234518456:那還不是自己手動去蓋掉... 01/02 16:05
看來某人才真的是沒在寫程式, C語言裡面處理可以釋放的變數或陣列都是宣告
指標(pointer) ,宣告後電腦會去主記憶體裡面找一塊符合大小的記憶體,然後
把起始位置寫回指標。
舉個例子:如果今天我需要一個可釋放的陣列 A,大小 8 bits ,那我宣告後程
式會去記憶體裡面找個空間來存指標,假設指標記憶位址是0x0000,然後再去找
段夠大的空間,假設從0x0100開始一直到0x0108,於是指向 A陣列的指標內容就
會是0x0100。
記憶體位址跟內容的關係是這樣:
位址:0x0000┌→0x0100 0x0101 ... 0x0107 0x0108
內容:0x0100┘ 0x00 0x00 ... 0x00 0x00
然後我把某個解密金鑰01 23 45 67 89 AB CD EF 寫入這個陣列,所以0x0100到
0x0108的內容就會是01 23 45 67 89 AB CD EF 00。
於是乎,記憶體位址跟內容會變成這樣:
位址:0x0000┌→0x0100 0x0101 ... 0x0107 0x0108
內容:0x0100┘ 0x01 0x23 ... 0xEF 0x00 ←假設0x00是終止字元
到這裡為止0x0000裡面儲存的值會是0x0100,然後金鑰存在 0x0100~0x0108。好
了,那我金鑰用完要釋放怎麼辦? C語言的作法是用delete,執行結果就是把
0x0000裡面的值0x0100刪掉,然後將0x0000標記成未佔用。根本不會去管0x0100
到0x0107這段裡面東西還在不在。
記憶體位址跟內容變成這樣:
位址:0x0000 0x0100 0x0101 ... 0x0107 0x0108
內容:null 0x01 0x23 ... 0xEF 0x00
所以只要把整個記憶體讀出來,然後搜尋0x0100 ~ 0x0108 ,就可以得知金鑰的
內容。於是有人就會想到說,那我釋放時再重新宣告一個陣列 B,大小能夠把剛
剛這段內容蓋掉不就好了?是沒錯,但一般程式設計師根本不會去管剛剛陣列 A
到底是存在記憶體的哪個位置,自然也不會特別要求程式去填那個位置,那如果
去蓋呢?
這叫做「此地無銀三百兩」,真的去填就等於告訴駭客「那邊有我不想給你們看
的東西,沒有我的允許,絕對絕對不可以去看喔!」,下次駭客就會讓程式當在
填垃圾資料前,然後去把那段位址的內容讀出。人天生就有收集資訊充實自己的
本能,不然某數字週刊怎麼可能賣得這麼好,有道理吧?
--
○ ____ _ _ _ _ ____ _ _ ____ _____ ____
。 ★(_ _)( \( )( \/ )( ___)( \( )(_ _)( _ )( _ \
o _)(_ ) ( \ / )__) ) ( )( )(_)( ) / ● ‧
(____)(_)\_) \/ (____)(_)\_) (__) (_____)(_)\_) ★
o
--
All Comments