浅谈.Net脱壳中方法体的局部变量签名还原

简介: 在之前介绍Jit层脱壳原理时曾提到两个难点,1。方法体的局部变量签名。2。方法体的SEH 异常处理表。 本文主要就第一个问题进行简单探讨,随带也涉及到一些第二个问题。 前面提到过投机的方式获取,不在本文讨论范围,投机总是过于侥幸。

在之前介绍Jit层脱壳原理时曾提到两个难点,
1。方法体的局部变量签名。
2。方法体的SEH 异常处理表。

本文主要就第一个问题进行简单探讨,随带也涉及到一些第二个问题。

前面提到过投机的方式获取,不在本文讨论范围,投机总是过于侥幸。

进入到Jit层后,局部变量签名已经由token值转变为了结构体 CORINFO_SIG_INFO ,可以推测,该转变应该是在 ee 层调用 jit的预处理过程中完成了。
参考sscli的源代码,很容易可以定位到一个关键函数 unsigned long __stdcall UnsafeJitFunction(class MethodDesc *, class COR_ILMETHOD_DECODER *, unsigned long) 在 .net 1.1 中好像名字叫 JitFunction 。

只要Hook这个函数,就可以获取到需要的东西了。
第一个参数,前面提到过了,可以转换为dotNet中的方法对象。第二个参数,是本文要提到的关键东西。关于它的定义可以参考sscli或者dotNet的sdk。
从名字就能看出它是干什么用的。如果你好彩,得到它就得到了整个方法体(如:.Net reactor, maxtocode 2007之前版本以及2007个人版,dnguard v1.0)。

如果壳在Jit层有挂钩,那么基本上可以判断这里无法取得IL字节码(如果壳采用分段解密,在这里不会解密IL字节码,它会把IL字节码的解密放到Jit层中)。
基本上可以确定这里能够获取到LocalVarSig 的 token值。
同时顺带一般也能获取到SEH Table。

这里需要注意,如果壳在附近也有挂钩,需要判断它是否挂了这个函数,然后需要调整一下hook位置。

还有一个不错的hook位置是 getMethodInfoHelper(MethodDesc *,CORINFO_METHOD_STRUCT_ *,COR_ILMETHOD_DECODER *,CORINFO_METHOD_INFO *)。


这个方法再配合 jit层的hook,加在一起基本上就完成了一个方法体的完整还原。

使用这个方法对 CliProtector,DNGuard HVM 加密保护的程序集无效。
这两个是纯Jit层的壳,在ee层没有挂钩服务提供解密,所以在这个方法hook不到所需的东西。
它们实际上是把预处理的工作全部放到了壳里面。
也许有人会有疑惑,既然这样加密壳为什么还要在ee层挂钩提供解密服务呢?这是几个技术问题,
加密壳需要在ee层挂接解密服务,一般是没有解决如何在壳中实现全部预处理的工作。
在Jit层实现预处理工作与在Jit层中直接实现脱壳是一个互逆的操作。
前面介绍Jit层脱壳时提到过两个难点,在jit层实现预处理同样也是这两个难点。

 

目录
相关文章
|
4月前
|
API 网络安全 数据安全/隐私保护
.NET邮箱API发送邮件的方法有哪些
本文介绍了.NET开发中使用邮箱API发送邮件的方法,包括SmtpClient类发送邮件、MailMessage类创建邮件消息、设置SmtpClient属性、同步/异步发送、错误处理、发送HTML格式邮件、带附件邮件以及多人邮件。AokSend提供高触达发信服务,适用于大规模验证码发送场景。了解这些技巧有助于开发者实现高效、可靠的邮件功能。
|
4月前
|
开发框架 .NET
ASP.NET Core NET7 增加session的方法
ASP.NET Core NET7 增加session的方法
72 0
|
12月前
|
IDE API 开发工具
拦截|篡改|伪造.NET类库中不限于public的类和方法
本文除了回顾拦截.NET类库中的方法,实现方法参数的篡改、方法返回结果的伪造,再着重介绍.NET类库中非public类及方法如何拦截。
拦截|篡改|伪造.NET类库中不限于public的类和方法
|
16天前
|
SQL 缓存 开发框架
分享一个 .NET EF6 应用二级缓存提高性能的方法
分享一个 .NET EF6 应用二级缓存提高性能的方法
|
16天前
|
程序员 数据库
分享 2 个 .NET EF 6 只更新某些字段的方法
分享 2 个 .NET EF 6 只更新某些字段的方法
|
16天前
|
数据库
分享一个 .NET EF 6 扩展 Where 的方法
分享一个 .NET EF 6 扩展 Where 的方法
|
16天前
|
开发框架 前端开发 算法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
|
16天前
|
开发框架 中间件 .NET
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
|
16天前
|
开发框架 .NET API
如何在 ASP.NET Core Web API 方法执行前后 “偷偷“ 作一些 “坏“ 事?初识 ActionFilterAttribute
如何在 ASP.NET Core Web API 方法执行前后 “偷偷“ 作一些 “坏“ 事?初识 ActionFilterAttribute
|
16天前
|
开发框架 前端开发 .NET
Asp.net Webapi 的 Post 方法不能把参数加到 URL 中?试试这样写
Asp.net Webapi 的 Post 方法不能把参数加到 URL 中?试试这样写