dotNet MSIL中的一些不常见IL指令

在做HVM伪代码覆盖率检测时,在构造的一些dotNet程序样本中总是缺少一些MSIL指令

,没有覆盖所有的MSIL指令。
如C#中的装箱和取消装箱的IL指令,可能很多人和我最初的想法一样,装箱是 box指令

,取消装箱是unbox指令,实际上这只对了一半。

装箱使用的box指令没有错误,但是取消装箱不是用的unbox指令,而是 unbox.any 指

令,在C#编译的程序中就从来没有发现过 unbox 指令。

另外还有一批没有发现的指令有 calli , cpobj, ldobj, stobj, refanyval,

mkrefany,arglist, refanytype, initblk, cpblk

initobj指令也比较少见,不过在C#的泛型中遇到了:
如 T obj = default(T); 编译后就会出现 initobj 指令。
这个指令就是给变量赋初值。

calli 在C#里面没有,在C++/CLI构造出来了,实际上它是调用函数指针的用法。

refanyval, mkrefany,arglist, refanytype 看了一篇介绍 undocumented IL 的文章

后构造出来了,具体可参考转的帖子。

其它的指令构造不出来就只能蛮干了,把exe用ilasm整成的 il 文件,然后直接修改il

,再编译测试,经过反复实验,构造出了可以正常运行的程序。

先看装箱和取消装箱,
int i = 123;
object obj = i;
i = (int)obj;
对应的il代码是:
第一句:
ldc.i4.s   123
stloc.0
第二句:
ldloc.0
box        [mscorlib]System.Int32
stloc.1
第三句:
ldloc.1
unbox.any  [mscorlib]System.Int32
stloc.0

首先我就是直接把
unbox.any  [mscorlib]System.Int32
改为
unbox  [mscorlib]System.Int32

然后测试,发现这是 i 的值不等于 123了,而是一个不确定的数字。看IL文档得知

unbox生成的只是一个指针,也就是地址。
 
这时想到了另外一个指令 ldobj ,这个指令直接从地址读取数据放到堆栈上。
如是把
unbox.any  [mscorlib]System.Int32
改为
unbox  [mscorlib]System.Int32
ldobj  [mscorlib]System.Int32

再测试,结果正确了。看起来 unbox + ldobj 的效果和 unbox.any一样。

stobj 指令,从名称就能看出它和 ldobj只对应的。将立即数存入地址中。
功能类似如c++中的 *p = value;

i = 3;
正常方式应该是
ldc.i4.s 3
stloc.s.0
改为另一种模式
ldloca.s 0 //载入 i 的地址
ldc.i4.s 3 //载入立即数
stobj [mscorlib]System.Int32 //将立即数存入地址

cpobj 指令,直接从地址复制对象类似c++中的 *p1 = *p2;

int i, j;
i = 3;
j = i;
正常方式是
ldc.i4.s 3
stloc.s 0

ldloc.s 0
stloc.s 1
改为使用cpobj的模式
ldloca.s 1 //dest
ldloca.s 0 //src
cpobj [mscorlib]System.Int32 //copy

initblk 类似如C中的 memset 函数
cpblk 类似如C中的 memcpy函数

DNGuard HVM核心是通过将IL代码替换为HVM伪指令然后提交给Jit去编译的,所以需要

检测所有的HVM伪指令是否都能够被正确编译执行。测试遇到没有覆盖的指令只好用蛮

干的方法构造样本了。
目前以及完成了 .net framework 2.0, .net framework 3.0环境下的指令覆盖检测,

所有HVM伪指令都编译通过了。
接下来将对 .net framework 1.1 和 .net framework 3.5的环境进行指令覆盖检测。

dotNet MSIL中的一些不常见IL指令相关推荐

  1. dotNET Core 中怎样操作 AD?

    做企业应用开发难免会跟 AD 打交道,在之前的 dotNET FrameWork 时代,通常使用 System.DirectoryServices 的相关类来操作 AD ,在 dotNET Core ...

  2. 【dotnet跨平台】Visual Studio Code常见问答

     [dotnet跨平台]Visual Studio Code常见问答 如果你没找到想要的问题答案,请看已知问题:https://github.com/microsoft/vscode/issues ...

  3. 极客新闻——16、数据库设计中的5个常见错误

    本文笔记全部来自<极客新闻>--新鲜的技术资讯.权威的趋势剖析.别样的技术洞察 本文作者总结了数据库设计中的5个常见错误,以供开发人员参考. 1.糟糕的预规划 好的数据库是深思熟虑的结果, ...

  4. 【机器学习】机器学习实践中的 7 种常见错误

    编译:伯乐在线 - yixingqingkong,英文:Cheng-Tao Chu 编注:本文作者是 Codecademy 的分析主管 Cheng-Tao Chu,其专长是数据挖掘和机器学习,之前在 ...

  5. 世界大学城空间代码_C++中命名空间的五大常见用法

    译者注:可能很多程序员对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述. 命名空间在1995年被引入到 c++ 标准中,通常是这样定义的: 命 ...

  6. dotNet 5 中执行 Node.js

    在低代码产品中为了扩展功能,我们在业务编排中会扩展代码块的功能,允许用户直接在界面中进行代码(Node.js. Python)的编写,来实现取数或者赋值的一些功能.本文简单介绍下在 dotNET 5 ...

  7. dotNET Core 中怎样操作AD(续1)

    在之前的文章<dotNET Core 中怎样操作 AD?>中主要以AD的数据同步到数据库的场景来描述了在 dotNetCore 中怎样操作AD,本文将继续介绍一些在 dotNetCore ...

  8. C 中命名空间的五大常见用法

    译者注:可能很多程序员对C 已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述. 命名空间在1995年被引入到 c 标准中,通常是这样定义的: 命名空间 ...

  9. 数组中的两个常见异常

    数组中的两个常见异常 一.数组索引越界异常: ​ 数组索引越界异常: ArrayIndexOutOfBoubdsException ​ 当访问了不存在的索引时 原因: ​ 操作数组的时候使用的索引值不 ...

最新文章

  1. Java8中的流操作-基本使用性能测试
  2. 紫书动规 例题9-10 UVA - 1626 Brackets sequence 区间dp
  3. python学习(字符串、整数、列表)
  4. 【BZOJ 1001】[BJOI2006]狼抓兔子(最大流)
  5. 967c语言程序设计是什么,2018年湖南师范大学数学与计算机科学院967C语言程序设计和数据结构[专硕]之C程序设计考研核心题库...
  6. 生命游戏(game of life)
  7. wps的计算机在哪里设置密码,wps文件怎么设置和取消密码 wps文件密码设置和取消的步骤方法...
  8. lisp求面与面的差集_Lisp 入门
  9. VPX视频叠加板卡学习资料第199篇:基于Xilinx FPGA XC5VFX100T的6U VPX视频叠加板卡
  10. 关于while循环终止循环的三种方式
  11. 动漫头像生成如此简单,教你接口快速制作动漫头像
  12. ih5连接mysql数据库_iH5高级教程:H5数据应用,多种数据的判断
  13. 新一配:一篇看懂加油站产业链解决方案
  14. 清华大学计算机相关夏令营,清华大学计算机系举办2014年信息学夏令营
  15. 巧学活用html4,新人教英语巧学活用必修一.docx
  16. 信息化实施, 管理前沿 ERP生产系统
  17. GBASE 8C——SQL参考 5 全文检索
  18. 第十一届蓝桥杯大赛软件类省赛第一场真题-Java语言B组
  19. HDU oj 自动交题爬虫
  20. 【leetcode刷题笔记】动态规划

热门文章

  1. 重读百度移动生态:“第一曲线”的创新“延长线”
  2. c语言:输入一个字符串,统计字母,数字,空格出现的个数,c - 统计字符串字母,空格,数字,其他字符的个数和行数....
  3. 浅谈前端性能优化(九)——DNS解析优化
  4. Linux_Shell脚本 + 配置文件:按照不同文件类型合并文件,小文件合并成大文件
  5. 华为手机日历倒计时_倒计时5天!3辆奔驰车、15部华为手机、120万免单奖!赶快上车啦!...
  6. 全国计算机等级考试16套一级,全国计算机等级考试16套.docx
  7. 了解流式加密(CK)(二)
  8. React Native开发(一)
  9. 基于遥感和GIS技术的生态承载力评价的解决方案
  10. isotropy与anisotropy?各向同性与各向异性滤波?