首页
社区
课程
招聘
[原创]mscorjit的介绍,以及maxtocode 2007 企业版运行库分析
发表于: 2007-7-9 13:55 10613

[原创]mscorjit的介绍,以及maxtocode 2007 企业版运行库分析

2007-7-9 13:55
10613

在前面介绍mscorwks的时提到了,.net的程序是以函数为单位编译。而在 mscorjit中提供了一个函数
compileMethod 。mscorwks就是通过调用这个函数来编译.Net方法的。
对于EE层,或者虚拟机预处理层的加密壳,只需要hook这个函数就可以dump出方法体的代码了。
需要注意一点,这个函数是 thiscall 调用约定的。

.Net方法体进入 compileMethod  之后是怎么样的处理流程呢?

限于篇幅,这里只能简单介绍一下,具体详情可以参考 sscli 2.0的源代码。
compileMethod 实际上只是一个接口函数,它没有做实际什么工作,
只是简单的 调用另一个函数:jitNativeCode。

在jitNativeCode 函数是一个线程安全的函数,在它里面实际上只是做了一些准备工作。
安装异常处理,然后实例化一个Complier对象。初始化Complier类,再调用
这个类的一个成员函数 compCompile 。

在 compCompile 就开始了实际的编译工作。

所以hook jit来实现脱壳的话,我们有三个选项:
hook compileMethod  (thiscall)
hook jitNativeCode (fastcall)
hook compCompile (thiscall)

对于这三个方案 实现脱壳是完全一样的。在这三个函数里面我们都能够获取到脱壳所需要的结构体。
实际上脱壳需要的结构体是 CORINFO_METHOD_STRUCT,CORINFO_MODULE_STRUCT,CORINFO_METHOD_INFO这三个。

我在脱某壳个人版加密的程序时是采用的方法2,hook jitNativeCode 函数。
hook方法:采用的替换方式,即直接修改 compileMethod  函数,将 call jitNativeCode 改为 call myhook。
在 myhook函数里面处理脱壳工作,然后再调用 call jitNativeCode 。

实际上有一个技巧。一般我们通过反射invoke让一个方法体进入jit处理过程的,然后在 myhook 里面截取dump方法体。
假设我们在dump一个 Exit函数时,如果让它执行了会导致进程退出,因为invoke会执行方法,而我们需要的只是让方法体进入
jit处理过程,以方法dump,而不希望这个方法被执行。所以我们可以不用回调 jitNativeCode 函数,直接返回一个nop地址。

maxtocode 2007企业版具称是虚拟机处理层的壳,那它在虚拟机处理层做了什么工作呢?
具分析 mscorjit.dll 的内存镜像,它实际上做了和 jit层脱壳 差不多的工作,
同时使用了 方案2 和 方案 3. 显然它hook jit的目的不是脱壳,而是实现 方法体的还原。

我们可以很容易确定 在程序运行到 compCompile 中后,加密壳的运行库已经完成了所有解密工作,
因此在 compCompile 函数里面,或者它下级的函数里面是脱壳的好时机。

如是我修改了一下jithook程序,只改了hook位置,即hook compCompile 的下级函数。
然后测试dump。效果如下:


可以dump出源代码。
看来企业版相对个人版来说只是hook位置的变化,对于脱壳来说,基本上没有增加任何难度,
只需要更改一下hook位置,就可以dump了。

另外发现企业版运行库的一个bug,可以用简单的方法脱壳。

如果只是分析程序注册算法,我们只需要 CORINFO_METHOD_INFO 就够。
在tankaiha  大以前的文章介绍过。
直接获取这个结构体中 的ILCode,而后用ilbytedecoder 取得il汇编代码。异常处理表不用修复也不影响分析代码。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
2
不错哈。我正好研究在这里 有事情就没有弄完。maxtocode在作者把一些东西理解错了。哈 比如Runtime用Themida的壳。 除了减少兼容性以外。基本上还不如aspr的壳。当然可以理解 因为是在看雪随便下载的一个‘免费’壳的原因。理解理解。 其实我在考虑一个简单的方法 。MaxToCode 用硬编码挂钩了 5处(WInForm)jitter里面的代码,我在想有没有可能性,通过补丁Jitter让其取得原始数据,也就是直接由.Net的方法Dump。 因为我在思考他的流程
原始码加密---〉如果Invoke这个方法---〉解密,但是貌似只有第一次才解密,我就是不知道它是如果判断是否是Reflector调用的。

DUmp
CORINFO_METHOD_INFO 这个方法确实好。。也很通用,可是问题很显然,就是 sscli的结构跟实际结构貌似很不一样。还有重建PE,也麻烦,Native 下操作Clr我还没有找到简单的方法。希望。楼主多指教
2007-7-9 15:44
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
大牛们,我来学习一下,虽然不懂
2007-7-9 16:51
0
雪    币: 5275
活跃值: (456)
能力值: (RANK:1170 )
在线值:
发帖
回帖
粉丝
4
呵呵,不错,原来你小子没闲着
2007-7-9 21:30
0
雪    币: 221
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
思路理解
但之前win32 hook基础不好
对hook还没法弄
真麻烦

有空得复习一下,晕
2007-7-10 09:11
0
雪    币: 225
活跃值: (218)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错,看来maxtocode作者喜欢借用啊。

“另外发现企业版运行库的一个bug,可以用简单的方法脱壳。”  这个怎么做哦?

老大的 jithook 程序找不到哦
2007-8-17 16:43
0
雪    币: 1919
活跃值: (901)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
7
net没研究,收藏了~~
2007-8-17 18:47
0
游客
登录 | 注册 方可回帖
返回
//