ctypes是Python语言的一个外部库,提供和C语言兼容的数据类型,可以很方便的调用C DLL中的函数。

操作环境:CentOS6.5

Python版本:2.66


 

第一章 搭建开发环境

1.3.2 使用动态链接库

1
2
3
4
from ctypes import *
libc = CDLL("libc.so.6")
message_string = "Hello world!\n"
libc.printf("Testing:%s",message_string)
1
2
[root@evilxr python_test]# python huimao.py
Testing:Hello world!

1.3.3 构造C数据类型

  使用Python创建一个C数据类型很简单,你可以很容易的使用由C或者C++些的组件。下面显示了三者之间的对于关系。

  

1.3.5 定义结构体和联合

1
2
3
4
5
6
7
8
9
10
11
12
13
from ctypes import *
 
class barley_amount(Union):
    _fields_ = [
    ("barley_long", c_long),
    ("barley_init", c_int),
    ("barley_char", c_char*8), 
    ]
value = raw_input("Enter the amount of barey to put into the beer vat:")
my_barley = barley_amount(int(value))
print "Barley amount as a long:%ld"% my_barley.barley_long
print "Barley amount as an int:%d" % my_barley.barley_long
print"Barley amount as a char:%s" % my_barley.barley_char

 结果:

1
2
3
4
5
[root@evilxr huimao]# python 1.py
Enter the amount of barey to put into the beer vat:67
Barley amount as a long:67
Barley amount as an int:67
Barley amount as a char:C

  其中67是C的ASCII码。

第二章 调试器设计

  a.黑盒测试与白盒测试

1
许多的开发平台都会包含一个自带的调试器,允许开发工具结合源代码对程序进行精确的跟踪测试。这就是白盒调试。当我们很难得到源代码的时候,开发者,逆向工程师,Hacker就会应用黑盒调试跟踪目标程序。黑盒调试中,被测试的软件对黑客来说是不透明的,唯一能看到的就是反汇编代码。这时候要分析出程序的运作流程,找出程序的错误将变得更复杂,花费的时间也会更多。但是高超的逆向技术集合优秀的逆向工具将使这个过程变得简单,轻松,有时候善于此道的黑客,甚至比开发者更了解软件:)。

  b.黑盒测试的两种模式

1
用户模式 和 内核模式。用户模式(通常指的是ring3级的程序)是你平时运行用户程序的一般模式(普通的程序)。用户模式的权限是最低的。当你运行“运算器(cacl.exe)[Windows]、bc[Linux]”的时候,就会产生一个用户级别的进程;对这个进程的调试就是用户模式调试。核心模式的权限是最高的。这里运行着操作系统内核,驱动程序,底层组件。当运行Wireshark嗅探数据包的时候,就是和一个工作在内核的网络驱动交互。如果你想暂停驱动或者检测驱动状态,就需要使用支持内核模式的调试器了。

  c.PyDbg和Immunity

1
PyDbg (byPedram Amini)和Immunity Debugger (from Immunity, Inc.)。PyDbg 是一个纯Python实现的调试器,让黑客能够用Python语言全面的控制一个进程,实现自动化调试。Immunity调试器则是一个会让你眼前一亮的调试器,界面相当的友好,类似OllyDbg,但是拥有更强大的功能以及更多的Python调试库。这两个调试器在本书的后面章节将会详细的介绍。现在先让我们深入了解调试器的一般原理。

2.1通用CPU寄存 

2.2 栈

在开发调试器的时候,栈是一个非常重要的结构。栈存储了与函数调用相关的各种信息,包括函数的参数和函数执行完成后返回的方法。ESP负责跟踪栈顶,EBP负责跟踪栈底。栈从内存的高地址像低地址增长。
调试器对堆栈结构的捕捉能力是相当有用的,特别是在我们捕捉程序崩溃,跟踪调查基于栈的缓冲区溢出的时候。

2.3 调试事件

  调试器在调试程序的时候会一直循环等待,直到检测到一个调试事件的发生。当调试事件发生的时候,就会调用一个与之对应的事件处理函数。处理函数被调用的时候,调试器会暂停程序等待下一步的指示。

  以下的这些事件是一个调试器必须能够捕捉到的(也叫做陷入):

2.4断点

  当我们需要让被调试程序暂停的时候就需要用到断点。通过暂停进程,我们能观察变量,堆栈参数以及内存数据,并且记录他们。断点有非常多的好处,当你调试进程的时候这些功能会让你觉得很舒爽。断点主要分成三种:软件断点,硬件断点,内存断点。他们有非常相似的工作方式,但实现的手段却各不相同。