我找到了一位朋友,他用一些很酷的函数来处理他用C ++编写的加密和安全性。然后他使用了themidia来使它更安全等等。
他给了我DLL,我使用函数查找器来查找所有函数。但这是问题所在。
所有函数都有一个@符号,而在C#中我使用一个重要的DLL,它说无法编译代码,因为它是@上的语法错误。例如,函数名称可能是“CheckPassword_ @ 12”,这很奇怪,但C#不允许我这样做。
是否有我遗漏的东西,他不会给我一个不安全的DLL因为如果他们破解我的应用程序以便能够修改他的DLL他不想要人。我检查了多个应用程序并完成了自己的工作,但所有的函数名称都提供了@。
谢谢!
答案 0 :(得分:2)
[DllImport("security.dll", CallingConvention=CallingConvention.StdCall, ExactSpelling=true)]
private static extern IntPtr _passwordValid@8(string string_0, string string_1);
这比你的问题更有意义。 StdCall调用约定在标识符之前加下一个下划线,在标识符后面加@n
。此名称修饰有助于捕获C程序中的声明错误。您只需省略它们,pinvoke marshaller可以对属性导出名称进行反向工程。 StdCall是默认值,所以这已经足够了:
[DllImport("security.dll")]
private static extern IntPtr passwordValid(string string_0, string string_1);
顺便说一下,我的意思是在评论中说EntryPoint而不是ExactSpelling。
还有一个细节,您可能需要在声明中使用CharSet属性。是否需要它取决于DLL作者使用的字符串类型。 DLL编写器通常还提供带有函数声明的.h文件。这样的.h文件也会说passwordValid
而不是_passwordValid@8
。确保您拥有使用此DLL的合法权利,没有这样的头文件是非常不寻常的。