使用python运行未报告的.dll函数
这似乎是一个奇怪的问题,但我想知道如何从内存“签名”运行.dll中的函数。我不太明白它到底是如何工作的,但我非常需要它。如果您知道.dll的内存签名和地址,它是从.dll中运行未报告函数的一种方法。 例如,我有:使用python运行未报告的.dll函数,python,memory,ctypes,Python,Memory,Ctypes,这似乎是一个奇怪的问题,但我想知道如何从内存“签名”运行.dll中的函数。我不太明白它到底是如何工作的,但我非常需要它。如果您知道.dll的内存签名和地址,它是从.dll中运行未报告函数的一种方法。 例如,我有: respawn_f "_ZN9CCSPlayer12RoundRespawnEv" respawn_sig "568BF18B06FF90B80400008B86E80D00" respawn_mask "xxxxx?xxx??xxxx?" 使用一些漂亮的C++代码,可以使用它来运行
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,则无法自动检查。同样,如果合适,您必须记住包含此参数的额外值