一、引言
下面是学习python灰帽子第六章Immunity Debugger部署硬钩子部分的学习笔记。
目前对Immunity Debugger软件使用不熟悉,为了深入探索软件的功能,所以下面的部分并没有严格按照书本的套路走,而是利用书本上代码的框架,完成对另一软件(realese后的printf_loop.exe)的硬钩子部署工作。
首先有必要说明一下系统环境和工具版本:
- win10教育版
- VS2012
- python v2.7.9
- Immunity Debugger v1.85
二、实现及过程
首先在VS2012上编译如下C++代码,生成printf_loop.exe。
# printf_loop.cpp
#include <iostream>
using namespace std;
int main()
{
int counter = 0;
while(1)
{
printf("Loop iteration %d:\n", counter);
_sleep(2*1000);//延时2秒
counter += 1;
}
return 0;
}
接下来对python灰帽子书上源代码进行修改,获取printf函数的入口和出口钩子。因为Immunity Debugger版本的不同,笔者发现书本上代码的一些方法名和实际Immunity Debugger库并不一致,存在一些方法名大小写不一致的问题。经过繁琐的查找和修改过程,初版的Pycommand代码如下(当然问题比较多,后面一步一步调试修改)。
# hippie_easy.py
# -*- coding: utf-8 -*-
import immlib
import immutils
# 搜索包含特定ret指令的基本块,
# 寻找函数中合适的挂钩点
def getRet(imm, printf_addr, max_opcodes = 300):
addr = printf_addr
for a