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

2024-09-30 14:18:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

使用一些漂亮的C++代码,可以使用它来运行.dll中的函数。在

下面是一篇解释得很好的文章: http://wiki.alliedmods.net/Signature_Scanning

那么,是否可以在python中使用Ctypes或其他任何方法来实现这一点呢?在


Tags: 方法函数内存代码地址报告maskxxx
2条回答

您说过您试图调用一个未导出的函数;据我所知,这在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文件才能正确编译。在

希望有帮助。在

相关问题 更多 >