Reflector代码反编译。遇到反编译所得源码里面调用类的习性时大都生set

C#代码反编译 得到项目不过运行源码

摘自:http://www.cnblogs.com/know/archive/2011/03/15/1985026.html

   
谈到”C#代码反编译”,大家也许还见面想到
Reflector代码反编译工具,对那个当吗不见面太陌生;做C#开发,它算得上是一个不可或缺的实用工具。通过她我们得很有利的查一个程序集的源代码(这是该极基本的下,也是豪门常用之),还足以便宜破解软件…,而自及时篇文章要和大家分享的是:用Reflector将C#的付出的软件[项目](此文中所说的凡winForm项目,对于.net项目方可借鉴或参考)的色代码还原——反编译得到可运行品种源码。
我所举行的反编译,并无是’破解’,其行使的前提或状态是:公司本请人开之’配餐软件(幼
儿园版)’,现有客户问想买,并且软件面临在一些问题需改,——不是自个儿支付之,该软件也无源码,想修改单独能够想方取软件之源码。具体的’破解’方法
记录在生,方便好事后翻看!(ps:
‘破解’的主意,自己前面就找了。但困于反编译之后的error比较多,没有耐心,有的题目发比较怪异,试了几坏好就放弃了 
——这就算间接的说明:真正的黑客,应该还是比起耐心的,呵呵…,
但做软件开发,又何尝不欲这么?!)

     a.使用及之工具:Reflector,具体的就是:Reflector插件File
disassembler(具体是啊以及how
to use,直接上网查)。

     b. 打开Reflector,选择要’破解’的软件(.exe)主程序,再择并点击
如图: 图片 1, 在右出现的
程序集(输出)类型选择界面 选择项目’windows Appliction’
(因为凡winForm应用程序,如果是选取的其它 如’class
…’类库,则需要在今后的步调中,改变项目性质被之
输出类型,不建议这样操作),如图:图片 2

 点击 生成 即可 得到这个主程序集的源码,其它的连锁程序集还如此操作即可!
——不要当生功告成,这仅仅是率先步,麻烦的当后边!

    c.将转移的源码 在Vs中打开(项目),
先试着运行下,(一般)会报错,排除’xxx程序集不在’这类的左,我所遇的如下:

   

图片 3

using
System;
using
System.Collections.Generic;
using
System.Runtime.CompilerServices;
using
System.Runtime.InteropServices;

[CompilerGenerated]
internalclass<PrivateImplementationDetails>{1FF4F699-35E0-4117-BDBC-9E44A1B0F9F5}
{
internalstatic
Dictionary<string, int> $$method0x600012e-1;
internalstatic
Dictionary<string, int> $$method0x6000137-1;
internalstatic
Dictionary<string, int> $$method0x6000137-2;
internalstatic
Dictionary<string, int> $$method0x600014a-1;
internalstatic
Dictionary<string, int> $$method0x6000169-1;
internalstatic
Dictionary<string, int> $$method0x60001b6-1;
internalstatic
__StaticArrayInitTypeSize=20
$$method0x6000213-1; // data size: 20
bytes
internalstatic
__StaticArrayInitTypeSize=20
$$method0x6000213-2; // data size: 20
bytes
internalstatic
__StaticArrayInitTypeSize=20
$$method0x6000213-3; // data size: 20
bytes
internalstatic
__StaticArrayInitTypeSize=20
$$method0x6000213-4; // data size: 20
bytes

[StructLayout(LayoutKind.Explicit, Size=20, Pack=1)]
privatestruct
__StaticArrayInitTypeSize=20
{
}
}

图片 4

 源码文件被见面面世一个
_PrivateImplementationDetails_{1FF4F699-35E0-4117-BDBC-9E44A1B0F9F5}.cs
文件称可怜长 内容而达到的 乱码类,对之解决办法时:注释此类
或直接删除。【程序相关的文书,如图、数据库等使记放项目涉及位置,一般在bin/debug/文件夹下】

    d. 添加相关程序集的援,设置启动对象。到这时,差不多程序就算可
跑起了,但是还没完 ——因为
反编译后的代码,文件夹的职和界面与资源引用之间的涉嫌,基本上都乱了.所以现在设解决的关键问题是:恢复文件中的关联和援(其它的问题,通过调节就
差不多可以解决)。如图:

   图片 5窗扇
体的.cs和.resx(资源)文件不以同一个文书夹着,对承诺窗体的.resx文件还助长了品种要缓解方案名前缀(zhiyiSystem.)
——This is point! 
这就算是我们如果解决问题之重中之重:恢复窗体的.cs和.resx文件之中的关系,操作大致有以下简单步:1.
将窗体的.cs和.resx文件在和一个文书被——即一律目录。2.去丢窗体的.resx文件的先头缀
——即改文件称,如果是一个个文书去修改,窗体比较多以来,是同等宗很重而粗鄙的从业,于是
就上网找
“批量改文件称”的家伙,下载了一两单觉还不好用,找不顶,只能自己下手了,再说就东西简单,说白了就是
遍历文件夹着文件并’重命名'(代码就非糊发了,文章后 附有 自己写的
“批量改文件称”工具)。

      
到是,程序就算好真正走起了。别看本身形容出来,似乎’破解’就
是说话之从业,但我开的时节,却几乎经过折腾
好几糟糕还感到”算了,又卡住了…”,有些或大或小问题,在此地坐时的故
及有些步骤一时半会也想不起来了,但要的法子应该还不曾到手下,如果发无懂得的恋人,可以留言交流,再举行解答;也期于’破解’方法来更的,能多领取头意
见,分享下你的‘破解’经验!

     后附:

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

批量改动文件名工具.rar

(Reflector插件)Reflector.FileDisassembler.rar

 

每当软件的破解和源码获取与重新编译的道路及会见碰到有些题材,书此备查。

有名的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项目时,控制器类和预编译视图里(如果发布时启用的了言语)会起过剩类似这样的切近

[CompilerGenerated]
private static class <Index>o__SiteContainer19
{
      public static CallSite<Func<CallSite, object, string, object>> <>p__Site1a;

      public static CallSite<Func<CallSite, object, string, object>> <>p__Site1b;

      public static CallSite<Func<CallSite, object, DateTime, object>> <>p__Site1c;

      public static CallSite<Func<CallSite, object, string, object>> <>p__Site1d;

      public static CallSite<Func<CallSite, object, string, object>> <>p__Site1e;

      public static CallSite<Func<CallSite, object, string, object>> <>p__Site1f;

      public static CallSite<Func<CallSite, object, string, object>> <>p__Site20;

      public static CallSite<Func<CallSite, object, string, object>> <>p__Site21;
}

这些代码是编译器为优化性能大成的静态类及静态属性。参考源码后你晤面发现,这些代码简单的尚是较便于还原的,复杂的若不怕留给着吧。

自我的做法是杀死[CompilerGenerated]特点,批量交替类名<Index>o__SiteContainer19为o__SiteContainer19,然后替换属性被的<>为空字符串。

自身的填补: 这样的代码其实就算是dynamic类型的操作,
 如果是MVC项目, 就是ViewBag.UserName = “abc”;

 

0x05:

偶尔我们并不需要源码,只是要改某只价值或同一处在代码。所以我们要之是Reflexil,当然还有更决定的mono.cecil和dnlib,这是自个儿理解的无限牛逼的老三只品种。

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

但是修改后意识并无可知运行,因为开发商以了次集强名称。所以自己一般会采用mono.cecil做如下操作来干少干少公钥签名

var asmdef = AssemblyDefinition.ReadAssembly(dll.FullName);
if (asmdef.Name.PublicKey != null && asmdef.Name.PublicKey.Any())
{
    asmdef.Name.PublicKey = new byte[0];
    asmdef.Name.PublicKeyToken = new byte[0];
    asmdef.Name.Attributes = AssemblyAttributes.SideBySideCompatible;
    asmdef.MainModule.Attributes &= ~ModuleAttributes.StrongNameSigned;
}

然修改后意识并无可知运行,因为开发商以了大称的InternalsVisibleTo特性,所以自己一般会采取mono.cecil做如下操作来干少InternalsVisibleToAttribute值里面的公钥

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

可是修改后意识并无能够运作,因为开发商以了序集强名称导致编译引用的呢是赛称的程序集,所以自己一般会使如下操作来波及少引用定义里面的公钥

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

上述操作后把反写副该软件就可以顺运行了。

0x06:

自然有些加了盖的,一般情形用找到呼应的脱壳工具。如果只是是改重点逻辑通过机要词查找该会找到蛛丝马迹,但前提是若力所能及望源码。

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

 

相关文章