基于mono.ceil对c#进行注入垃圾代码,混淆代码,IL代码注入
前言
unity的c#层,编译处理的程序集Assembly_CSharp.dll,通过dnspy反编译出来,可以看到自己写的代码,代码也是公司的财产(大雾,这不是我说的),但是开发项目过程中,有什么方法加密程序集呢?指令表(Instruction List,简称IL)是为可编程逻辑控制器(PLC)设计的编程语言,是相关的IEC 61131-3标准中支援几种语言之一,是类似组合语言的低阶语言。
Mono.Ceil 地址Mono.Cecil | Mono
官方wiki:https://github.com/jbevain/cecil/wiki/HOWTO
通过AssemblyDefinition下的ReadAssembly 读取程序集,AssemblyDefinition存储着改程序集的参数
ReadAssembly(assemblyPath, readParams); 其中参数readParams是对该程序集交互的方法,最简单的将’True’初始化给ReaderParameters.ReadSymbols对象 或 WriterParameters.WriteSymbols对象
var readParams = new ReaderParameters();CustomResolver customResolver = new CustomResolver();customResolver.SetPath(projectDir, configPath);readParams.AssemblyResolver = customResolver;readParams.ReadWrite = true;readParams.ReadSymbols = true;
这里的CustomResolver是我的自定义类,指定你的自己的AssemblyResolver。通过这种方式你可以控制你加载模块和你解析的一些和他的相关的引用的生命周期。
继承自BaseAssemblyResolver,
添加一该程序集需要的外部引用,我这里是拿依赖unity dll。
dll.Write(baseDllDir, new WriterParameters { WriteSymbols = true });
dll保存
assembly.MainModule获取程序集模块,
var typeArr = assembly.MainModule.Types;获取该程序集所有的类模块
一个TypeDefinition列表, foreach (var t in typeArr)遍历
TypeDefinition.name 就是类名,可以混淆,
TypeDefinition.Methods该类所有方法,可以插入垃圾方法或者垃圾代码type.Methods.Insert(index, mymethod);
代码你可以通过IL指令自己写,也可以写一个垃圾方法类,遍历类的时候,把垃圾方法类提取出来成IL指令,再插入方法。
var mymethod = new MethodDefinition();Random random = new Random();for (int it = 0; it < 3; it++){int JunlMethodIndex = random.Next(variableMap.Count);string methodNameSeed = "";for (int i = 0; i < 17; i++){methodNameSeed += _zimu[random.Next(52)]; //通过索引下标随机}var typeRef = mythodBodyList[JunlMethodIndex].ReturnType;mymethod = new MethodDefinition(methodNameSeed + "12345", MethodAttributes.Public, typeRef);mymethod.Body.Instructions.Clear();mymethod.Body.Variables.Clear();foreach (var il in mythodBodyList[JunlMethodIndex].Body.Instructions){var ilProcessor = mythodBodyList[JunlMethodIndex].Body.GetILProcessor();if (il.OpCode.Equals(Mono.Cecil.Cil.OpCodes.Add)){Instruction ilTemp = ilProcessor.Create(Mono.Cecil.Cil.OpCodes.Sub);mymethod.Body.Instructions.Add(ilTemp);continue;}if (il.OpCode.Equals(Mono.Cecil.Cil.OpCodes.Sub)){Instruction ilTemp = ilProcessor.Create(Mono.Cecil.Cil.OpCodes.Add);mymethod.Body.Instructions.Add(ilTemp);continue;}if (il.OpCode.Equals(Mono.Cecil.Cil.OpCodes.Mul)){Instruction ilTemp = ilProcessor.Create(Mono.Cecil.Cil.OpCodes.Div);mymethod.Body.Instructions.Add(ilTemp);continue;}if (il.OpCode.Equals(Mono.Cecil.Cil.OpCodes.Div)){Instruction ilTemp = ilProcessor.Create(Mono.Cecil.Cil.OpCodes.Mul);mymethod.Body.Instructions.Add(ilTemp);continue;}if (il.OpCode.Equals(Mono.Cecil.Cil.OpCodes.And)){Instruction ilTemp = ilProcessor.Create(Mono.Cecil.Cil.OpCodes.Or);mymethod.Body.Instructions.Add(ilTemp);continue;}if (il.OpCode.Equals(Mono.Cecil.Cil.OpCodes.Or)){Instruction ilTemp = ilProcessor.Create(Mono.Cecil.Cil.OpCodes.And);mymethod.Body.Instructions.Add(ilTemp);continue;}mymethod.Body.Instructions.Add(il);}foreach (var il in mythodBodyList[JunlMethodIndex].Body.Variables){mymethod.Body.Variables.Add(il);}foreach (var il in mythodBodyList[JunlMethodIndex].Parameters){mymethod.Parameters.Add(il);}int index = random.Next(type.Methods.Count);//Console.WriteLine("mymethod what error :{0}", mymethod.Name);type.Methods.Insert(index, mymethod);}
我这里演示一些IL指令写垃圾方法,垃圾类就不演示了。
同时,还可以检查该类或者方法是否被其他程序集引用,如果引用,则不可以混淆,或者记录下来一起混淆,
查看IL指令,不难发现
这是个单例,后面是参数,
程序集调用方法,下面是方法体
很清楚,查看所有IL指令表IL指令详细表 - 张龙豪 - 博客园,然后
method.Body.Instructions获取方法体里面所有的IL指令
if (ilLanguage.ToString().Contains("call")){if (ilLanguage.Operand.GetType() == (typeof(GenericInstanceMethod)) && ((GenericInstanceMethod)ilLanguage.Operand).DeclaringType.Scope.Name == DllName){GenericInstanceMethod methodRef = ((GenericInstanceMethod)ilLanguage.Operand);//Console.WriteLine("AssemblyEditorPath class:{0} ==============ref 程序集:{1} ====== ref classs:{2} === method:{3}", type, methodRef.DeclaringType.Scope.Name, methodRef.DeclaringType, methodRef.Name);string methodName = methodRef.Name;string className = methodRef.DeclaringType.Name;if (!isRefByOtherDLLMap.ContainsKey(className)){List<string> xx = new List<string>();xx.Add(methodName);isRefByOtherDLLMap.Add(className, xx);continue;}if (isRefByOtherDLLMap[className].IndexOf(methodName) == 0)continue;isRefByOtherDLLMap[className].Add(methodName);}if (ilLanguage.Operand.GetType() == (typeof(MethodReference)) && ((MethodReference)ilLanguage.Operand).DeclaringType.Scope.Name == DllName){MethodReference methodRef = ((MethodReference)ilLanguage.Operand);string methodName = methodRef.Name;string className = methodRef.DeclaringType.Name;if (!isRefByOtherDLLMap.ContainsKey(className)){List<string> xx = new List<string>();xx.Add(methodName);isRefByOtherDLLMap.Add(className, xx);continue;}if (isRefByOtherDLLMap[className].IndexOf(methodName) == 0)continue;isRefByOtherDLLMap[className].Add(methodName);}}
查找call指令的语句,
/Console.WriteLine("AssemblyEditorPath class:{0} ==============ref 程序集:{1} ====== ref classs:{2} === method:{3}", type, methodRef.DeclaringType.Scope.Name, methodRef.DeclaringType, methodRef.Name);
methodRef.DeclaringType.Scope.Name 引用程序集名
methodRef.DeclaringType 引用的class名
methodRef.Name 引用的程序名
基于mono.ceil对c#进行注入垃圾代码,混淆代码,IL代码注入相关推荐
- 基于改进层次凝聚聚类算法的垃圾收运跨区域调度策略
1引言: 垃圾收运的各个环节是控制垃圾回收成本的关键,当前分区域运营模式存在以下问题: 运营成本高:分区域运营模式限制了城市生活垃圾收集和运输的各个环节.从一个区域的特定街道收集的垃圾只能在该区域街道 ...
- nginx防护规则,拦截非法字符,防止SQL注入、防XSS,nginx过滤url访问,屏蔽垃圾蜘蛛,WordPress安全代码篇
nginx防护规则,拦截非法字符,防止SQL注入.防XSS,nginx过滤url访问,屏蔽垃圾蜘蛛,WordPress安全代码篇 精心强化,小白一键复制 资源宝分享:www.httple.net 宝塔 ...
- Xamarin 2.0:基于Mono跨平台开发框架
原文地址为: Xamarin 2.0:基于Mono跨平台开发框架 跨平台移动开发框架Xamarin今天发布了最新的2.0版本,新增Xamarin Studio集成开发环境以及 Xamarin Comp ...
- 基于Mono和VSCode打造轻量级跨平台IDE
最近Visual Studio推出Mac版本的消息迅速在技术圈里刷屏,当工程师们最喜欢的笔记本电脑Mac,邂逅地球上最强大的集成开发环境Visual Studio的时候,会碰撞出怎样精彩的火花呢? ...
- spring 构造函数注入_Spring依赖注入–字段vs设置器vs构造函数注入
spring 构造函数注入 欢迎使用Spring Dependency Injection –字段,设置器,构造函数注入教程. 了解场注入 , 二传手注入和构造函数注入之间的区别. 借助代码示例,我们 ...
- Spring依赖注入–字段vs设置器vs构造函数注入
欢迎使用Spring Dependency Injection –字段,设置器,构造函数注入教程. 了解场注入 , 二传手注入和构造函数注入之间的区别. 借助代码示例,我们将看到使用每个示例的好处以及 ...
- 关于dll注入方式的学习(全局钩子注入)
何为dll注入 DLL注入技术,一般来讲是向一个正在运行的进程插入/注入代码的过程.我们注入的代码以动态链接库(DLL)的形式存在.DLL文件在运行时将按需加载(类似于UNIX系统中的共享库(shar ...
- 基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明)
基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明) 配置环境 1.前言 2.问题描述 3.解决方案 4.实现步骤 4.1数据集选择 4.2构建网络 4.3训练网络 4.4测试网络 4.5图 ...
- limit 后注入_聊一聊 SQLMAP 在进行 sql 注入时的整个流程
本文作者:sher10ck(信安之路核心成员) 很多小伙伴在发现或者判断出注入的时候,大多数选择就是直接上 sqlmap,结果往往也不尽人意,于是就有想法来写写 sqlmap 从执行到判断注入,到底发 ...
最新文章
- C#中switch语句注意
- Android利用RecyclerView实现列表倒计时
- ORACLE基础知识
- linux 定时执行shell脚本 定时任务
- mysql数据库主从同步状态正常,无异常报错,数据不能同步
- php_self include,PHP_SELF返回/index.php/index.php
- [LeetCode] Sum of Left Leaves 左子叶之和
- 怎么将查询到的数据表传到文本区_60秒上手Treelab (二):入门数据表
- php 图片 中文乱码,php utf8页面验证码图片中文乱码
- 淘宝店铺基础版全屏装修步骤及代码,已经经过测试
- steam linux安装目录在哪,Ubuntu 16.04 LTS 64位下安装steam游戏平台
- matlab已知随机样本求总体均值与方差的矩估计值(例子应用)
- Linux之旅----硬件篇
- NOSQL原理,基础用法,NOSQL入门
- 怪物Appr值与Data里Mon-x.wil里图像的对应关系
- BZOJ1067降雨量
- asp读取QQwry.dat
- Masonry--“瀑布流” 布局(图片较多,推荐在WIFI下查看)
- ubuntu 双硬盘分区方案
- 【题集·待解决】牛客网·2018年全国多校算法寒假训练营练习比赛(第二场)
热门文章
- 小米鼠标,蓝牙鼠标MiMouse ,电脑搜不到怎么办?一秒搞定
- 【Tech-Android-Other】Android性能优化
- 用计算机打字英语,计算机英语常用词汇_1000-1695_纯英文版
- 服务器网络打印总是自动删除,打印机无法打印打印文件时会自动删除,怎么回事啊?...
- 用canvas画一个水滴形状的渐变进度条、控制条
- stm32f407用oled实时显示日期和时间
- Photoshop CS3 裁剪图片指南
- c# 如果控制智能停车系统出入口道闸模块开关
- Keil复制中文注释到记事本/word出现乱码
- 如何在 JavaScript 中创建线性仪表图