IDA插件C++调用Python模块
背景
不科普,具体问题参考http://www.hexblog.com/?p=788
实现
基础工作
blog中写的比较清楚
使用
PyGILState_STATE state = PyGILState_Ensure();
RunPyCode(cmd);
PyGILState_Release(state);
主要是PyGILState_Ensure和PyGILState_Release两个函数,与普通的C++调用Python方法不一样。当然还需要init,
if (!Py_IsInitialized())
Py_InitializeEx(0 /* Don't catch SIGPIPE, SIGXFZ, SIGXFSZ & SIGINT signals */);
init在插件的init函数中添加,运行py代码在run函数或者插件代码的任何位置添加都行。
加载模块
能够调用py代码,自然需要调用py模块,标准写法如下
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
PyObject *pName,*pModule,*pDict,*pFunc,*pArgs;
pName = PyString_FromString("module_name");
pModule = PyImport_Import(pName);
if (!pModule) {
msg("can't find analysis.py\n");
}
但是运行时py脚本到底应该放在哪呢?
经测,如上写法需要放在被测程序所在目录中。
实际上只需要把文件路径添加在sys.path中就行了,然而在写的时候忽略了转义,实际非常简单。。。
so much