[C++/CLI编程宝典][5]编译与反汇编

 

通过上次的第一个简单的C++/CLI实例,我们已经对C++/CLI的基本语法有了一定的认识,一些新的关键字也混了个眼熟。其实如果你有ISOC++背景,了解一些.NET相关概念,且使用VS2008 IDE开发的话,相信到现在你已经可以使用C++/CLI写一些简单的小程序了。本次继续上次的sample来深入了解它的编译和反编译。 

1)编译

在安装了VS2008或WinSDK后,我们就拥有了很多的工具,其中Cl.exe就是用来编译C++代码的,对于Cl.exe的很多的选项可以查看msdn。这里结合上次的实例了解常用的选项,我们使用cl.exe /clr main.cpp来编译上次的实例,其中/clr选项表明要编译为托管的IL中间代码,因为我们知道ISOC++是可以直接编译为本地代码,main.cpp是我们要编译的C++文件名,其他的选项没有显式指定,使用默认。在执行次命令后会在与main.cpp相同的目录下产生main.obj和main.exe,且此时的main.exe是IL中间代码。编译过程如下图:

 2009010521564681.png

2)JIT编译

在上面我们看到main.cpp被编译连接后生成main.exe,我们知道exe是windows的可执行文件,但是上面的exe与我们传统的exe有所不同,这里的main.exe为IL中间语言的(IL中间语言我们可以先认为是一种高级的汇编语),它离真正的汇编语言还有一节距离,那么为什么IL中间语言的exe能够执行呢,这就要归功于.NET的虚拟机机制,当IL中间语言的exe运行的时候其实是要依赖于CLR先编译为真正的汇编代码的,然后再运行。

当IL中间语言的exe直接发布以后,用户第一次执行,会将IL中间语言编译为真正的汇编,我们将这个过程称为JIT(just in time)编译,JIT 编译考虑了在执行过程中某些代码可能永远不会被调用的事实。它不是耗费时间和内存将可移植可执行 (PE) 文件中的所有 MSIL 都转换为本机代码,而是在执行期间根据需要转换 MSIL 并将生成的本机代码存储在内存中,以供该进程上下文中的后续调用访问。在加载并初始化类型时,加载程序将创建存根 (stub) 并将其附加到该类型的每个方法中。当首次调用某个方法时,存根 (stub) 会将控制权交给 JIT 编译器,后者会将该方法的 MSIL 转换为本机代码,并修改存根 (stub) 以使其直接指向生成的本机代码。这样,对 JIT 编译的方法的后续调用将直接转到该本机代码。

当然微软也发布了NGen.exe工具,你可以在安装过程中使用此工具将IL语言的exe先转化为真正的汇编代码,这样exe就和我们传统的exe一样了,没有运行时的第一次编译了。使用Ngen.exe编译后,生成了本机映像(包含经编译的特定于处理器的机器代码的文件),并将它们安装到本地计算机上的本机映像缓存中。运行库CLR从缓存中使用本机映像,而不是使用实时 (JIT) 编译器编译原始程序集。最好是把.dll ngen了,而不是exe,因为.exe的执行是由操作系统启动的,操作系统先通过EXE内部的一个固定函数启动clr,再将控制权交给CLR。下面是使用NGen.exe来产生main.exe的本地映像的实例:

 2009010521575532.png

 

3) JIT与NGen.exe比较

JIT运行时编译,NGen.exe在运行前编译;JIT每次编译需要的方法,NGen.exe一次编译整个程序集;JIT将编译后存在内存中,NGen.exe编译后持久地存储在本地的磁盘上;JIT 编译器生成的代码会绑定到触发编译的进程上,不能多进程间共享,NGen.exe可以多进程间共享已经编译好的代码。

4)反IL中间语言

C++/CLi是架构于CLI之上,使用IL作为中间抽象层,我们的C++/CLI代码被编译为IL中间语言,从IL中间语言到底层的汇编CLR帮我们做好了,对于我们开发人员就像是系统的底层提升到了IL中间语言层,所以我们只要关心到IL中间语言就好了,而IL中间语言又跟我们的高级语言非常相似,大大降低了我们理解底层的难度。所以标题中提到的反汇编,现在就转为了反IL中间语言了,下面使用另一个工具ildasm.exe来将刚才的main.exe反IL中间语言,使用命令ildasm main.exe如下图:

2009010521585696.png

运行命令后打开ildasm窗口如下:

2009010521332123.png

 

在ildasm窗口中,我们看到我们NativeClass,ValueStruct和RefClass的定义,这些就是CLI的IL中间语言。下节深入编译后的IL中间语言!

完!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先关于 [评价可免费] 的严重声明: 一、评价=评论加评价(评星星); 二、评价必须是下载完了该资源后的评价,没下载就评论无效; 三、如果正确评价了,返还积分可能需要等等,系统需要反应下。呵呵 评论时记得要评分。然后会返回给你花费的分再加1分.理论上有十分就可以下载完所有的资源了。一般人我不告诉他。 MFC 程序逆向 – 消息篇(上) 作者:szdbg Email:szdbg@sina.com 前言: 记得前一段时间,我刚接触软件破解和逆向这一行时,对于一些软件不知从何处跟踪按钮消息,试了好多方法,就是断 不下来,在系统模块中经常转得晕头转向,而一无所获。 MFC 程序是一种常见类型的程序,我静下心来,潜心研究了一下MFC 消息流程。弄清原委之后,一切豁然开朗,发现跟 踪MFC 程序和消息处理原来是如此。。。,跟踪按钮事件处理也由此变得特别简单。 于是,我将这些研究整理成文,以备后忘。并希望大家有所帮助,失误之处,请高手指正。 的确, .Net之类的程序必定是大势所趋,不过,就目前来说,MFC程序在软件市场还是占有重要的一席之地,所以,了解它,对于逆向和破解此类程序还是很有必要的. MFC之所以显的复杂,就在于它隐藏了它的消息的处理机制,可以说, 程序员基本上不需要懂得它的消息处理过程,就可以写出一套满足应用的软件来.这有好有坏,好的是大大简化了程序员写程序的过程,坏的一方面是,给一般程序员留下了一个迷团: 我只知道这样做,而不知道为什么这样做.心里老是觉得不踏实.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值