最近,我工作漏洞显示平台上,攻击是使用python实现的一部分。c语言实现的部分使用libcli库类似于telnet,并调用回调函数运行时的python模块。调用python c,让一个小demopython模块:def print_arg (str):打印strdef添加(a, b):打印=\u201Caprint ' b =\u201D, breturn + bclass Class_A: def __init__(自我):打印\u201Cinit\u201Ddef有趣(自我,str):打印'hello\u2019, strreturn strclass dedecms_get_webshell: def __init__(自我):\u201C\u201D\u201C自我。
定义了一个函数添加到传递多个参数。和一个函数返回值3。Class_A定义了一个类和方法有趣(传递参数。有一个返回值)4。dedecms_get_webshell定义了一个类和方法检查(传递多个参数,返回值是一个元组)以下使用c语言文件中调用该函数。主要测试功能:int (int命令行参数个数,char * argv[]){测试();test1 (); test2 (); test3 (); test4(),返回0;}分析一个接一个:\/ \/导出当前环境变量空白getcurrent () {PyRun_SimpleString(\u201C进口sys\u201D); PyRun_SimpleString (\u201C(\u201C。
返回;}1。最重要的一个调用方法空白测试(){Py_Initialize(); \/ \/初始化pythonPyRun_SimpleString(\u201C打印'hello python\u201D); \/ \/执行python代码直接Py_Finalize ();\/ \/释放python返回;}分析:直接执行python代码,您必须首先做初始化操作(Py_Initialize)当调用,和做清理工作后调用(Py_Finalize) 2。模块中调用一个普通函数void test1 () {Py_Initialize(); \/ \/初始化pythongetcurrent (); PyObject * pModule = NULL, * pFunc = NULL, * pArg =零;
\/ \/介绍模块pFunc = PyObject_GetAttrString (pModule print_arg \\/ \/调用获得的直接函数。并通过参数Py_Finalize ();\/ \/释放pythonreturn;}分析:首先引用模块(PyImport_ImportModule)。然后把函数(PyObject_GetAttrString)模块。类型转换的参数传递到python c (Py_BuildValue (\u201C(s)\u201D、\u201Chello_python\u201D))。最后,直接调用函数和传递的参数(PyEval_CallObject)。3.在模块中调用一个函数(多个参数,返回值)无效test2 () {Py_Initialize ();
PyObject * pModule = NULL, * pDict = NULL, * pFunc = NULL, * pArg = NULL, *结果=零;pModule = PyImport_ImportModule(\u201C演示\u201D);\/ \/引入模块pDict = PyModule_GetDict (pModule);\/ \/得到字典模块属性\/ \/它相当于__dict__ Python模块的属性对象模块的名字空间的字典对象pFunc = PyDict_GetItemString (pDict,\u201C添加\u201D);\/ \/得到字典功能属性pArg = Py_BuildValue(\u201C(我)\u201D、1、2);
\/ \/调用函数。并获得python的返回值类型int总和;PyArg_Parse(因此,\u201C我\u201D和);\/ \/ python类型的返回值转换为c \/ c++类型printf (\调用模块中的一个简单的类(单返回值)无效test3 () {Py_Initialize (); getcurrent (); PyObject * pModule = NULL, * pDict = NULL, * pClass = NULL, * pInstance = NULL, *结果=零;pModule = PyImport_ImportModule(\u201C演示\u201D);\/ \/引入模块pDict = PyModule_GetDict (pModule);
\/ \/通过字典属性模块中的类pInstance = PyInstance_New (pClass, NULL, NULL); \/ \/实例化类获得的结果= PyObject_CallMethod (pInstance,\u201C有趣\u201D,\u201C(s)\u201D、\u201Cpython_000\u201D);\/ \/调用该方法的类char *名称=零;PyArg_Parse (\u201Cs\u201D,结果就是,名字);\/ \/ python类型的返回值转换为c \/ c++类型printf (\调用模块中的一个简单的类(返回值是一个元组)无效test4 () {Py_Initialize ();
PyObject * pModule = NULL, * pDict = NULL, * pClass = NULL, * pInstance = NULL, *结果=零;pModule = PyImport_ImportModule(\u201C演示\u201D);\/ \/引入模块pDict = PyModule_GetDict (pModule);\/ \/得到字典模块属性pClass = PyDict_GetItemString (pDict dedecms_get_webshell);\/ \/获取类的模块通过字典属性pInstance = PyInstance_New (pClass,空,空);
佩克测试不同的python版本号。使用等,图书馆的路径是指安装的路径。我打算开始写更多的东西,但最后匆忙。