首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在调用MSIL中的字段之前必须执行ldarg.0?

在调用MSIL中的字段之前必须执行ldarg.0,是因为MSIL(Microsoft Intermediate Language)是一种低级的中间语言,它需要以一种特定的方式来处理方法和函数的参数和局部变量。在MSIL中,参数和局部变量是通过索引来访问的,而不是通过名称。

当在MSIL中调用一个方法或函数时,需要将当前对象的引用作为第一个参数传递给该方法或函数。因此,在调用该方法或函数之前,需要使用ldarg.0指令将当前对象的引用加载到堆栈上。这样,在调用该方法或函数时,该引用将作为第一个参数传递给该方法或函数。

ldarg.0指令的作用是将当前对象的引用加载到堆栈上。这个指令的操作数是一个索引,表示当前对象的引用在局部变量表中的位置。在MSIL中,局部变量表是一个数组,用于存储方法或函数的局部变量和参数。

总之,在调用MSIL中的字段之前必须执行ldarg.0,是因为MSIL需要将当前对象的引用作为第一个参数传递给方法或函数,并且需要使用ldarg.0指令将该引用加载到堆栈上。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

DNS远程调用执行应用

Address一般是服务器本身配置DNS外网出口IP,证明是下部分命令成功icloud.com登录功能所在服务器成功执行,这个是一个可以执行命令演示,如果这里exp是一个echo "...自己设备上执行,可以看到我设备本身DNS外网递归出口为27.40.22.150IP地址; image.png image.png 二、实现原理 image.png     当我们...权威服务器就能知道,什么时间,什么IP请求了什么域名,然后做日志回显即可完成该操作;(该网站提供子域名TTL也是 190,所以190s之内请求就记录不了了,要等到下一个TTL周期进行请求。)...dnslog.cn提供随机子域名请求打印功能,可以很快验证远程命令是否正常执行,以便给黑白帽子做判断是否进行下一步操作;  那么基于此原理,还能做什么?...,我还想知道是什么角色之下,执行下whoami命令,显然是OK,并且ceye提供子域名TTL是1s,也就是大部分请求日志都会记录在权威; image.png image.png    这样带来可玩性就比较多了

5.9K240

Javascript必须理解执行上下文和调用

——爱默生 执行上下文 JavaScript 是非常重要基础知识,想要理解 JavaScript 执行过程,执行上下文 是你必须要掌握知识。否则只能是知其然不知其所以然。...这篇文章我们将深入了解 执行上下文,读完文章之后你应该可以清楚了解到 JavaScript 解释器到底做了什么,为什么可以一些函数和变量之前使用它,以及它们值是如何确定。...如果在全局代码调用了一个函数,则代码执行会进入函数,此时会创建一个新执行上下文,它会被推到执行上下文栈。...虽然 foo 被声明了两次,但是我们创建阶段说到,函数是变量之前创建在变量对象,当变量对象名称已经存在时,变量声明什么也不做。...希望你已经理解了 JavaScript 解释器是如何执行代码。理解执行上下文和 执行上下文栈能够让你清楚知道你代码为什么和预期值不一样。 你认为了解,解释器内部原理是多余还是必须知识?

54430

Javascript必须理解执行上下文和调用

这篇文章我们将深入了解 执行上下文,读完文章之后你应该可以清楚了解到 JavaScript 解释器到底做了什么,为什么可以一些函数和变量之前使用它,以及它们值是如何确定。...如果在全局代码调用了一个函数,则代码执行会进入函数,此时会创建一个新执行上下文,它会被推到执行上下文栈。...执行阶段之前,我们已经完成了创建阶段,此时变量/函数已经被创建,所以当函数执行时候 foo 可以被访问到。...虽然 foo 被声明了两次,但是我们创建阶段说到,函数是变量之前创建在变量对象,当变量对象名称已经存在时,变量声明什么也不做。...希望你已经理解了 JavaScript 解释器是如何执行代码。理解执行上下文和 执行上下文栈能够让你清楚知道你代码为什么和预期值不一样。 你认为了解,解释器内部原理是多余还是必须知识?

44510

NEO C# 合约编译器原理解析

代码是github上面找,NEO-NEP5.1是NEP5一个token,包含常用元素,字段,事件与函数。具有常见数据存储,合约调用及日志信息功能。...,其中字段还原没有问题,多了个类构造和构造函数,还有event对应出来两个add/remove方法,后来转换过程中都需要清除掉.事实上neoevent更多只是起到了标识作用。...-> 合约字节码 MSIL转换合约字节码工具是neo-compiler/neon定义,转换命令为 dotnet ....代码调用 合约代码入口就是文件main函数,通常是根据传入函数名称判断调用到对应工作函数。下面会通过两个具体函数执行过程,通过对比三种代码来说明这个编译执行过程。...定义 合约自己定义方法都符合这个类型,如例子转账及部署等。

88020

【.Net底层剖析】3.用IL来理解属性

概述: 我们经常在code中用到属性,但是我们真的知道属性和字段区别吗?为什么会有属性这个用法?...Beforefieldinit 属性为Student提供了一个附加信息,用于标记运行库可以在任何时候执行类型构造函数方法,只要该构造方法第一次访问其静态字段之前执行即可。...Ldarg.0(load argument)装载第一个成员参数,实例方法中指的是当前实例引用,该实例引用将用于基类构造函数调用。  ...从调用执行构造函数初始化之前,首先初始化对象附加成员: 指向该类型方法表指针 SyncBlockIndex,用于进行线程同步。     所有的对象都包含这两个附加成员,用于管理对象。...但是调试时需要注意,如果对属性Name添加了监视,则可能会引入bug,比如在get访问器递增一个字段count,那么每单步执行一行代码,监视器都会重新去调用get方法,从而造成字段递增。

81670

.NET托管非托管区别和引申

托管加固 一些加密软件,为了对托管DLL逆向难度进行增强。来回托管和非托管中切换,理论上来说托管函数都遵循CLR/JIT规则。...这个看似简单过程,可以通过加密软件把这个ABC函数MSIL进行重新构建。...不说它在JIT里面的IR变形和优化,也不说变成机器码之后程序结果。只看当前就非常艰涩。它某些跳转里面包含了一些函数调用,这些函数调用里面又包含了十几个跳转。...为了解决这个困惑,可以JITPreStubworker上入手,查看其汇编结果,逐步推导。...基本上耗尽耐心。虽然它看似足够牛逼,为了解决这个非托管困惑。这里依然有足够宽松切入点,那就上面所说非托管DLL。

10710

CA1810:以内联方式初始化引用类型静态字段

规则说明 当一个类型声明显式静态构造函数时,实时 (JIT) 编译器会向该类型每个静态方法和实例构造函数添加一项检查,以确保之前调用该静态构造函数。...静态初始化可以保证访问任何静态字段之前某个时间发生,但不能在调用静态方法或实例构造函数之前发生。 请注意,声明类型变量后,可能会随时发生静态初始化。 静态构造函数检查会降低性能。...通常,静态构造函数仅用于初始化静态字段,在这种情况下,必须确保仅在首次访问静态字段之前发生静态初始化。 beforefieldinit 行为适用于这些类型和大多数其他类型。...仅当静态初始化影响全局状态并且满足以下任一条件时,它才是不适当: 影响全局状态成本非常昂贵,如果不使用该类型,则不需要这样做。 可以不访问该类型任何静态字段情况下访问全局状态效果。...何时禁止显示警告 如果不考虑性能,或者,如果静态初始化导致全局状态更改成本非常昂贵,或者必须保证调用该类型静态方法或创建该类型实例之前进行静态初始化,则可以安全地禁止显示此规则发出警告。

59700

5-自动属性增强

在为属性赋值时候,我们可以在任意地方为其赋值。但是并没有一种像是字段一样声明且立即初始化语法来简化默认值设定。C#6为我们带来了这种新语法,像是为字段赋值一样为属性赋值。...,第2行分别表示这个自动是编译器自动生成,第3行表示该字段不显示Debugger窗口中。...声明只读属性 10 public string Note { get; } 11 12 public Person(string note) 13 { 14 //构造器为只读属性初始化默认值...(readonly ),只允许声明时候设置初始值或者构造器里面赋值。...string csharp6.Person::'k__BackingField' 19 IL_0021: ret 20 } // end of method Person::.ctor 和之前语法生成代码可以说是一致

56870

30分钟?不需要,轻松读懂IL

为什么取这个标题呢,记得很久之前看过一篇文章,叫"正则表达式30分钟入门教程",学正则最重要就是记住各个符号含义。个人觉得相比难以直接看出实际意义正则符号如"\w","\d","*","?"...Dup 复制计算堆栈上当前最顶端值,然后将副本推送到计算堆栈上。 Neg 对一个值执行求反并将结果推送到计算堆栈上。...Debug下 Pop 移除当前位于计算堆栈顶部值。 Initobj Init Object将位于指定地址值类型每个字段初始化为空引用或适当基元类型 0。...ldarg要特别注意一个问题:如果是实例方法的话ldarg.0加载是本身,也就是this,ldarg.1加载才是函数第一个参数;如果是静态函数,ldarg.0就是第一个参数。...//调用基类People构造函数,而People也会调用Object构造函数 8 IL_0006: ldarg.0 //加载this 9 IL_0007: ldarg.1 //加载第二个参数也就是

71170

.Net JIT二进制骚操DHVM破解篇

然后执行指令 mov qword ptr [rdi+10h],r11 这里r11寄存器保存是通过DHVM加密后托管DLL真实MSIL二进制代码。...它这么做目的就是屏蔽掉原有托管DLL里面的MSIL,而用DHVM自己加密之后保存MSIL。无论你怎么修改原有的托管DLL,都不会影响JIT执行。...构建数据之前还需要做一件事情,我们上面蛛丝马迹里面jmp指令 0000000180497AB2: E9 A1 01 00 00 jmp 0000000180497AB8 需要让它跳转到00499258...MSIL 我们需要做就是r15里面修改MSIL二进制即可。...06 调用DEF函数二进制代码是: 28 07 00 00 06 可以看到ABC和DEF函数MSIL二进制代码,只是基本上相同,上面偏移0x1位置一个是06,一个是07。

22410

.NET 各种混淆(Obfuscation)含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)

名称混淆 Obfuscation 修改类型、字段、属性、方法等名称。 流程混淆 Control Flow Obfuscation 修改方法内执行逻辑,使其执行错综复杂。...字段混淆有三个不同级别: 等级 1 是源码字段名称和混淆后字段名称一一对应 等级 2 是一个类不同字段使用不同名称即可(这不废话吗,不过 SmartAssembly 应该是为了强调与等级 1...和等级 3 不同,必须写一个描述) 等级 3 是允许不同类字段使用相同名字(这样能够更加让人难以理解) 需要注意:对于部分程序集,字段名(FieldsNameMangling)等级只能选为...而如果开启了这一选项,那么 Strings.Get 就不是全局调用了,而是内部调用一个委托字段。...,因为多执行代码都是有编译期级别优化,没有太多性能开销代码 流程混淆仅影响实现,不修改 API,所以基本不会影响其他程序各种对此程序集调用 名称混淆 尽量选择 任意选择类/方法名和字段级别

2.3K10

C#基础知识系列六(静态类和静态类成员)

例如, .NET Framework 类库,静态类 System.Math 包含方法只执行数学运算,而无需存储或检索特定 Math 类实例特有的数据。...但是,可以保证程序首次引用该类前加载该类,并初始化该类字段调用其静态构造函数。 静态构造函数仅调用一次,程序驻留应用程序域生存期内,静态类一直保留在内存。...如果非静态类包含需要进行重要初始化静态成员,也应定义静态构造函数。 静态类成员   非静态类可以包含静态方法、字段、属性或事件。 即使没有创建类实例,也可以调用该类静态成员。...更常见做法是声明具有一些静态成员非静态类,而不是将整个类声明为静态类。 静态字段有两个常见用法:一是记录已实例化对象个数,二是存储必须在所有实例之间共享值。   ...对静态方法调用以 Microsoft 中间语言 (MSIL) 生成调用指令,而对实例方法调用生成 callvirt 指令,该指令还检查 null 对象引用。

80320

实例方法和静态方法有区别吗?

对于很多人来说,这是一个愚蠢问题。因为我们都知道它们区别,实例方法作用于某个具体上下文对象,该上下文对象可以利用this关键字获得;静态方法则是定义某个类型,不存在上下文对象概念。...方法涉及三个IL指令:ldarg.0提取第1个参数压入栈,具体入栈是指向IntValue对象地址;目标IntValue对象_value字段通过ldfld指令被加载,最终通过ret指令作为结果返回...如下所示就是上面C#针对这两个方法调用转换生成IL代码。...比如我们IntValue类型(可以定义任意类型定义了一个总是返回int.MaxValueAlwaysMaxValue方法。...在演示程序,我们通过调用Hijack方法将IntValue实例方法AsInt32“替换”这个AlwaysMaxValue方法。

18240

为什么 C# string.Empty 是一个静态只读字段,而不是一个常量呢?

进一步可以发现 string.Empty 实际上是一个静态只读字段,而不是一个常量。 为什么这个看起来最适合是常量 string.Empty,竟然使用静态只读字段呢?...翻译过来是:对具有此 Intrinsic 特性标记字段方法或引用调用可以某些具有 JIT 内部扩展调用点处替换,标记有此属性类型可能被运行时或编译器特殊处理。...string.Empty 字段整个 String 类型你都看不到初始化代码,String 类静态构造函数也不会执行。也就是说,String 类所有静态成员都不会被托管代码初始化。...从上文中 string.Empty 注释描述可以知道: 编译器会将 C# 语言编译成中间语言 MSIL; 如果这是一个常量,那么编译器不做特殊处理情况下,就会生成 ldstr "",而这种方式不会调用到...String 类构造函数(注意不是静态构造函数,String 类静态构造函数是特殊处理不会调用); 而如果这是一个静态字段,那么编译器可以不做特殊处理情况下,生成 ldsfld string

1K00

如何有效地检测和阻止SunBurst恶意软件?

您可以观察到第一件事是,这些规则是any/any,这意味着IDS必须调查每个连接,因为大多数IDS都不像ntop工具那样使用DPI,因此它们需要在到处搜索而不是精确定位字段:这意味着整体工具性能会降低...,因为即使是不相关流量也必须进行分析,你可能会遇到假阳性。...请注意,由于这些规则是使用加密流量之前设计,因此不是最优,因此它们非常原始,范围有限。...上搜索(甚至非标准端口上),如果你发现了指向特定网站连接(例如freescanonline.com),就会发出警报。...里面,你必须通过绑定(菜单设置->应用程序和类别)告诉它Sunburst是一个恶意软件,Sunburst属于恶意软件类别。

79730

C#扩展方法原理及其使用

1、写在前面 今天群里一个小伙伴问了这样一个问题,扩展方法与实例方法执行顺序是什么样子,谁先谁后(这个问题会在文章结尾回答)。所以写了这边文章,力图从原理角度解释扩展方法及其使用。...先让我们来感受一下.NET自带扩展方法,其中OrderBy和Aggregate都是系统自带扩展方法 ?...通过以上实例,我们可以知道自定义扩展方法需要做到: 必须是静态类,扩展方法也为静态方法 此方法第一个参数指定方法所操作类型;此参数前面必须加上 this 修饰符 调用代码,如何不再同一个命名空间...,这也解释了一个问题,就是当类型为空时候,为什么调用扩展方法了 ?...一下是使用扩展方法时需要注意地方 扩展方法与该类型定义方法具有相同签名,编译器总是绑定到该实例方法,也就是扩展方法永远不会被调用,这也就回答了题目刚开始所说问题。

1.5K20

C# 泛型简单理解(安全、集合、方法、约束、继承)

例如,如果你定义一个泛型类型MyList<T>,仅仅该类型一个定义出现在MSIL。当程序执行时,不同类被动态地创建,每个类对应该参数化类型一种类型。...<>内T代表了实际的当使用该类时要指定类型。MyList类,定义了一个静态字段objCount。我构造器增加它值。因此我能发现使用我用户共创建了多少个那种类型对象。...属性Count返回与被调用实例同类型实例数目。...问题是:Count(上面的程序输出)值该是多少?在你继阅读之前,试一试回答这个问题。 ?...注意,虽然有4个MyList类,但仅有一个被存储MSIL。怎么能证明这一点?请看下图显示出使用工具ildasm.exe生成MSIL代码。 ? 泛型方法 除了有泛型类,你也可以有泛型方法。

1K10

C# IL DASM 使用

IL是微软平台上一门中间语言,我们常写C#代码在编译器中都会自动转换成IL,然后由即时编译器(JIT Compiler)转化机器码,最后被CPU执行。...已上信息填写完成后,“工具”选择卡能找到我们刚增加外部工具名称(IL_DASM)。增加完成后可以小试一把。 国际惯例来段"Hello World"。...这时可以看到Main方法IL编译代码。感觉有点陌生不易看懂。 还有IL编译出现三角型,正方型都是啥! IL DASM 基础 1.图标含义 ? 使用IL反编译出项目代码 ?...这里主要指C、C++代码等; 5)beforefieldinit,是用来标记运行库(CLR)可以静态字段方法生成后任意时刻,来加载构造器(构造函数); .ctor 方法代码: .method public....otor期间评估堆栈(Evaluation Stack) ; 3) IL_0000:标记代码行开头; 4)ldarg.0:表示转载第一个成员参数,实例方法中指的是当前实例引用; 5)call:

93431
领券