问题描述
对于.Net的客户端程序,总是那么不保险,想用程序集签名的方式防止客户端程序集被篡改。可是按照网上的步骤,先用公钥进行签名,为了项目可运行、可调试,勾选了延迟签名的选项,并通过命令sn-Vrxxx.dll将xxx.dll加入到信任列表内,最后发布的时候,再用私钥对发布的dll进行再次签名。但我觉得这一系列步骤好像不是那么科学。还是我的方法有误?!过程如下:在开发机内,将程序进行私钥签名后发布到虚拟机内。在虚拟机(有VisualStudio环境)里试了一下,将已通过私钥签名的程序放到虚拟机里,一切正常;然后用一个xxx.dll(经公钥签名,但无私钥签名),去替换xxx.dll(经私钥签名),程序运行异常,说明起到了防篡改的目的。但是,当我打开vs的命令行工具,一样通过sn-Vrxxx.dll,让程序运行时不去验证xxx.dll,这时候程序居然正常运行了,也就是说即使程序集已经经过私钥签名了,但是任然可以通过sn-Vr命令绕过签名验证。那这么一来,这个所谓通过签名防篡改不是成为一个摆设么?只要一个命令,就能击破,防篡改何从说起?
解决方案
本帖最后由 csz_1987 于 2015-02-12 09:17:28 编辑
解决方案二:
看来真的是鸡肋一个。上图来至MSDN。
解决方案三:
引用1楼csz_1987的回复:
看来真的是鸡肋一个。上图来至MSDN。
https://msdn.microsoft.com/zh-cn/library/t07a3dye(VS.80).aspx
解决方案四:
当你没有源码的时候怎么去篡改呢?
解决方案五:
防什么篡改?防止别人直接修改exe里面的二进制数据??
解决方案六:
引用3楼FoxDave的回复:
当你没有源码的时候怎么去篡改呢?
比如一个登录的逻辑写在login.dll里面。可通过Reflector看到login.dll里的源码,Reflector可将源码导出为项目,在源码里做些手脚(比如登录成功后将用户名密码发送到某个邮箱)重新编译一份login.dll(篡改)覆盖掉原客户端程序集login.dll(原版),那么这时候用户登录成功后,用户名密码就被偷偷的发送到某个指定的邮箱里了。我原本想用程序集签名的方式来避免这种dll被偷梁换柱。
解决方案七:
引用5楼csz_1987的回复:
Quote: 引用3楼FoxDave的回复:
当你没有源码的时候怎么去篡改呢?比如一个登录的逻辑写在login.dll里面。可通过Reflector看到login.dll里的源码,Reflector可将源码导出为项目,在源码里做些手脚(比如登录成功后将用户名密码发送到某个邮箱)重新编译一份login.dll(篡改)覆盖掉原客户端程序集login.dll(原版),那么这时候用户登录成功后,用户名密码就被偷偷的发送到某个指定的邮箱里了。我原本想用程序集签名的方式来避免这种dll被偷梁换柱。
呵呵,真正的产品你用reflector是看不到源码的,都混淆了
解决方案八:
引用5楼csz_1987的回复:
Quote: 引用3楼FoxDave的回复:
当你没有源码的时候怎么去篡改呢?比如一个登录的逻辑写在login.dll里面。可通过Reflector看到login.dll里的源码,Reflector可将源码导出为项目,在源码里做些手脚(比如登录成功后将用户名密码发送到某个邮箱)重新编译一份login.dll(篡改)覆盖掉原客户端程序集login.dll(原版),那么这时候用户登录成功后,用户名密码就被偷偷的发送到某个指定的邮箱里了。我原本想用程序集签名的方式来避免这种dll被偷梁换柱。
用户应该自己保证使用的客户端是官方下载,而不是从哪个网站随便下载的,否则里面有木马,也怪不得别人了
解决方案九:
引用6楼FoxDave的回复:
Quote: 引用5楼csz_1987的回复:
Quote: 引用3楼FoxDave的回复:
当你没有源码的时候怎么去篡改呢?比如一个登录的逻辑写在login.dll里面。可通过Reflector看到login.dll里的源码,Reflector可将源码导出为项目,在源码里做些手脚(比如登录成功后将用户名密码发送到某个邮箱)重新编译一份login.dll(篡改)覆盖掉原客户端程序集login.dll(原版),那么这时候用户登录成功后,用户名密码就被偷偷的发送到某个指定的邮箱里了。我原本想用程序集签名的方式来避免这种dll被偷梁换柱。
呵呵,真正的产品你用reflector是看不到源码的,都混淆了
混淆是混淆,混淆是另一回事。我就想问做了签名后,还是可以通过一行sn-Vr命令绕过签名这不是白搭么。
解决方案十:
而如果黑客都直接黑进客户机去修改客户端了那还用改客户端吗直接监控用户到底在文本框里输入了啥不就得了而且很可能用户自己记不住密码,而是把密码写在了桌面上某个txt文本里,直接看不就得了
解决方案十一:
引用7楼Z65443344的回复:
Quote: 引用5楼csz_1987的回复:
Quote: 引用3楼FoxDave的回复:
当你没有源码的时候怎么去篡改呢?比如一个登录的逻辑写在login.dll里面。可通过Reflector看到login.dll里的源码,Reflector可将源码导出为项目,在源码里做些手脚(比如登录成功后将用户名密码发送到某个邮箱)重新编译一份login.dll(篡改)覆盖掉原客户端程序集login.dll(原版),那么这时候用户登录成功后,用户名密码就被偷偷的发送到某个指定的邮箱里了。我原本想用程序集签名的方式来避免这种dll被偷梁换柱。
用户应该自己保证使用的客户端是官方下载,而不是从哪个网站随便下载的,否则里面有木马,也怪不得别人了
程序集签名的目的不是就是为了防篡改么?一个sn命令就可以绕过他了?
解决方案十二:
如果黑客已经破解了你的dll那么他再稍微多费点劲,把你整个程序集破解了不行?
解决方案十三:
纠结这个没什么意义我觉得
解决方案十四:
我觉得这就像一个卖烤地瓜的,每天回家都把地瓜放到保险柜里然后还纠结保险柜也可能会被撬开
解决方案十五:
世界上没有撬不开的锁只不过是撬锁需要花费的代价和里面的东西的价值相比,值得不值得的问题
其他方案:
引用13楼Z65443344的回复:
我觉得这就像一个卖烤地瓜的,每天回家都把地瓜放到保险柜里然后还纠结保险柜也可能会被撬开
哎,话是这么说。我就想知道是不是一个sn命令就绕开了,还是你们有更好的方法。结果你们扯东扯西的,我问签名是否有办法不被绕开,一个回答我混淆;一个回答我黑客地瓜云云。你们直接回答我无解不就行了,或者告诉我这条路走下去就是这个结果就行了。我当然知道没有最强的矛也没有最强的盾。你们歪楼的功夫正式够可以的。还是谢谢你们。
其他方案:
引用15楼csz_1987的回复:
Quote: 引用13楼Z65443344的回复:
我觉得这就像一个卖烤地瓜的,每天回家都把地瓜放到保险柜里然后还纠结保险柜也可能会被撬开哎,话是这么说。我就想知道是不是一个sn命令就绕开了,还是你们有更好的方法。结果你们扯东扯西的,我问签名是否有办法不被绕开,一个回答我混淆;一个回答我黑客地瓜云云。你们直接回答我无解不就行了,或者告诉我这条路走下去就是这个结果就行了。我当然知道没有最强的矛也没有最强的盾。你们歪楼的功夫正式够可以的。还是谢谢你们。
你这话很有点道理,不知道不丢人.做技术谁敢说什么都精通.
其他方案:
一个sn命令就绕开了,是在你的dll已经被破解了的前提下既然dll已经被破解了,里程序集整个被破解还远吗所以纠结这个没啥意义贼已经进了家了,再纠结里面的门不是防盗的,已经晚了
其他方案:
再说sn命令是需要在vs的命令行工具里执行的小偷为了改别人电脑上的客户端程序,还得先给客户机安装个VS?
其他方案:
可以说强命名的功能一个是程序集版本标识的一部分,另一个是代表了发行方的身份。你也看msdn了,还有个有句话:"Donotrelyonstrongnamesforsecurity.Theyprovideauniqueidentityonly."。防篡改必须主动检查,大部分混淆工具都提供防篡改功能,不过其实意义不大。如果像你5楼说的那种情况,就算你避免了软件被篡改,也无法避免被重新打包发布,添加木马。那一样能够窃取用户信息。防止菜鸟reflector看代码,简单的混淆下就可以了。
其他方案:
可通过Reflector看到login.dll里的源码,Reflector可将源码导出为项目,在源码里做些手脚所以就不让别人看源码呗......就好像密道不是要弄几个防盗门啊大铁锁啊,先要想办法不让人发现才叫密道嘛
其他方案:
程序集签名本质上并不是用来防破解的,而是防止C++中的DllHell现象.如果你想防止破解,就用加密狗吧.
其他方案:
如果dll是经过签名然后被引用,那么这个dll如果被修改,但没有经过同一个key签名,是会引用出错的,这就是防篡改