编程中的一些关键概念与技术解析
1. Python ctypes模块调用外部函数
Python的ctypes模块可用于调用DLL、.so等文件中的外部函数。在32位环境下,必须明确指定调用约定。ctypes导出了 *cdll*
,在Windows系统中还有 *windll*
和 *oledll*
对象,用于加载动态链接库。加载库的方式是将其作为这些对象的属性进行访问。
- *cdll*
:加载使用标准“cdecl”调用约定导出函数的库。
- *windll*
:加载使用“stdcall”调用约定调用函数的库。
实际上,我们可以修改ctypes模块(或其他调用代码),使其能成功调用外部的cdecl或stdcall函数,而无需知道具体是哪种调用约定,但需要指定参数数量。这可能可以通过调用者中的5 - 10条x86汇编指令来解决。
2. Cdecl调用约定示例:DLL替换
曾经有人想替换某个软件中的原始DLL文件。首先,列举出所有DLL导出的函数名,并在自己的替换DLL中为原始DLL中的每个函数创建一个对应的函数,例如:
void function1 ()
{
write_to_log ("function1() called\n");
};
由于时间紧迫,没有时间推导每个函数的参数数量和数据类型,所以替换DLL中的每个函数都没有参数。但由于所有函数都采用cdecl调用约定,所以