目录

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语言文件,同时该文件可以被ILasm读取并处理(编译)。

ILdasm的路径在C:\Program Files (x86)\Microsoft SDKs\Windows\vXXA\bin下可以找到。

上一篇文章主要因为涉及到破解被移除了首页,虽然我死不承认,一直说我是在科学使用。

但是为了不惹麻烦,这次我学聪明了。我只会科学使用别人的软件,但是我会破解自己的软件。

为此我特意编写了一个非常牛逼的产品我称之为NiubilityProduct。

它的功能是当输入参数为Niubility时,它会展示这个产品有多牛逼。

一般人没办法看到它有多牛逼,为此我们需要破解它。

static void Main(string[] args)
{
string key;
if (args.Length == 1)
{
key = args[0];
}
else
{
key = Console.ReadLine();
} if (key == "Niubility")
{
Console.WriteLine("This is a Niubility Product");
}
else
{
Console.WriteLine("Bye !");
}
Console.ReadKey();
}

和DnSpy一样,我们可以将dll或exe文件直接拖入到ILdsam。

界面比较清爽简洁。双击Main方法就能显示出IL语言

但是ILdsam不能编辑IL,前面说了它可以将程序集反编译为IL文件。在菜单栏中选择文件然后点击转储,将其保存包含IL的il后缀的文件。



他会生成一个il后缀的文件以及一个res后缀的文件

  • IL文件就是包含IL语言的文件
  • res文件包含了托管资源的元数据的资源名称。

IL文件可以使用文本打开

.class private auto ansi beforefieldinit NiubilityProduct.Program
extends [mscorlib]System.Object
{
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 77 (0x4d)
.maxstack 2
.locals init ([0] string key,
[1] bool CS$4$0000)
... IL_0016: nop
IL_0017: call string [mscorlib]System.Console::ReadLine()
IL_001c: stloc.0
IL_001d: nop
IL_001e: ldloc.0
IL_001f: ldstr "Niubility"
IL_0024: call bool [mscorlib]System.String::op_Equality(string,
string)
IL_0029: ldc.i4.0
IL_002a: ceq
IL_002c: stloc.1
IL_002d: ldloc.1
IL_002e: brtrue.s IL_003f IL_0030: nop
IL_0031: ldstr "this is a Niubility Product"
IL_0036: call void [mscorlib]System.Console::WriteLine(string)
IL_003b: nop
IL_003c: nop
IL_003d: br.s IL_004c IL_003f: nop
IL_0040: ldstr "Bye !"
IL_0045: call void [mscorlib]System.Console::WriteLine(string)
IL_004a: nop
IL_004b: nop
IL_004c: ret
} // end of method Program::Main

我们可以不管输入什么值, 无需判断直接调用if里面的指令,调用完后会跳转到IL_004C

    IL_0017:  call       string [mscorlib]System.Console::ReadLine()
IL_001c: stloc.0
IL_001d: nop
IL_001e: nop
IL_001f: nop
IL_0024: nop
IL_0029: nop
IL_002a: nop
IL_002c: nop
IL_002d: nop
IL_002e: nop
IL_0031: ldstr "this is a Niubility Product"
IL_0036: call void [mscorlib]System.Console::WriteLine(string)
IL_003b: nop
IL_003c: nop
IL_003d: br.s IL_004c

修改完成我们需要将IL重新进行编译

ILasm

ILasm在win10下可以直接搜索到。或者在.net 4.0及以上在C:\Windows\Microsoft.NET\Framework64\v4.0.30319目录可以找到,.net 3.5在C:\Windows\Microsoft.NET\Framework64\v2.0.50727目录可以找到。

通过命令ilasm /exe /output=输出文件完整路径 /Resource=资源路径 IL文件路径


F:\Study\Demo\NiubilityProduct>ilasm /exe /output=NiubilityProduct.exe /Resource=NiubilityProduct.res NiubilityProduct.il Microsoft (R) .NET Framework IL Assembler. Version 4.8.3752.0
Copyright (c) Microsoft Corporation. All rights reserved.
Assembling 'NiubilityProduct.il' to EXE --> 'NiubilityProduct.exe'
Source file is UTF-8 Assembled method NiubilityProduct.Program::Main
Assembled method NiubilityProduct.Program::.ctor
Creating PE file Emitting classes:
Class 1: NiubilityProduct.Program Emitting fields and methods:
Global
Class 1 Methods: 2; Emitting events and properties:
Global
Class 1
Writing PE file
Operation completed successfully F:\Study\Demo\NiubilityProduct>

现在调用随便输入什么都能看到这个产品的牛逼之处

结语

本篇文章涉及到使用ILDasm和ILasm进行反编译和编译。掌握了本篇的技能之后你会发现...还是DnSpy好用

推荐文献

  1. 读懂IL代码就这么简单 (一)
  2. 初识Ildasm.exe——IL反编译的实用工具
  3. C# IL DASM 使用



微信扫一扫二维码关注订阅号杰哥技术分享

出处:https://www.cnblogs.com/Jack-Blog/p/11978817.html

作者:杰哥很忙

本文使用「CC BY 4.0」创作共享协议。欢迎转载,请在明显位置给出出处及链接。

.net反编译原理的更多相关文章

  1. 揭秘autoit3的运行机制和反编译原理

    今天发这个帖子的目的在于和论坛里面的朋友交流一下学习心得,主要内容是围绕着autoit3的编译原理.先开门见山的说一下结果,我不知道如何反编译au3,但相信论坛有很多高手,能解开我心中的疑团.我没有想 ...

  2. Android APK反编译(一)

    apk是安卓工程打包的最终形式,将apk安装到手机或者模拟器上就可以使用APP.反编译apk则是将该安卓工程的源码.资源文件等内容破解出来进行分析. 一.APK反编译基本原理 1.APK分析 apk文 ...

  3. javap反编译解释外部类直接使用内部类private字段的原理

    2016-07-04 15:56:39 我们都知道: 1.内部类可以直接访问外部类的private字段和方法: 2.非静态内部类持有外部类的引用: 3.外部类可以直接访问内部类的private字段和方 ...

  4. ILSpy,DLL反编译工具,学习与了解原理的好帮手

    你是否一直苦于找到了好的dll却只知道怎么使用而不知道其原理. 你是否在使用一个dll的时候发现它在一些参数时报错了却没法解决. 你是否想成为一个优秀的.net开发,成为一个优秀的系统制造者. 那你需 ...

  5. 反编译字节码角度分析synchronized关键字的原理

    1.synchronized介绍 synchronized是java关键字.JVM规范中,synchronized关键字用于在线程并发执行时,保证同一时刻,只有一个线程可以执行某个代码块或方法:同时还 ...

  6. Android安全攻防战,反编译与混淆技术完全解析(下)

    在上一篇文章当中,我们学习了Android程序反编译方面的知识,包括反编译代码.反编译资源.以及重新打包等内容.通过这些内容我们也能看出来,其实我们的程序并没有那么的安全.可能资源被反编译影响还不是很 ...

  7. 跟vczh看实例学编译原理——一:Tinymoe的设计哲学

    自从<序>胡扯了快一个月之后,终于迎来了正片.之所以系列文章叫<看实例学编译原理>,是因为整个系列会通过带大家一步一步实现Tinymoe的过程,来介绍编译原理的一些知识点. 但 ...

  8. Java 7 中的Switch 谈 Java版本更新和反编译知识

    Java 7 中的Switch 谈 Java版本更新和反编译知识          学习编程,享受生活,大家好,我是追寻梦的飞飞.今天主要讲述的是Java7中的更新Switch实现内部原理和JAD反编 ...

  9. Android反编译(三)之重签名

    Android反编译(三) 之重签名 [目录] 1.原理 2.工具与准备工作 3.操作步骤 4.装X技巧 5.问题 1.原理 1).APK签名的要点 a.所有的应用程序都必须有数字证书 ,Androi ...

随机推荐

  1. 什么是Viewport

    什么是Viewport 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤到很小的窗口中(这样会破坏没有针对手机 ...

  2. R语言之脸谱图

    脸谱图和星图类似,但它却比星图可以表示更多的数据维度.用脸谱来分析多维度数据,即将P个维度的数据用人脸部位的形状或大小来表征.脸谱图在平面上能够形象的表示多维度数据并给人以直观的印象,可帮助使用者形象 ...

  3. 最常用 最完整 最清晰 的git使用命令大全!

    Git 常用命令 初始化项目步骤 mkdir WebApp //创建文件夹 cd WebApp //进入到该文件夹 git init //初始化 touch README //生成README git ...

  4. [考试反思]1005csp-s模拟测试61:休止

    连续不知道多少场了,都是一场10名以内一场20以外...波动极大...还极有规律... 拿到这套题,看到T1大模拟无话可说. 然后考场上我觉得T2很简单....然后就码了两个半小时. T3数据水了暴力 ...

  5. 原生JS实现栈结构

    1. 前言 栈,是一种遵从后进先出(LIFO,Later-In-First-Out)原则的有序集合.新添加的元素都保存在栈的一端,称作栈顶,另一端叫做栈底.在栈中,新元素都靠近栈顶,旧元素都靠近栈底. ...

  6. beacon帧字段结构最全总结(二)——HT字段总结

    一.HT Capabilities HT Capabilities:802.11n的mac层给802.11的mac层加入了高吞吐量单元.所有新加的802.11n功能都是通过管理帧中的HT单元才得以实现 ...

  7. vue的路由安全验证

    在传统的网页中: view层是由后端控制的,用户的请求到达后端的控制器中,只有当安安全全没有丝毫异常的情况下,后端才会将完成数据的渲染,返回给前端视图 前后端分离的项目: view层的切换权,转交给了 ...

  8. Servlet相关学习

    Servlet入门解析 概念 运行在服务器端的小程序 servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则 实现servlet接口.复写方法 快速入门 创建web项目 ...

  9. PHP中跳出循环break,continue,return,exit的区别

    1. return 语句的作用       (1) return 从当前的方法中退出,返回到该调用的方法的语句处,继续执行.       (2) return 返回一个值给调用该方法的语句,返回值的数 ...

  10. PHP 当Swoole 遇上 ThinkPHP5

    本文假设你已经有了 Linux 操作系统的 PHP 环境,强烈推荐使用 Vagrant 来搭建开发环境 安装 Swoole PECL 拓展可以通过 pecl 命令或者通过源码包编译安装,本文采用 pe ...