原文地址:http://blog.csdn.net/three_bird/article/details/51433734

在软件的破解及源码获取及重新编译的道路上会遇到一些问题,书此备查。

大名鼎鼎的Reflector以及开源的ILSPY都是.NET程序集的反编译利器,但是它们不能为你做全部的工作。

0x01:

遇到反编译所得源码里面调用类的属性时多出set_Name或者get_Name之类的说明程序集引用没有加载完全,

因为反编译工具在没有元数据的情况下无法判断这丫的到底是个方法还是个属性。

有时候反编译得到的源码里的-1实际上可能是某个数的最大值,因为反编译时没有加载依赖的程序集,工具将类似int.MaxValue等值变成了-1。

所以将依赖项加载完是一个好的习惯,Reflector在反编译时找不到依赖会提示你手动选择,你可以手动选择或者忽略(点取消就是忽略),而ILSPY不会提示。

0x02:

Reflector新版支持C#6的特性,会把一些属性赋值反编译为Lumbda表达式,而实际该项目可能不是c#6的项目,造成无法通过编译器检查。

解决办法是生成程序集的源码之前从主界面工具栏那个下拉列表选择合适的.NET框架版本。

0x03:

一些WPF强名称应用程序会由于资源文件也是强名称引用导致反编译为项目后跑不起来。

或许重新签名然后替换资源引用的公钥可以解决此问题但我没有试过。

0x04:

在反编译MVC Web项目时,控制器类和预编译视图里(如果发布时启用的了话)会出现很多类似这样的类

  1. [CompilerGenerated]
  2. private static class <Index>o__SiteContainer19
  3. {
  4. public static CallSite<Func<CallSite, object, string, object>> <>p__Site1a;
  5.  
  6. public static CallSite<Func<CallSite, object, string, object>> <>p__Site1b;
  7.  
  8. public static CallSite<Func<CallSite, object, DateTime, object>> <>p__Site1c;
  9.  
  10. public static CallSite<Func<CallSite, object, string, object>> <>p__Site1d;
  11.  
  12. public static CallSite<Func<CallSite, object, string, object>> <>p__Site1e;
  13.  
  14. public static CallSite<Func<CallSite, object, string, object>> <>p__Site1f;
  15.  
  16. public static CallSite<Func<CallSite, object, string, object>> <>p__Site20;
  17.  
  18. public static CallSite<Func<CallSite, object, string, object>> <>p__Site21;
  19. }

这些代码是编译器为优化性能生成的静态类及静态属性。参考源码后你会发现,这些代码简单的还是比较容易还原的,复杂的你就留着吧。

我的做法是干掉[CompilerGenerated]特性,批量替换类名<Index>o__SiteContainer19为o__SiteContainer19,然后替换属性中的<>为空字符串。

我的补充: 这样的代码其实就是dynamic类型的操作,  如果是MVC项目, 就是ViewBag.UserName = "abc";

0x05:

有时候我们并不需要源码,只是需要修改某个值或一处代码。所以我们需要的是Reflexil,当然还有更厉害的mono.cecil和dnlib,这是我知道的最牛逼的三个项目。

个人喜欢用ILSPY看源码,然后用mono.cecil改程序。

可是修改后发现并不能运行,因为开发商使用了程序集强名称。所以我一般会使用mono.cecil做如下操作来干掉干掉公钥签名

  1. var asmdef = AssemblyDefinition.ReadAssembly(dll.FullName);
  2. if (asmdef.Name.PublicKey != null && asmdef.Name.PublicKey.Any())
  3. {
  4. asmdef.Name.PublicKey = new byte[];
  5. asmdef.Name.PublicKeyToken = new byte[];
  6. asmdef.Name.Attributes = AssemblyAttributes.SideBySideCompatible;
  7. asmdef.MainModule.Attributes &= ~ModuleAttributes.StrongNameSigned;
  8. }

可是修改后发现并不能运行,因为开发商使用了强名称的InternalsVisibleTo特性,所以我一般会使用mono.cecil做如下操作来干掉InternalsVisibleToAttribute值里面的公钥

  1. //0x02 干掉InternalsVisibleToAttribute值里面的公钥
  2. var internalsVisibleToAttrs = asmdef.CustomAttributes.Where(x => x.AttributeType.Name == "InternalsVisibleToAttribute").ToList();
  3. foreach (CustomAttribute item in internalsVisibleToAttrs)
  4. {
  5. var argsctor = item.ConstructorArguments.Single();
  6. var commaIndex = argsctor.Value.ToString().IndexOf(",");
  7. if (argsctor.Value != null && commaIndex != -) //format is "AsmName,PublicKey=..."
  8. {
  9. var newValue = item.ConstructorArguments[].Value.ToString().Substring(, commaIndex);//format is "AsmName"
  10. item.ConstructorArguments[] = new CustomAttributeArgument(argsctor.Type, newValue);
  11. var index = asmdef.CustomAttributes.IndexOf(item);
  12. asmdef.CustomAttributes.RemoveAt(index);
  13. asmdef.CustomAttributes.Insert(index, item);
  14. }
  15. }

可是修改后发现并不能运行,因为开发商使用了程序集强名称导致编译引用的也是强名称的程序集,所以我一般会使用如下操作来干掉引用定义里面的公钥

  1. //这里假设引用的该产品的程序集都是SupperApp.*.dll格式的
  2. var asmRefs = asmdef.MainModule.AssemblyReferences
  3. .Where(x => x.FullName.StartsWith("SupperApp", StringComparison.OrdinalIgnoreCase)
  4. && x.PublicKeyToken != null && x.PublicKeyToken.Any())
  5. .ToList();foreach (var item in asmRefs)
  6. {
  7. item.PublicKeyToken = new byte[];
  8. }

以上操作后把变更写入该软件就可以顺利运行了。

0x06:

当然有些加了壳的,一般情况需要找到对应的脱壳工具。如果只是修改关键逻辑通过关键词查找应该能找到蛛丝马迹,但前提是要能看到源码。

对于既没有工具能脱壳也没有工具能看源码的可以求助C++反汇编高手。

[转] .net软件反编译笔记的更多相关文章

  1. .net软件反编译笔记

    在软件的破解及源码获取及重新编译的道路上会遇到一些问题,书此备查. 大名鼎鼎的Reflector以及开源的ILSPY都是.NET程序集的反编译利器,但是它们不能为你做全部的工作. 0x01: 遇到反编 ...

  2. 专注于C#.Net WPF软件开发-软件反编译-软件破解-逆向-靖芯科技-包括安卓APK反编译

    靖芯科技提供.Net软件开发,软件修改定制二次开发,软件破解,反编译,逆向等各项优质服务: 包括安卓APK软件反编译. 包括但不限于C#,WPF,Surface,Winform,Asp.net.JAV ...

  3. JAVA代码反编译笔记

    最近有个朋友说有个java弄的软件是从朋友处拿来的,由于进行了网卡地址绑定,不修改网卡地址无法使用,叫我看看有无办法破解,之前都很少玩这些东西,本着帮忙的心态,尝试了下,便有了一下的笔记内容. 1.使 ...

  4. 使用ILSpy软件反编译.Net应用程序的方法及注意事项

    今天遇到之前同事写的代码没有源码了,但是客户要在原来的基础上修改程序!好在没有做加壳处理,所以就用了ILSpy软件进行反编译!下面把步骤及遇到的问题写下来: 1.打开ILSpy软件,点击File  , ...

  5. APK软件反编译 去广告

    具体步骤: 1.下载 apktool 下载地址:https://code.google.com/p/android-apktool/downloads/list 2.通过apktool 反编译apk. ...

  6. C#反编译笔记

    碰到下面这种 public class DstBoneName : Enum { public int value__; ; } 还原为 public enum DstBoneName { cf_J_ ...

  7. APK反编译之一

    初步接触APK反编译.刚刚使用android-apktool软件反编译了一下QQ.apk,目的只是想看看QQ这个应用软件是内部是如何设计的,希望可以在某些方面借鉴一下.下面就如何反编译做一个简单的记录 ...

  8. apk 反编译工具的使用

    在学习android 开发的时候,我们经常回尝试使用到别人的apk,希望能了解别人怎么编写的代码,于是想要一个能实现其反编译的软件,将软件反编译出来,查看其代码. 工具/原料 反编译软件dex2jar ...

  9. apk反编译、smali修改、回编译笔记

    最近下了一个apk程序,但是一启动会弹出一个流氓广告.这个广告不是原厂商加的,而是有人在原有apk程序的基础上,加了一个壳,让apk先启动他加的广告,再启动原来的程序,很恶心.于是想去掉它. 试了几个 ...

随机推荐

  1. oracle 死锁查询及处理

    SELECT    bs.username "Blocking User", bs.username "DB User",          ws.userna ...

  2. MD5—加密,加盐

    MD5的参考盐值:String salt = "212*)()()**()^&UYGbakdkj " ; MD5—加密工具类 package com.demo.tools; ...

  3. 2017ACM/ICPC Guangxi Invitational Solution

    A: A Math Problem 题意:给出一个n,找出有多少个k满足kk  <= n 思路: kk的增长很快,当k == 16 的时候就已经超过1e18 了,对于每一次询问,暴力一下就可以 ...

  4. HDU - 2844 Coins(多重背包+完全背包)

    题意 给n个币的价值和其数量,问能组合成\(1-m\)中多少个不同的值. 分析 对\(c[i]*a[i]>=m\)的币,相当于完全背包:\(c[i]*a[i]<m\)的币则是多重背包,考虑 ...

  5. 20155310 2016-2017-2 《Java程序设计》第七周学习总结

    20155310 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 第十三章 时间与日期 认识时间与日期 •时间的度量 •GMT(格林威治标准时间):现在不是标 ...

  6. mongoose 操作一直转圈

    可能是:渲染时候 new content({ category:req.body.category, title:req.body.title, description:req.body.descri ...

  7. C#反射——简单反射操作类的封装

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Re ...

  8. Java学习笔记之MyEclipse 2017 CI 7、CI 8、CI 9和CI 10的安装与激活

    0x00 前言 本文介绍MyEclipse 2017 CI 7.CI 8.CI 9和CI 10的安装与激活. 重要提示:此方法理论上应该能激活MyEclipse 2017 CI所有系列,即激活方法是通 ...

  9. OpenCV中Denoising相关函数的简单介绍

    参考:http://wenhuix.github.io/research/denoise.html一.基本情况         (一)基本方法          Fast  Non-Local  Me ...

  10. Linux内核分析08

    进程的切换和系统的一般执行过程 一,进程切换的关键代码switch_to分析 进程调度的时机 中断处理过程(包括时钟中断.I/O中断.系统调用和异常)中,直接调用schedule(),或者返回用户态时 ...