{"id":16995786,"url":"https://github.com/qtc-de/rpv","last_synced_at":"2025-07-04T21:04:49.722Z","repository":{"id":193291473,"uuid":"688507402","full_name":"qtc-de/rpv","owner":"qtc-de","description":"rpv is a v library for analyzing RPC servers and interfaces on the Windows operating system","archived":false,"fork":false,"pushed_at":"2025-05-08T13:50:09.000Z","size":403,"stargazers_count":33,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-05-08T14:34:03.031Z","etag":null,"topics":["decompiler","ndr","rpc","rpcview","vlang","vlang-package"],"latest_commit_sha":null,"homepage":"","language":"V","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qtc-de.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null}},"created_at":"2023-09-07T13:43:43.000Z","updated_at":"2025-04-23T12:52:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"7ef42245-a5f0-45e4-bf80-0369ba10eb98","html_url":"https://github.com/qtc-de/rpv","commit_stats":null,"previous_names":["qtc-de/rpv"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/qtc-de/rpv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qtc-de%2Frpv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qtc-de%2Frpv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qtc-de%2Frpv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qtc-de%2Frpv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qtc-de","download_url":"https://codeload.github.com/qtc-de/rpv/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qtc-de%2Frpv/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263619743,"owners_count":23489558,"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":["decompiler","ndr","rpc","rpcview","vlang","vlang-package"],"created_at":"2024-10-14T03:50:10.239Z","updated_at":"2025-07-04T21:04:49.714Z","avatar_url":"https://github.com/qtc-de.png","language":"V","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/user-attachments/assets/be814b15-8485-412e-a3a5-fa0989865bd7\"/\u003e\n\u003c/div\u003e\n\u003cbr/\u003e\n\n[![](https://github.com/qtc-de/rpv/actions/workflows/build-examples.yml/badge.svg?branch=main)](https://github.com/qtc-de/rpv/actions/workflows/build-examples.yml)\n[![](https://github.com/qtc-de/rpv/actions/workflows/build-examples.yml/badge.svg?branch=dev)](https://github.com/qtc-de/rpv/actions/workflows/build-examples.yml)\n[![](https://img.shields.io/badge/version-1.3.1-blue)](https://github.com/qtc-de/rpv/releases)\n[![](https://img.shields.io/badge/programming%20language-v-blue)](https://vlang.io/)\n[![](https://img.shields.io/badge/license-GPL%20v3.0-blue)](https://github.com/qtc-de/rpv/blob/master/LICENSE)\n[![](https://img.shields.io/badge/docs-fa6b05)](https://qtc-de.github.io/rpv)\n\n*rpv* is a *v* library for analyzing *RPC* servers and interfaces\non the *Windows* operating system. It is inspired by [RpcView](https://www.rpcview.org/)\nand uses similar ideas for finding and investigating *RPC* servers.\n*rpv* does not provide a graphical user interface or a command line\ninterface itself. The [examples](/examples) folder contains some\nexamples how *rpv* can be used within your own projects. Moreover,\nthe [rpv-web](https://github.com/qtc-de/rpv-web) project provides\na browser based graphical user interface.\n\n\n### Installation\n\n----\n\n*rpv* is available on [vpm](https://vpm.vlang.io/packages/qtc.rpv).\nAssuming that *v* [is installed](https://github.com/vlang/v#installing-v-from-source),\ninstalling *rpv* can be done using the following command:\n\n```console\n[user@host ~]$ v install qtc-de.rpv\n```\n\nAfter installation, *rpv* can be used to analyze *RPC* servers and\ninterfaces in *x64* processes. If you need to investigate *x86* instead,\nyou need to replace the file `rpv/internals/rpc-internal-structs.v` within\nyour *v* modules folder (usually at `~/.vmodules`) with the appropriate\nfile from the [alternate](/alternate) folder.\n\nIn future, this will hopefully no longer be necessary when [toplevel\ncompile time statements](https://github.com/vlang/v/discussions/18670)\nare added to *v*.\n\nAs it is already implemented by [RpcView](https://github.com/silverf0x/RpcView),\nthe [alternate](/alternate) folder may also contain different struct\ndefinitions for different versions of *Windows* in future. Currently,\nonly the struct definitions for the most recent *Windows* releases were\nported from *RpcView* to *v*.\n\n\n### Qickstart\n\n----\n\nThe following listing shows an example on how the library can be used to\nenumerate *RPC* servers and interfaces. More examples can be found within\n[examples](/examples) folder.\n\n```v\nimport qtc_de.rpv\n\nfn main()\n{\n    infos := rpv.get_rpv_process_infos() or { panic(err) }\n\n    for info in infos\n    {\n        if info.rpc_info.rpc_type in [.no_rpc, .wrong_arch]\n        {\n            continue\n        }\n\n        println('[+]')\n        println('[+] Process Name: ${info.name}')\n        println('[+] PID         : ${info.pid}')\n        println('[+] User        : ${info.user}')\n        println('[+] Path        : ${info.path}')\n        println('[+] RPC Endpoints:')\n\n        for endpoint in info.rpc_info.server_info.endpoints\n        {\n            println('[+]\\t ${endpoint.protocol} - ${endpoint.name}')\n        }\n\n        println('[+] RPC Interfaces:')\n\n        for intf in info.rpc_info.interface_infos\n        {\n            println('[+]\\t ${intf.id} (${intf.methods.len} methods)')\n        }\n    }\n}\n```\n\n\n### Documentation\n\n----\n\nDetailed documentation for the defined methods and structures can be\nfound within the auto generated [html docs](https://qtc-de.github.io/rpv/).\nA more usage oriented documentation does not exist at the time of\nwriting. It is recommended to look at the [examples](/examples) folder\nor the [rpv-web](https://github.com/qtc-de/rpv-web) project to learn\nhow the library can be used.\n\n\n### Future Work\n\n----\n\nIn future, *rpv* will probably extended to also work for analyzing *RPC*\nservers and interfaces from files without running processes.\n\n\n### Disclaimer\n\n----\n\n*rpv* should not be used to create applications that are accessible by untrusted clients.\nThe library contains several *unsafe* code blocks, that bypass the memory safety features\nof *v*. This is required, to get the *C* interop working, but may introduce well known\nmemory corruption bugs. Therefore, the library should only be used for local research\nprojects and should not be used for applications that are exposed to untrusted clients.\n\n\n### Acknowledgments\n\n----\n\nWriting *rpv* would not have been possible without the excellent work\nby [silverf0x](https://github.com/silverf0x) ([RpcView](https://github.com/silverf0x/RpcView)),\n[James Forshaw](https://twitter.com/tiraniddo) ([sandbox-attacksurface-analysis-tools](https://github.com/googleprojectzero/sandbox-attacksurface-analysis-tools)),\nNicolas Pouvesle ([mIDA](https://github.com/tenable/mIDA)) and all the\nothers that contributed to these projects. They did the real work by\nfiguring out the different data formats used by the *RPC* runtime. My\npart was only to use this knowledge and to write a *v* wrapper around\nit :)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqtc-de%2Frpv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqtc-de%2Frpv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqtc-de%2Frpv/lists"}