// -*- coding: utf-8 -*- //+---------------------------------------------------------------------------+ //| 01001110 01100101 01110100 01111010 01101111 01100010 | //| | //| Netzob : Inferring communication protocols | //+---------------------------------------------------------------------------+ //| Copyright (C) 2011-2017 Georges Bossert and Frédéric Guihéry | //| This program is free software: you can redistribute it and/or modify | //| it under the terms of the GNU General Public License as published by | //| the Free Software Foundation, either version 3 of the License, or | //| (at your option) any later version. | //| | //| This program is distributed in the hope that it will be useful, | //| but WITHOUT ANY WARRANTY; without even the implied warranty of | //| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | //| GNU General Public License for more details. | //| | //| You should have received a copy of the GNU General Public License | //| along with this program. If not, see . | //+---------------------------------------------------------------------------+ //| @url : http://www.netzob.org | //| @contact : contact@netzob.org | //| @sponsors : Amossys, http://www.amossys.fr | //| Supélec, http://www.rennes.supelec.fr/ren/rd/cidre/ | //+---------------------------------------------------------------------------+ //Compilation Windows //cl -Fe_libInterface.pyd -Ox -Ot -openmp -LD /I"C:\Python26\include" /I"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include" libInterface.c "C:\Python26\libs\python26.lib" "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\vcomp.lib" //+---------------------------------------------------------------------------+ //| Import Associated Header //+---------------------------------------------------------------------------+ #include "libInterface.h" #ifdef _WIN32 #include #include #endif // The Python callback PyObject *python_callback; PyObject *python_callback_isFinish; unsigned int deserializeSymbols(PyObject *symbols, Bool debugMode); PyObject* py_deserializeSymbols(PyObject* self, PyObject* args); static PyMethodDef libInterface_methods[] = { {"getBID", py_getBID, METH_NOARGS, NULL}, {"deserializeMessages", py_deserializeMessages, METH_VARARGS, NULL}, {"deserializeGroups", py_deserializeGroups, METH_VARARGS, NULL}, {"deserializeSymbols",py_deserializeSymbols, METH_VARARGS, NULL}, {NULL, NULL, 0, NULL} }; //+---------------------------------------------------------------------------+ //| initlibInterface : Python will use this function to init the module //+---------------------------------------------------------------------------+ PyObject* PyInit__libInterface(void) { static struct PyModuleDef moduledef = { PyModuleDef_HEAD_INIT, "_libInterface", NULL, -1, libInterface_methods, NULL, NULL, NULL, NULL }; return PyModule_Create(&moduledef); } int callbackIsFinish(void) { if (python_callback_isFinish != NULL) { int isFinish; PyObject *result_cb; result_cb = PyObject_CallObject(python_callback_isFinish, NULL); if (result_cb == NULL) { return -1; } if (result_cb == Py_True) { isFinish = 1; } else if (result_cb == Py_False) { isFinish = 0; } else { isFinish = -1; } Py_DECREF(result_cb); return isFinish; } return -1; } //+---------------------------------------------------------------------------+ //| callbackStatus : displays the status or call python wrapper is available //+---------------------------------------------------------------------------+ int callbackStatus(int stage, double percent, char* message, ...) { // Variadic member va_list args; // local variables PyObject *arglist_cb; PyObject *result_cb; char buffer[4096]; va_start(args, message); vsnprintf(buffer, sizeof(buffer), message, args); va_end(args); buffer[4095] = '\0'; if (python_callback != NULL) { arglist_cb = Py_BuildValue("(i,d,s)", stage, percent, buffer); result_cb = PyObject_CallObject(python_callback, arglist_cb); Py_DECREF(arglist_cb); if (result_cb == NULL) { return -1; } Py_DECREF(result_cb); return 1; } else { printf("[%f] %s\n", percent, buffer); return 1; } return 0; } //+---------------------------------------------------------------------------+ //| py_deserializeMessages : Python wrapper for deserializeMessages //+---------------------------------------------------------------------------+ PyObject* py_deserializeMessages(__attribute__((unused))PyObject* self, PyObject* args) { unsigned int nbMessages = (unsigned int) PyObject_Size(args); char *format; int sizeFormat; unsigned char *serialMessages; int sizeSerialMessages; unsigned int debugMode = 0; unsigned int nbDeserializedMessage = 0; t_group group_result; // Converts the arguments if (!PyArg_ParseTuple(args, "hss#h", &nbMessages, &format, &sizeFormat, &serialMessages, &sizeSerialMessages, &debugMode)) { printf("Error while parsing the arguments provided to py_deserializeMessages\n"); return NULL; } // Deserializes the provided arguments if (debugMode == 1) { printf("py_alignSequences : Deserialization of the arguments (format, serialMessages).\n"); } group_result.len = nbMessages; group_result.messages = malloc(nbMessages*sizeof(t_message)); nbDeserializedMessage = deserializeMessages(&group_result, format, serialMessages, nbMessages, debugMode); if (nbDeserializedMessage != nbMessages) { printf("Error : impossible to deserialize all the provided messages.\n"); return NULL; } // cleaning a bit free(group_result.messages); if(debugMode == 1) { printf("All the provided messages were deserialized (%d).\n", nbDeserializedMessage); } // return the number of deserialized messages return Py_BuildValue("i", nbDeserializedMessage); } //+---------------------------------------------------------------------------+ //| py_deserializeGroups : Python wrapper for deserializeGroups //+---------------------------------------------------------------------------+ PyObject* py_deserializeGroups(__attribute__((unused))PyObject* self, PyObject* args) { unsigned int nbGroups = 0; char *format; int sizeFormat; unsigned char *serialGroups; int sizeSerialGroups; unsigned int debugMode = 0; unsigned int nbDeserializedGroup = 0; t_groups groups_result; // Get the number of group (need python>=2.5) if(PyObject_Size(args) == -1) { printf("The argument has no length"); return NULL; } else { nbGroups = (unsigned int) PyObject_Size(args); } // Converts the arguments if (!PyArg_ParseTuple(args, "hss#h", &nbGroups, &format, &sizeFormat, &serialGroups, &sizeSerialGroups, &debugMode)) { printf("Error while parsing the arguments provided to py_deserializeGroups\n"); return NULL; } // Deserializes the provided arguments if (debugMode == 1) { printf("py_deserializeGroups : Deserialization of the arguments (format, serialGroups).\n"); } groups_result.len = nbGroups; groups_result.groups = malloc(nbGroups*sizeof(t_group)); nbDeserializedGroup = deserializeGroups(&groups_result, format, serialGroups, nbGroups, debugMode); // deserializeSymbols(&groups_result, args, debugMode); if (nbDeserializedGroup != nbGroups) { printf("Error : impossible to deserialize all the provided groups, %d/%d were effectly parsed.\n", nbDeserializedGroup, nbGroups); return NULL; } // cleaning a bit free(groups_result.groups); if(debugMode == 1) { printf("All the provided groups were deserialized (%d).\n", nbDeserializedGroup); } // return the number of deserialized groups return Py_BuildValue("i", nbDeserializedGroup); } /******************************************************************** * deserializeSymbols: * push list of symbols in the groups * *********************************************************************/ PyObject * py_deserializeSymbols(__attribute__((unused))PyObject* self, PyObject* args) { deserializeSymbols(args,0); return Py_BuildValue("i", 1); } unsigned int deserializeSymbols(PyObject *args, Bool debugMode) { PyObject *symbols = PyTuple_GetItem(args, 0); int nbGroups = PyObject_Size(symbols); int nbScore = 0; float tempScore = 0; if (nbGroups == -1) return 0; int i_group = 0; int j_group = 0; PyObject *current_symbol = NULL; PyObject *scoresList = NULL; PyObject *current_position = NULL; printf("IN\n"); if (!PyList_Check(symbols)) { printf("The format of the list of symbols given is not a list"); return 0; } else { if(debugMode == 1) { printf("Size %d\n",nbGroups); printf("InElse\n"); } for (i_group = 0; i_group