{"id":23702984,"url":"https://github.com/revengai/creait","last_synced_at":"2025-09-03T08:32:08.948Z","repository":{"id":249776151,"uuid":"832242777","full_name":"RevEngAI/creait","owner":"RevEngAI","description":"RevEng.AI Toolkit in C","archived":false,"fork":false,"pushed_at":"2024-12-16T09:44:45.000Z","size":2886,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2024-12-16T10:32:20.558Z","etag":null,"topics":["ai","binary-analysis","reverse-engineering"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RevEngAI.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-22T15:55:54.000Z","updated_at":"2024-10-08T06:36:02.000Z","dependencies_parsed_at":"2024-08-19T02:28:17.000Z","dependency_job_id":"a7013a32-62a5-4c3d-af2c-c66afac6148b","html_url":"https://github.com/RevEngAI/creait","commit_stats":null,"previous_names":["revengai/creait"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RevEngAI%2Fcreait","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RevEngAI%2Fcreait/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RevEngAI%2Fcreait/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RevEngAI%2Fcreait/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RevEngAI","download_url":"https://codeload.github.com/RevEngAI/creait/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":231861252,"owners_count":18437345,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","binary-analysis","reverse-engineering"],"created_at":"2024-12-30T13:00:23.692Z","updated_at":"2025-09-03T08:32:08.930Z","avatar_url":"https://github.com/RevEngAI.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# C RevEngAI Toolkit (creait)\n\n`creait` is a C library for interacting with the RevEngAI API. It provides a set of functions to perform binary analysis, decompilation, and function identification using RevEngAI's machine learning models.\n\n## Features\n\n- Binary analysis with AI-powered models\n- Function identification and annotation\n- AI-assisted decompilation\n- Binary similarity search\n- Collection management\n- Function renaming and annotation\n\n## Installation\n\n### Prerequisites\n\nBefore building, ensure you have the following dependencies installed:\n\n- libcurl (development package)\n- git\n- cmake\n- make or ninja\n- pkg-config\n\n#### On macOS:\n```sh\nbrew install cmake ninja curl pkg-config\n```\n\n#### On Ubuntu/Debian:\n```sh\nsudo apt install libcurl4-openssl-dev git cmake ninja-build pkg-config\n```\n\n#### On Windows:\n- Install Visual Studio with C/C++ development tools\n- Install Git from the official website\n- Install Python and then run `pip install meson`\n- Install pkg-config: `choco install pkgconfiglite` (requires Chocolatey)\n\n### Building and Installing\n\n```sh\n# Clone this repo and cd into it\ngit clone git@github.com:RevEngAI/creait.git \u0026\u0026 cd creait\n\n# Configure the build using ninja\ncmake -B Build -G Ninja\n\n# Build and install creait\nninja -C Build \u0026\u0026 sudo ninja -C Build install\n```\n\n## Configuration System\n\nThe library includes a simple configuration system that allows users to store and retrieve key-value pairs. Configuration files use a simple format with one key-value pair per line, separated by an equals sign (`=`).\n\n### Configuration File Format\n\n```\napi_key = your_api_key_here\nhost = https://api.reveng.ai\ntimeout = 30\ndebug = true\n```\n\nEach line contains a key-value pair in the format `key = value`. Whitespace around keys and values is automatically trimmed.\n\n### Default Configuration Location\n\nThe default configuration file is located at:\n- Windows: `%USERPROFILE%\\.creait`\n- macOS/Linux: `$HOME/.creait`\n\n### Using the Configuration System\n\n```c\n#include \u003cReai/Config.h\u003e\n\nint main() {\n    // Read configuration from the default location\n    Config config = ConfigRead(NULL);\n    \n    // Or read from a specific path\n    // Config config = ConfigRead(\"/path/to/config.ini\");\n    \n    // Get a value from the configuration\n    Str* api_key = ConfigGet(\u0026config, \"api_key\");\n    if (api_key) {\n        printf(\"API Key: %s\\n\", api_key-\u003edata);\n    } else {\n        printf(\"API Key not found in config\\n\");\n    }\n    \n    // Add or update a configuration value\n    ConfigAdd(\u0026config, \"new_key\", \"new_value\");\n    \n    // Write the configuration back to a file\n    ConfigWrite(\u0026config, NULL);  // Write to default location\n    // Or write to a specific path\n    // ConfigWrite(\u0026config, \"/path/to/config.ini\");\n    \n    // Clean up\n    ConfigDeinit(\u0026config);\n    \n    return 0;\n}\n```\n\n### Integration with API Functions\n\nYou can use the configuration system to store your API key and host information:\n\n```c\n#include \u003cReai/Api.h\u003e\n#include \u003cReai/Config.h\u003e\n\nint main() {\n    // Read configuration\n    Config config = ConfigRead(NULL);\n    \n    // Initialize connection\n    Connection conn = ConnectionInit();\n    \n    // Set API key and host from config\n    Str* api_key = ConfigGet(\u0026config, \"api_key\");\n    Str* host = ConfigGet(\u0026config, \"host\");\n    \n    if (api_key \u0026\u0026 host) {\n        StrInitCopy(\u0026conn.api_key, api_key);\n        StrInitCopy(\u0026conn.host, host);\n        \n        // Authenticate\n        if (Authenticate(\u0026conn)) {\n            printf(\"Authentication successful\\n\");\n            // Proceed with API calls\n        } else {\n            printf(\"Authentication failed\\n\");\n        }\n    } else {\n        printf(\"API key or host not found in config\\n\");\n    }\n    \n    // Clean up\n    ConfigDeinit(\u0026config);\n    StrDeinit(\u0026conn.api_key);\n    StrDeinit(\u0026conn.host);\n    \n    return 0;\n}\n```\n\n## Working with Request Objects\n\nThe library provides convenient macros for initializing and cleaning up request objects. Always use these macros to ensure proper memory management.\n\n### Initializing Request Objects\n\n```c\n// Initialize a new analysis request with default values\nNewAnalysisRequest request = NewAnalysisRequestInit();\n\n// Initialize a search request with default values\nSearchBinaryRequest search_req = SearchBinaryRequestInit();\n\n// Initialize a similar functions request\nSimilarFunctionsRequest similar_req = SimilarFunctionsRequestInit();\n```\n\n### Cleaning Up Request Objects\n\n```c\n// Clean up a new analysis request\nNewAnalysisRequestDeinit(\u0026request);\n\n// Clean up a search request\nSearchBinaryRequestDeinit(\u0026search_req);\n\n// Clean up a similar functions request\nSimilarFunctionsRequestDeinit(\u0026similar_req);\n```\n\n## Status Handling\n\nThe library uses a unified status system for tracking the state of analyses, decompilations, and other operations. Status values include a type flag to indicate their source.\n\n### Status Types\n\n- `ANALYSIS_STATUS`: Status related to binary analysis\n- `DYN_EXEC_STATUS`: Status related to dynamic execution\n- `AI_DECOMP_STATUS`: Status related to AI decompilation\n\n### Common Status Values\n\n- `STATUS_QUEUED`: Operation is queued\n- `STATUS_PROCESSING` / `STATUS_RUNNING` / `STATUS_PENDING`: Operation is in progress\n- `STATUS_COMPLETE` / `STATUS_SUCCESS`: Operation completed successfully\n- `STATUS_ERROR`: Operation failed\n- `STATUS_UPLOADED`: Binary was uploaded but not yet processed\n\n### Converting Between Status and String\n\n```c\n#include \u003cReai/Api.h\u003e\n#include \u003cReai/Api/Types/Status.h\u003e\n\n// Convert status to string\nStatus status = GetAnalysisStatus(\u0026conn, binary_id);\nStr status_str = StrInit();\nStatusToStr(status, \u0026status_str);\nprintf(\"Status: %s\\n\", status_str.data);\nStrDeinit(\u0026status_str);\n\n// Convert string to status\nStr status_str = StrInit();\nStrPrintf(\u0026status_str, \"Complete\");\nStatus status = StatusFromStr(\u0026status_str);\n// Use STATUS_MASK to get the base status without flags\nif ((status \u0026 STATUS_MASK) == STATUS_COMPLETE) {\n    printf(\"Analysis is complete\\n\");\n}\nStrDeinit(\u0026status_str);\n```\n\n## Usage Examples\n\n### Authentication\n\nBefore using the API, you need to authenticate with your API key:\n\n```c\n#include \u003cReai/Api.h\u003e\n\nint main() {\n    // Initialize connection\n    Connection conn = ConnectionInit();\n    \n    // Set API key and host\n    StrPrintf(\u0026conn.api_key, \"your_api_key_here\");\n    StrPrintf(\u0026conn.host, \"https://api.reveng.ai\");\n    \n    // Authenticate\n    if (!Authenticate(\u0026conn)) {\n        printf(\"Authentication failed\\n\");\n        return 1;\n    }\n    \n    printf(\"Authentication successful\\n\");\n    \n    // Clean up\n    StrDeinit(\u0026conn.api_key);\n    StrDeinit(\u0026conn.host);\n    \n    return 0;\n}\n```\n\n### Uploading a Binary File\n\n```c\n#include \u003cReai/Api.h\u003e\n\nint main() {\n    Connection conn = ConnectionInit();\n    StrPrintf(\u0026conn.api_key, \"your_api_key_here\");\n    StrPrintf(\u0026conn.host, \"https://api.reveng.ai\");\n    \n    // Authenticate\n    if (!Authenticate(\u0026conn)) {\n        printf(\"Authentication failed\\n\");\n        return 1;\n    }\n    \n    // Upload a binary file\n    Str file_path = StrInit();\n    StrPrintf(\u0026file_path, \"/path/to/your/binary\");\n    \n    Str sha256 = UploadFile(\u0026conn, file_path);\n    if (sha256.length == 0) {\n        printf(\"File upload failed\\n\");\n        StrDeinit(\u0026file_path);\n        return 1;\n    }\n    \n    printf(\"File uploaded successfully. SHA256: %s\\n\", sha256.data);\n    \n    // Clean up\n    StrDeinit(\u0026file_path);\n    StrDeinit(\u0026sha256);\n    StrDeinit(\u0026conn.api_key);\n    StrDeinit(\u0026conn.host);\n    \n    return 0;\n}\n```\n\n### Creating a New Analysis\n\n```c\n#include \u003cReai/Api.h\u003e\n\nint main() {\n    Connection conn = ConnectionInit();\n    StrPrintf(\u0026conn.api_key, \"your_api_key_here\");\n    StrPrintf(\u0026conn.host, \"https://api.reveng.ai\");\n    \n    // Authenticate\n    if (!Authenticate(\u0026conn)) {\n        printf(\"Authentication failed\\n\");\n        return 1;\n    }\n    \n    // Upload a binary file\n    Str file_path = StrInit();\n    StrPrintf(\u0026file_path, \"/path/to/your/binary\");\n    \n    Str sha256 = UploadFile(\u0026conn, file_path);\n    if (sha256.length == 0) {\n        printf(\"File upload failed\\n\");\n        return 1;\n    }\n    \n    // Create a new analysis request using the initialization macro\n    NewAnalysisRequest request = NewAnalysisRequestInit();\n    \n    // Set model name\n    StrPrintf(\u0026request.ai_model, \"binnet-v1\");\n    \n    // Set file options\n    request.file_opt = FILE_OPTION_AUTO;\n    \n    // Set file details\n    StrPrintf(\u0026request.file_name, \"example_binary\");\n    StrPrintf(\u0026request.sha256, \"%s\", sha256.data);\n    \n    request.file_size = 1024; // Replace with actual file size\n    \n    // Set analysis options\n    request.dynamic_execution = true;\n    request.is_private = true;\n    request.priority = 1;\n    \n    // Submit analysis request\n    BinaryId binary_id = CreateNewAnalysis(\u0026conn, \u0026request);\n    if (binary_id == 0) {\n        printf(\"Analysis creation failed\\n\");\n        return 1;\n    }\n    \n    printf(\"Analysis created successfully. Binary ID: %llu\\n\", binary_id);\n    \n    // Clean up using the deinitialization macro\n    NewAnalysisRequestDeinit(\u0026request);\n    StrDeinit(\u0026file_path);\n    StrDeinit(\u0026sha256);\n    StrDeinit(\u0026conn.api_key);\n    StrDeinit(\u0026conn.host);\n    \n    return 0;\n}\n```\n\n### Getting Analysis Status\n\n```c\n#include \u003cReai/Api.h\u003e\n\nint main() {\n    Connection conn = ConnectionInit();\n    StrPrintf(\u0026conn.api_key, \"your_api_key_here\");\n    StrPrintf(\u0026conn.host, \"https://api.reveng.ai\");\n    \n    // Authenticate\n    if (!Authenticate(\u0026conn)) {\n        printf(\"Authentication failed\\n\");\n        return 1;\n    }\n    \n    // Get analysis status for a binary\n    BinaryId binary_id = 123456; // Replace with your binary ID\n    Status status = GetAnalysisStatus(\u0026conn, binary_id);\n    \n    printf(\"Analysis status: \");\n    switch (status \u0026 STATUS_MASK) {\n        case STATUS_QUEUED:\n            printf(\"Queued\\n\");\n            break;\n        case STATUS_PROCESSING:\n            printf(\"Processing\\n\");\n            break;\n        case STATUS_COMPLETE:\n            printf(\"Completed\\n\");\n            break;\n        case STATUS_ERROR:\n            printf(\"Failed\\n\");\n            break;\n        default:\n            printf(\"Unknown\\n\");\n    }\n    \n    // Clean up\n    StrDeinit(\u0026conn.api_key);\n    StrDeinit(\u0026conn.host);\n    \n    return 0;\n}\n```\n\n### Getting Function Information\n\n```c\n#include \u003cReai/Api.h\u003e\n\nint main() {\n    Connection conn = ConnectionInit();\n    StrPrintf(\u0026conn.api_key, \"your_api_key_here\");\n    StrPrintf(\u0026conn.host, \"https://api.reveng.ai\");\n    \n    // Authenticate\n    if (!Authenticate(\u0026conn)) {\n        printf(\"Authentication failed\\n\");\n        return 1;\n    }\n    \n    // Get function information for a binary\n    BinaryId binary_id = 123456; // Replace with your binary ID\n    FunctionInfos functions = GetBasicFunctionInfoUsingBinaryId(\u0026conn, binary_id);\n    \n    printf(\"Found %zu functions:\\n\", functions.size);\n    for (size_t i = 0; i \u003c functions.size; i++) {\n        FunctionInfo* func = \u0026functions.data[i];\n        printf(\"Function ID: %llu, Name: %s, Address: 0x%llx, Size: %zu\\n\",\n               func-\u003eid, func-\u003esymbol.name.data, func-\u003esymbol.value.addr, func-\u003esize);\n    }\n    \n    // Clean up\n    VecDeinit(\u0026functions);\n    StrDeinit(\u0026conn.api_key);\n    StrDeinit(\u0026conn.host);\n    \n    return 0;\n}\n```\n\n### Renaming Functions\n\n```c\n#include \u003cReai/Api.h\u003e\n\nint main() {\n    Connection conn = ConnectionInit();\n    StrPrintf(\u0026conn.api_key, \"your_api_key_here\");\n    StrPrintf(\u0026conn.host, \"https://api.reveng.ai\");\n    \n    // Authenticate\n    if (!Authenticate(\u0026conn)) {\n        printf(\"Authentication failed\\n\");\n        return 1;\n    }\n    \n    // Rename a function\n    FunctionId function_id = 123456; // Replace with your function ID\n    Str new_name = StrInit();\n    StrPrintf(\u0026new_name, \"process_user_input\");\n    \n    if (RenameFunction(\u0026conn, function_id, new_name)) {\n        printf(\"Function renamed successfully\\n\");\n    } else {\n        printf(\"Function renaming failed\\n\");\n    }\n    \n    // Clean up\n    StrDeinit(\u0026new_name);\n    StrDeinit(\u0026conn.api_key);\n    StrDeinit(\u0026conn.host);\n    \n    return 0;\n}\n```\n\n### AI Decompilation\n\n```c\n#include \u003cReai/Api.h\u003e\n\nint main() {\n    Connection conn = ConnectionInit();\n    StrPrintf(\u0026conn.api_key, \"your_api_key_here\");\n    StrPrintf(\u0026conn.host, \"https://api.reveng.ai\");\n    \n    // Authenticate\n    if (!Authenticate(\u0026conn)) {\n        printf(\"Authentication failed\\n\");\n        return 1;\n    }\n    \n    // Request AI decompilation for a function\n    FunctionId function_id = 123456; // Replace with your function ID\n    \n    if (!BeginAiDecompilation(\u0026conn, function_id)) {\n        printf(\"Failed to start AI decompilation\\n\");\n        return 1;\n    }\n    \n    // Poll for decompilation status\n    Status status;\n    do {\n        sleep(5); // Wait 5 seconds between checks\n        status = GetAiDecompilationStatus(\u0026conn, function_id);\n        \n        printf(\"Decompilation status: \");\n        switch (status \u0026 STATUS_MASK) {\n            case STATUS_QUEUED:\n            case STATUS_UNINITIALIZED:\n                printf(\"Queued\\n\");\n                break;\n            case STATUS_PROCESSING:\n            case STATUS_RUNNING:\n                printf(\"Processing\\n\");\n                break;\n            case STATUS_COMPLETE:\n                printf(\"Completed\\n\");\n                break;\n            case STATUS_ERROR:\n                printf(\"Failed\\n\");\n                break;\n            default:\n                printf(\"Unknown\\n\");\n        }\n    } while ((status \u0026 STATUS_MASK) == STATUS_QUEUED || \n             (status \u0026 STATUS_MASK) == STATUS_PROCESSING ||\n             (status \u0026 STATUS_MASK) == STATUS_RUNNING ||\n             (status \u0026 STATUS_MASK) == STATUS_UNINITIALIZED);\n    \n    if ((status \u0026 STATUS_MASK) == STATUS_COMPLETE) {\n        // Get decompilation result with AI summary\n        AiDecompilation decompilation = GetAiDecompilation(\u0026conn, function_id, true);\n        \n        printf(\"Decompiled code:\\n%s\\n\\n\", decompilation.decompiled_code.data);\n        printf(\"AI Summary:\\n%s\\n\", decompilation.ai_summary.data);\n        \n        // Clean up decompilation\n        StrDeinit(\u0026decompilation.decompiled_code);\n        StrDeinit(\u0026decompilation.ai_summary);\n    }\n    \n    // Clean up\n    StrDeinit(\u0026conn.api_key);\n    StrDeinit(\u0026conn.host);\n    \n    return 0;\n}\n```\n\n### Finding Similar Functions\n\n```c\n#include \u003cReai/Api.h\u003e\n\nint main() {\n    Connection conn = ConnectionInit();\n    StrPrintf(\u0026conn.api_key, \"your_api_key_here\");\n    StrPrintf(\u0026conn.host, \"https://api.reveng.ai\");\n    \n    // Authenticate\n    if (!Authenticate(\u0026conn)) {\n        printf(\"Authentication failed\\n\");\n        return 1;\n    }\n    \n    // Create a request to find similar functions using the initialization macro\n    SimilarFunctionsRequest request = SimilarFunctionsRequestInit();\n    request.function_id = 123456; // Replace with your function ID\n    request.limit = 10;\n    request.distance = 0.8; // Similarity threshold (0.0 to 1.0)\n    \n    // Configure search options\n    request.debug_include.user_symbols = true;\n    request.debug_include.system_symbols = true;\n    request.debug_include.external_symbols = true;\n    \n    // Get similar functions\n    SimilarFunctions similar = GetSimilarFunctions(\u0026conn, \u0026request);\n    \n    printf(\"Found %zu similar functions:\\n\", similar.size);\n    for (size_t i = 0; i \u003c similar.size; i++) {\n        SimilarFunction* func = \u0026similar.data[i];\n        printf(\"Function: %s, Distance: %f\\n\", func-\u003efunction_name.data, func-\u003edistance);\n    }\n    \n    // Clean up using the deinitialization macro\n    SimilarFunctionsRequestDeinit(\u0026request);\n    VecDeinit(\u0026similar);\n    StrDeinit(\u0026conn.api_key);\n    StrDeinit(\u0026conn.host);\n    \n    return 0;\n}\n```\n\n### Searching for Binaries\n\n```c\n#include \u003cReai/Api.h\u003e\n\nint main() {\n    Connection conn = ConnectionInit();\n    StrPrintf(\u0026conn.api_key, \"your_api_key_here\");\n    StrPrintf(\u0026conn.host, \"https://api.reveng.ai\");\n    \n    // Authenticate\n    if (!Authenticate(\u0026conn)) {\n        printf(\"Authentication failed\\n\");\n        return 1;\n    }\n    \n    // Create a search request using the initialization macro\n    SearchBinaryRequest request = SearchBinaryRequestInit();\n    request.page = 1;\n    request.page_size = 10;\n    \n    StrPrintf(\u0026request.partial_name, \"example\");\n    \n    // Search for binaries\n    BinaryInfos binaries = SearchBinary(\u0026conn, \u0026request);\n    \n    printf(\"Found %zu binaries:\\n\", binaries.size);\n    for (size_t i = 0; i \u003c binaries.size; i++) {\n        BinaryInfo* binary = \u0026binaries.data[i];\n        printf(\"Binary ID: %llu, Name: %s\\n\", binary-\u003eid, binary-\u003ename.data);\n    }\n    \n    // Clean up using the deinitialization macro\n    SearchBinaryRequestDeinit(\u0026request);\n    VecDeinit(\u0026binaries);\n    StrDeinit(\u0026conn.api_key);\n    StrDeinit(\u0026conn.host);\n    \n    return 0;\n}\n```\n\n## API Reference\n\nFor a complete list of API functions and their parameters, please refer to the header file:\n`Include/Reai/Api.h`\n\nKey API functions include:\n\n- `Authenticate`: Authenticate with the RevEngAI API\n- `UploadFile`: Upload a binary file for analysis\n- `CreateNewAnalysis`: Submit a new analysis request\n- `GetAnalysisStatus`: Check the status of an analysis\n- `GetBasicFunctionInfoUsingBinaryId`: Get function information for a binary\n- `RenameFunction`: Rename a function\n- `BeginAiDecompilation`: Start AI decompilation for a function\n- `GetAiDecompilationStatus`: Check the status of a decompilation\n- `GetAiDecompilation`: Get decompiled code and AI summary\n- `GetSimilarFunctions`: Find functions similar to a given function\n- `SearchBinary`: Search for binaries\n- `SearchCollection`: Search for collections\n\n## License\n\nCopyright (c) RevEngAI. All Rights Reserved.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frevengai%2Fcreait","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frevengai%2Fcreait","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frevengai%2Fcreait/lists"}