当前位置:编程学习 > C#/ASP.NET >>

【安全问题】c# 怎么加密 防止被破解


一般加什么壳 或者加密

然后最好杀毒能不报毒

谢谢大家 --------------------编程问答-------------------- 如果这个问题的答案我知道,那么专业编写病毒的人也都知道。那么杀毒软件都拿这种病毒没有办法。早就成一个大新闻了。 --------------------编程问答-------------------- .net rector 4比较好。防君子不防小人。
我搜索到一个,但不知道是不是最新可用的。你可以看看
.Net Rector 4.5
用法很简单,一看就会。你试试。 --------------------编程问答--------------------
引用 1 楼 caozhy 的回复:
如果这个问题的答案我知道,那么专业编写病毒的人也都知道。那么杀毒软件都拿这种病毒没有办法。早就成一个大新闻了。


请教除了加壳,还有其它什么方法能替代? --------------------编程问答-------------------- 杀毒软件是不会认为这是病毒的,但有些邮件系统会认为是病毒,估计是某些国外杀毒软件会认为这种加壳行为更像木马。 --------------------编程问答--------------------
引用 3 楼 tincal7 的回复:
Quote: 引用 1 楼 caozhy 的回复:

如果这个问题的答案我知道,那么专业编写病毒的人也都知道。那么杀毒软件都拿这种病毒没有办法。早就成一个大新闻了。


请教除了加壳,还有其它什么方法能替代?


如果你理解“防君子不防小人”,那么有很多方法,否则无解。一个程序要想不被破解,除非它根本不能执行。 --------------------编程问答-------------------- .net的一般都是混淆,混淆后的代码因为难以辨认,所以破解了也意义不大。 --------------------编程问答--------------------
引用 6 楼 letsbetter 的回复:
.net的一般都是混淆,混淆后的代码因为难以辨认,所以破解了也意义不大。


那你就理解错了。呵呵。关键代码,未必需要看懂,如果是某些计算的,直接抽象出来,整体拿来用就可以了。

再或者,软件中限定某个关键词、密码、写死的校验码,都回一览无余,因为这些都是string常量。 --------------------编程问答-------------------- 估计你很难理解,给你说一个吧。加密狗,需要一个公钥,就可以访问加密狗上的文件,从加密狗中读取数据回来后,根据用户的私钥进行解析数据。这个公钥一般是一个公司的同类产品都统一一个,这个公钥是明文方式写在代码中的,因为你拿到公钥也只是能读取狗中的文件,还是需要私钥,所以破解到公钥不是很危险,但如果文件没加密或是一些其他参数,就可以用这个公钥直接继续想办法了… --------------------编程问答--------------------
引用 7 楼 wuyazhe 的回复:
Quote: 引用 6 楼 letsbetter 的回复:

.net的一般都是混淆,混淆后的代码因为难以辨认,所以破解了也意义不大。


那你就理解错了。呵呵。关键代码,未必需要看懂,如果是某些计算的,直接抽象出来,整体拿来用就可以了。

再或者,软件中限定某个关键词、密码、写死的校验码,都回一览无余,因为这些都是string常量。

一些混淆软件是可以进行字符串加密的(能破击混淆软件的字符串加密算法的另说了),这样更加大了代码查看的难度 --------------------编程问答-------------------- 回楼上:
不想跟你争了,也跑题了,没什么心思跟你说这个呵呵,更没心思从原理上分析。 --------------------编程问答--------------------
引用 9 楼 letsbetter 的回复:
Quote: 引用 7 楼 wuyazhe 的回复:

Quote: 引用 6 楼 letsbetter 的回复:

.net的一般都是混淆,混淆后的代码因为难以辨认,所以破解了也意义不大。


那你就理解错了。呵呵。关键代码,未必需要看懂,如果是某些计算的,直接抽象出来,整体拿来用就可以了。

再或者,软件中限定某个关键词、密码、写死的校验码,都回一览无余,因为这些都是string常量。

一些混淆软件是可以进行字符串加密的(能破击混淆软件的字符串加密算法的另说了),这样更加大了代码查看的难度


你说的也对,wuyazhe说的也对。但是你们说的不是一个层次上的东西。就好比一个初中生,老师会告诉他,如果你算三角函数算出负的了,那么就是出错了,这并非老师错了,只是说在这个层次上,你应该这么理解。 --------------------编程问答-------------------- .NET Reactor4.5挺好用的,目前在用。可以多种加密强度选择。可以禁止反编译和添加至工具箱,也可以单纯混淆代码。 --------------------编程问答--------------------
引用 10 楼 wuyazhe 的回复:
回楼上:
不想跟你争了,也跑题了,没什么心思跟你说这个呵呵,更没心思从原理上分析。

什么时候和你争了,什么地方跑题呢,楼主问的就是防破解的方式,楼上说了加壳,那我提出混淆来不对吗?.net代码保护不是有加壳和混淆两种方式吗?能加壳就有脱壳的,混淆的代码自然不能防止反编译,但最起码也是一层屏障,也有存在的理由吧。至于你“没心思”提的原理,我想我还了解一点,但希望你回答楼主的问题时能给点解决方案顺便说点“没心思”提的原理,也不亏你版主的身份。 --------------------编程问答-------------------- 一般都能破解的 都是防君子不防小人 如果不希望太容易反编译 关键算法用c写动态库调用好了  --------------------编程问答-------------------- 大家争议下也是好的,这样才能提高嘛 --------------------编程问答-------------------- 大家争议下也是好的,这样才能提高嘛 --------------------编程问答-------------------- 没意义啊。 只要有价值怎么都能破解。
如果没价值,你不用加密 混淆都 没人去反编译。 --------------------编程问答-------------------- 感觉c#在这点上有很大的漏洞,比较容易被人利用 --------------------编程问答--------------------
引用 13 楼 letsbetter 的回复:
Quote: 引用 10 楼 wuyazhe 的回复:

回楼上:
不想跟你争了,也跑题了,没什么心思跟你说这个呵呵,更没心思从原理上分析。

什么时候和你争了,什么地方跑题呢,楼主问的就是防破解的方式,楼上说了加壳,那我提出混淆来不对吗?.net代码保护不是有加壳和混淆两种方式吗?能加壳就有脱壳的,混淆的代码自然不能防止反编译,但最起码也是一层屏障,也有存在的理由吧。至于你“没心思”提的原理,我想我还了解一点,但希望你回答楼主的问题时能给点解决方案顺便说点“没心思”提的原理,也不亏你版主的身份。



你理解的资源和我说的资源不是一回事,所以没有必要就一个你对我说话的误解做出解释。
如果这个是窗体的资源,这个是可以被加密的,但常量是无法加密的,
int i = 10000;


你告诉我,这个加密后,你是否还看的到10000?

string pwd = "do it ";
你有什么方法吧这个do it 改变后,程序的运行逻辑仍然保持不变?


我说的跑题呢,是因为楼主要的是工具,你我都没有实际的开发过类似.net rector的软件,没必要装出一副很懂的样子混淆别人,不确定正确的东西还是不要误导别人的好。 --------------------编程问答-------------------- .net代码,混淆的是变量名、函数名、类名、属性名等。对常量是无法混淆的方式修改的,我不需要跟你解释,我反编译过某软件,我看到里面的公钥。 --------------------编程问答-------------------- 我不需要跟你解释
是因为我也不确定我这样的理解是否100%正确,但看上去是没问题的,至少我想不出,如何将常量都改变后,还能保持程序的逻辑正确,所以,我认为.net rector或是类似的软件也不会对常量进行改变。 --------------------编程问答--------------------   --------------------编程问答--------------------
引用 13 楼 letsbetter 的回复:
Quote: 引用 10 楼 wuyazhe 的回复:

回楼上:
不想跟你争了,也跑题了,没什么心思跟你说这个呵呵,更没心思从原理上分析。

什么时候和你争了,什么地方跑题呢,楼主问的就是防破解的方式,楼上说了加壳,那我提出混淆来不对吗?.net代码保护不是有加壳和混淆两种方式吗?能加壳就有脱壳的,混淆的代码自然不能防止反编译,但最起码也是一层屏障,也有存在的理由吧。至于你“没心思”提的原理,我想我还了解一点,但希望你回答楼主的问题时能给点解决方案顺便说点“没心思”提的原理,也不亏你版主的身份。


1.我给你解释一下“没心思”的意思,是我对这个了解的很少,我没有心思花时间研究这个,因为我用不着,所以,我没心思去研究这个,然后来跟你讨论,因为我“没心思”这么干,这样说,满足了你的好奇心和挑衅的斗志了么?
2.版主就像你的老板,是一个为大家服务的,并不一定什么都懂,谁告诉你版主需要懂所有东西了?你跟你公司的领导讨论技术么?你的老板一定要懂技术才可以做你的领导么?
3.跑题的意思,如果你是真懂而不是忽悠两句或是现学现卖的看几篇博客来这里敷衍一下,你之前的回复应该就开始用解释来证明你真的懂了。

我没心思这么跟你说,而这么说就是在跑题,这样解释,你明白了么? --------------------编程问答-------------------- 其实不过是很简单的一个想法,换来你的“误读”,所以我觉得就这个来说,没什么意思。

我没有很仔细的从IL中分析过混淆后的代码,使用过的5~6种软件,包括你在市面上找不到的(某国内加密狗公司自己实现的),对字符串常量均没有做处理,并非不是没有办法处理,例如原本代码中,对关键的字符串就采用拼接密文,然后用某种方式还原明文后使用,在混淆后看上去比较复杂,仅此而已,但密文依然是可见而且是直接可见的。很简单的几部就可以还原。这些并不能证明字符串也被混淆了。

.net的加密,不过就是混淆和加壳,混淆是对函数名,变量名,属性名等表达意义的变量、常量名称的修改,达到和原本意义没有联系,增加理解难度的方法,加壳的方式,因为.net的程序也要符合pe结构,所以可以将入口函数地址偏移到另外一个地方,启动后再交给原来的入口函数,去启动.net clr,进而启动翻译和执行。但这个偏移程序入口函数地址的做法,经常被木马使用,所以某些软件会误报。

我知道的就这么多,无论楼主,还是你说什么我都不会再来看了。到此为止,很忙。抽空回来csdn看看论坛而已,没必要这样,如果你“真的懂”,剩下的就请你给大家科普一下吧。 --------------------编程问答-------------------- 哇哇哇啊哇  涨见识了~~! --------------------编程问答--------------------
引用 24 楼 wuyazhe 的回复:
其实不过是很简单的一个想法,换来你的“误读”,所以我觉得就这个来说,没什么意思。

我没有很仔细的从IL中分析过混淆后的代码,使用过的5~6种软件,包括你在市面上找不到的(某国内加密狗公司自己实现的),对字符串常量均没有做处理,并非不是没有办法处理,例如原本代码中,对关键的字符串就采用拼接密文,然后用某种方式还原明文后使用,在混淆后看上去比较复杂,仅此而已,但密文依然是可见而且是直接可见的。很简单的几部就可以还原。这些并不能证明字符串也被混淆了。

.net的加密,不过就是混淆和加壳,混淆是对函数名,变量名,属性名等表达意义的变量、常量名称的修改,达到和原本意义没有联系,增加理解难度的方法,加壳的方式,因为.net的程序也要符合pe结构,所以可以将入口函数地址偏移到另外一个地方,启动后再交给原来的入口函数,去启动.net clr,进而启动翻译和执行。但这个偏移程序入口函数地址的做法,经常被木马使用,所以某些软件会误报。

我知道的就这么多,无论楼主,还是你说什么我都不会再来看了。到此为止,很忙。抽空回来csdn看看论坛而已,没必要这样,如果你“真的懂”,剩下的就请你给大家科普一下吧。

真有意思,我说了还有混淆的方式,你说“这你就理解错了”,好,正常交流,我再提出“一些混淆软件是可以进行字符串加密的,这样更加大了代码查看的难度”,也是想告诉大家混淆软件有能加密字符串的,可以增加代码查看难度(只是增加难度奥),你来一句“我跑题了”,也“没心思”给我讲原理了,我反驳后,你好像“极不情愿”的一样,给大家普及下混淆的知识,还来一句“版主就像你的老板”,怪不得,原来有“老板”心态。
不错,目前主流混淆软件主要是对“函数名,变量名,属性名等表达意义的变量、常量名称的修改”,但也有混淆软件在混淆时注入自己精心处理过的加密算法对字符串常量进行加密,虽然这样也很容易被破解,就像我说的那样:增加了代码的查看难度。我也看过IL中字符串经过加密后的效果,也看到网上有分析它的加密代码并写出解密算法,但我不确定这么多年后这款混淆器是否有所改进,是否加入了更曲折更难以理解的更分散的或者其他途径的加密代码来增加“君子”们的解密难度,所以我没有提过这个软件的名字,虽然你可能猜出来了。
正常的论坛交流可以提高你我和大家的知识水平,我就从中受益匪浅,但动不动就“没心思说”、“你说什么我也不会看了”、“到此为止,我很忙”,那我只想说:“老板”心态要不得,“码农”情商更重要。 --------------------编程问答-------------------- “string pwd = "do it ";
你有什么方法吧这个do it 改变后,程序的运行逻辑仍然保持不变?”

方法是有的,混淆器混淆前在目标代码中将混淆器自带的加密算法注入到目标代码中,将常量改为加密字符并加入解码方法引用,然后混淆。比如“string pwd="do it"”改为“string pwd=_sde("加密后字符")”,这样做的缺点就是反编译后会连同解码方法一起暴漏,但可以通过提高逻辑复杂度、分散代码等方式提高阅读难度(尤其是混淆后,阅读难度更高),甚至可以引用非托管代码存放解码程序,这样更提高了阅读难度。
这样的最突出优点就是反编译后无法通过“do it”直接定位到目标代码块,想找到这个字符串,一行一行读代码去吧,还是混淆后的代码,杀了“君子”们吧。

当然上述方法只是我想的解决方案,没有实践,因为我平时也用不到混淆。
--------------------编程问答-------------------- 以前我有加密软件处理过我的程序,但是运行出问题了。反正是混淆的事
后来,我也不再用加密软件了。破解就破解。都是程序猿,谁欺负谁不能看代码呀?
再说,只要逻辑稍微复杂点的程序,自己超过1周不看再看也有点蒙圈,何况一个新人呢。
话说核心函数的话,让人调用也就用吧,程序猿何苦难为程序猿
实在想加密的的话,把核心函数用C写,然后调用它 --------------------编程问答-------------------- --------------------编程问答-------------------- 混淆后可以把改变字符串常量。
最近用到了一个内存分析工具。在使用破解文件时一直失败,我就想反编译源码,看看什么地方出错了,结果发现,不仅变量名,函数名混淆过了,连字符串变量也改了。
下面是反编译后的一段代码。
object obj2;
    Dictionary<uint, object> data = AppDomain.CurrentDomain.GetData("\x00147́�m\x000f��ޗ4�Q.�") as Dictionary<uint, object>;
    if (data == null)
    {
        AppDomain.CurrentDomain.SetData("\x00147́�m\x000f��ޗ4�Q.�", data = new Dictionary<uint, object>());
        MemoryStream stream = new MemoryStream();
        using (DeflateStream stream2 = new DeflateStream(Assembly.GetCallingAssembly().GetManifestResourceStream("\x00147́�m\x000f��ޗ4�Q.�"), CompressionMode.Decompress))
        {
            byte[] buffer = new byte[0x1000];
            int count = stream2.Read(buffer, 0, 0x1000);
            do
            {
                stream.Write(buffer, 0, count);
                count = stream2.Read(buffer, 0, 0x1000);
            }
            while (count != 0);
        }
        AppDomain.CurrentDomain.SetData("�ۏFe�E\x0015#��p5��R", stream.ToArray());
    }
--------------------编程问答-------------------- --------------------编程问答--------------------
引用 1 楼 caozhy 的回复:
如果这个问题的答案我知道,那么专业编写病毒的人也都知道。那么杀毒软件都拿这种病毒没有办法。早就成一个大新闻了。
+
呃。。。 --------------------编程问答-------------------- 貌似怎么吵起来了?????

我还是同意那句 防君子不防小人。我一般使用配套的加密狗加密。基本上破解很费事的。

有时候觉得破解后没啥大的影响的就加壳。

加壳的话不要用太主流的很容易被针对。

我使用的是不知名的但是也具备加壳的作用,能加大破解的难度。 --------------------编程问答-------------------- 关键函数用C++写,c#只负责调用与UI --------------------编程问答--------------------
引用 33 楼 dongjianhua520520 的回复:
貌似怎么吵起来了?????

我还是同意那句 防君子不防小人。我一般使用配套的加密狗加密。基本上破解很费事的。

有时候觉得破解后没啥大的影响的就加壳。

加壳的话不要用太主流的很容易被针对。

我使用的是不知名的但是也具备加壳的作用,能加大破解的难度。


配套的加密狗是指?
加壳主要是担心 360之类的杀软报毒
不知道 双重混淆 是否可行,先用A混淆,混淆完再用B混淆
--------------------编程问答-------------------- 不折腾这个问题。

我建议lz放弃.net、java等等。去使用编程语言编程。 --------------------编程问答-------------------- 你可以试试稍微高级一点的代码,例如这样的代码
       internal void Render(Scene scene, bool parallel)
        {
            int[] rgb = new int[screenWidth * screenHeight];
            var pixelsQuery = from y in Enumerable.Range(0, screenHeight).AsParallel().WithDegreeOfParallelism(parallel ? 2 : 1)
                              let recenterY = -(y - (screenHeight / 2.0)) / (2.0 * screenHeight)
                              select from x in Enumerable.Range(0, screenWidth)
                                     let recenterX = (x - (screenWidth / 2.0)) / (2.0 * screenWidth)
                                     let point =
                                         Vector.Norm(Vector.Plus(scene.Camera.Forward,
                                                                 Vector.Plus(Vector.Times(recenterX, scene.Camera.Right),
                                                                             Vector.Times(recenterY, scene.Camera.Up))))
                                     let ray = new Ray() { Start = scene.Camera.Pos, Dir = point }
                                     let computeTraceRay = (Func<Func<TraceRayArgs, Color>, Func<TraceRayArgs, Color>>)
                                      (f => traceRayArgs =>
                                       (from isect in
                                            from thing in traceRayArgs.Scene.Things
                                            select thing.Intersect(traceRayArgs.Ray)
                                        where isect != null
                                        orderby isect.Dist
                                        let d = isect.Ray.Dir
                                        let pos = Vector.Plus(Vector.Times(isect.Dist, isect.Ray.Dir), isect.Ray.Start)
                                        let normal = isect.Thing.Normal(pos)
                                        let reflectDir = Vector.Minus(d, Vector.Times(2 * Vector.Dot(normal, d), normal))
                                        let naturalColors =
                                            from light in traceRayArgs.Scene.Lights
                                            let ldis = Vector.Minus(light.Pos, pos)
                                            let livec = Vector.Norm(ldis)
                                            let testRay = new Ray() { Start = pos, Dir = livec }
                                            let testIsects = from inter in
                                                                 from thing in traceRayArgs.Scene.Things
                                                                 select thing.Intersect(testRay)
                                                             where inter != null
                                                             orderby inter.Dist
                                                             select inter
                                            let testIsect = testIsects.FirstOrDefault()
                                            let neatIsect = testIsect == null ? 0 : testIsect.Dist
                                            let isInShadow = !((neatIsect > Vector.Mag(ldis)) || (neatIsect == 0))
                                            where !isInShadow
                                            let illum = Vector.Dot(livec, normal)
                                            let lcolor = illum > 0 ? Color.Times(illum, light.Color) : Color.Make(0, 0, 0)
                                            let specular = Vector.Dot(livec, Vector.Norm(reflectDir))
                                            let scolor = specular > 0
                                                           ? Color.Times(Math.Pow(specular, isect.Thing.Surface.Roughness),
                                                                         light.Color)
                                                           : Color.Make(0, 0, 0)
                                            select Color.Plus(Color.Times(isect.Thing.Surface.Diffuse(pos), lcolor),
                                                              Color.Times(isect.Thing.Surface.Specular(pos), scolor))
                                        let reflectPos = Vector.Plus(pos, Vector.Times(.001, reflectDir))
                                        let reflectColor = traceRayArgs.Depth >= MaxDepth
                                                            ? Color.Make(.5, .5, .5)
                                                            : Color.Times(isect.Thing.Surface.Reflect(reflectPos),
                                                                          f(new TraceRayArgs(new Ray()
                                                                          {
                                                                              Start = reflectPos,
                                                                              Dir = reflectDir
                                                                          },
                                                                                             traceRayArgs.Scene,
                                                                                             traceRayArgs.Depth + 1)))
                                        select naturalColors.Aggregate(reflectColor,
                                                                       (color, natColor) => Color.Plus(color, natColor))
                                       ).DefaultIfEmpty(Color.Background).First())
                                     let traceRay = Y(computeTraceRay)
                                     select new { X = x, Y = y, Color = traceRay(new TraceRayArgs(ray, scene, 0)) };
            int rowsProcessed = 0;
            pixelsQuery.ForAll(row =>
                {
                    foreach (var pixel in row)
                    {
                        rgb[pixel.X + (pixel.Y * screenWidth)] = pixel.Color.ToInt32();
                    }
                    int processed = Interlocked.Increment(ref rowsProcessed);
                    if (processed % rowsPerUpdate == 0 ||
                        processed >= screenHeight) updateImageHandler(rgb);
                });
        }

它编译出来之后如何读。

整天就是纠结于定一个字符串变量、然后让别人不认识“这是一个字符串变量”上,就好像是小孩子过家家,我觉得大多数成年人都实在是没有多少时间陪玩儿。有这个时间,研究一下“自己的代码都分别被多少了竞争对手研究过?是否超过50个公司?”这还有点意义。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,