pwn 0.5.708 → 0.5.710

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (450) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/documentation/Installation.md +1 -0
  4. data/etc/default_skills/exploitdev/SKILL.md +38 -0
  5. data/etc/default_skills/pwn/ai/agent/extrospection/osint/bridges/SKILL.md +30 -8
  6. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/SKILL.md +30 -8
  7. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/references/urls.md +1 -1
  8. data/etc/default_skills/pwn/ai/agent/extrospection/references/urls.md +0 -1
  9. data/etc/default_skills/pwn/memory_index/SKILL.md +0 -4
  10. data/etc/default_skills/pwn/plugins/aflplusplus/SKILL.md +49 -0
  11. data/etc/default_skills/pwn/plugins/android/SKILL.md +1 -0
  12. data/etc/default_skills/pwn/plugins/artifact_registry/SKILL.md +49 -0
  13. data/etc/default_skills/pwn/plugins/binary_parser/SKILL.md +54 -0
  14. data/etc/default_skills/pwn/plugins/credential_attack/SKILL.md +58 -0
  15. data/etc/default_skills/pwn/plugins/credential_attack/references/urls.md +3 -0
  16. data/etc/default_skills/pwn/plugins/exploit_db/SKILL.md +49 -0
  17. data/etc/default_skills/pwn/plugins/exploit_dev/SKILL.md +63 -0
  18. data/etc/default_skills/pwn/plugins/frida/SKILL.md +51 -0
  19. data/etc/default_skills/pwn/plugins/fuzz/SKILL.md +2 -0
  20. data/etc/default_skills/pwn/plugins/gdb/SKILL.md +53 -0
  21. data/etc/default_skills/pwn/plugins/jobs/SKILL.md +51 -0
  22. data/etc/default_skills/pwn/plugins/k8s/SKILL.md +51 -0
  23. data/etc/default_skills/pwn/plugins/nuclei/SKILL.md +50 -0
  24. data/etc/default_skills/pwn/plugins/preflight_checker/SKILL.md +59 -0
  25. data/etc/default_skills/pwn/plugins/process_tube/SKILL.md +53 -0
  26. data/etc/default_skills/pwn/plugins/radare2/SKILL.md +59 -0
  27. data/etc/default_skills/pwn/plugins/recon/SKILL.md +57 -0
  28. data/etc/default_skills/pwn/plugins/recon/references/urls.md +6 -0
  29. data/etc/default_skills/pwn/plugins/semgrep/SKILL.md +48 -0
  30. data/etc/default_skills/pwn/plugins/sqlmap/SKILL.md +48 -0
  31. data/etc/default_skills/pwn/plugins/transparent_browser/SKILL.md +0 -4
  32. data/etc/default_skills/pwn/plugins/volatility/SKILL.md +49 -0
  33. data/lib/pwn/ai/agent/assembly.rb +4 -1
  34. data/lib/pwn/ai/agent/btc.rb +4 -1
  35. data/lib/pwn/ai/agent/burp_suite.rb +5 -2
  36. data/lib/pwn/ai/agent/curriculum.rb +89 -30
  37. data/lib/pwn/ai/agent/dispatch.rb +27 -16
  38. data/lib/pwn/ai/agent/extrospection/osint/bridges.rb +9 -18
  39. data/lib/pwn/ai/agent/extrospection/osint/social.rb +9 -18
  40. data/lib/pwn/ai/agent/extrospection.rb +185 -60
  41. data/lib/pwn/ai/agent/gqrx.rb +4 -1
  42. data/lib/pwn/ai/agent/hacker_one.rb +5 -2
  43. data/lib/pwn/ai/agent/learning.rb +142 -25
  44. data/lib/pwn/ai/agent/loop.rb +53 -46
  45. data/lib/pwn/ai/agent/metrics.rb +133 -23
  46. data/lib/pwn/ai/agent/mistakes.rb +126 -17
  47. data/lib/pwn/ai/agent/open_goal.rb +25 -9
  48. data/lib/pwn/ai/agent/policy.rb +158 -18
  49. data/lib/pwn/ai/agent/prompt_builder.rb +21 -11
  50. data/lib/pwn/ai/agent/prompt_cache.rb +44 -13
  51. data/lib/pwn/ai/agent/reflect.rb +9 -5
  52. data/lib/pwn/ai/agent/registry.rb +65 -12
  53. data/lib/pwn/ai/agent/result.rb +19 -10
  54. data/lib/pwn/ai/agent/reward.rb +150 -32
  55. data/lib/pwn/ai/agent/sast.rb +4 -1
  56. data/lib/pwn/ai/agent/swarm.rb +72 -36
  57. data/lib/pwn/ai/agent/task_summarizer.rb +165 -36
  58. data/lib/pwn/ai/agent/tool_guard.rb +105 -6
  59. data/lib/pwn/ai/agent/tools/sessions.rb +8 -1
  60. data/lib/pwn/ai/agent/transparent_browser.rb +4 -1
  61. data/lib/pwn/ai/agent/turn_finalizer.rb +41 -21
  62. data/lib/pwn/ai/agent/vuln_gen.rb +6 -3
  63. data/lib/pwn/ai/agent.rb +4 -0
  64. data/lib/pwn/ai/anthropic.rb +41 -7
  65. data/lib/pwn/ai/gemini.rb +21 -11
  66. data/lib/pwn/ai/grok.rb +44 -6
  67. data/lib/pwn/ai/http_retry.rb +40 -12
  68. data/lib/pwn/ai/ollama.rb +19 -10
  69. data/lib/pwn/ai/open_ai.rb +81 -30
  70. data/lib/pwn/ai/open_web_ui.rb +20 -14
  71. data/lib/pwn/ai/red_team/agent_protocol_abuse.rb +7 -1
  72. data/lib/pwn/ai/red_team/data_and_model_poisoning.rb +7 -1
  73. data/lib/pwn/ai/red_team/excessive_agency.rb +7 -1
  74. data/lib/pwn/ai/red_team/hidden_context_exposure.rb +7 -1
  75. data/lib/pwn/ai/red_team/insecure_output_handling.rb +7 -1
  76. data/lib/pwn/ai/red_team/jailbreak.rb +7 -1
  77. data/lib/pwn/ai/red_team/memory_poisoning.rb +7 -1
  78. data/lib/pwn/ai/red_team/multimodal_injection.rb +7 -1
  79. data/lib/pwn/ai/red_team/overreliance.rb +7 -1
  80. data/lib/pwn/ai/red_team/payload_splitting.rb +7 -1
  81. data/lib/pwn/ai/red_team/prompt_injection.rb +7 -1
  82. data/lib/pwn/ai/red_team/rag_poisoning.rb +7 -1
  83. data/lib/pwn/ai/red_team/sensitive_information_disclosure.rb +7 -1
  84. data/lib/pwn/ai/red_team/supply_chain.rb +7 -1
  85. data/lib/pwn/ai/red_team/system_prompt_extraction.rb +7 -1
  86. data/lib/pwn/ai/red_team/test_case_engine.rb +12 -9
  87. data/lib/pwn/ai/red_team/token_smuggling.rb +7 -1
  88. data/lib/pwn/ai/red_team/unbounded_consumption.rb +7 -1
  89. data/lib/pwn/ai/red_team/vector_and_embedding_weaknesses.rb +7 -1
  90. data/lib/pwn/ai/red_team.rb +4 -0
  91. data/lib/pwn/ai.rb +4 -0
  92. data/lib/pwn/aws/acm.rb +5 -2
  93. data/lib/pwn/aws/api_gateway.rb +10 -7
  94. data/lib/pwn/aws/app_stream.rb +5 -2
  95. data/lib/pwn/aws/application_auto_scaling.rb +5 -2
  96. data/lib/pwn/aws/application_discovery_service.rb +5 -2
  97. data/lib/pwn/aws/auto_scaling.rb +5 -2
  98. data/lib/pwn/aws/batch.rb +5 -2
  99. data/lib/pwn/aws/budgets.rb +5 -2
  100. data/lib/pwn/aws/cloud_formation.rb +5 -2
  101. data/lib/pwn/aws/cloud_front.rb +7 -4
  102. data/lib/pwn/aws/cloud_hsm.rb +5 -2
  103. data/lib/pwn/aws/cloud_search.rb +5 -2
  104. data/lib/pwn/aws/cloud_search_domain.rb +5 -2
  105. data/lib/pwn/aws/cloud_trail.rb +5 -2
  106. data/lib/pwn/aws/cloud_watch.rb +5 -2
  107. data/lib/pwn/aws/cloud_watch_events.rb +5 -2
  108. data/lib/pwn/aws/cloud_watch_logs.rb +5 -2
  109. data/lib/pwn/aws/code_build.rb +5 -2
  110. data/lib/pwn/aws/code_commit.rb +5 -2
  111. data/lib/pwn/aws/code_deploy.rb +5 -2
  112. data/lib/pwn/aws/code_pipeline.rb +5 -2
  113. data/lib/pwn/aws/cognito_identity.rb +5 -2
  114. data/lib/pwn/aws/cognito_identity_provider.rb +5 -2
  115. data/lib/pwn/aws/cognito_sync.rb +5 -2
  116. data/lib/pwn/aws/config_service.rb +5 -2
  117. data/lib/pwn/aws/data_pipleline.rb +5 -2
  118. data/lib/pwn/aws/database_migration_service.rb +5 -2
  119. data/lib/pwn/aws/device_farm.rb +5 -2
  120. data/lib/pwn/aws/direct_connect.rb +5 -2
  121. data/lib/pwn/aws/directory_service.rb +5 -2
  122. data/lib/pwn/aws/dynamo_db.rb +5 -2
  123. data/lib/pwn/aws/dynamo_db_streams.rb +5 -2
  124. data/lib/pwn/aws/ec2.rb +5 -2
  125. data/lib/pwn/aws/ecr.rb +5 -2
  126. data/lib/pwn/aws/ecs.rb +5 -2
  127. data/lib/pwn/aws/efs.rb +5 -2
  128. data/lib/pwn/aws/elasti_cache.rb +5 -2
  129. data/lib/pwn/aws/elastic_beanstalk.rb +8 -5
  130. data/lib/pwn/aws/elastic_load_balancing.rb +5 -2
  131. data/lib/pwn/aws/elastic_load_balancing_v2.rb +6 -3
  132. data/lib/pwn/aws/elastic_transcoder.rb +5 -2
  133. data/lib/pwn/aws/elasticsearch_service.rb +5 -2
  134. data/lib/pwn/aws/emr.rb +5 -2
  135. data/lib/pwn/aws/firehose.rb +5 -2
  136. data/lib/pwn/aws/game_lift.rb +5 -2
  137. data/lib/pwn/aws/glacier.rb +6 -3
  138. data/lib/pwn/aws/health.rb +5 -2
  139. data/lib/pwn/aws/iam.rb +10 -4
  140. data/lib/pwn/aws/import_export.rb +5 -2
  141. data/lib/pwn/aws/inspector.rb +5 -2
  142. data/lib/pwn/aws/iot.rb +5 -2
  143. data/lib/pwn/aws/iot_data_plane.rb +5 -2
  144. data/lib/pwn/aws/kinesis.rb +5 -2
  145. data/lib/pwn/aws/kinesis_analytics.rb +5 -2
  146. data/lib/pwn/aws/kms.rb +5 -2
  147. data/lib/pwn/aws/lambda.rb +5 -2
  148. data/lib/pwn/aws/lambda_preview.rb +5 -2
  149. data/lib/pwn/aws/lex.rb +5 -2
  150. data/lib/pwn/aws/lightsail.rb +5 -2
  151. data/lib/pwn/aws/machine_learning.rb +5 -2
  152. data/lib/pwn/aws/marketplace_commerce_analytics.rb +5 -2
  153. data/lib/pwn/aws/marketplace_metering.rb +5 -2
  154. data/lib/pwn/aws/ops_works.rb +5 -2
  155. data/lib/pwn/aws/ops_works_cm.rb +5 -2
  156. data/lib/pwn/aws/pinpoint.rb +5 -2
  157. data/lib/pwn/aws/polly.rb +5 -2
  158. data/lib/pwn/aws/rds.rb +5 -2
  159. data/lib/pwn/aws/redshift.rb +5 -2
  160. data/lib/pwn/aws/rekognition.rb +5 -2
  161. data/lib/pwn/aws/route53.rb +5 -2
  162. data/lib/pwn/aws/route53_domains.rb +5 -2
  163. data/lib/pwn/aws/s3.rb +5 -2
  164. data/lib/pwn/aws/service_catalog.rb +5 -2
  165. data/lib/pwn/aws/ses.rb +5 -2
  166. data/lib/pwn/aws/shield.rb +5 -2
  167. data/lib/pwn/aws/simple_db.rb +5 -2
  168. data/lib/pwn/aws/sms.rb +5 -2
  169. data/lib/pwn/aws/snowball.rb +5 -2
  170. data/lib/pwn/aws/sns.rb +5 -2
  171. data/lib/pwn/aws/sqs.rb +5 -2
  172. data/lib/pwn/aws/ssm.rb +5 -2
  173. data/lib/pwn/aws/states.rb +5 -2
  174. data/lib/pwn/aws/storage_gateway.rb +5 -2
  175. data/lib/pwn/aws/sts.rb +4 -1
  176. data/lib/pwn/aws/support.rb +5 -2
  177. data/lib/pwn/aws/swf.rb +5 -2
  178. data/lib/pwn/aws/waf.rb +5 -2
  179. data/lib/pwn/aws/waf_regional.rb +5 -2
  180. data/lib/pwn/aws/workspaces.rb +5 -2
  181. data/lib/pwn/aws/x_ray.rb +5 -2
  182. data/lib/pwn/aws.rb +4 -0
  183. data/lib/pwn/banner/anon.rb +3 -0
  184. data/lib/pwn/banner/bubble.rb +3 -0
  185. data/lib/pwn/banner/cheshire.rb +3 -0
  186. data/lib/pwn/banner/code_cave.rb +3 -0
  187. data/lib/pwn/banner/dont_panic.rb +3 -0
  188. data/lib/pwn/banner/f_society.rb +3 -0
  189. data/lib/pwn/banner/fork_bomb.rb +3 -0
  190. data/lib/pwn/banner/jmp_esp.rb +3 -0
  191. data/lib/pwn/banner/matrix.rb +5 -1
  192. data/lib/pwn/banner/ninja.rb +3 -0
  193. data/lib/pwn/banner/off_the_air.rb +3 -0
  194. data/lib/pwn/banner/pirate.rb +3 -0
  195. data/lib/pwn/banner/radare2.rb +3 -0
  196. data/lib/pwn/banner/radare2_ai.rb +3 -0
  197. data/lib/pwn/banner/white_rabbit.rb +3 -0
  198. data/lib/pwn/banner.rb +6 -2
  199. data/lib/pwn/blockchain/btc.rb +8 -3
  200. data/lib/pwn/blockchain/eth.rb +10 -3
  201. data/lib/pwn/blockchain.rb +4 -0
  202. data/lib/pwn/bounty/lifecycle_authz_replay.rb +46 -27
  203. data/lib/pwn/bounty.rb +4 -0
  204. data/lib/pwn/config.rb +79 -13
  205. data/lib/pwn/cron.rb +297 -20
  206. data/lib/pwn/driver.rb +2 -18
  207. data/lib/pwn/ffi/adalm_pluto.rb +65 -11
  208. data/lib/pwn/ffi/fftw.rb +31 -6
  209. data/lib/pwn/ffi/hack_rf.rb +59 -8
  210. data/lib/pwn/ffi/liquid.rb +63 -10
  211. data/lib/pwn/ffi/rtl_sdr.rb +35 -5
  212. data/lib/pwn/ffi/soapy_sdr.rb +60 -10
  213. data/lib/pwn/ffi/stdio.rb +7 -8
  214. data/lib/pwn/ffi/volk.rb +36 -7
  215. data/lib/pwn/ffi.rb +12 -0
  216. data/lib/pwn/memory.rb +136 -16
  217. data/lib/pwn/memory_index.rb +34 -19
  218. data/lib/pwn/migrate.rb +34 -24
  219. data/lib/pwn/module_skills.rb +39 -8
  220. data/lib/pwn/plugins/aflplusplus.rb +72 -0
  221. data/lib/pwn/plugins/android.rb +71 -245
  222. data/lib/pwn/plugins/artifact_registry.rb +71 -0
  223. data/lib/pwn/plugins/assembly.rb +9 -4
  224. data/lib/pwn/plugins/authentication_helper.rb +8 -5
  225. data/lib/pwn/plugins/baresip.rb +59 -12
  226. data/lib/pwn/plugins/basic_auth.rb +9 -3
  227. data/lib/pwn/plugins/beef.rb +28 -18
  228. data/lib/pwn/plugins/binary_parser.rb +133 -0
  229. data/lib/pwn/plugins/black_duck_binary_analysis.rb +63 -39
  230. data/lib/pwn/plugins/burp_suite.rb +98 -68
  231. data/lib/pwn/plugins/bus_pirate.rb +15 -8
  232. data/lib/pwn/plugins/char.rb +33 -3
  233. data/lib/pwn/plugins/credential_attack.rb +158 -0
  234. data/lib/pwn/plugins/credit_card.rb +6 -1
  235. data/lib/pwn/plugins/dao_ldap.rb +19 -13
  236. data/lib/pwn/plugins/dao_mongo.rb +11 -5
  237. data/lib/pwn/plugins/dao_postgres.rb +28 -19
  238. data/lib/pwn/plugins/dao_sqlite3.rb +15 -6
  239. data/lib/pwn/plugins/defect_dojo.rb +38 -22
  240. data/lib/pwn/plugins/detect_os.rb +5 -0
  241. data/lib/pwn/plugins/ein.rb +3 -0
  242. data/lib/pwn/plugins/exploit_db.rb +69 -0
  243. data/lib/pwn/plugins/exploit_dev.rb +330 -0
  244. data/lib/pwn/plugins/file_fu.rb +11 -8
  245. data/lib/pwn/plugins/frida.rb +112 -0
  246. data/lib/pwn/plugins/fuzz.rb +42 -6
  247. data/lib/pwn/plugins/gdb.rb +115 -0
  248. data/lib/pwn/plugins/git.rb +19 -14
  249. data/lib/pwn/plugins/github.rb +38 -15
  250. data/lib/pwn/plugins/google_workspace.rb +188 -45
  251. data/lib/pwn/plugins/hacker_one.rb +159 -35
  252. data/lib/pwn/plugins/hunter.rb +6 -3
  253. data/lib/pwn/plugins/ip_info.rb +9 -4
  254. data/lib/pwn/plugins/irc.rb +28 -15
  255. data/lib/pwn/plugins/jenkins.rb +65 -57
  256. data/lib/pwn/plugins/jira_data_center.rb +30 -22
  257. data/lib/pwn/plugins/jobs.rb +110 -0
  258. data/lib/pwn/plugins/json_pathify.rb +9 -5
  259. data/lib/pwn/plugins/k8s.rb +73 -0
  260. data/lib/pwn/plugins/log.rb +113 -13
  261. data/lib/pwn/plugins/mail_agent.rb +87 -79
  262. data/lib/pwn/plugins/metasploit.rb +11 -6
  263. data/lib/pwn/plugins/monkey_patch.rb +3 -0
  264. data/lib/pwn/plugins/msr206.rb +42 -28
  265. data/lib/pwn/plugins/nessus_cloud.rb +44 -4
  266. data/lib/pwn/plugins/nexpose_vuln_scan.rb +40 -24
  267. data/lib/pwn/plugins/nmap_it.rb +14 -34
  268. data/lib/pwn/plugins/nuclei.rb +90 -0
  269. data/lib/pwn/plugins/oauth2.rb +11 -5
  270. data/lib/pwn/plugins/ocr.rb +3 -0
  271. data/lib/pwn/plugins/open_api.rb +5 -2
  272. data/lib/pwn/plugins/openvas.rb +33 -25
  273. data/lib/pwn/plugins/packet.rb +152 -31
  274. data/lib/pwn/plugins/pdf_parse.rb +5 -2
  275. data/lib/pwn/plugins/pony.rb +86 -1
  276. data/lib/pwn/plugins/preflight_checker.rb +166 -0
  277. data/lib/pwn/plugins/process_tube.rb +139 -0
  278. data/lib/pwn/plugins/ps.rb +7 -1
  279. data/lib/pwn/plugins/pwn_logger.rb +6 -2
  280. data/lib/pwn/plugins/rabbit_mq.rb +12 -7
  281. data/lib/pwn/plugins/radare2.rb +253 -0
  282. data/lib/pwn/plugins/recon.rb +196 -0
  283. data/lib/pwn/plugins/repl.rb +122 -1
  284. data/lib/pwn/plugins/scannable_codes.rb +5 -1
  285. data/lib/pwn/plugins/semgrep.rb +61 -0
  286. data/lib/pwn/plugins/serial.rb +24 -14
  287. data/lib/pwn/plugins/shodan.rb +54 -35
  288. data/lib/pwn/plugins/slack_client.rb +11 -6
  289. data/lib/pwn/plugins/sock.rb +17 -8
  290. data/lib/pwn/plugins/spider.rb +5 -2
  291. data/lib/pwn/plugins/sqlmap.rb +49 -0
  292. data/lib/pwn/plugins/ssn.rb +3 -0
  293. data/lib/pwn/plugins/thread_pool.rb +6 -9
  294. data/lib/pwn/plugins/tor.rb +9 -4
  295. data/lib/pwn/plugins/transparent_browser.rb +62 -107
  296. data/lib/pwn/plugins/tty_spinner.rb +16 -2
  297. data/lib/pwn/plugins/twitter_api.rb +6 -2
  298. data/lib/pwn/plugins/uri_scheme.rb +4 -1
  299. data/lib/pwn/plugins/vault.rb +12 -3
  300. data/lib/pwn/plugins/vin.rb +24 -12
  301. data/lib/pwn/plugins/voice.rb +7 -2
  302. data/lib/pwn/plugins/volatility.rb +67 -0
  303. data/lib/pwn/plugins/vsphere.rb +9 -5
  304. data/lib/pwn/plugins/xxd.rb +12 -43
  305. data/lib/pwn/plugins/zaproxy.rb +30 -16
  306. data/lib/pwn/plugins.rb +22 -0
  307. data/lib/pwn/reports/ai_red_team.rb +6 -2
  308. data/lib/pwn/reports/csv.rb +8 -1
  309. data/lib/pwn/reports/fuzz.rb +5 -2
  310. data/lib/pwn/reports/html.rb +8 -1
  311. data/lib/pwn/reports/html_footer.rb +4 -3
  312. data/lib/pwn/reports/html_header.rb +6 -2
  313. data/lib/pwn/reports/json.rb +8 -1
  314. data/lib/pwn/reports/markdown.rb +8 -1
  315. data/lib/pwn/reports/pdf.rb +8 -1
  316. data/lib/pwn/reports/phone.rb +5 -2
  317. data/lib/pwn/reports/sast.rb +6 -2
  318. data/lib/pwn/reports/uri_buster.rb +5 -2
  319. data/lib/pwn/reports/xml.rb +8 -1
  320. data/lib/pwn/reports.rb +19 -0
  321. data/lib/pwn/sast/amqp_connect_as_guest.rb +9 -3
  322. data/lib/pwn/sast/apache_file_system_util_api.rb +9 -3
  323. data/lib/pwn/sast/aws.rb +9 -3
  324. data/lib/pwn/sast/banned_function_calls_c.rb +9 -3
  325. data/lib/pwn/sast/base64.rb +9 -3
  326. data/lib/pwn/sast/beef_hook.rb +9 -3
  327. data/lib/pwn/sast/cmd_execution_go_lang.rb +9 -3
  328. data/lib/pwn/sast/cmd_execution_java.rb +9 -3
  329. data/lib/pwn/sast/cmd_execution_python.rb +9 -3
  330. data/lib/pwn/sast/cmd_execution_ruby.rb +9 -3
  331. data/lib/pwn/sast/cmd_execution_scala.rb +9 -3
  332. data/lib/pwn/sast/csrf.rb +9 -3
  333. data/lib/pwn/sast/deserial_java.rb +9 -3
  334. data/lib/pwn/sast/emoticon.rb +9 -3
  335. data/lib/pwn/sast/eval.rb +9 -3
  336. data/lib/pwn/sast/factory.rb +9 -3
  337. data/lib/pwn/sast/http_authorization_header.rb +9 -3
  338. data/lib/pwn/sast/inner_html.rb +9 -3
  339. data/lib/pwn/sast/keystore.rb +9 -3
  340. data/lib/pwn/sast/local_storage.rb +9 -3
  341. data/lib/pwn/sast/location_hash.rb +9 -3
  342. data/lib/pwn/sast/log4j.rb +9 -3
  343. data/lib/pwn/sast/logger.rb +9 -3
  344. data/lib/pwn/sast/md5.rb +9 -3
  345. data/lib/pwn/sast/outer_html.rb +9 -3
  346. data/lib/pwn/sast/padding_oracle.rb +9 -3
  347. data/lib/pwn/sast/password.rb +9 -3
  348. data/lib/pwn/sast/php_input_mechanisms.rb +9 -3
  349. data/lib/pwn/sast/php_type_juggling.rb +9 -3
  350. data/lib/pwn/sast/pom_version.rb +9 -3
  351. data/lib/pwn/sast/port.rb +9 -3
  352. data/lib/pwn/sast/post_message.rb +9 -3
  353. data/lib/pwn/sast/private_key.rb +9 -3
  354. data/lib/pwn/sast/redirect.rb +9 -3
  355. data/lib/pwn/sast/redos.rb +9 -3
  356. data/lib/pwn/sast/shell.rb +9 -3
  357. data/lib/pwn/sast/signature.rb +9 -3
  358. data/lib/pwn/sast/sql.rb +9 -3
  359. data/lib/pwn/sast/ssl.rb +9 -3
  360. data/lib/pwn/sast/sudo.rb +9 -3
  361. data/lib/pwn/sast/task_tag.rb +9 -3
  362. data/lib/pwn/sast/test_case_engine.rb +11 -7
  363. data/lib/pwn/sast/throw_errors.rb +9 -3
  364. data/lib/pwn/sast/token.rb +9 -3
  365. data/lib/pwn/sast/type_script_type_juggling.rb +9 -3
  366. data/lib/pwn/sast/use_after_free.rb +9 -3
  367. data/lib/pwn/sast/version.rb +9 -3
  368. data/lib/pwn/sast/window_location_hash.rb +9 -3
  369. data/lib/pwn/sast.rb +4 -0
  370. data/lib/pwn/sdr/decoder/adsb.rb +36 -5
  371. data/lib/pwn/sdr/decoder/apt.rb +9 -6
  372. data/lib/pwn/sdr/decoder/base.rb +74 -22
  373. data/lib/pwn/sdr/decoder/bluetooth.rb +17 -5
  374. data/lib/pwn/sdr/decoder/dect.rb +12 -3
  375. data/lib/pwn/sdr/decoder/dsp.rb +229 -39
  376. data/lib/pwn/sdr/decoder/flex.rb +59 -11
  377. data/lib/pwn/sdr/decoder/gps.rb +12 -3
  378. data/lib/pwn/sdr/decoder/gsm.rb +24 -4
  379. data/lib/pwn/sdr/decoder/iridium.rb +12 -3
  380. data/lib/pwn/sdr/decoder/lora.rb +13 -4
  381. data/lib/pwn/sdr/decoder/lte.rb +27 -3
  382. data/lib/pwn/sdr/decoder/morse.rb +12 -3
  383. data/lib/pwn/sdr/decoder/p25.rb +12 -3
  384. data/lib/pwn/sdr/decoder/pager.rb +8 -5
  385. data/lib/pwn/sdr/decoder/pocsag.rb +29 -9
  386. data/lib/pwn/sdr/decoder/rds.rb +14 -8
  387. data/lib/pwn/sdr/decoder/rfid.rb +12 -3
  388. data/lib/pwn/sdr/decoder/rtl433.rb +12 -3
  389. data/lib/pwn/sdr/decoder/rtty.rb +8 -5
  390. data/lib/pwn/sdr/decoder/wifi.rb +12 -3
  391. data/lib/pwn/sdr/decoder/zigbee.rb +12 -3
  392. data/lib/pwn/sdr/decoder.rb +9 -0
  393. data/lib/pwn/sdr/flipper_zero.rb +17 -10
  394. data/lib/pwn/sdr/frequency_allocation.rb +4 -1
  395. data/lib/pwn/sdr/gqrx.rb +178 -119
  396. data/lib/pwn/sdr/rfidler.rb +4 -1
  397. data/lib/pwn/sdr/son_micro_rfid.rb +37 -24
  398. data/lib/pwn/sdr.rb +14 -0
  399. data/lib/pwn/sessions.rb +86 -16
  400. data/lib/pwn/setup.rb +106 -37
  401. data/lib/pwn/version.rb +1 -1
  402. data/lib/pwn/www/app_cobalt_io.rb +11 -5
  403. data/lib/pwn/www/bing.rb +10 -5
  404. data/lib/pwn/www/bug_crowd.rb +11 -5
  405. data/lib/pwn/www/checkip.rb +8 -4
  406. data/lib/pwn/www/coinbase_pro.rb +11 -5
  407. data/lib/pwn/www/duckduckgo.rb +12 -6
  408. data/lib/pwn/www/facebook.rb +11 -5
  409. data/lib/pwn/www/github.rb +11 -5
  410. data/lib/pwn/www/google.rb +11 -5
  411. data/lib/pwn/www/hacker_one.rb +20 -9
  412. data/lib/pwn/www/linkedin.rb +11 -5
  413. data/lib/pwn/www/pandora.rb +11 -5
  414. data/lib/pwn/www/pastebin.rb +9 -4
  415. data/lib/pwn/www/paypal.rb +19 -11
  416. data/lib/pwn/www/synack.rb +11 -5
  417. data/lib/pwn/www/torch.rb +13 -8
  418. data/lib/pwn/www/trading_view.rb +11 -5
  419. data/lib/pwn/www/twitter.rb +11 -5
  420. data/lib/pwn/www/uber.rb +11 -5
  421. data/lib/pwn/www/upwork.rb +11 -5
  422. data/lib/pwn/www/wayback_machine.rb +12 -6
  423. data/lib/pwn/www/youtube.rb +10 -5
  424. data/lib/pwn/www.rb +4 -0
  425. data/spec/conventions_spec.rb +118 -2
  426. data/spec/integration/help_contract_spec.rb +2 -0
  427. data/spec/lib/pwn/ai/agent/reward_spec.rb +9 -0
  428. data/spec/lib/pwn/plugins/aflplusplus_spec.rb +13 -0
  429. data/spec/lib/pwn/plugins/artifact_registry_spec.rb +13 -0
  430. data/spec/lib/pwn/plugins/binary_parser_spec.rb +21 -0
  431. data/spec/lib/pwn/plugins/credential_attack_spec.rb +13 -0
  432. data/spec/lib/pwn/plugins/exploit_db_spec.rb +13 -0
  433. data/spec/lib/pwn/plugins/exploit_dev_spec.rb +23 -0
  434. data/spec/lib/pwn/plugins/frida_spec.rb +13 -0
  435. data/spec/lib/pwn/plugins/gdb_spec.rb +13 -0
  436. data/spec/lib/pwn/plugins/jobs_spec.rb +13 -0
  437. data/spec/lib/pwn/plugins/k8s_spec.rb +13 -0
  438. data/spec/lib/pwn/plugins/nuclei_spec.rb +13 -0
  439. data/spec/lib/pwn/plugins/preflight_checker_spec.rb +23 -0
  440. data/spec/lib/pwn/plugins/process_tube_spec.rb +13 -0
  441. data/spec/lib/pwn/plugins/radare2_spec.rb +13 -0
  442. data/spec/lib/pwn/plugins/recon_spec.rb +26 -0
  443. data/spec/lib/pwn/plugins/semgrep_spec.rb +13 -0
  444. data/spec/lib/pwn/plugins/sqlmap_spec.rb +13 -0
  445. data/spec/lib/pwn/plugins/volatility_spec.rb +13 -0
  446. data/spec/lib/pwn/req_queue_spec.rb +168 -0
  447. data/third_party/pwn_rdoc.jsonl +160 -5
  448. metadata +63 -7
  449. data/etc/default_skills/pwn/memory_index/references/urls.md +0 -4
  450. data/etc/default_skills/pwn/plugins/transparent_browser/references/urls.md +0 -3
@@ -248,33 +248,52 @@ module PWN
248
248
  # Display Usage Information
249
249
 
250
250
  public_class_method def self.help
251
- <<~HELP
252
- Usage:
253
- plan = PWN::Bounty::LifecycleAuthzReplay.load_plan(
254
- yaml_path: '/path/to/lifecycle_authz_replay.yaml'
255
- )
256
-
257
- run_obj = PWN::Bounty::LifecycleAuthzReplay.start_run(
258
- plan: plan,
259
- output_dir: '/tmp/evidence-bundles'
260
- )
261
-
262
- PWN::Bounty::LifecycleAuthzReplay.record_observation(
263
- run_obj: run_obj,
264
- checkpoint: 'post_change_t0',
265
- actor: 'revoked_user',
266
- surface: 'repo_settings_page',
267
- status: :accessible,
268
- request: { method: 'GET', path: '/org/repo/settings' },
269
- response: { http_status: 200 },
270
- notes: 'Still reachable after remove action',
271
- artifact_paths: ['/tmp/screenshot.png']
272
- )
273
-
274
- summary = PWN::Bounty::LifecycleAuthzReplay.finalize_run(
275
- run_obj: run_obj
276
- )
277
- HELP
251
+ puts "USAGE:
252
+ # Run load plan and return its result
253
+ #{self}.load_plan(
254
+ yaml_path: 'required - /path/to/lifecycle_authz_replay.yaml'
255
+ )
256
+
257
+ # Run start run and return its result
258
+ #{self}.start_run(
259
+ yaml_path: 'optional - /path/to/lifecycle_authz_replay.yaml',
260
+ output_dir: 'required - /tmp/evidence_bundle',
261
+ plan: 'required - normalized_plan_hash',
262
+ run_id: 'required - run id value consumed by #start_run'
263
+ )
264
+
265
+ # Run record observation and return its result
266
+ #{self}.record_observation(
267
+ run_obj: 'required - run obj value consumed by #record_observation',
268
+ checkpoint: 'required - checkpoint value consumed by #record_observation',
269
+ actor: 'required - actor value consumed by #record_observation',
270
+ surface: 'required - repo_settings_page',
271
+ status: 'required - status value consumed by #record_observation',
272
+ request: 'optional - { method: GET, path: /org/repo/settings }',
273
+ response: 'optional - { http_status: 200 }',
274
+ notes: 'optional - Still reachable after collaborator removal',
275
+ artifact_paths: 'optional - Array [/tmp/screen.png]'
276
+ )
277
+
278
+ # Run finalize run and return its result
279
+ #{self}.finalize_run(
280
+ run_obj: 'required - run obj value consumed by #finalize_run'
281
+ )
282
+
283
+ # Run normalize plan and return its result
284
+ #{self}.normalize_plan(
285
+ plan: 'optional - plan value consumed by #normalize_plan',
286
+ campaign: 'required - { id: acme-revoke }',
287
+ actors: 'optional - [owner, revoked_user]',
288
+ surfaces: 'optional - surfaces value consumed by #normalize_plan',
289
+ checkpoints: 'required - [pre_change, post_change_t0]',
290
+ plan_id_hint: 'required - plan id hint value consumed by #normalize_plan'
291
+ )
292
+
293
+ # Print the AUTHOR(S) string for this module.
294
+ #{self}.authors
295
+ "
296
+ constants.sort
278
297
  end
279
298
 
280
299
  private_class_method def self.find_stale_access_findings(opts = {})
data/lib/pwn/bounty.rb CHANGED
@@ -16,6 +16,10 @@ module PWN
16
16
  end
17
17
 
18
18
  public_class_method def self.help
19
+ puts "USAGE:
20
+ # Display a List of Every PWN::Bounty Module
21
+ #{self}.authors
22
+ "
19
23
  constants.sort
20
24
  end
21
25
  end
data/lib/pwn/config.rb CHANGED
@@ -1050,39 +1050,105 @@ module PWN
1050
1050
 
1051
1051
  public_class_method def self.help
1052
1052
  puts "USAGE:
1053
+ # Run env template and return its result
1054
+ #{self}.env_template
1055
+
1056
+ # Run default env and return its result
1053
1057
  #{self}.default_env(
1054
1058
  pwn_env_path: 'optional - Path to pwn.yaml file. Defaults to ~/.pwn/pwn.yaml'
1055
1059
  )
1056
1060
 
1061
+ # Run redact sensitive artifacts and return its result
1057
1062
  #{self}.redact_sensitive_artifacts(
1058
1063
  config: 'optional - Hash to redact sensitive artifacts from. Defaults to PWN::Env'
1059
1064
  )
1060
1065
 
1061
- #{self}.pwn_skills_path
1066
+ # Run init driver options and return its result
1067
+ #{self}.init_driver_options
1068
+
1069
+ # Run refresh env and return its result
1070
+ #{self}.refresh_env(
1071
+ pwn_env_path: 'required - pwn env path value consumed by #refresh_env',
1072
+ pwn_dec_path: 'required - pwn dec path value consumed by #refresh_env',
1073
+ key: 'optional - key value consumed by #refresh_env',
1074
+ iv: 'optional - iv value consumed by #refresh_env'
1075
+ )
1062
1076
 
1063
- #{self}.sanitize_skill_name(name: '...')
1077
+ # Run pwn skills path and return its result
1078
+ #{self}.pwn_skills_path(
1079
+ pwn_env_path: 'optional - Path to pwn.yaml file. Defaults to ~/.pwn/pwn.yaml'
1080
+ )
1064
1081
 
1082
+ # Run sanitize skill name and return its result
1083
+ #{self}.sanitize_skill_name(
1084
+ name: 'required - binary or identifier name'
1085
+ )
1086
+
1087
+ # Run parse skill frontmatter and return its result
1088
+ #{self}.parse_skill_frontmatter(
1089
+ content: 'optional - content value consumed by #parse_skill_frontmatter'
1090
+ )
1091
+
1092
+ # Run parse skill references and return its result
1093
+ #{self}.parse_skill_references(
1094
+ content: 'optional - content value consumed by #parse_skill_references'
1095
+ )
1096
+
1097
+ # Run write skill and return its result
1065
1098
  #{self}.write_skill(
1066
- name: 'required', content: 'required',
1067
- description: 'optional', references: 'optional Array',
1068
- license: 'optional', metadata: 'optional Hash',
1069
- allowed_tools: 'optional Array', pwn_skills_path: 'optional'
1099
+ name: 'required - free-form; sanitised to [a-z0-9-]',
1100
+ content: 'required - markdown body (WITHOUT frontmatter)',
1101
+ description: 'optional - 1..1024 chars; derived from body when omitted',
1102
+ references: 'optional - Array of URLs / CWE / CVE / ATT&CK / NIST ids',
1103
+ license: 'optional - SPDX id or free text',
1104
+ metadata: 'optional - Hash of arbitrary metadata',
1105
+ allowed_tools: 'optional - Array of toolset names',
1106
+ pwn_skills_path: 'optional - override skills root (defaults to pwn_skills_path)'
1070
1107
  )
1071
1108
 
1072
- #{self}.load_skills(pwn_skills_path: 'optional')
1109
+ # Run migrate legacy skills and return its result
1110
+ #{self}.migrate_legacy_skills(
1111
+ pwn_skills_path: 'optional - override skills root (defaults to pwn_skills_path)',
1112
+ delete_legacy: 'optional - remove flat file after migration (default true)'
1113
+ )
1073
1114
 
1074
- #{self}.migrate_legacy_skills(pwn_skills_path: 'optional', delete_legacy: true)
1115
+ # Run default skill names and return its result
1116
+ #{self}.default_skill_names(
1117
+ source: 'optional - source value consumed by #default_skill_names',
1118
+ root: 'optional - root value consumed by #default_skill_names'
1119
+ )
1075
1120
 
1076
- #{self}.install_default_skills(pwn_skills_path: 'optional')
1077
- #{self}.default_skill_names
1121
+ # Run default skills dir and return its result
1122
+ #{self}.default_skills_dir
1078
1123
 
1079
- #{self}.refresh_env(
1080
- pwn_env_path: 'optional - Path to pwn.yaml file. Defaults to ~/.pwn/pwn.yaml',
1081
- pwn_dec_path: 'optional - Path to pwn.yaml.decryptor file. Defaults to ~/.pwn/pwn.yaml.decryptor'
1124
+ # Seed bundled skills into ~/.pwn/skills (or pwn_skills_path:)
1125
+ #{self}.install_default_skills(
1126
+ pwn_skills_path: 'optional - pwn skills path value consumed by #install_default_skills',
1127
+ source: 'optional - source value consumed by #install_default_skills'
1128
+ )
1129
+
1130
+ # Run load skills and return its result
1131
+ #{self}.load_skills(
1132
+ pwn_skills_path: 'optional - Path to skills folder. Defaults to ~/.pwn/skills',
1133
+ references: 'optional - frontmatter:, loaded:?, error:? }'
1082
1134
  )
1083
1135
 
1136
+ # Run pwn memory path and return its result
1137
+ #{self}.pwn_memory_path
1138
+
1139
+ # Run load memory and return its result
1140
+ #{self}.load_memory
1141
+
1142
+ # Run pwn sessions path and return its result
1143
+ #{self}.pwn_sessions_path
1144
+
1145
+ # Run pwn cron path and return its result
1146
+ #{self}.pwn_cron_path
1147
+
1148
+ # Print the AUTHOR(S) string for this module.
1084
1149
  #{self}.authors
1085
1150
  "
1151
+ constants.sort
1086
1152
  end
1087
1153
  end
1088
1154
  end
data/lib/pwn/cron.rb CHANGED
@@ -1518,26 +1518,303 @@ module PWN
1518
1518
 
1519
1519
  # Display Usage for this Module
1520
1520
  public_class_method def self.help
1521
- puts <<~USAGE
1522
- USAGE:
1523
- PWN::Cron.create(schedule: '0 * * * *', prompt: 'Run daily recon on target.com using NmapIt and report', name: 'daily-recon')
1524
- PWN::Cron.list
1525
- res = PWN::Cron.run(id: 'abc123')
1526
- PWN::Cron.enable(id: 'abc123')
1527
- PWN::Cron.disable(id: 'abc123')
1528
- PWN::Cron.remove(id: 'abc123')
1529
- # OS-native persistence (systemd --user / launchd / schtasks / crontab)
1530
- PWN::Cron.install_scheduler
1531
- PWN::Cron.uninstall_scheduler
1532
- PWN::Cron.sync_scheduler
1533
- PWN::Cron.scheduler_backend
1534
- PWN::Cron.install_defaults # seed S1/P3/W2/M1 curriculum jobs (idempotent)
1535
- PWN::Cron.ensure_worker # start/restart the background scheduler
1536
- PWN::Cron.worker_status
1537
- PWN::Cron.tick # fire currently-due jobs once
1538
-
1539
- #{self}.authors
1540
- USAGE
1521
+ puts "USAGE:
1522
+ # Run cron dir and return its result
1523
+ #{self}.cron_dir
1524
+
1525
+ # Run list and return its result
1526
+ #{self}.list
1527
+
1528
+ # Run create and return its result
1529
+ #{self}.create(
1530
+ name: 'optional - binary or identifier name (defaults to job-)',
1531
+ schedule: 'required - required e.g. 0 * * * * or 30m or every 2h',
1532
+ prompt: 'optional - pwn-ai prompt to run',
1533
+ ruby: 'optional - ruby snippet to eval',
1534
+ script: 'optional - path to external script',
1535
+ delivery: 'optional - log|stdout (default log)',
1536
+ enabled: 'optional - enabled value consumed by #create',
1537
+ install_crontab: 'optional - install crontab value consumed by #create'
1538
+ )
1539
+
1540
+ # Executes the job (for pwn-ai prompt it will use current active AI engine
1541
+ #{self}.run(
1542
+ id: 'required - id value consumed by #run'
1543
+ )
1544
+
1545
+ # Run remove and return its result
1546
+ #{self}.remove(
1547
+ id: 'optional - id value consumed by #remove'
1548
+ )
1549
+
1550
+ # Run enable and return its result
1551
+ #{self}.enable(
1552
+ id: 'optional - id value consumed by #enable'
1553
+ )
1554
+
1555
+ # Run disable and return its result
1556
+ #{self}.disable(
1557
+ id: 'optional - id value consumed by #disable'
1558
+ )
1559
+
1560
+ # Install a crontab line that invokes this job via pwn
1561
+ #{self}.install_crontab_entry
1562
+
1563
+ # Run install defaults and return its result
1564
+ #{self}.install_defaults
1565
+
1566
+ # Runtime paths follow cron_dir (and therefore a stubbed CRON_DIR)
1567
+ #{self}.jobs_file
1568
+
1569
+ # Run pid file and return its result
1570
+ #{self}.pid_file
1571
+
1572
+ # Run worker log and return its result
1573
+ #{self}.worker_log
1574
+
1575
+ # Run due and return its result
1576
+ #{self}.due?(
1577
+ schedule: 'required - 5-field cron or relative (30m, every 2h)',
1578
+ last_run: 'optional - Time / iso8601 / nil',
1579
+ now: 'optional - Time (default Time.now)'
1580
+ )
1581
+
1582
+ # Run due jobs and return its result
1583
+ #{self}.due_jobs(
1584
+ now: 'optional - now value consumed by #due_jobs (defaults to Time.now)'
1585
+ )
1586
+
1587
+ # Fires every currently-due enabled job via run(). Returns the list
1588
+ #{self}.run_due(
1589
+ now: 'optional - now value consumed by #run_due (defaults to Time.now)',
1590
+ jobs: 'optional - jobs value consumed by #run_due'
1591
+ )
1592
+
1593
+ # Run worker status and return its result
1594
+ #{self}.worker_status
1595
+
1596
+ # Idempotent. With restart:true (default) a live worker is replaced
1597
+ #{self}.start_worker(
1598
+ interval: 'optional - interval value consumed by #start_worker',
1599
+ foreground: 'optional - foreground value consumed by #start_worker',
1600
+ restart: 'optional - restart value consumed by #start_worker (defaults to foreground)'
1601
+ )
1602
+
1603
+ # Run stop worker and return its result
1604
+ #{self}.stop_worker
1605
+
1606
+ # Single tick used by the loop AND by tests (no sleep)
1607
+ #{self}.tick(
1608
+ now: 'optional - now value consumed by #tick'
1609
+ )
1610
+
1611
+ # Blocking poll loop. `once: true` runs a single tick then returns
1612
+ #{self}.worker_loop(
1613
+ interval: 'optional - interval value consumed by #worker_loop',
1614
+ once: 'optional - once value consumed by #worker_loop'
1615
+ )
1616
+
1617
+ # any setup action so YAML-only default jobs actually fire
1618
+ #{self}.ensure_worker(
1619
+ interval: 'optional - interval value consumed by #ensure_worker (defaults to DEFAULT_INTERVAL)'
1620
+ )
1621
+
1622
+ # Append an @reboot line so the worker comes back after a reboot
1623
+ #{self}.install_worker_crontab
1624
+
1625
+ # Run os type and return its result
1626
+ #{self}.os_type
1627
+
1628
+ # Run windows and return its result
1629
+ #{self}.windows?
1630
+
1631
+ # Run scheduler file and return its result
1632
+ #{self}.scheduler_file
1633
+
1634
+ # Run scheduler config and return its result
1635
+ #{self}.scheduler_config
1636
+
1637
+ # Run cron enabled and return its result
1638
+ #{self}.cron_enabled?
1639
+
1640
+ # Run persist scheduler config and return its result
1641
+ #{self}.persist_scheduler_config(
1642
+ backend: 'optional - backend value consumed by #persist_scheduler_config'
1643
+ )
1644
+
1645
+ # Run apply native and return its result
1646
+ #{self}.apply_native?(
1647
+ apply: 'optional - apply value consumed by #apply_native?'
1648
+ )
1649
+
1650
+ # Run which bin and return its result
1651
+ #{self}.which_bin(
1652
+ name: 'required - binary or identifier name'
1653
+ )
1654
+
1655
+ # Run crontab available and return its result
1656
+ #{self}.crontab_available?
1657
+
1658
+ # Run systemd user available and return its result
1659
+ #{self}.systemd_user_available?
1660
+
1661
+ # Run schtasks available and return its result
1662
+ #{self}.schtasks_available?
1663
+
1664
+ # Run scheduler backend and return its result
1665
+ #{self}.scheduler_backend(
1666
+ backend: 'optional - backend value consumed by #scheduler_backend',
1667
+ os: 'optional - os value consumed by #scheduler_backend'
1668
+ )
1669
+
1670
+ # Run native unit dir and return its result
1671
+ #{self}.native_unit_dir(
1672
+ backend: 'optional - backend value consumed by #native_unit_dir'
1673
+ )
1674
+
1675
+ # Run ruby lib dir and return its result
1676
+ #{self}.ruby_lib_dir
1677
+
1678
+ # Run ruby eval argv and return its result
1679
+ #{self}.ruby_eval_argv(
1680
+ snippet: 'optional - snippet value consumed by #ruby_eval_argv'
1681
+ )
1682
+
1683
+ # Run ruby eval shell and return its result
1684
+ #{self}.ruby_eval_shell(
1685
+ log: 'optional - log value consumed by #ruby_eval_shell'
1686
+ )
1687
+
1688
+ # Convert a 5-field cron expression into a portable calendar hash
1689
+ #{self}.cron_to_calendar(
1690
+ schedule: 'optional - schedule value consumed by #cron_to_calendar'
1691
+ )
1692
+
1693
+ # Run systemd on calendar and return its result
1694
+ #{self}.systemd_on_calendar(
1695
+ calendar: 'optional - calendar value consumed by #systemd_on_calendar',
1696
+ schedule: 'optional - schedule value consumed by #systemd_on_calendar'
1697
+ )
1698
+
1699
+ # Run launchd calendar interval and return its result
1700
+ #{self}.launchd_calendar_interval(
1701
+ calendar: 'optional - calendar value consumed by #launchd_calendar_interval',
1702
+ schedule: 'optional - schedule value consumed by #launchd_calendar_interval'
1703
+ )
1704
+
1705
+ # Run schtasks spec and return its result
1706
+ #{self}.schtasks_spec(
1707
+ calendar: 'optional - calendar value consumed by #schtasks_spec',
1708
+ schedule: 'optional - schedule value consumed by #schtasks_spec'
1709
+ )
1710
+
1711
+ # Run install scheduler and return its result
1712
+ #{self}.install_scheduler(
1713
+ enabled: 'optional - enabled value consumed by #install_scheduler',
1714
+ backend: 'optional - optional force',
1715
+ apply: 'optional - optional (default true unless PWN_CRON_DIR is set',
1716
+ sync_jobs: 'optional - sync jobs value consumed by #install_scheduler'
1717
+ )
1718
+
1719
+ # Run uninstall scheduler and return its result
1720
+ #{self}.uninstall_scheduler(
1721
+ backend: 'optional - backend value consumed by #uninstall_scheduler',
1722
+ persist: 'optional - persist value consumed by #uninstall_scheduler'
1723
+ )
1724
+
1725
+ # Run sync scheduler and return its result
1726
+ #{self}.sync_scheduler
1727
+
1728
+ # Run scheduler status and return its result
1729
+ #{self}.scheduler_status
1730
+
1731
+ # Run install native job and return its result
1732
+ #{self}.install_native_job(
1733
+ job: 'optional - job value consumed by #install_native_job',
1734
+ backend: 'optional - backend value consumed by #install_native_job'
1735
+ )
1736
+
1737
+ # Run remove native job and return its result
1738
+ #{self}.remove_native_job(
1739
+ job: 'optional - job value consumed by #remove_native_job',
1740
+ id: 'optional - id value consumed by #remove_native_job',
1741
+ name: 'optional - binary or identifier name',
1742
+ backend: 'optional - backend value consumed by #remove_native_job'
1743
+ )
1744
+
1745
+ # Run sync native jobs and return its result
1746
+ #{self}.sync_native_jobs(
1747
+ backend: 'optional - backend value consumed by #sync_native_jobs'
1748
+ )
1749
+
1750
+ # ---- crontab -------------------------------------------------------
1751
+ #{self}.install_crontab_worker
1752
+
1753
+ # Run install crontab job and return its result
1754
+ #{self}.install_crontab_job(
1755
+ job: 'optional - job value consumed by #install_crontab_job'
1756
+ )
1757
+
1758
+ # Run uninstall crontab and return its result
1759
+ #{self}.uninstall_crontab
1760
+
1761
+ # Run uninstall crontab job and return its result
1762
+ #{self}.uninstall_crontab_job(
1763
+ job: 'optional - job value consumed by #uninstall_crontab_job'
1764
+ )
1765
+
1766
+ # ---- systemd --user ------------------------------------------------
1767
+ #{self}.install_systemd_user_worker
1768
+
1769
+ # Run install systemd user job and return its result
1770
+ #{self}.install_systemd_user_job(
1771
+ job: 'optional - job value consumed by #install_systemd_user_job'
1772
+ )
1773
+
1774
+ # Run uninstall systemd user and return its result
1775
+ #{self}.uninstall_systemd_user
1776
+
1777
+ # Run uninstall systemd user job and return its result
1778
+ #{self}.uninstall_systemd_user_job(
1779
+ job: 'optional - job value consumed by #uninstall_systemd_user_job'
1780
+ )
1781
+
1782
+ # ---- launchd -------------------------------------------------------
1783
+ #{self}.install_launchd_worker
1784
+
1785
+ # Run install launchd job and return its result
1786
+ #{self}.install_launchd_job(
1787
+ job: 'optional - job value consumed by #install_launchd_job'
1788
+ )
1789
+
1790
+ # Run uninstall launchd and return its result
1791
+ #{self}.uninstall_launchd
1792
+
1793
+ # Run uninstall launchd job and return its result
1794
+ #{self}.uninstall_launchd_job(
1795
+ job: 'optional - job value consumed by #uninstall_launchd_job'
1796
+ )
1797
+
1798
+ # ---- schtasks (Windows) -------------------------------------------
1799
+ #{self}.install_schtasks_worker
1800
+
1801
+ # Run install schtasks job and return its result
1802
+ #{self}.install_schtasks_job(
1803
+ job: 'optional - job value consumed by #install_schtasks_job'
1804
+ )
1805
+
1806
+ # Run uninstall schtasks and return its result
1807
+ #{self}.uninstall_schtasks
1808
+
1809
+ # Run uninstall schtasks job and return its result
1810
+ #{self}.uninstall_schtasks_job(
1811
+ job: 'optional - job value consumed by #uninstall_schtasks_job'
1812
+ )
1813
+
1814
+ # Print the AUTHOR(S) string for this module.
1815
+ #{self}.authors
1816
+ "
1817
+ constants.sort
1541
1818
  end
1542
1819
  end
1543
1820
  end
data/lib/pwn/driver.rb CHANGED
@@ -69,26 +69,10 @@ module PWN
69
69
 
70
70
  public_class_method def self.help
71
71
  puts "USAGE:
72
- # Load default driver options into PWN::Env
73
- opts = PWN::Env[:driver_opts]
74
- #{self}::Parser.new.parse(&:on).parse!
75
-
76
- # Add more options by passing a block to the parser
77
- opts = PWN::Env[:driver_opts]
78
- #{self}::Parser.new do |options|
79
- # Boolean option
80
- options.on('-b', '--boolean') do |o|
81
- opts[:boolean] = o
82
- end
83
-
84
- # String option
85
- options.on('-sSTRING', '--string=STRING') do |o|
86
- opts[:string] = o
87
- end
88
- end.parse!
89
-
72
+ # Print the AUTHOR(S) string for this module.
90
73
  #{self}.authors
91
74
  "
75
+ constants.sort
92
76
  end
93
77
  end
94
78
  end
@@ -455,22 +455,76 @@ module PWN
455
455
 
456
456
  public_class_method def self.help
457
457
  puts "USAGE:
458
+ # Run available and return its result
458
459
  #{self}.available?
460
+
461
+ # Run info and return its result
459
462
  #{self}.info
460
- #{self}.list_uris
461
- ctx = #{self}.open(uri: 'ip:192.168.2.1') # or nil for default
462
- #{self}.device_info(context: ctx)
463
- #{self}.configure(context: ctx, freq_hz:, rate_hz: 2_500_000, gain_db: nil)
464
- h = #{self}.start_rx(context: ctx, samples: 262_144)
465
- iq = #{self}.read_sync(handle: h) # cs16le interleaved String
466
- #{self}.stop_rx(handle: h)
467
- #{self}.close(context: ctx)
468
-
469
- # one-shot
470
- cap = #{self}.capture(freq_hz: 1090e6, rate_hz: 2_500_000, bytes: 1_048_576)
471
463
 
464
+ # Run list uris and return its result
465
+ #{self}.list_uris(
466
+ backends: 'optional - backends value consumed by #list_uris'
467
+ )
468
+
469
+ # Open a session or connection and return a handle.
470
+ #{self}.open(
471
+ uri: 'required - URI or URL string',
472
+ timeout_ms: 'optional - timeout ms value consumed by #open'
473
+ )
474
+
475
+ # Close a session previously returned by #open.
476
+ #{self}.close(
477
+ context: 'optional - context value consumed by #close'
478
+ )
479
+
480
+ # Run device info and return its result
481
+ #{self}.device_info(
482
+ context: 'required - context value consumed by #device_info'
483
+ )
484
+
485
+ # Run configure and return its result
486
+ #{self}.configure(
487
+ context: 'required - pointer from .open',
488
+ freq_hz: 'required - RX LO frequency Hz',
489
+ rate_hz: 'optional - sample rate (default 2_500_000)',
490
+ bw_hz: 'optional - RF bandwidth (default = rate_hz)',
491
+ gain_db: 'optional - manual gain dB; nil = slow_attack AGC',
492
+ gain_mode: 'optional - slow_attack|fast_attack|manual|hybrid'
493
+ )
494
+
495
+ # Run start rx and return its result
496
+ #{self}.start_rx(
497
+ context: 'required - pointer from .open',
498
+ samples: 'optional - samples-per-refill (default 262144)',
499
+ cyclic: 'optional - cyclic buffer (default false)'
500
+ )
501
+
502
+ # Run read sync and return its result
503
+ #{self}.read_sync(
504
+ handle: 'required - handle value consumed by #read_sync'
505
+ )
506
+
507
+ # Run stop rx and return its result
508
+ #{self}.stop_rx(
509
+ handle: 'optional - handle value consumed by #stop_rx'
510
+ )
511
+
512
+ # High-level one-shot: open → configure → start_rx → N refills → stop → close
513
+ #{self}.capture(
514
+ freq_hz: 'required - freq hz value consumed by #capture',
515
+ rate_hz: 'optional - rate hz value consumed by #capture',
516
+ bytes: 'optional - 1_048_576, # approximate payload size',
517
+ uri: 'optional - URI or URL string',
518
+ gain_db: 'optional - gain db value consumed by #capture',
519
+ timeout_ms: 'optional - timeout ms value consumed by #capture',
520
+ bw_hz: 'optional - bw hz value consumed by #capture',
521
+ gain_mode: 'optional - gain mode value consumed by #capture'
522
+ )
523
+
524
+ # Print the AUTHOR(S) string for this module.
472
525
  #{self}.authors
473
526
  "
527
+ constants.sort
474
528
  end
475
529
 
476
530
  class << self