.Net程序集的不同加載方式,以及其在內存中格式
.Net程序集除了正常的有框架自動按需載入外,我們還可以通過反射手動載入程序集。
其中反射載入程序集有一種方式就是 以字節流的方式載入程序集。而不是直接從磁盤文件載入。
很多.Net壓縮殼,和整體保護殼都采用了這種方式。
這種方式載入的程序集和從磁盤文件載入的程序集,其內存屬性是不一樣的。
字節流載入的內存屬性是 MEM_MAPPED .
文件方式載入的內存屬性是 MEM_IMAGE 。
(注:指使用api函數 VirtualQuery 獲取的內存信息)
在 .Net 1.1中 這兩種內存影像的布局是一樣的,都是按照pe header的sections進行了內存映射的。
但是在 .Net 2.0 中這種情況變化了,字節流加載的程序集。在內存中的布局和它原始的字節流一樣。沒有按照pe header進行section的映射。
如果要進行程序集的整體dump,就需要考慮這兩種不同的加載模式。
字節流加載的程序集,在獲取Assembly的Location屬性時會異常。
加密殼加密后的程序集,如果需要兼容后續使用壓縮殼或整體加密殼再次保護,也需要在運行時考慮這種情況。
DNGuard 從2.6起就已經考慮處理了這種情況。
其中反射載入程序集有一種方式就是 以字節流的方式載入程序集。而不是直接從磁盤文件載入。
很多.Net壓縮殼,和整體保護殼都采用了這種方式。
這種方式載入的程序集和從磁盤文件載入的程序集,其內存屬性是不一樣的。
字節流載入的內存屬性是 MEM_MAPPED .
文件方式載入的內存屬性是 MEM_IMAGE 。
(注:指使用api函數 VirtualQuery 獲取的內存信息)
在 .Net 1.1中 這兩種內存影像的布局是一樣的,都是按照pe header的sections進行了內存映射的。
但是在 .Net 2.0 中這種情況變化了,字節流加載的程序集。在內存中的布局和它原始的字節流一樣。沒有按照pe header進行section的映射。
如果要進行程序集的整體dump,就需要考慮這兩種不同的加載模式。
字節流加載的程序集,在獲取Assembly的Location屬性時會異常。
加密殼加密后的程序集,如果需要兼容后續使用壓縮殼或整體加密殼再次保護,也需要在運行時考慮這種情況。
DNGuard 從2.6起就已經考慮處理了這種情況。
浙公網安備 33010602011771號