Python取证技术(1):环境搭建和ctype库介绍

环境配置

安装虚拟沙盒virtualenv

pip install virtualenv

创建一个虚拟沙盒,也就是python的独立开发环境,类似于VMWare里虚拟机的操作系统一样,对外界不会产生任何影响。

root@kali:~# virtualenv KenEnv
New python executable in KenEnv/bin/python
Installing setuptools, pip, wheel...done.

创建成功后,会在当前目录建立一个专属于该python独立开发环境的目录。该目录包含了可执行python文件和pip库的复件。可用于在python独立开发环境安装其他packages。该环境的名称可以随便指定。在这里的名字是KenEnv。命令提示符

要让它开始工作,首先我们进入该目录,激活它

root@kali:~# cd KenEnv/
root@kali:~/KenEnv# source ./bin/activate
(KenEnv)root@kali:~/KenEnv# 

激活成功后,命令提示符前面会带上环境名称的前缀。

如果想回到正常的shell环境,命令提示符前面的前缀也会去掉。

(KenEnv)root@kali:~/KenEnv# deactivate 
root@kali:~/KenEnv# 

ctype使用

ctype是python的一个外部库,提供了兼容C的数据类型和可以调用dll和共享库的函数。这意味着只用python代码就可以调用C语言的函数。ctype可以说是在python的库中最强大的库之一。
更详细的内容点官方文档

调用dll

标准C函数


>>> from ctypes import *
>>> libc = cdll.msvcrt
>>> print libc.time(None)
1453083296

msvcrt是微软的标准C库,包含了很多标准c函数和使用cdecl调用。类似于Linux系统的libc。
注意上述语句在linux运行会报错,因为在Linux并不存在msvcrt文件。

Linux 动态链接库so

Linux调用动态链接库(即so文件)需要提供完整的文件名。使用CDLL不是cdll,这两个函数是不同的,一个用于windows,一个用于linux。

>>> from ctypes import *
>>> libc = CDLL("libc.so.6")
>>> print libc.time(None)
1453083296

Windows dll

在windows环境下,还可以调用windows的dll导出函数,kernel32.dll、user32.dll等等。使用标准call约定。

>>> from ctypes import *
>>> hex(windll.kernel32.GetModuleHandleA(None))
   '0x1c7a0000'                                   

从上面这些例子可以看到,ctype库可以很容易的调用这些dll导出的函数。

ctype数据类型

所有的python类型除了整型、字符串和unicode字符串以外。其他的类型都需要转换成在ctype中相应的类型,不然就会抛出类型异常。

ctypes type C type Python type
c_bool _Bool bool (1)
c_char char 1-character string
c_wchar wchar_t 1-character unicode string
c_byte char int/long
c_ubyte unsigned char int/long
c_short short int/long
c_ushort unsigned short int/long
c_int int int/long
c_uint unsigned int int/long
c_long long int/long
c_ulong unsigned long int/long
c_longlong __int64 or long long int/long
c_ulonglong unsigned __int64 or unsigned long long int/long
c_float float float
c_double double float
c_longdouble long double float
c_char_p char * (NUL terminated) string or None
c_wchar_p wchar_t * (NUL terminated) unicode or None
c_void_p void * int/long or None

下面我举一个例子:

>>> printf = cdll.msvcrt.printf                                                                              
>>> printf("整型:%d,浮点型:%f",1,1.0)                                                                             
Traceback (most recent call last):                                                                           
  File "<stdin>", line 1, in <module>                                                                     
ctypes.ArgumentError: argument 3: <type 'exceptions.TypeError'>: Don't know how to convert parameter 3       

第三个参数抛出异常,原因是不知道该参数应该转换成什么类型。

>>> printf("整型:%d,浮点型:%f",1,c_double(1.0))  
整型:1,浮点型:1.00000022                         

将第三个参数转换成ctype中相对应的类型c_double时不再抛出异常。

更多用法请参考官方文档。

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 环境配置
    1. 1.1. 安装虚拟沙盒virtualenv
    2. 1.2. ctype使用
      1. 1.2.1. 调用dll
        1. 1.2.1.1. 标准C函数
        2. 1.2.1.2. Linux 动态链接库so
        3. 1.2.1.3. Windows dll
      2. 1.2.2. ctype数据类型
,