一关于C#程序反编译讨论的帖子

一关于C#程序反编译讨论的帖子
最近做的题库系统做完了.我把程序打包后,并安装.我把连接数据库的用户名,IP地址,密码写在了配置文件里.并用DES加密用户名和数据库名字.  
我的一个朋友在试我的程序,我看它用了一个反编译程序,一会就把我写的DES加密解密的方法弄出来了,关轻易得到了加密的KEY和向量.  
结果.......就直接得到了我连接数据库的用户名和密码.  
    
  怎么C#的程序这么容易就能让人看到原代码啊.郁闷.  
  

1 楼 C#确实比较容易被反编译~

2 楼 谁叫微软有反编译工具那

3 楼  2用代码混淆器,可以让别人反编译后看你的代码累一点,哈哈

4 楼 每每对C#了解的越深,就越是感觉C#这东西没法用了。

5 楼 没有办法啦,

6 楼 用代码混淆器,只是看起来稍微累点,没解决根本问题,哈哈

7 楼 哪大家做C/S结构程序时,如果隐藏连接数据库的用户名和密码.

8 楼 这个问题与C#无关,任何编程语言都有这个问题,你把密码包含在程序或配置文件中交付给用户,无论你怎样做,都不可能绝对安全。

9 楼 就算你是用C++写的程序,要破解也不是难事

10 楼 服务器采用web   services,你本地连接服务器的web   services,那么本地就可以不用知道服务器的密码了。  
  

11 楼 隐藏密码可以使用webservice处理数据

12 楼 是这样的,兄弟,命苦不能怨政府

13 楼 C#有个反编译工具,反编C#代码易如反掌,  
不过只能反编大70%的代码。

14 楼 但是我看大多数都能看到代码.如封装在类里的方法\类成员变量什么的,都看得见.  
    
  "隐藏密码可以使用webservice处理数据"  
  这个怎么处理,没有用过,能否讲讲?  
  

15 楼 你用什么DES,没意义,白做了.无论你用什么加密算法,无论你的加密过程多么复杂.  
你最终还是要以明文发送数据包去连接数据库吧?  
只要截取了数据包下来分析一下就能知道SQL连接密码了.这个问题也跟开发语言无关,你用什么语言编写的程序都跟不过最后这一关.所以说是你的设计方案本身就有问题,还是建议你还Web   Services做

16 楼 哦,楼上朋友的话说得很让我茅塞顿开阿。

17 楼

18 楼 当然还是要用Web   Services拉   偶们公司做的网上审批系统就是用的Web   Services   8然万一用户名和密码被人知道就可以随便批拉!~

19 楼 这个跟C#没什么关系,你数据库用户名是写在配置文件里吗?  
我们这里用的加密,是自己在原来的加密函数基础上,重新写的函数,调用函数需要密码的。要么反编译出来的结果会不正确。

20 楼 有谁可以告诉我怎么截获数据包.

21 楼 大家都说用Web   Services来做,但哪位能讲讲思路和方法,来个例子.

22 楼 我知道,但是不告诉你,嘿嘿!!

23 楼 我想告诉你,但是我不知道,嘿嘿!!  
  

24 楼 webservice就是放在服务器的类,你在客户端调用这个类,进行操作,在VS中加入webservice就是web引用.

25 楼 学习

26 楼 做web,有了代码肯定就能知道密码,这个没办法的.

27 楼 因为C#是与JAVA竞争,是作网络应用的,网络不存在反汇编,作WINFORM最好用C++

28 楼 C++就不好破解了么?,一大堆的脱壳工具,一大堆的PE修改工具,在C++里面只要你把字符串写在类成员里,保证五分钟之类就给你找出来并改掉

29 楼 今天看了一点关于"Web   Services"的东东,你们的意思是,在服务器端在Web   Services里写个类或者写个方法,把连接数据库用的东东放在里面,在客户端的WINFORM里调用这个方法,对不?  
  如果是这样,哪调用Web   Services里方法返回的值,能不能被得到,我知道有些软件是专门监听网络流的.

30 楼

31 楼 现在有什么不能被反编译的语言?!!呵呵

32 楼 C++就是不能反编译啊,,只能反汇编吧?

33 楼

34 楼 楼主你没用过Reflector吧,没混淆的基本上源代码都能看得见的。

35 楼 c/s为了保护数据库名用户和密码,你可以在数据库上开一个公用用户名,这个用户权限只给只读访问用户表,当客户端用此用户登陆数据库效验成功后,从数据库返回另一个用户名和密码,客户端再用具有新权限的用户名登陆使用,这样就不怕被反编译了.  
  此乃拙见,希望各位兄弟批评指正

36 楼 楼上,截取数据的话,你的新用户名和密码一样会被看到

37 楼 不知道用MD5加密可不可以

38 楼 楼主随便看看cram-md5的rfc就可以搞定了

39 楼 你的安全机制本身设计的就有问题

40 楼 有一种办法可以解决既要以C/S方式直接登录数据库又不泄露数据库密码的问题。那就是用户登录系统时所用的密码就是登录数据库的密码,分发给用户的程序和配置文件不包含任何密码信息,数据库配置为使用安全连接,即使别人从网络上截获了数据包也无法知道所用的密码。麻烦之处在于需要为每个用户在数据库上建立一个账户。不过这个可以使用程序自动完成,数据库上也可以配置用户组来为每个数据库用户授予对表、视图或存储过程的访问权限。这个方案应该是比较安全的,建议采用。

41 楼 连接数据库的密码中插几个韩文,日文字.或其他的希奇古怪的字符.呵呵.

42 楼 混淆一下,加个壳,搞定

43 楼 使用应用服务器不知行不行

44 楼 加一个服务器验证   或者看看MAX   CODE

45 楼 我测试过了   抓包   可以看到   数据   帐号   表名   SQL语句  
但是就是看不到密码,密码自动被加密了的。  
楼主   是把密码存在了程序里面   当然可以看到了。是通过破解程序或者反编译哈  
通过抓包   还是看不到密码的  
请问那位高手知道   用Sniffer抓包   可以看到密码的站出来探讨一下

46 楼 但是就是看不到密码,密码自动被加密了的  
密码肯定不会明文传送的,都是做了手脚再传送的。

47 楼 可以用windows认证方式呀,这样不用写口令,直接管理服务器就可以了,适用于局域网上的程序(服务器最好是域服务器),对于互联网就采用Webservise就可以了。

48 楼

49 楼 楼上有人建议用户登录系统时所用的密码就是登录数据库的密码,我觉得这样也不行,如果这样,那么用户完成可以使用数据库的客户端来连接数据库,直接访问后台数据,这样完全可以避免应用系统的逻辑。而使用windows认证的方式,同样也有这个问题。我觉得,解决方法还是使用三层结构,使用应用服务器来达到安全的目的。其实webservise就是这样的解决思路。不过,同质系统其实没有必要使用webservise,效率比较低。

50 楼 所以以后别用C#了

51 楼 找混淆器吧.

52 楼 混淆器管一点用。  
要是用了   MaxtoCode   这款国人做的佼佼工具软件,就效果不一般了。  
这款工具软件就是用来防止   .NET   软件被反编译的。 http://www.maxtocode.com/  
不过,楼主的安全机制本身有问题。加密的东西能这么做?  
对称加密的密钥最好要在非对称加密后再传输,以供进行对称解密。

53 楼 怎么知道一个文件是什么语言写的呢?

54 楼 呵呵MD5加密是不能反編譯的。但你的代碼算法還是很容易被人獲知的!

55 楼 数据库用户名密码没事丢到客户端去做什么?  
你只要把服务器的ip和端口给客户端就好了  
服务器与客户端全部通过tcp/ip通讯,跟数据库无关,绝对安全。

56 楼  对于直接连数据库的CS应用程序,也只能这样了,如果要避免用户直接连数据库而绕过应用逻辑,其实也有办法,那就是把所有的应用逻辑都写进存储过程,用户只有访问存储过程,或读取表或试图的权限,没有写表的权限。传统的C/S模式就是这么做的。

转载于:https://www.cnblogs.com/ssda/archive/2009/06/10/1500891.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C#编写的一个关卡的推箱子游戏的示例: ```csharp using System; class Program { static void Main() { // 定义地图 char[,] map = new char[,] { { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' }, { '#', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#' }, { '#', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#' }, { '#', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#' }, { '#', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#' }, { '#', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#' }, { '#', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#' }, { '#', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#' }, { '#', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#' }, { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' } }; // 定义人物和箱子的初始位置 int playerX = 1; int playerY = 1; int boxX = 3; int boxY = 3; // 游戏循环 while (true) { // 清空屏幕 Console.Clear(); // 绘制地图 for (int y = 0; y < map.GetLength(0); y++) { for (int x = 0; x < map.GetLength(1); x++) { if (x == playerX && y == playerY) { Console.Write('P'); // 绘制人物 } else if (x == boxX && y == boxY) { Console.Write('B'); // 绘制箱子 } else { Console.Write(map[y, x]); // 绘制地图 } } Console.WriteLine(); } // 判断是否胜利 if (boxX == 7 && boxY == 7) { Console.WriteLine("恭喜你通关了!"); break; } // 获取玩家输入 ConsoleKeyInfo keyInfo = Console.ReadKey(); // 根据玩家输入移动人物和箱子 switch (keyInfo.Key) { case ConsoleKey.UpArrow: if (map[playerY - 1, playerX] != '#') { playerY--; if (playerX == boxX && playerY == boxY - 1 && map[boxY - 1, boxX] != '#') { boxY--; } } break; case ConsoleKey.DownArrow: if (map[playerY + 1, playerX] != '#') { playerY++; if (playerX == boxX && playerY == boxY + 1 && map[boxY + 1, boxX] != '#') { boxY++; } } break; case ConsoleKey.LeftArrow: if (map[playerY, playerX - 1] != '#') { playerX--; if (playerX == boxX - 1 && playerY == boxY && map[boxY, boxX - 1] != '#') { boxX--; } } break; case ConsoleKey.RightArrow: if (map[playerY, playerX + 1] != '#') { playerX++; if (playerX == boxX + 1 && playerY == boxY && map[boxY, boxX + 1] != '#') { boxX++; } } break; } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值