Mono源码阅读--加载文件
2017-11-11 17:49
681 查看
Mono是微软提供了实现.Net框架跨平台的项目,Unity3D中使用C#脚本进行开发就是基于Mono的。
注意:本文阅读的Mono源码版本对应为3.8.0。
提到U3D中使用Mono加载DLL,不得不说到的一个函数就是mono_image_open_from_data_with_name,因为该函数作为DLL加载必须经过的流程,可以很好地被用来对DLL进行解密的操作,目前市面上很多针对DLL文件的保护就是在此处进行解密的,不过由于太广为人知,很容易就被攻破····和本文关系不是很大,暂且不提。
首先来看该函数原型:
data对应DLL内存地址数据,data_len对应数据长度,name对应DLL名称。
该函数作为加载DLL关键函数,创建MonoImage对象,将相关信息设置,调用do_mono_image_load函数、register_image函数。
该函数作为主要的功能函数调用点,调用了以下功能函数:
1、执行预加载,初始化
2、校验文件信息
当然首先开始就是对整个PE文件结构的校验以及梳理,包含调用了以下函数进行梳理及校验相关信息
3、加载PE数据
校验完之后加载,没毛病,此处对应调用do_load_header会找到CLI文件结构起始的地址
4、开始对CLI数据进行校验
相对于其他的文件结构的不同,.Net版本的PE文件结构相当于只是在外层套用了一个PE结构,内部包含了一个.Net的文件结构,因此前面的流程主要是为了找到这个文件结构的地址,此处校验包含了:
5、加载CLI文件数据
此处第一步操作是加载CLI头,第二步开始加载metadata:
CLI中最关键的就是metadata,它是整个文件中的数据流,此处加载包含了对元数据头的解析以及表的加载:
“#~”表是所有表中最重要的一项,它包含了方法、数据类型等等,会是我们关注的重点。
6、校验表中的信息
整个文件的加载流程大致如此,如有疏漏或者有问题处欢迎指正。
转载请注明出处。
注意:本文阅读的Mono源码版本对应为3.8.0。
提到U3D中使用Mono加载DLL,不得不说到的一个函数就是mono_image_open_from_data_with_name,因为该函数作为DLL加载必须经过的流程,可以很好地被用来对DLL进行解密的操作,目前市面上很多针对DLL文件的保护就是在此处进行解密的,不过由于太广为人知,很容易就被攻破····和本文关系不是很大,暂且不提。
首先来看该函数原型:
MonoImage *mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly, const char *name);
data对应DLL内存地址数据,data_len对应数据长度,name对应DLL名称。
该函数作为加载DLL关键函数,创建MonoImage对象,将相关信息设置,调用do_mono_image_load函数、register_image函数。
static MonoImage *do_mono_image_load (MonoImage *image, MonoImageOpenStatus *status,gboolean care_about_cli, gboolean care_about_pecoff)
该函数作为主要的功能函数调用点,调用了以下功能函数:
1、执行预加载,初始化
mono_profiler_module_event (image, MONO_PROFILE_START_LOAD); mono_image_init (image);
2、校验文件信息
mono_verifier_verify_pe_data
当然首先开始就是对整个PE文件结构的校验以及梳理,包含调用了以下函数进行梳理及校验相关信息
verify_msdos_header verify_pe_header verify_pe_optional_header load_section_table load_data_directories verify_import_table verify_resources_table
3、加载PE数据
gboolean mono_image_load_pe_data (MonoImage *image)
校验完之后加载,没毛病,此处对应调用do_load_header会找到CLI文件结构起始的地址
4、开始对CLI数据进行校验
gboolean mono_verifier_verify_cli_data (MonoImage *image, GSList **error_list)
相对于其他的文件结构的不同,.Net版本的PE文件结构相当于只是在外层套用了一个PE结构,内部包含了一个.Net的文件结构,因此前面的流程主要是为了找到这个文件结构的地址,此处校验包含了:
verify_cli_header verify_metadata_header verify_tables_schema(针对#~(TILDE_STREAM)表进行的)
5、加载CLI文件数据
gboolean mono_image_load_cli_data (MonoImage *image)
此处第一步操作是加载CLI头,第二步开始加载metadata:
static gboolean load_cli_header (MonoImage *image, MonoCLIImageInfo *iinfo) static gboolean load_metadata (MonoImage *image, MonoCLIImageInfo *iinfo)
CLI中最关键的就是metadata,它是整个文件中的数据流,此处加载包含了对元数据头的解析以及表的加载:
load_metadata_ptrs load_tables #(解析#~表包含的每一个表)
“#~”表是所有表中最重要的一项,它包含了方法、数据类型等等,会是我们关注的重点。
6、校验表中的信息
mono_verifier_verify_table_data->verify_tables_data //包括: verify_module_table verify_typedef_table verify_field_table verify_method_table
整个文件的加载流程大致如此,如有疏漏或者有问题处欢迎指正。
转载请注明出处。
相关文章推荐
- Mycat1.6之三大配置文件加载源码阅读
- Spring源码阅读 之加载XML配置文件
- SparkConf加载与SparkContext创建(源码阅读二)
- 【Nutch2.2.1源代码分析之4】Nutch加载配置文件的方法 分类: H3_NUTCH 2014-08-22 21:57 928人阅读 评论(0) 收藏
- Mybatis如何加载配置文件 源码解读parameterType
- Spring源码分析:Bean加载流程概览及配置文件读取
- NGINX----源码阅读---数据结构---配置文件相关
- Spring IOC 源码阅读之资源定位加载
- linux 驱动 编译加载 , 程序搬移到目标板,驱动源码和头文件位置
- Silverlight实用窍门系列:2.Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)【附带实例源码】
- Spring 加载 *.properties 文件的源码分析
- spring boot实战(第六篇)加载application资源文件源码分析
- 【Spring】从源码分析Spring配置文件的加载
- Mybatis 源码分析--Configuration.xml配置文件加载到内存
- NGINX----源码阅读---配置文件解析
- [RK3288][Android7.1.2] Launcher3 源码阅读之step5:查看主要的xml布局文件
- 源码分析setContentView加载布局文件的过程
- Spring源码阅读之Bean加载(annotation )2
- 关于阅读MFC源码的MFC.bsc文件
- hadoop配置文件的加载机制 分类: A1_HADOOP 2015-01-21 11:29 839人阅读 评论(0) 收藏