我用Reflector工具看了下别人的DLL,发现方法名和类名都一览无余.但是方法内容却看不见,只看见一个空方法挂在那.导出代码也没报错,但是还是和之前一样,只有一个空方法挂在那,从而...所有导出的.cs文件都只有1kb (我觉得这是他对方法进行了什么特殊混淆)而我自己用.NET Reactor进行混淆后的DLL (仅选择obfuscation,不选加壳) 再用Reflector看的时候也能看见类名和方法名(很多方法名已被混淆成稀奇古怪的名字). 但是在双击我的方法名的时候出现报错:Expression stack is empty at offset 0006.  
同时.在我选择导出代码的时候也出现这个错误. 这样, 我确认自己是混淆成功,并且初步屏蔽了反编译工具对方法的窥探.但是,我不明白为什么别人混淆了的DLL和我混淆了的DLL在反编译工具反编译的时候表现不一样.为什么会这样, 到底混淆代码有多少种模式呢? 我所查看的那个别人的那个DLL所达到的效果 我能不能用.NET Reactor达到呢?

解决方案 »

  1.   

    这不是加密,也不是混淆,只是核心代码不在托管代码里而已,它将核心代码全部编译到了非托管部分,托管代码只有函数入口(也叫函数名),所有方法都是执行的非托管代码,这个是由Unity游戏引擎自动完成的,无法干预。
      

  2.   

    但是奇怪的是 我自己用Unity3d做的项目 我自己就能反编译其dll
      

  3.   


    说白了就是 现在 我在app-store上看见部分用u3d写的应用, 我都下载下来拆过包, 然后也拿出了他的逻辑层的dll. 也反编译了 但是如你所说, 我只能看见他的方法名.他的非托管代码难道是他开发的时候通过u3d写入非托管集合里的吗?
    就我现在了解来看, 他怎么做到的呢...如果是u3d官方自带的功能, 我也不见官方有说明啊.  而且,我说一下u3d的ios程序生成过程:
    首先要准备一台MAC, 然后装好U3d, 然后放过去程序, 用u3d的build选项导出一个 xcode工程 然后再用这个xcode工程 build出一个 ios的包.期间, 这些所有你的代码都会编译成.net中间语言, 但是这些语言最终是由mono去解析.
    据我所知,  u3d 恐怕真不具备你所说的这个功能:
    1,解析你的c#代码, 
    2,提取其业务逻辑的托管代码, 然后变成非托管代码
    3,然后注入一个非托管的程序集内供调用.这个玩意/....  怎么可能办得到这样的程度呢?
    -------------------另外, 根据我的分析,我认为他的DLL有一点很奇怪, 700多k的大小 或者500多k的大小 然后所有代码都是空方法..  如果是这样的话 我觉得他的 dll就偏大了.所以我认为他通过某种手段把dll内的方法实现体给隐藏了.  -- > 猜的
      

  4.   

    如果如你所说的话:它将核心代码全部编译到了非托管部分,托管代码只有函数入口如果真是那样的话, 实际上他如果要做到这点, 他必须在生成一个 xcode 项目之前就把 [托管的可暴露在外的dll] 生成好, 并提取代码其中的托管代码解析好并生成非托管代码....  然后最终在ios设备上的调用过程就是:ios启动app, app加载mono运行框架(也就是类似.net framwork的一个虚拟机) 
    然后 mono框架加载托管代码. 然后触发方法的时候 再反转回去调用 非托管代码.
    ------------------------但是.... 兄弟. 你不觉得这有点天方夜谭么.  如果真能这么干的话, 那是不是所有 ms 阵营的混淆器都失业了?  都用这个方式不就完了么.....
    ------------------------
    我说一下我怀疑的方向:我怀疑他把他的DLL的方法实现体都抽到了另外一个dll上, 然后把这个dll作为资源文件隐蔽在资源包下,然后在u3d运行的时候通过某些手段去动态加载这个dll. 通过此方式达到目的.u3d的资源文件系统我暂时还没找到办法 从其中把 各文件抽取出来.(也就是一些 *.assets文件和resources.assets文件)
      

  5.   

    另外, 我不是要反编译unity3d的核心源代码的dll.我是要反编译用u3d开发的程序的dll.如我所述, 我现在是能反编译自己开发的dll的.  但是别人用u3d写的程序我反不出来.
      

  6.   

    能够因此到无法查看IL的程度,那么只能是嵌入了非托管代码在里面,如何实现我也不清楚,你可以研究下C++/CLR是如何实现的,那个非托管和托管的混合编程能够实现的话,这里应该也可以实现。
      

  7.   

    我还是有个疑问:
    如果如qldsrx所说,以及如我所猜测. 这些托管的dll里装的只是一些空方法, 那下面这些dll的大小为什么都那么大呢?
    http://pan.baidu.com/share/link?shareid=539831&uk=671392312比如那个叫做Dead Trigger 1.7.1的dll(Assembly-CSharp.dll)为什么会有700多kb呢
      

  8.   


                嗯                                                                                               .
                       
                         
                     
      

  9.   

    C++可以将非托管代码和托管代码编译到一起,这意味着dll中的文件头能够被识别为正常的托管IL,但是还包含的非托管数据部分,无法被识别,但没有破坏文件结构。这好比病毒在exe文件末尾添加属于它自己的字节,exe文件还是可以执行,只不过附加执行了病毒代码。
    我曾经用C++/CLR(旧语法)编写过托管方法,在方法内直接调用非托管代码,结果编译后,那个托管代码就只看得到方法名,里面的方法完全被隐藏,估计是无法解析被跳过了。