Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 假装GetCallingAssembly()指向其他程序集_C#_Security - Fatal编程技术网

C# 假装GetCallingAssembly()指向其他程序集

C# 假装GetCallingAssembly()指向其他程序集,c#,security,C#,Security,我是一名c#游戏的开发者,我有一个安全功能,我的服务器动态创建一个包含一些密钥的DLL,并将该DLL上传到amazon s3,然后向人们推出随机挑战。当客户端收到此质询时,他们有30秒的时间响应 客户端从AmazonS3下载DLL,并使用反射调用一个方法,该方法接收服务器发送给它们的密钥 然后,dll获取传递到函数中的密钥、随机构建到dll中的密钥以及GetCallingAssembly()的crc散列,并将它们散列在一起。此结果将返回给客户端,客户端将响应推回服务器 回到问题上来。。。我们有一

我是一名c#游戏的开发者,我有一个安全功能,我的服务器动态创建一个包含一些密钥的DLL,并将该DLL上传到amazon s3,然后向人们推出随机挑战。当客户端收到此质询时,他们有30秒的时间响应

客户端从AmazonS3下载DLL,并使用反射调用一个方法,该方法接收服务器发送给它们的密钥

然后,dll获取传递到函数中的密钥、随机构建到dll中的密钥以及
GetCallingAssembly()
的crc散列,并将它们散列在一起。此结果将返回给客户端,客户端将响应推回服务器

回到问题上来。。。我们有一个黑客,他不知何故找到了一种伪造
GetCallingAssembly
的方法,为了更好地理解这一点,以便我可以找到一种方法来防止它,或者使用更难伪造的东西,我想复制他所做的


据我所知,他使用的是一个应用程序,他没有使用代码来实现这一点。但我在这方面什么也没发现。非常感谢您提供的任何帮助,以便我可以删除这个家伙的安全漏洞。

看来要想欺骗
GetCallingAssembly
您需要做的唯一一件事就是创建一个同名的新程序集。现在链条断了。我不能指出他是如何做到的,但我可以提供一个建议,使它更难破解

  • 客户端从S3下载DLL
  • 客户端调用DLL中的方法
  • DLL获取调用程序集,并调用客户端上的方法。此方法接收一些salt(最好是DLL中的一个唯一密钥或日期时间),将其附加到一个秘密字符串(存储在客户端中),对结果进行散列,然后将此散列返回给DLL
  • 一旦客户机提供了正确的结果,DLL就会正确地响应服务器

  • 破门而入总是可能的,但是中间与加密相关的步骤越多,您就越难让他们破门而入。这一步不需要太多的努力就可以完成。

    有多种技术可用于此。例如,允许在BCL程序集上替换甚至静态方法的实现。它通过使用CLR档案器来实现这一点,这可能不是你的黑客所做的。

    你为什么不给他发一份工作邀请?我已经提供了这个,而他会加入我们的团队。我肯定他已经声明他不会透露他正在做什么。这样做的一种方法是使用像Moles这样的迂回框架,它可以指导任何静态方法的实现。将下载的DLL反汇编到其IL,将对GetCallingAssembly的调用替换为预期值的恒定加载,然后重新编译并使用它也不会太困难。还有一些工具可以利用机器代码来实现这一点,尽管这类迂回要复杂一些。你应该努力让你的游戏变得如此安全,即使人们可以看到完整的源代码,也不会有问题。这就是说,如果调用程序集是伪造的,并且指向计算机上其他地方的真实交易,那么它仍然会生成正确的响应,从而使您所建议的内容变得毫无意义。他伪造了调用程序集,指向真正的游戏,而他修改的程序是实际运行的。此外,我正在做GealCalpCudio.Load,然后使用文件的字节,生成一个CRC,这是我用来验证它真正的游戏。所以它是一个中间人,他只是假装在玩两面?如果是这样的话,那就更难规避了…差不多,他破解了游戏,不知怎的伪造了GetCallingAssembly指向真实的集合,因此,当他像往常一样从游戏中调用dll时,dll会看到getcallingassembly以某种方式指向真实游戏,因此我的dll会散列真实游戏您刚才让我想到了一个想法,从dll中,如果我们查看当前运行的进程,并确保未更改的游戏和路径在运行进程列表中,会怎么样?我们绑定到特定的端口以使游戏正常运行,这样做,他将很难打开同一个端口两次。有没有办法取消劫持?或者确定它是否被劫持了?@willthiswork89,可能吧,但是每一种对策当然都可以通过确定它在寻找什么并绕道/重写检查以获得成功来反击。这个故事的真正寓意是,你无法阻止对客户的黑客攻击,所以永远不要相信客户会做任何重要的事情。