我用Reflector工具看了下别人的DLL,发现方法名和类名都一览无余.但是方法内容却看不见,只看见一个空方法挂在那.导出代码也没报错,但是还是和之前一样,只有一个空方法挂在那,从而...所有导出的.cs文件都只有1kb (我觉得这是他对方法进行了什么特殊混淆)而我自己用.NET Reactor进行混淆后的DLL (仅选择obfuscation,不选加壳) 再用Reflector看的时候也能看见类名和方法名(很多方法名已被混淆成稀奇古怪的名字). 但是在双击我的方法名的时候出现报错:Expression stack is empty at offset 0006.
同时.在我选择导出代码的时候也出现这个错误. 这样, 我确认自己是混淆成功,并且初步屏蔽了反编译工具对方法的窥探.但是,我不明白为什么别人混淆了的DLL和我混淆了的DLL在反编译工具反编译的时候表现不一样.为什么会这样, 到底混淆代码有多少种模式呢? 我所查看的那个别人的那个DLL所达到的效果 我能不能用.NET Reactor达到呢?
同时.在我选择导出代码的时候也出现这个错误. 这样, 我确认自己是混淆成功,并且初步屏蔽了反编译工具对方法的窥探.但是,我不明白为什么别人混淆了的DLL和我混淆了的DLL在反编译工具反编译的时候表现不一样.为什么会这样, 到底混淆代码有多少种模式呢? 我所查看的那个别人的那个DLL所达到的效果 我能不能用.NET Reactor达到呢?
说白了就是 现在 我在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内的方法实现体给隐藏了. -- > 猜的
然后 mono框架加载托管代码. 然后触发方法的时候 再反转回去调用 非托管代码.
------------------------但是.... 兄弟. 你不觉得这有点天方夜谭么. 如果真能这么干的话, 那是不是所有 ms 阵营的混淆器都失业了? 都用这个方式不就完了么.....
------------------------
我说一下我怀疑的方向:我怀疑他把他的DLL的方法实现体都抽到了另外一个dll上, 然后把这个dll作为资源文件隐蔽在资源包下,然后在u3d运行的时候通过某些手段去动态加载这个dll. 通过此方式达到目的.u3d的资源文件系统我暂时还没找到办法 从其中把 各文件抽取出来.(也就是一些 *.assets文件和resources.assets文件)
如果如qldsrx所说,以及如我所猜测. 这些托管的dll里装的只是一些空方法, 那下面这些dll的大小为什么都那么大呢?
http://pan.baidu.com/share/link?shareid=539831&uk=671392312比如那个叫做Dead Trigger 1.7.1的dll(Assembly-CSharp.dll)为什么会有700多kb呢
嗯 .
我曾经用C++/CLR(旧语法)编写过托管方法,在方法内直接调用非托管代码,结果编译后,那个托管代码就只看得到方法名,里面的方法完全被隐藏,估计是无法解析被跳过了。