紫雨轩 .Net, DNGuard HVM , .Net VMProtect

DNGuard HVM - Advanced .NET Code Protection Technology

常用链接

统计

积分与排名

友情连接

最新评论

.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起就已经考虑处理了这种情况。

posted on 2008-05-15 20:33 紫雨轩 .Net 阅读(2053) 评论(9)  编辑 收藏

评论

#1楼  2008-05-15 20:35 皇帝的新装      

就这些吗,Sir LZ?   回复  引用  查看    

#2楼 [楼主] 2008-05-15 20:53 瑞克      

:)   回复  引用  查看    

#3楼  2008-05-15 21:02 jfan [未注册用户]

study   回复  引用    

#4楼  2008-05-16 08:12 lbq1221119      

这两种不同的加载方式,就是再ee启动的时候可以制定一个peimage的格式,peimage的两种格式一种是进行逻辑映射,映射到内存里面,这种方式对于pe文件的各个section都进行了从新的组织.
另外一种方式就是流方式,把整个pe文件都加载进来,不进行逻辑映射

这两种方式可以再ee启动的时候制定的吧.

呵呵 没错吧   回复  引用  查看    

#5楼  2008-05-16 08:13 lbq1221119      

rick的东西都顶 呵呵 感谢发到sscli   回复  引用  查看    

#6楼  2008-05-16 12:15 簡簡單單..      

两者的优缺点如何?   回复  引用  查看    

#7楼  2008-05-18 17:40 fannee [未注册用户]

跟动态程序集差不多,动态程序集如正则表达式生成的程序集是没有location的,取这个属性会报错,但可以取fullname,以便在程序中另用。   回复  引用    

#8楼 [楼主] 2008-05-19 14:22 瑞克      

嗯,动态程序集也是字节流方式加载的。   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-05-15 20:38 编辑过
 
另存  打印