爲了驗證設計可行性,通常我會先快速建模,用delphi實驗一下,由於VCL和編譯器以及OO的思想使得模型實現起來很是快,尤爲自帶基礎類型String很是好用並且速度極快,可是源碼裏是看不到的,編譯器自動支持,然而在測試大規模hook api的時候,字符串操做會偶爾缺失中間的某個字節,這就是我爲什麼不相信第三方庫的緣由了,在追影C實現的掛鉤模塊中,我沒有使用任何第三方庫(記錄模塊使用了cuckoo monitor,掛鉤模塊和記錄器是兩個東西),甚至連memcpy這些都本身用匯編作了實現,使得掛鉤模塊中的一切可控,隨時知道問題出在哪裏。在底層的開發中,任何黑箱對我來講都是一種隱患,當出問題的時候我不得不打開每一個黑箱,去審計大量的第三方代碼,事實上也不止一次發現第三方代碼中存在大量問題。也是帶着這種懷疑精神,我逆向了編譯器是如何實現其自帶的string類型。api
結果以下:函數
struct unicodestring{測試
dword reference;設計
dword length;code
word content[];內存
}unicode
跟COM的作法有點相似。每次進入有字符串類型的函數前,編譯器自動加上一個增長引用的調用,退出函數前減小引用。我推測在引用爲0的時候會釋放內存,跟COM的作法同樣。而經過反彙編發現,實際上字符串變量內的地址指向的是content的地址,而不是unicodestring的地址,編譯器經過content地址的偏移去操做reference和length,因爲提早知道了長度,比經過檢查\0結尾,把整個串擼一遍的字符串操做要快的多。開發