魔改python实现字节码hook

本文介绍了如何在Python 2.7.14源码中添加hook,通过修改`CALL_FUNCTION`指令来实现特定文件名函数调用的打印。在`eval.c`中插入C语言代码,用于检查并打印函数调用信息,包括参数和函数名。通过编译安装后的示例在Ubuntu环境下展示了效果,这种方法可用于Python的调试。
摘要由CSDN通过智能技术生成

下载python源码,2.7.14,python.org
修改字节码执行(添加hook),Python/eval.c,在TARGET(CALL_FUNCTION)处添加代码,在语句sp=stack_pointer之后添加如下c语言代码:
if(!strcmp(“easy_python.py”,PyString_AsString(co->co_filename))&&oparg>0)
{
printf("\n");
printf(“call from %s and arg num is %d”,PyString_AsString(co->co_name),oparg);
printf("\n");
int i=-1;
if(PyString_CheckExact(sp[i]))
{
printf(“arg0,str:”);
printf(PyString_AsString(sp[i]));
printf(" “);
}
else if (PyInt_Check(sp[i])) {
printf(“arg0,long:%ld “,PyInt_AS_LONG(sp[i]));
}
printf(”\n”);
int na = oparg & 0xff;
int nk = (oparg>>8) & 0xff;
int n = na + 2 * nk;
PyObject **pfunc = (sp) - n - 1;
PyObject *func = *pfunc;
if(func!=NULL&&!strcmp(“easy_python.py”,PyString_AsString(co->co_filename)))
{
if(PyObject_GetAttrString(func,“name”)!=NULL)
{
printf(“func name : %s”,PyString_AsString(PyObject_GetAttrString(func,“name”)));
printf(”\n");
}
}
}
解释:PyString_AsString把PyObject转为char数组,PyString_CheckExact检测对象是否为字符串对象,PyInt_AS_LONG把PyObject转为long类型,PyObject_GetAttrString以字符串作为属性名取PyObject属性,
编译安装见如下链接:https://www.cnblogs.com/ITer-jack/p/8305912.html
编译安装后,这里作为例子使用buu上的easy_python,所以文件名为easy_python.py,创建对应文件名脚本后,执行(ubuntu)可见如下效果:请添加图片描述
可以用这种方法写个调试器…但是我不会!!!这个可以通过猜测解出buu那题.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值