Python灰帽子 黑客与逆向工程(ctype库)

1.动态链接库

动态链接库文件是一种不可执行的二进制程序文件,它允许程序共享执行特殊任务所必需的代码和其他资源。在windows平台下这些二进制文件必称为动态链接库(DLL),常是".dll"文件;而在linux平台下必称为共享对象(SO),常是 ".so" 文件。windows提供的DLL文件中包含了允许基于windows的程序在windows环境下操作的许多函数和资源。一般存放在电脑的"C:\Windows\System32" 目录下。

它们向运行于windows操作系统下的程序提供代码、数据或函数。程序可根据 DLL 文件中的指令打开、启用、查询、禁用和关闭驱动程序。

2.ctype库

ctype库使我们能够调用动态链接库中的导出函数,也能通过ctype库构建复杂的c数据类型,并编写出具备低层内存操作能力的工具函数。ctype库赋予我们类似c语言一样的底层操作能力,同时却又保持了动态语言便捷的本性。

​ctype库提供了三种不同的动态链接库加载方式:cdll(),windll(), oledll()。编写动态链接库,使用C/C++是最常见的方式,所以ctype库常用于Python与C/C++混合编程之中。

ctype通过类型映射的方式把Python和二进制动态链接库相连接, Python的数据类型会经过包装成为C类型,从而作为函数的调用参数,而函数的返回值也会经过一系列的包装成为Python类型。

函数调用约定描述了如何以正确的方式调用某些特定类型的函数。最基本的两种约定:cdecl和stdcall。cdecl调用约定规定函数的参数列表以从右向左的顺序入栈,并且由函数的调用者负责清除栈上的参数。

stdcall入栈顺序和前者一模一样,区别在于由被调用者本身在函数返回前自行负责清除。

3.基本数据类型转换关系

Python灰帽子 黑客与逆向工程(ctype库)_第1张图片

4.结构体和联合体

一个结构体本质上是一组相同或者不同类型的变量。

下面给出了几个例子:


在C中

//使用C定义结构体 
struct beer_recipe
{
	int amt_barley;
	int amt_water;
};
//使用C定义联合体
union{
	long barley_long;
	int barley_int;
	char barley_char[8];
}barley_amount; 
在python中
from ctypes import *

# 使用python定义结构体
class beer_recipe(Structure):
    _fields_ = [
        ("amt_barley", c_int),
        ("amt_water", c_int),
    ]

# 使用python定义联合体,与结构体不同的是,联合体中包含的所有成员变量共享同一个内存地址
class barley_amount(Union):
    _fields_ = [
        ("barley_long", c_long),
        ("barley_int", c_int),
        ("barley_char", c_char * 8),
    ]
value = input("输入小麦的数量:")
my_barley = barley_amount(int(value))
print("int : %d" % my_barley.barley_int)

你可能感兴趣的:(书籍)