c语言调用python变量_使用c语言调用python小结

最近,我工作漏洞显示平台上,攻击是使用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版本号。使用等,图书馆的路径是指安装的路径。我打算开始写更多的东西,但最后匆忙。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值