这似乎是个奇怪的问题,但我想知道如何从内存“签名”运行.dll中的函数。我不太了解它的实际工作原理,但我非常需要它。它是一种从.dll中运行未报告函数的方法,如果您知道它的内存签名和地址。 例如,我有这些:
respawn_f "_ZN9CCSPlayer12RoundRespawnEv"
respawn_sig "568BF18B06FF90B80400008B86E80D00"
respawn_mask "xxxxx?xxx??xxxx?"
使用一些漂亮的C++代码,可以使用它来运行.dll中的函数。在
下面是一篇解释得很好的文章: http://wiki.alliedmods.net/Signature_Scanning
那么,是否可以在python中使用Ctypes或其他任何方法来实现这一点呢?在
您说过您试图调用一个未导出的函数;据我所知,这在Python中是不可能的。然而,你的问题似乎仅仅是名字被弄错了。在
可以使用ctypes调用任意导出。由于名称已损坏,并且不是有效的Python标识符,因此可以使用getattr()。在
如果有正确的信息,另一种方法是按序号查找导出,如果根本没有导出名称,则必须这样做。获得序数的一种方法是使用垃圾箱.exe,包含在许多Windows编译语言中。它实际上是链接器的前端,所以如果你有MS链接.exe,也可以将其与适当的命令行开关一起使用。在
要获取函数引用(它是一个绑定到它的地址的“函数指针”对象),可以使用如下方法:
导入ctypes func=获取属性(ctypes.windll.msvcrt,“@@myfunc”) retval=func(无)
当然,您可以将“msvcrt”替换为您特别想要调用的dll。在
我在这里没有展示的是如何解开名称以派生调用签名,从而得到必要的参数。这样做需要一个DeangRangle,而这些对DLL创建的C++编译器的版本和版本非常特殊。在
如果函数是stdcall,则会进行一定量的错误检查,因此有时您可以对某些事情进行修改,直到正确为止。但是如果函数是cdecl,那么就没有办法自动检查。同样,如果合适的话,您必须记住包含额外的this参数。在
如果你已经可以用C++运行它们,那么你可以尝试使用SWIG来为你编写的C++代码生成Python包装,使其可以从Python调用。在
http://www.swig.org/
我在使用SWIG时发现了一些注意事项:
Swig基于字符串值查找类型。例如 Python(int)中的整数类型将确保 cpp类型为“int”,否则swig将投诉 关于类型不匹配。没有自动转换。在
Swig逐字复制源代码,因此甚至复制同一命名空间中的对象 将需要完全限定,这样cxx文件才能正确编译。在
希望有帮助。在
相关问题 更多 >
编程相关推荐