託管**中的字串是一類特殊的物件,它不可被改變的,每次使用 system.string 類中的方法之一或進行運算時(如賦值、拼接等)時,都要在記憶體中建立乙個新的字串物件,也就是為該新物件分配新的空間。這就帶來兩個問題:
1:原來的字串是不是還在記憶體當中?
2:如果在記憶體當中,那麼機密資料(如密碼)該如何儲存才足夠安全?
先來看第乙個問題:
publicclass
program
static
void
method1()}
在method1處打上斷點,讓vs執行到此處,在即時視窗中執行命令:.load sos.dll 和 !dso,如下:
開啟除錯中的記憶體檢視視窗,定位到019db820(由!dso得到)。由於此時還沒有進入到method1,所以記憶體當中不存在字串「luminji」。接著讓程式執行到方法內部,我們看到記憶體當中已經存在了「luminji」了。
接著讓程式繼續執行,退出方法method1,發現「luminji」依然留在記憶體當中。
這就帶來乙個問題,如果有惡意人員掃瞄你的記憶體,你的程式所儲存的機密資訊將無處可逃。幸好fcl中提供了system.security.securestring,securestring表示乙個應保密的文字,在初始化時就已經被加密。
publicclass
program
static
void'l
''u'
'm''
i''n
''j'
'i');
}}
相同的方法,可以發現在進入method2後,已經找不到對應的字串了。但是,問題隨之而來,核心資料的儲存問題已經解決了,可是文字總是要取出來用的,只要取出來不是就會被發現嗎。沒錯,這個問題沒法避免,但是我們可以做到文字一使用完畢,就釋放掉。
見如下**:
staticvoid'l
''u'
'm''
i''n
''j'
'i');
intptr addr
=marshal.securestringtobstr(securestring);
string
temp
=marshal.ptrtostringbstr(addr);
//使用該機密文字do something
///*****==開始清理記憶體
//清理掉非託管**中對應的記憶體的值
marshal.zerofreebstr(addr);
//清理託管**對應的記憶體的值(採用重寫的方法)
intid
=getprocessid();
byte
writebytes
=encoding.unicode.getbytes(
"******");
intptr intptr
=open(id);
unsafe
}///
*****==清理完畢}
注意檢視上文**:
intptr addr = marshal.securestringtobstr(securestring);
string temp = marshal.ptrtostringbstr(addr);
這兩行**表示的就是將機密文字從securestring取出來,臨時賦值給字串temp。這就存在兩個問題,第一行實際呼叫的是非託管**,它在記憶體中也會儲存乙個「luminji」,第二行**是在託管記憶體中儲存乙個「luminji」。這兩段文字的釋放方式是不一樣的。前者,可以通過使用:
marshal.zerofreebstr(addr);
進行釋放。而託管記憶體中的文字,只能通過重寫來完成(如上文中,就是重寫成為無意義的「******」)。
上段**涉及到的幾個方法如下:
publicstatic
intgetprocessid()
public
static
intptr open(
intprocessid)
public
static
intwritememory(intptr addressbase,
byte
writebytes,
intwritelength)
return
reallywritelength;
}[structlayout(layoutkind.sequential)]
internal
struct
process_information
[flags]
enum
processaccessflags :
uint
static
class
processapihelper
總結:1:機密文字使用system.security.securestring儲存;
2:system.security.securestring被釋放後使用marshal.zerofreebstr清除在記憶體中的痕跡;
3:託管字串只能使用重寫記憶體進行清除;
有關利用sos.dll除錯非託管**,檢視
C 中機密文字的儲存方案
託管 中的字串是一類特殊的物件,它不可被改變的,每次使用 system.string 類中的方法之一或進行運算時 如賦值 拼接等 時,都要在記憶體中建立乙個新的字串物件,也就是為該新物件分配新的空間。這就帶來兩個問題 1 原來的字串是不是還在記憶體當中?2 如果在記憶體當中,那麼機密資料 如密碼 該...
C 將所需內容儲存到txt文字中
前言 題外話 今天911,首先想到了 911事件 轉眼間11年過去了,感嘆時間之快!話說,在cv領域,特別是目標檢測任務中,計算演算法的ap值是一件基本任務。特別地,在使用c 做前向推理的時候,對其 結果做ap計算的時候,往往可以將其 結果先儲存到txt文字中,然後將其結果轉為計算ap所需要的資料格...
c 中的儲存型別
儲存型別是從變數的存在時間 即生存期 來劃分變數。變數的儲存型別可分為靜態儲存方式和動態儲存方式。對於動態儲存變數,當程式執行到該變數處時才為其分配儲存空間,當程式執行到該變數所在作用域的結束處時自動收回為其分配的儲存空間,因此它的生存期為所在作用域。在程式開始就執行就為其分配儲存空間,直到程式結束...