博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Net内存程序集通用脱壳机实现原理(二、反射以及重建方法头)
阅读量:5864 次
发布时间:2019-06-19

本文共 1432 字,大约阅读时间需要 4 分钟。

.Net程序加密的原理及解密探讨三(实例解密)  一文中我们介绍了反射,
主要提到三个函数
 DumpAssembly,DumpType, DumpMethod。
这里我们将就 DumpMethod 这个函数讨论。
前一篇我们已经提到的dump的整体流程。
先把PE整体dump出来,然后在文件后面增加一个段。
接下来就是这次要讲的反射和方法体重建。
依靠上面的三个函数反射枚举所有方法。
取得 MethodBody 对象,重建 方法体,将方法体保存到 PE文件新建的段中,修改元数据中该方法对应的RVA,指向刚保存的位置。
只修改元数据中方法的RVA值,元数据的大小不会改变,所以元数据最后可以直接写回到原始位置。
下面介绍方法体重建。
DotNet程序一个方法的函数体一般由三部份组成。
ILHeader + ILByteArray + [DataSection]
其中第三部份是可选的,有些方法只有前两个部分。
前面提到的 MethodBody.GetILAsByteArray 是函数体的第二部分。
所以现在的任务是重建第一部分和第三部份。
今回只介绍第一部分的重建。
ILHeader 分两种模式 Tiny的和 Fat的,Tiny的Header只有1字节,Fat的Header有12字节。
为了简便起见,我们可以全部重建为Fat的Header。
先看看 Fat Header的定义
typedef struct IMAGE_COR_ILMETHOD_FAT
{
    unsigned Flags    : 12;     // Flags
    unsigned Size     :  4;     // size in DWords of this structure (currently 3)
    unsigned MaxStack : 16;     // 
    DWORD   CodeSize;           // size of the code
    mdSignature   LocalVarSigTok;    
} IMAGE_COR_ILMETHOD_FAT;
红色的三项一共 4 字节。mdSignature   大小也是4字节。整个结构12字节。
1、Size 的值是 3,固定不变的。
2、MaxStack的值 取 MethodBody.MaxStackSize 即可。
3、CodeSize 的值就是 MethodBody.GetILAsByteArray 字节数组的长度。
4、LocalVarSigTok 的值 取 MethodBody.LocalSignatureMetadataToken 即可。
这个Fat Header的重建还是很容易的,现在只剩下 Flags 的值了。
这里我们只需要给 Flags 赋 三个标志值。
第一个 标识该函数体是 Fat 格式:0x03
第二个 标识该函数是否 InitLocals:0x10
我们可以通过 MethodBody.InitLocals 来判断是否需要增加一个标识值。
第三个 标识该函数是否有异常处理结构:0x08
这个可以通过 MethodBody.ExceptionHandlingClauses 这个列表的大小判断是否需要增加这个标识值。
如果函数没有异常处理结构,那么整个方法体的重建工作就完成了。
如果有,就需要继续重建 第三部份了。
而第三部份的重建就是依靠 MethodBody.ExceptionHandlingClauses  中的信息完成的。

转载地址:http://pbynx.baihongyu.com/

你可能感兴趣的文章
js的面向对象编程
查看>>
Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听...
查看>>
log备份压缩以及获取指定内容到新文件
查看>>
2.7 最佳创新先锋:韵达集团副总裁兼CIO杨周龙
查看>>
【原创】MySQL Proxy - query注入动作中的脚本序列
查看>>
用代码画流程图和时序图快餐教程(2) - mermaid数据流图速成
查看>>
pdflush的工作流程
查看>>
spider 介绍
查看>>
热门论文Top 30:那些被国外专家引用最多的计算机视觉和深度学习论文【可下载】...
查看>>
WebLogic集群体系架构(原创)
查看>>
【ANDROID游戏开发二十一】ANDROID OS设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!...
查看>>
[多问几个为什么]为什么匿名内部类中引用的局部变量和参数需要final而成员字段不用?...
查看>>
ExtJS5学习之TreePanel
查看>>
[Servlet&JSP] HttpServletRequest的使用
查看>>
页面分部分加载呈现收集(不断更新中)
查看>>
涉密数据的处理
查看>>
讨喜的隔离可变性(十二)基于角色模型的局限性和小结
查看>>
[翻译] JTSlideShadowAnimation
查看>>
Android 性能测试实践(三)Cpu
查看>>
GCD之Apply
查看>>