dnSpy

foreach 集合又抛经典异常了,这次一定要刨根问底

空扰寡人 提交于 2020-08-16 07:42:49
一:背景 1. 讲故事 最近同事在写一段业务逻辑的时候,程序跑起来总是报: 集合已修改;可能无法执行枚举操作 ,硬是没有找到什么情况下会导致这个异常产生,就让我来找一下bug,其实这个异常在座的每个程序员几乎都遇到过,谁也不是一生下就是大牛,简单看了下代码,确实是多线程操作foreach,但并没有对foreach进行Add,Remove操作,扫完代码其实我也是有点懵,没撤只能调试了,在foreach里套一层trycatch,查看异常的线程堆栈从而找出了问题代码,代码简化如下: static void Main(string[] args) { var dict = new Dictionary<int, int>() { [1001] = 1, [1002] = 10, [1003] = 20 }; foreach (var userid in dict.Keys) { dict[userid] = dict[userid] + 1; } } 先寻找点安慰,说实话,凭肉眼你觉得这段代码会抛出异常吗? 反正我是被骗过了,大写的尴尬,结论如下,运行一下便知。 从图中看确实是异常,说明在foreach的过程中连迭代集合的 value 都不可以修改,这让我激起了强烈的探索欲,看看FCL中到底是怎么限制的。 二:源码探索 1. 从IL中寻找答案 C#已发展到 9.0 了,到处都充斥着语法糖

Unity安卓手游汉化笔记(总)

别来无恙 提交于 2020-08-16 05:10:15
  这是我个人对于Unity逆向汉化的总结,这里默认游戏没有采用额外的安全措施,使用的Demo是使用Unity直接生成的,实际应用中,大部分需要先绕开游戏的安全机制,或者在汉化结束后需要进行重新签名等。 主要工具:   AssetStudio(地址: https://www.perfare.net/tag/assetstudio )   il2cppdumper: https://www.perfare.net/tag/il2cppdumper ,和AssetStudio是一个作者,具体操作也在他的网站上有   UABE(地址: https://7daystodie.com/forums/showthread.php?22675-Unity-Assets-Bundle-Extractor ) 一、基础知识之Unity的资源文件   这里说的资源文件不是做游戏过程中使用的资源,而是在序列化之后得到的资源文件,在Android平台下,Unity的资源文件都放在Asset/bin/Data文件夹下,也就是AssetStudio读取的文件夹,这下面的文件就是Unity的资源文件,子文件夹Manager里面放的是代码相关的文件,其他都是资源文件,如果读过Asset Studio的源码,类SerialiableFile解析的文件,就是最常用的资源文件格式

foreach 集合又抛经典异常了,这次一定要刨根问底

我怕爱的太早我们不能终老 提交于 2020-08-16 04:49:12
一:背景 1. 讲故事 最近同事在写一段业务逻辑的时候,程序跑起来总是报: 集合已修改;可能无法执行枚举操作 ,硬是没有找到什么情况下会导致这个异常产生,就让我来找一下bug,其实这个异常在座的每个程序员几乎都遇到过,谁也不是一生下就是大牛,简单看了下代码,确实是多线程操作foreach,但并没有对foreach进行Add,Remove操作,扫完代码其实我也是有点懵,没撤只能调试了,在foreach里套一层trycatch,查看异常的线程堆栈从而找出了问题代码,代码简化如下: static void Main(string[] args) { var dict = new Dictionary<int, int>() { [1001] = 1, [1002] = 10, [1003] = 20 }; foreach (var userid in dict.Keys) { dict[userid] = dict[userid] + 1; } } 先寻找点安慰,说实话,凭肉眼你觉得这段代码会抛出异常吗? 反正我是被骗过了,大写的尴尬,结论如下,运行一下便知。 从图中看确实是异常,说明在foreach的过程中连迭代集合的 value 都不可以修改,这让我激起了强烈的探索欲,看看FCL中到底是怎么限制的。 二:源码探索 1. 从IL中寻找答案 C#已发展到 9.0 了,到处都充斥着语法糖

foreach 集合又抛经典异常了,这次一定要刨根问底

时光怂恿深爱的人放手 提交于 2020-08-15 01:08:39
一:背景 1. 讲故事 最近同事在写一段业务逻辑的时候,程序跑起来总是报: 集合已修改;可能无法执行枚举操作 ,硬是没有找到什么情况下会导致这个异常产生,就让我来找一下bug,其实这个异常在座的每个程序员几乎都遇到过,谁也不是一生下就是大牛,简单看了下代码,确实是多线程操作foreach,但并没有对foreach进行Add,Remove操作,扫完代码其实我也是有点懵,没撤只能调试了,在foreach里套一层trycatch,查看异常的线程堆栈从而找出了问题代码,代码简化如下: static void Main(string[] args) { var dict = new Dictionary<int, int>() { [1001] = 1, [1002] = 10, [1003] = 20 }; foreach (var userid in dict.Keys) { dict[userid] = dict[userid] + 1; } } 先寻找点安慰,说实话,凭肉眼你觉得这段代码会抛出异常吗? 反正我是被骗过了,大写的尴尬,结论如下,运行一下便知。 从图中看确实是异常,说明在foreach的过程中连迭代集合的 value 都不可以修改,这让我激起了强烈的探索欲,看看FCL中到底是怎么限制的。 二:源码探索 1. 从IL中寻找答案 C#已发展到 9.0 了,到处都充斥着语法糖

编写高质量代码的50条黄金守则-Day 02(首选readonly而不是const)

天大地大妈咪最大 提交于 2020-08-15 00:19:28
编写高质量代码的50条黄金守则-Day 02(首选readonly而不是const),本文由比特飞原创发布,转载务必在文章开头附带链接: https://www.byteflying.com/archives/6549 该系列文章由比特飞原创发布,计划用半年时间写完全50篇文章,为大家提供编写高质量代码的一般准则。 1、概述 众所周知,.net 包含两种类型的常量, 运行时常量 和 编译时常量 ,它们的表现行为不同,使用不当,会使你陷入困境。虽然编译时常量在执行上速度略快,但我依然强烈建议大家使用运行时常量(readonly),而不是编译时常量(const)。在继续深入了解之前,我们先要知道 .net 中两种常量各自的特点。 2、.net中两种常量的基本特点 我们看看以下代码片段: 两种常量的代码片段 我们很容易总结出它们各自的特点: 1、运行时常量 readonly 要么在定义的时候赋初始值,要么在构造函数中赋初始值; 2、编译时常量 const 必须在定义的时候赋初始值。 那我为什么建议大家使用运行时常量呢?因为编译时常量可能会使你已发行程序的表现和你测试时不同,这是为什么呢?为了清楚的了解个中原委,我们要明白编译器为运行时常量和编译时常量都做了什么? 3、编译器为readonly和const关键字做了什么? 使用readonly修饰的常量为运行时常量

BUUCTF--[BJDCTF2020]BJD hamburger competition

删除回忆录丶 提交于 2020-08-11 12:05:55
测试文件: https://www.lanzous.com/ib3e6ih 代码分析 这出题人真是个人才,打开一次笑一次,奥利给。 这道题找对文件分析就行,dnSpy打开Assembly-CSharp.dll文件 1 using System; 2 using System.Security.Cryptography; 3 using System.Text; 4 using UnityEngine; 5 6 // Token: 0x02000004 RID: 4 7 public class ButtonSpawnFruit : MonoBehaviour 8 { 9 // Token: 0x0600000A RID: 10 RVA: 0x00002110 File Offset: 0x00000310 10 public static string Md5( string str ) 11 { 12 byte [] bytes = Encoding.UTF8.GetBytes( str ); 13 byte [] array = MD5.Create().ComputeHash(bytes); 14 StringBuilder stringBuilder = new StringBuilder(); 15 foreach ( byte b in array) 16 { 17

科学使用Log4View2查看日志

和自甴很熟 提交于 2020-04-24 23:31:52
目录 目录 前言 科学使用 编辑和调试程序集 调试程序集 编辑程序集 结语 推荐文献 目录 NLog日志框架使用探究-1 NLog日志框架使用探究-2 科学使用Log4View2 前言 这个标题很低调吧,但是既然你点进来,那么接下来的干货是属于你的。 不想成为黑客的程序员不是好程序员。在上一篇 《NLog日志框架使用探究-2》 文章提到了Log4View2工具有30天的试用期,超过试用期许多功能就被限制,比如不能使用数据库加载。那么我们如何科学使用它呢? 本篇文章涉及到反编译技术、对称加密技术、IL中间语言等技术。掌握了这些技术之后你会发现原来自己也能更加科学的使用软件。 接下来的内容仅供个人学习使用,任何人不得用于商业用途或用于非法途径,一切后果本人概不负责。 科学使用 我们可以使用 dnspy 、 ilspy 以及reflector对.net程序进行反编译。Log4View2就是纯.net开发的项目。 reflector是收费的,也需要科学使用。 ILSpy是开源的.NET程序集浏览器和编译器。 dnSpy是一个调试器和.NET程序集编辑器。即使没有任何可用的源代码,也可以使用它来编辑和调试程序集。 dnspy也是基于ILSpy的反编译引擎,在它基础上增加了丰富的功能,甚至可以直接修改源代码。首先我们通过dyspy看看相关注册的源码,直接在安装路径找到Log4View

.net反编译原理

女生的网名这么多〃 提交于 2020-04-24 23:02:32
目录 目录 前言 ILdasm ILasm 结语 推荐文献 目录 NLog日志框架使用探究-1 NLog日志框架使用探究-2 科学使用Log4View2 前言 本来没有想写反编译相关的文章,但是写着写着就扯到反编译破解了。更何况上一篇 《科学使用Log4View2》 文章还被管理员移出了首页。 花了几个小时写的文章被移除首页的感受你们了解吗?终于凭借我的三寸不烂之舌终于打动管理大大恢复到了首页。 为了更加合规合法,因此有了该篇文章。 上一篇文章我们使用DnSpy可以非常方便的反编译甚至可以直接修改IL并生成新的程序集。本篇文章我们就来讲讲在DnSpy出现之前,我们是如何修改程序集的。 ILdasm 在没有DnSpy这等强大的反编译工具之前,若需要修改程序集,一般都需要使用微软官方提供的ILDasm反编译,ILAsm编译IL。 本篇文章的重点不是谈论IL的语法,IL如何阅读,想要了解这些,网上一搜一大把。推荐一篇吧: https://www.cnblogs.com/zery/p/3366175.html。 IL拆解器是IL汇编器(Ilasm.exe)的配套工具。ILDasm.exe采用包含中间语言(IL)代码的可移植可执行(PE)文件,并创建适合作为ILasm.exe 输入的文本文件。 这是官方的解释,说白了就是它可以将.Net程序集反编译为IL语言文件

反射器的开源替代品? [关闭]

假装没事ソ 提交于 2020-02-26 08:31:22
只是想知道是否有人知道RedGate的 Reflector的 开源 替代品? 我很想知道一个类似于Reflector的工具是如何工作的。 请注意,如果您知道Reflector的免费但 非 开源替代方案,您可以回答以下相关问题: 比.NET Reflector更好的东西? 摘要 - 2011年5月11日更新 快速汇总已建议的各种开源项目和工具: 通用编译器基础结构 (CCI) 单声道塞西尔 ILSpy dnSpy (ILSpy的分支,项目看起来比原来更活跃) Dotnet IL编辑器(DILE) IL.View Monoflector (截至2011年4月 不再有效 ) 以下资源也可能是有意义的: TypeView.cs Jason Haley关于 拆解.NET 的说明 Adrian Bank 最近的 博客文章 总结了许多Reflector的替代方案,包括下面没有提到的几个选项。 Mark Lichtenberg的详细 博客文章 将几个开源替代品(DILE,ILSpy和使用MonoDevelop的Mono Cecil)与Reflector进行了比较。 #1楼 好吧,Reflector本身是一个.NET程序集,所以你可以在Reflector中打开Reflector.exe来检查它是如何构建的。 #2楼 Reflector工具使用Reflection。 - 显然这是不正确的。