c#安全-nativeAOT
文章目录
- 前记
- AOT测试
- 反序列化
- Emit
前记
JIT\AOT
JIT编译器(Just-in-Time Complier),AOT编译器(Ahead-of-Time Complier)。

AOT测试
首先编译一段普通代码
using System;
using System.Runtime.InteropServices;
namespace coleak
{class winfun{[DllImport("User32.dll")]public static extern int MessageBox(IntPtr h, string m, string c, uint type);[DllImport("kernel32.dll", EntryPoint = "Beep")]public static extern bool mymethod(uint frequency, uint duration);}class Program{static void Main(string[] args){winfun winfun = new winfun();winfun.MessageBox((IntPtr)0, "yueyy", "coleak",(uint) 0);Random random = new Random();for (int i = 0; i < 10000; i++){winfun.mymethod((uint)random.Next(10000), 100);}Console.ReadLine();}}
}
和csc直接编译相比,AOT发布确实可以防止dnspy出源码,但不能解决反汇编,该加壳还是得加壳
优点
不依赖.net框架环境也可以运行
不会被直接反编译而导致代码泄露
缺点
不能Assembly.Load进行动态加载
不支持32位程序
示例如下
using System;
using System.Reflection;
namespace LoadExe
{class Program{static void Main(string[] args)
{string base64string = @"";byte[] Buffer = Convert.FromBase64String(base64string);Assembly assembly = Assembly.Load(Buffer);Type type = assembly.GetType("DemoExe.Test");MethodInfo method = type.GetMethod("TestMethod");Object obj = assembly.CreateInstance(method.Name);method.Invoke(obj, null);
}}
}
Unhandled Exception: System.PlatformNotSupportedException: Operation is not supported on this platform.at Internal.Reflection.Execution.AssemblyBinderImplementation.Bind(ReadOnlySpan`1, ReadOnlySpan`1, AssemblyBindResult&, Exception&) + 0x39at System.Reflection.Runtime.Assemblies.RuntimeAssemblyInfo.GetRuntimeAssemblyFromByteArray(ReadOnlySpan`1, ReadOnlySpan`1) + 0x58at System.Reflection.Assembly.Load(Byte[], Byte[]) + 0xbeat LoadExe.Program.Main(String[] args) + 0x25at nativeAOT!<BaseAddress>+0x114a40
但是部分反射api仍然有效
using System;
using System.Reflection;
namespace LoadExe
{class Program{public static void Main(){Console.Write("Name of type: ");string typeName = "LoadExe.Program";string methodName = "SayHello";Type.GetType(typeName).GetMethod(methodName).Invoke(null, null);Console.ReadKey();}public static void SayHello(){Console.WriteLine("Hello!");}}
}
具体规则如下
1.APIs that don’t work and will not work
- APIs that require dynamic code generation:
Reflection.Emit,Assembly.Loadand friends - Obvious program introspection APIs: APIs on
TypeandAssemblynot mentioned above,MethodBase,MethodInfo,ConstructorInfo,FieldInfo,PropertyInfo,EventInfo. These APIs will throw at runtime. - APIs building on top of reflection APIs. Too many to enumerate.
2.Reflection-free mode supports a limited set of reflection APIs that keep their expected semantics.
typeof(SomeType)will return aSystem.Typethat can be compared with results of othertypeofexpressions or results ofObject.GetType()calls. The patterns commonly used in perf optimizations of generic code (e.g.typeof(T) == typeof(byte)) will work fine, and so willobj.GetType() == typeof(SomeType).- Following APIs on
System.Typework:TypeHandle,UnderlyingSystemType,BaseType,IsByRefLike,IsValueType,GetTypeCode,GetHashCode,GetElementType,GetInterfaces,HasElementType,IsArray,IsByRef,IsPointer,IsPrimitive,IsAssignableFrom,IsAssignableTo,IsInstanceOfType. Activator.CreateInstance()will work. The compiler statically analyzes and expands this to efficient code at compile time. No reflection is involved at runtime.Assembly.GetExecutingAssembly()will return aSystem.Reflection.Assemblythat can be compared with other runtimeAssemblyinstances. This is mostly to make it possible to use theNativeLibrary.SetDllImportResolverAPI.
反序列化
JSON格式
using System;
using System.Runtime.Serialization.Json;//添加的引用
namespace ConsoleApp1
{public class Book{public int ID { get; set; }public string Name { get; set; }public float Price { get; set; }}public class Program{static void Main(string[] args){//序列化jsonBook book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(Book));using (MemoryStream stream = new MemoryStream()){formatter.WriteObject(stream, book);string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());Console.WriteLine(result);}Console.WriteLine();//反序列化jsonstring oriStr = "{\"ID\":102,\"Name\":\"C# wpf程序设计\",\"Price\":100}";DataContractJsonSerializer formatter1 = new DataContractJsonSerializer(typeof(Book));using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(oriStr))){Book outBook = formatter1.ReadObject(stream) as Book;Console.WriteLine(outBook.ID);Console.WriteLine(outBook.Name);Console.WriteLine(outBook.Price);}Console.ReadLine();}}
}
Emit
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Text;namespace ConsoleApp1
{class Program{static void Main(string[] args){CreateAssembly();Console.ReadKey();}public static void CreateAssembly(){StringBuilder asmFileNameBldr = new StringBuilder();//定义一个程序集的名称var asmName = new AssemblyName("MyAssembly");//首先就需要定义一个程序集AssemblyBuilder defAssembly = AssemblyBuilder.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndCollect);//定义一个构建类DefineDynamicModuleModuleBuilder defModuleBuilder = defAssembly.DefineDynamicModule("MyModule");//定义一个类TypeBuilder typeBuilder = defModuleBuilder.DefineType("MyModule.MyClass", TypeAttributes.Public);//定义一个方法var defMethodBuilder = typeBuilder.DefineMethod("MyMethod",MethodAttributes.Public,null,//返回类型null//参数类型);Console.WriteLine($"程序集信息:{typeBuilder.Assembly.FullName}");Console.WriteLine($"命名空间:{typeBuilder.Namespace} , 类型:{typeBuilder.Name}");//获取IL生成器var il = defMethodBuilder.GetILGenerator();//定义一个字符串il.Emit(OpCodes.Ldstr, "coleak");//调用一个函数il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));//返回到方法开始(返回)il.Emit(OpCodes.Ret);//创建类型Type dynamicType = typeBuilder.CreateType();object ass = Activator.CreateInstance(dynamicType);dynamicType.GetMethod("MyMethod").Invoke(ass, null);}}
}
.NET Framework 中,有 RunAndSave 、Save 等枚举,可用于保存构建的程序集,但是在 .NET Core 中,是没有这些枚举的,也就是说,Emit 构建的程序集只能在内存中,是无法保存成 .dll 文件的
相关文章:
c#安全-nativeAOT
文章目录 前记AOT测试反序列化Emit 前记 JIT\AOT JIT编译器(Just-in-Time Complier),AOT编译器(Ahead-of-Time Complier)。 AOT测试 首先编译一段普通代码 using System; using System.Runtime.InteropServices; namespace co…...
【Java】案例:检测MySQL是否存在某数据库,没有则创建
1.代码 package hello; import java.sql.*;public class CeShi {//定义基本数据static final String JDBC_DRIVER "com.mysql.cj.jdbc.Driver";static final String DB_URL "jdbc:mysql://localhost/";static final String USER "your_username&q…...
内网渗透靶场02----Weblogic反序列化+域渗透
网络拓扑: 攻击机: Kali: 192.168.111.129 Win10: 192.168.111.128 靶场基本配置:web服务器双网卡机器: 192.168.111.80(模拟外网)10.10.10.80(模拟内网)域成员机器 WIN7PC192.168.…...
[嵌入式系统-9]:C语言程序调用汇编语言程序的三种方式
目录 1. 使用函数声明和函数调用: 2. 使用汇编内联(Inline Assembly): 3. 使用汇编代码文件和链接器: C语言程序可以调用汇编程序的方式有多种,下面列举了几种常见的方式: 1. 使用函数声明和…...
备战蓝桥杯---搜索(完结篇)
再看一道不完全是搜索的题: 解法1:贪心并查集: 把冲突事件从大到小排,判断是否两个在同一集合,在的话就返回,不在的话就合并。 下面是AC代码: #include<bits/stdc.h> using namespace …...
深入浅出:Golang的Crypto/SHA256库实战指南
深入浅出:Golang的Crypto/SHA256库实战指南 介绍crypto/sha256库概览主要功能应用场景库结构和接口实例 基础使用教程字符串哈希化文件哈希化处理大型数据 进阶使用方法增量哈希计算使用Salt增强安全性多线程哈希计算 实际案例分析案例一:安全用户认证系…...
Unity_ShaderGraph节点问题
Unity_ShaderGraph节点问题 Unity版本:Unity2023.1.19 为什么在Unity2023.1.19的Shader Graph中找不见PBR Master节点? 以下这个PBR Maste从何而来?...
Java集合 Collection接口
这里写目录标题 集合Collection接口创建一个性表增加元素删除元素修改元素判断元素遍历集合实例判断元素是否存在 集合 Java中的Collection接口是集合类的一个顶级接口,它定义了一些基本的操作,如添加、删除、查找等。Collection接口主要有以下几个常用…...
C# Task的使用
C#中的Task类是.NET框架中用于实现异步编程的核心组件之一,它在.NET Framework 4及更高版本以及.NET Core中广泛使用。Task对象代表一个异步操作,并提供了跟踪异步操作状态、获取结果和处理完成通知的方法。 Task 类提供了对异步操作的封装,…...
尚硅谷Ajax笔记
一天拿下 介绍二级目录三级目录 b站链接 介绍 ajax优缺点 http node.js下载配置好环境 express框架 切换到项目文件夹,执行下面两条命令 有报错,退出用管理员身份打开 或者再命令提示符用管理员身份打开 npm init --yes npm i express请求 <script>//引…...
【MATLAB源码-第138期】基于matlab的D2D蜂窝通信仿真,对比启发式算法,最优化算法和随机算法的性能。
操作环境: MATLAB 2022a 1、算法描述 D2D蜂窝通信介绍 D2D蜂窝通信允许在同一蜂窝网络覆盖区域内的终端设备直接相互通信,而无需数据经过基站或网络核心部分转发。这种通信模式具有几个显著优点:首先,它可以显著降低通信延迟&…...
AcWing 第 142 场周赛 B.最有价值字符串(AcWing 5468) (Java)
AcWing 第 142 场周赛 B.最有价值字符串(AcWing 5468) (Java) 比赛链接:AcWing 第 142 场周赛 x题传送门:B.最有价值字符串 题目:不展示 分析: 题目不难,不过有坑😭。 我们可以定义一个数组记录每个字…...
滑块识别验证
滑块识别 1. 获取图片 测试网站:https://www.geetest.com/adaptive-captcha-demo 2. 点击滑块拼图并开始验证 # 1.打开首页 driver.get(https://www.geetest.com/adaptive-captcha-demo)# 2.点击【滑动拼图验证】 tag WebDriverWait(driver, 30, 0.5).until(la…...
每日五道java面试题之java基础篇(四)
第一题. 访问修饰符 public、private、protected、以及不写(默认)时的区别? Java 中,可以使⽤访问控制符来保护对类、变量、⽅法和构造⽅法的访问。Java ⽀持 4 种不同的访问权限。 default (即默认,什么也不写&…...
我的docker随笔43:问答平台answer部署
本文介绍开源问答社区平台Answer的容器化部署。 起因 笔者一直想搭建一个类似stack overflower这样的平台,自使用了Typora,就正式全面用MarkdownTyporagit来积累自己的个人知识库,但没有做到web化,现在也还在探索更好的方法。 无…...
17、ELK
17、ELK helm 安装 elkfk(kafka 集群外可访问) ES/Kibana <— Logstash <— Kafka <— Filebeat 部署顺序: 1、elasticsearch 2、kibana 3、kafka 4、logstash 5、filebeat kubectl create ns elkhelm3部署elkfk 1、elast…...
React+Antd+tree实现树多选功能(选中项受控+支持模糊检索)
1、先上效果 树型控件,选中项形成一棵新的树,若父选中,子自动选中,子取消,父不取消,子选中,所有的父节点自动取消。同时支持模糊检索,会检索出所有包含该内容的关联节点。 2、环境准…...
鸿蒙 WiFi 扫描流程(2)
接着上篇没有记录完的,我们继续梳理,需要上一篇做基础的请看:鸿蒙 WiFi 扫描流程(1) 上一篇我们讲到 scan_service.cpp 里面的 SingleScan 方法,继续这个方法往下看: // foundation/communicat…...
微信小程序(四十)API的封装与调用
注释很详细,直接上代码 上一篇 新增内容: 1.在单独的js文件中写js接口 2.以注册为全局wx的方式调用接口 源码: utils/testAPI.js const testAPI{/*** * param {*} title */simpleToast(title提示){//可传参,默认为‘提示’wx.sho…...
WebSocket+Http实现功能加成
WebSocketHttp实现功能加成 前言 首先,WebSocket和HTTP是两种不同的协议,它们在设计和用途上有一些显著的区别。以下是它们的主要特点和区别: HTTP (HyperText Transfer Protocol): 请求-响应模型: HTTP 是基于请求-响应模型的协…...
从代码小白到脚本高手:拆解一个实用的Illustrator自动角线脚本(JavaScript for AI)
从代码小白到脚本高手:拆解Illustrator自动角线脚本的JavaScript实现 在印刷品制作流程中,角线标注是不可或缺的环节。传统手动绘制不仅耗时费力,还容易因人为疏忽导致误差。这个自动角线脚本通过JavaScript与Illustrator DOM的交互ÿ…...
ArcGIS 10.5保姆级安装指南:从下载到激活,一次搞定所有报错
ArcGIS 10.5实战安装手册:避坑指南与深度优化 第一次安装ArcGIS 10.5的经历,往往像一场没有地图的探险——你永远不知道下一个报错对话框会在哪个转角等着你。作为GIS领域的行业标准工具,ArcGIS的安装过程远比普通软件复杂,特别是…...
2026年必知!千川数据报表究竟该怎么看?
痛点深度剖析我们团队在实践中发现,众多企业在使用千川数据报表时面临诸多困境。一方面,数据维度繁杂,包含流量、转化、销售等多方面数据,企业难以快速准确地从中提取关键信息,如不同渠道流量的转化率、不同商品的销售…...
AVX-512内存对齐踩坑实录:从‘段错误’到完美运行的避坑指南
AVX-512内存对齐踩坑实录:从‘段错误’到完美运行的避坑指南 当你在深夜的办公室里,面对一个神秘的Segmentation fault错误,而代码逻辑明明毫无破绽时,那种挫败感足以让任何开发者抓狂。这正是我第一次尝试将AVX-512指令集集成到现…...
功率MOSFET选型方案——路空一体飞行汽车充电场站高效、可靠与紧凑型电源系统设计指南
随着城市立体交通的快速发展,路空一体飞行汽车充电场站已成为下一代交通能源补给的核心枢纽。其高功率充电桩、储能系统及辅助设施对电源转换与管理的效率、功率密度及长期运行可靠性提出了极致要求。功率MOSFET作为电能转换的关键开关器件,其选型直接决…...
vulhub系列-84-hacksudo: aliens(超详细)
免责声明:本文记录的是 hacksudo: aliens 渗透测试靶机 的解题过程,所有操作均在 本地授权环境 中进行。内容仅供 网络安全学习与防护研究 使用,请勿用于任何非法用途。读者应遵守《网络安全法》及相关法律法规,自觉维护网络空间安…...
写代码时频繁打喷嚏?别信“有人想你”,这是身体系统的预警日志
写代码时频繁打喷嚏?别信“有人想你”,这是身体系统的预警日志 专栏链接:匠身颐和 作者:培风图南以星河揽胜 技以匠心,身以颐和。穷源溯流,昂霄耸壑;至道嘉猷,静水流深。 前言 作为…...
XSKY 与平凯星辰(TiDB)完成联合解决方案互认证,存储+数据库联合交付能力再获验证
近日,XSKY 星辰天合与平凯星辰(北京)科技有限公司正式完成联合解决方案互认证。本次认证覆盖 XSKY 旗下 XEBS V6(星飞极速版)、XHERE V6(星飞极速版)、XEDP V6 三款核心产品与平凯星辰的平凯数据…...
不止于调试:用Modbus Poll深度解析Modbus TCP/IP协议帧,看懂每一行通信报文
不止于调试:用Modbus Poll深度解析Modbus TCP/IP协议帧,看懂每一行通信报文 当你熟练使用Modbus Poll完成设备读写时,是否好奇过点击"Read/Write Once"按钮后,工具与PLC之间究竟传递了哪些信息?那些十六进制…...
Java高频面试考点场景题12
视频以 “银行网点” 类比,系统讲解了线程池的核心设计逻辑与面试高频考点,核心内容可总结为以下四部分:一、线程池的 “抠门” 原则线程池设计遵循 “能排队就不招临时工” 的反直觉原则:优先使用核心线程处理任务,队…...
