Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/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
使用python运行未报告的.dll函数_Python_Memory_Ctypes - Fatal编程技术网

使用python运行未报告的.dll函数

使用python运行未报告的.dll函数,python,memory,ctypes,Python,Memory,Ctypes,这似乎是一个奇怪的问题,但我想知道如何从内存“签名”运行.dll中的函数。我不太明白它到底是如何工作的,但我非常需要它。如果您知道.dll的内存签名和地址,它是从.dll中运行未报告函数的一种方法。 例如,我有: respawn_f "_ZN9CCSPlayer12RoundRespawnEv" respawn_sig "568BF18B06FF90B80400008B86E80D00" respawn_mask "xxxxx?xxx??xxxx?" 使用一些漂亮的C++代码,可以使用它来运行

这似乎是一个奇怪的问题,但我想知道如何从内存“签名”运行.dll中的函数。我不太明白它到底是如何工作的,但我非常需要它。如果您知道.dll的内存签名和地址,它是从.dll中运行未报告函数的一种方法。 例如,我有:

respawn_f "_ZN9CCSPlayer12RoundRespawnEv"
respawn_sig "568BF18B06FF90B80400008B86E80D00"
respawn_mask "xxxxx?xxx??xxxx?"

使用一些漂亮的C++代码,可以使用它来运行.dll中的函数。 下面是一篇解释得很好的文章:


>,在Python中是否可以使用cType或其他任何方式?

< P>如果你已经用C++运行了它们,那么你可以尝试使用SWIG来为你编写的C++代码生成Python包装,使其可以从Python调用。

我在使用SWIG时发现了一些注意事项:

Swig根据字符串值查找类型。例如 Python中的整数类型(int)将确保 cpp类型为“int”,否则swig将投诉 关于类型不匹配。没有自动转换

Swig一字不差地复制源代码,因此甚至可以复制同一命名空间中的对象 需要完全限定,以便正确编译cxx文件


希望能有所帮助。

您说您试图调用一个未导出的函数;据我所知,这在Python中是不可能的。然而,您的问题似乎只是名称被损坏

您可以使用ctypes调用任意导出。由于名称已损坏,并且不是有效的Python标识符,因此可以使用getattr()

如果您有正确的信息,另一种方法是按序号查找导出,如果根本没有导出名称,就必须这样做。获取序号的一种方法是使用许多Windows编译语言中包含的dumpbin.exe。它实际上是链接器的前端,因此如果您有MS LinK.exe,也可以将其与相应的命令行开关一起使用

要获取函数引用(绑定到它的地址的“函数指针”对象),可以使用以下方法:

导入ctypes func=getattr(ctypes.windell.msvcrt,“@@myfunc”) retval=func(无)

当然,您会用您特别想要调用的dll替换“msvcrt”

我在这里没有展示的是如何分解名称以派生调用签名,从而得到必要的参数。这样做需要一个DeangRangle,而那些对于创建DLL的C++编译器的品牌和版本非常具体。 如果函数是stdcall,则会有一定数量的错误检查,因此有时您可以在正确处理之前对其进行处理。但如果函数是cdecl,则无法自动检查。同样,如果合适,您必须记住包含此参数的额外值