pwn 0.5.708 → 0.5.709

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 (434) hide show
  1. checksums.yaml +4 -4
  2. data/documentation/Installation.md +1 -0
  3. data/etc/default_skills/pwn/ai/agent/extrospection/osint/bridges/SKILL.md +30 -8
  4. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/SKILL.md +30 -8
  5. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/references/urls.md +1 -1
  6. data/etc/default_skills/pwn/ai/agent/extrospection/references/urls.md +0 -1
  7. data/etc/default_skills/pwn/memory_index/SKILL.md +0 -4
  8. data/etc/default_skills/pwn/plugins/aflplusplus/SKILL.md +48 -0
  9. data/etc/default_skills/pwn/plugins/android/SKILL.md +1 -0
  10. data/etc/default_skills/pwn/plugins/artifact_registry/SKILL.md +49 -0
  11. data/etc/default_skills/pwn/plugins/binary_parser/SKILL.md +54 -0
  12. data/etc/default_skills/pwn/plugins/credential_attack/SKILL.md +51 -0
  13. data/etc/default_skills/pwn/plugins/doctor/SKILL.md +57 -0
  14. data/etc/default_skills/pwn/plugins/exploit_dev/SKILL.md +61 -0
  15. data/etc/default_skills/pwn/plugins/frida/SKILL.md +49 -0
  16. data/etc/default_skills/pwn/plugins/gdb/SKILL.md +52 -0
  17. data/etc/default_skills/pwn/plugins/jobs/SKILL.md +51 -0
  18. data/etc/default_skills/pwn/plugins/nuclei/SKILL.md +48 -0
  19. data/etc/default_skills/pwn/plugins/process_tube/SKILL.md +52 -0
  20. data/etc/default_skills/pwn/plugins/radare2/SKILL.md +59 -0
  21. data/etc/default_skills/pwn/plugins/recon/SKILL.md +55 -0
  22. data/etc/default_skills/pwn/plugins/recon/references/urls.md +5 -0
  23. data/etc/default_skills/pwn/plugins/sqlmap/SKILL.md +48 -0
  24. data/etc/default_skills/pwn/plugins/transparent_browser/SKILL.md +0 -4
  25. data/etc/default_skills/pwn/plugins/volatility/SKILL.md +48 -0
  26. data/lib/pwn/ai/agent/assembly.rb +4 -1
  27. data/lib/pwn/ai/agent/btc.rb +4 -1
  28. data/lib/pwn/ai/agent/burp_suite.rb +5 -2
  29. data/lib/pwn/ai/agent/curriculum.rb +89 -30
  30. data/lib/pwn/ai/agent/dispatch.rb +27 -16
  31. data/lib/pwn/ai/agent/extrospection/osint/bridges.rb +9 -18
  32. data/lib/pwn/ai/agent/extrospection/osint/social.rb +9 -18
  33. data/lib/pwn/ai/agent/extrospection.rb +185 -60
  34. data/lib/pwn/ai/agent/gqrx.rb +4 -1
  35. data/lib/pwn/ai/agent/hacker_one.rb +5 -2
  36. data/lib/pwn/ai/agent/learning.rb +142 -25
  37. data/lib/pwn/ai/agent/loop.rb +53 -46
  38. data/lib/pwn/ai/agent/metrics.rb +133 -23
  39. data/lib/pwn/ai/agent/mistakes.rb +126 -17
  40. data/lib/pwn/ai/agent/open_goal.rb +25 -9
  41. data/lib/pwn/ai/agent/policy.rb +158 -18
  42. data/lib/pwn/ai/agent/prompt_builder.rb +21 -11
  43. data/lib/pwn/ai/agent/prompt_cache.rb +44 -13
  44. data/lib/pwn/ai/agent/reflect.rb +9 -5
  45. data/lib/pwn/ai/agent/registry.rb +65 -12
  46. data/lib/pwn/ai/agent/result.rb +19 -10
  47. data/lib/pwn/ai/agent/reward.rb +150 -32
  48. data/lib/pwn/ai/agent/sast.rb +4 -1
  49. data/lib/pwn/ai/agent/swarm.rb +72 -36
  50. data/lib/pwn/ai/agent/task_summarizer.rb +165 -36
  51. data/lib/pwn/ai/agent/tool_guard.rb +105 -6
  52. data/lib/pwn/ai/agent/transparent_browser.rb +4 -1
  53. data/lib/pwn/ai/agent/turn_finalizer.rb +41 -21
  54. data/lib/pwn/ai/agent/vuln_gen.rb +6 -3
  55. data/lib/pwn/ai/agent.rb +4 -0
  56. data/lib/pwn/ai/anthropic.rb +41 -7
  57. data/lib/pwn/ai/gemini.rb +21 -11
  58. data/lib/pwn/ai/grok.rb +44 -6
  59. data/lib/pwn/ai/http_retry.rb +40 -12
  60. data/lib/pwn/ai/ollama.rb +19 -10
  61. data/lib/pwn/ai/open_ai.rb +81 -30
  62. data/lib/pwn/ai/open_web_ui.rb +20 -14
  63. data/lib/pwn/ai/red_team/agent_protocol_abuse.rb +7 -1
  64. data/lib/pwn/ai/red_team/data_and_model_poisoning.rb +7 -1
  65. data/lib/pwn/ai/red_team/excessive_agency.rb +7 -1
  66. data/lib/pwn/ai/red_team/hidden_context_exposure.rb +7 -1
  67. data/lib/pwn/ai/red_team/insecure_output_handling.rb +7 -1
  68. data/lib/pwn/ai/red_team/jailbreak.rb +7 -1
  69. data/lib/pwn/ai/red_team/memory_poisoning.rb +7 -1
  70. data/lib/pwn/ai/red_team/multimodal_injection.rb +7 -1
  71. data/lib/pwn/ai/red_team/overreliance.rb +7 -1
  72. data/lib/pwn/ai/red_team/payload_splitting.rb +7 -1
  73. data/lib/pwn/ai/red_team/prompt_injection.rb +7 -1
  74. data/lib/pwn/ai/red_team/rag_poisoning.rb +7 -1
  75. data/lib/pwn/ai/red_team/sensitive_information_disclosure.rb +7 -1
  76. data/lib/pwn/ai/red_team/supply_chain.rb +7 -1
  77. data/lib/pwn/ai/red_team/system_prompt_extraction.rb +7 -1
  78. data/lib/pwn/ai/red_team/test_case_engine.rb +12 -9
  79. data/lib/pwn/ai/red_team/token_smuggling.rb +7 -1
  80. data/lib/pwn/ai/red_team/unbounded_consumption.rb +7 -1
  81. data/lib/pwn/ai/red_team/vector_and_embedding_weaknesses.rb +7 -1
  82. data/lib/pwn/ai/red_team.rb +4 -0
  83. data/lib/pwn/ai.rb +4 -0
  84. data/lib/pwn/aws/acm.rb +5 -2
  85. data/lib/pwn/aws/api_gateway.rb +10 -7
  86. data/lib/pwn/aws/app_stream.rb +5 -2
  87. data/lib/pwn/aws/application_auto_scaling.rb +5 -2
  88. data/lib/pwn/aws/application_discovery_service.rb +5 -2
  89. data/lib/pwn/aws/auto_scaling.rb +5 -2
  90. data/lib/pwn/aws/batch.rb +5 -2
  91. data/lib/pwn/aws/budgets.rb +5 -2
  92. data/lib/pwn/aws/cloud_formation.rb +5 -2
  93. data/lib/pwn/aws/cloud_front.rb +7 -4
  94. data/lib/pwn/aws/cloud_hsm.rb +5 -2
  95. data/lib/pwn/aws/cloud_search.rb +5 -2
  96. data/lib/pwn/aws/cloud_search_domain.rb +5 -2
  97. data/lib/pwn/aws/cloud_trail.rb +5 -2
  98. data/lib/pwn/aws/cloud_watch.rb +5 -2
  99. data/lib/pwn/aws/cloud_watch_events.rb +5 -2
  100. data/lib/pwn/aws/cloud_watch_logs.rb +5 -2
  101. data/lib/pwn/aws/code_build.rb +5 -2
  102. data/lib/pwn/aws/code_commit.rb +5 -2
  103. data/lib/pwn/aws/code_deploy.rb +5 -2
  104. data/lib/pwn/aws/code_pipeline.rb +5 -2
  105. data/lib/pwn/aws/cognito_identity.rb +5 -2
  106. data/lib/pwn/aws/cognito_identity_provider.rb +5 -2
  107. data/lib/pwn/aws/cognito_sync.rb +5 -2
  108. data/lib/pwn/aws/config_service.rb +5 -2
  109. data/lib/pwn/aws/data_pipleline.rb +5 -2
  110. data/lib/pwn/aws/database_migration_service.rb +5 -2
  111. data/lib/pwn/aws/device_farm.rb +5 -2
  112. data/lib/pwn/aws/direct_connect.rb +5 -2
  113. data/lib/pwn/aws/directory_service.rb +5 -2
  114. data/lib/pwn/aws/dynamo_db.rb +5 -2
  115. data/lib/pwn/aws/dynamo_db_streams.rb +5 -2
  116. data/lib/pwn/aws/ec2.rb +5 -2
  117. data/lib/pwn/aws/ecr.rb +5 -2
  118. data/lib/pwn/aws/ecs.rb +5 -2
  119. data/lib/pwn/aws/efs.rb +5 -2
  120. data/lib/pwn/aws/elasti_cache.rb +5 -2
  121. data/lib/pwn/aws/elastic_beanstalk.rb +8 -5
  122. data/lib/pwn/aws/elastic_load_balancing.rb +5 -2
  123. data/lib/pwn/aws/elastic_load_balancing_v2.rb +6 -3
  124. data/lib/pwn/aws/elastic_transcoder.rb +5 -2
  125. data/lib/pwn/aws/elasticsearch_service.rb +5 -2
  126. data/lib/pwn/aws/emr.rb +5 -2
  127. data/lib/pwn/aws/firehose.rb +5 -2
  128. data/lib/pwn/aws/game_lift.rb +5 -2
  129. data/lib/pwn/aws/glacier.rb +6 -3
  130. data/lib/pwn/aws/health.rb +5 -2
  131. data/lib/pwn/aws/iam.rb +10 -4
  132. data/lib/pwn/aws/import_export.rb +5 -2
  133. data/lib/pwn/aws/inspector.rb +5 -2
  134. data/lib/pwn/aws/iot.rb +5 -2
  135. data/lib/pwn/aws/iot_data_plane.rb +5 -2
  136. data/lib/pwn/aws/kinesis.rb +5 -2
  137. data/lib/pwn/aws/kinesis_analytics.rb +5 -2
  138. data/lib/pwn/aws/kms.rb +5 -2
  139. data/lib/pwn/aws/lambda.rb +5 -2
  140. data/lib/pwn/aws/lambda_preview.rb +5 -2
  141. data/lib/pwn/aws/lex.rb +5 -2
  142. data/lib/pwn/aws/lightsail.rb +5 -2
  143. data/lib/pwn/aws/machine_learning.rb +5 -2
  144. data/lib/pwn/aws/marketplace_commerce_analytics.rb +5 -2
  145. data/lib/pwn/aws/marketplace_metering.rb +5 -2
  146. data/lib/pwn/aws/ops_works.rb +5 -2
  147. data/lib/pwn/aws/ops_works_cm.rb +5 -2
  148. data/lib/pwn/aws/pinpoint.rb +5 -2
  149. data/lib/pwn/aws/polly.rb +5 -2
  150. data/lib/pwn/aws/rds.rb +5 -2
  151. data/lib/pwn/aws/redshift.rb +5 -2
  152. data/lib/pwn/aws/rekognition.rb +5 -2
  153. data/lib/pwn/aws/route53.rb +5 -2
  154. data/lib/pwn/aws/route53_domains.rb +5 -2
  155. data/lib/pwn/aws/s3.rb +5 -2
  156. data/lib/pwn/aws/service_catalog.rb +5 -2
  157. data/lib/pwn/aws/ses.rb +5 -2
  158. data/lib/pwn/aws/shield.rb +5 -2
  159. data/lib/pwn/aws/simple_db.rb +5 -2
  160. data/lib/pwn/aws/sms.rb +5 -2
  161. data/lib/pwn/aws/snowball.rb +5 -2
  162. data/lib/pwn/aws/sns.rb +5 -2
  163. data/lib/pwn/aws/sqs.rb +5 -2
  164. data/lib/pwn/aws/ssm.rb +5 -2
  165. data/lib/pwn/aws/states.rb +5 -2
  166. data/lib/pwn/aws/storage_gateway.rb +5 -2
  167. data/lib/pwn/aws/sts.rb +4 -1
  168. data/lib/pwn/aws/support.rb +5 -2
  169. data/lib/pwn/aws/swf.rb +5 -2
  170. data/lib/pwn/aws/waf.rb +5 -2
  171. data/lib/pwn/aws/waf_regional.rb +5 -2
  172. data/lib/pwn/aws/workspaces.rb +5 -2
  173. data/lib/pwn/aws/x_ray.rb +5 -2
  174. data/lib/pwn/aws.rb +4 -0
  175. data/lib/pwn/banner/anon.rb +3 -0
  176. data/lib/pwn/banner/bubble.rb +3 -0
  177. data/lib/pwn/banner/cheshire.rb +3 -0
  178. data/lib/pwn/banner/code_cave.rb +3 -0
  179. data/lib/pwn/banner/dont_panic.rb +3 -0
  180. data/lib/pwn/banner/f_society.rb +3 -0
  181. data/lib/pwn/banner/fork_bomb.rb +3 -0
  182. data/lib/pwn/banner/jmp_esp.rb +3 -0
  183. data/lib/pwn/banner/matrix.rb +5 -1
  184. data/lib/pwn/banner/ninja.rb +3 -0
  185. data/lib/pwn/banner/off_the_air.rb +3 -0
  186. data/lib/pwn/banner/pirate.rb +3 -0
  187. data/lib/pwn/banner/radare2.rb +3 -0
  188. data/lib/pwn/banner/radare2_ai.rb +3 -0
  189. data/lib/pwn/banner/white_rabbit.rb +3 -0
  190. data/lib/pwn/banner.rb +6 -2
  191. data/lib/pwn/blockchain/btc.rb +8 -3
  192. data/lib/pwn/blockchain/eth.rb +10 -3
  193. data/lib/pwn/blockchain.rb +4 -0
  194. data/lib/pwn/bounty/lifecycle_authz_replay.rb +46 -27
  195. data/lib/pwn/bounty.rb +4 -0
  196. data/lib/pwn/config.rb +79 -13
  197. data/lib/pwn/cron.rb +297 -20
  198. data/lib/pwn/driver.rb +2 -18
  199. data/lib/pwn/ffi/adalm_pluto.rb +65 -11
  200. data/lib/pwn/ffi/fftw.rb +31 -6
  201. data/lib/pwn/ffi/hack_rf.rb +59 -8
  202. data/lib/pwn/ffi/liquid.rb +63 -10
  203. data/lib/pwn/ffi/rtl_sdr.rb +35 -5
  204. data/lib/pwn/ffi/soapy_sdr.rb +60 -10
  205. data/lib/pwn/ffi/stdio.rb +5 -8
  206. data/lib/pwn/ffi/volk.rb +36 -7
  207. data/lib/pwn/ffi.rb +12 -0
  208. data/lib/pwn/memory.rb +136 -16
  209. data/lib/pwn/memory_index.rb +34 -19
  210. data/lib/pwn/migrate.rb +34 -24
  211. data/lib/pwn/module_skills.rb +39 -8
  212. data/lib/pwn/plugins/aflplusplus.rb +52 -0
  213. data/lib/pwn/plugins/android.rb +65 -245
  214. data/lib/pwn/plugins/artifact_registry.rb +71 -0
  215. data/lib/pwn/plugins/assembly.rb +9 -4
  216. data/lib/pwn/plugins/authentication_helper.rb +8 -5
  217. data/lib/pwn/plugins/baresip.rb +59 -12
  218. data/lib/pwn/plugins/basic_auth.rb +9 -3
  219. data/lib/pwn/plugins/beef.rb +28 -18
  220. data/lib/pwn/plugins/binary_parser.rb +133 -0
  221. data/lib/pwn/plugins/black_duck_binary_analysis.rb +63 -39
  222. data/lib/pwn/plugins/burp_suite.rb +98 -68
  223. data/lib/pwn/plugins/bus_pirate.rb +15 -8
  224. data/lib/pwn/plugins/char.rb +33 -3
  225. data/lib/pwn/plugins/credential_attack.rb +99 -0
  226. data/lib/pwn/plugins/credit_card.rb +6 -1
  227. data/lib/pwn/plugins/dao_ldap.rb +19 -13
  228. data/lib/pwn/plugins/dao_mongo.rb +11 -5
  229. data/lib/pwn/plugins/dao_postgres.rb +28 -19
  230. data/lib/pwn/plugins/dao_sqlite3.rb +15 -6
  231. data/lib/pwn/plugins/defect_dojo.rb +38 -22
  232. data/lib/pwn/plugins/detect_os.rb +5 -0
  233. data/lib/pwn/plugins/doctor.rb +149 -0
  234. data/lib/pwn/plugins/ein.rb +3 -0
  235. data/lib/pwn/plugins/exploit_dev.rb +264 -0
  236. data/lib/pwn/plugins/file_fu.rb +11 -8
  237. data/lib/pwn/plugins/frida.rb +61 -0
  238. data/lib/pwn/plugins/fuzz.rb +9 -6
  239. data/lib/pwn/plugins/gdb.rb +95 -0
  240. data/lib/pwn/plugins/git.rb +19 -14
  241. data/lib/pwn/plugins/github.rb +38 -15
  242. data/lib/pwn/plugins/google_workspace.rb +188 -45
  243. data/lib/pwn/plugins/hacker_one.rb +159 -35
  244. data/lib/pwn/plugins/hunter.rb +6 -3
  245. data/lib/pwn/plugins/ip_info.rb +9 -4
  246. data/lib/pwn/plugins/irc.rb +28 -15
  247. data/lib/pwn/plugins/jenkins.rb +65 -57
  248. data/lib/pwn/plugins/jira_data_center.rb +30 -22
  249. data/lib/pwn/plugins/jobs.rb +109 -0
  250. data/lib/pwn/plugins/json_pathify.rb +9 -5
  251. data/lib/pwn/plugins/log.rb +113 -13
  252. data/lib/pwn/plugins/mail_agent.rb +87 -79
  253. data/lib/pwn/plugins/metasploit.rb +11 -6
  254. data/lib/pwn/plugins/monkey_patch.rb +3 -0
  255. data/lib/pwn/plugins/msr206.rb +42 -28
  256. data/lib/pwn/plugins/nessus_cloud.rb +44 -4
  257. data/lib/pwn/plugins/nexpose_vuln_scan.rb +40 -24
  258. data/lib/pwn/plugins/nmap_it.rb +14 -34
  259. data/lib/pwn/plugins/nuclei.rb +57 -0
  260. data/lib/pwn/plugins/oauth2.rb +11 -5
  261. data/lib/pwn/plugins/ocr.rb +3 -0
  262. data/lib/pwn/plugins/open_api.rb +5 -2
  263. data/lib/pwn/plugins/openvas.rb +33 -25
  264. data/lib/pwn/plugins/packet.rb +152 -31
  265. data/lib/pwn/plugins/pdf_parse.rb +5 -2
  266. data/lib/pwn/plugins/pony.rb +86 -1
  267. data/lib/pwn/plugins/process_tube.rb +120 -0
  268. data/lib/pwn/plugins/ps.rb +7 -1
  269. data/lib/pwn/plugins/pwn_logger.rb +6 -2
  270. data/lib/pwn/plugins/rabbit_mq.rb +12 -7
  271. data/lib/pwn/plugins/radare2.rb +253 -0
  272. data/lib/pwn/plugins/recon.rb +161 -0
  273. data/lib/pwn/plugins/repl.rb +122 -1
  274. data/lib/pwn/plugins/scannable_codes.rb +5 -1
  275. data/lib/pwn/plugins/serial.rb +24 -14
  276. data/lib/pwn/plugins/shodan.rb +54 -35
  277. data/lib/pwn/plugins/slack_client.rb +11 -6
  278. data/lib/pwn/plugins/sock.rb +16 -8
  279. data/lib/pwn/plugins/spider.rb +5 -2
  280. data/lib/pwn/plugins/sqlmap.rb +49 -0
  281. data/lib/pwn/plugins/ssn.rb +3 -0
  282. data/lib/pwn/plugins/thread_pool.rb +6 -9
  283. data/lib/pwn/plugins/tor.rb +9 -4
  284. data/lib/pwn/plugins/transparent_browser.rb +62 -107
  285. data/lib/pwn/plugins/tty_spinner.rb +16 -2
  286. data/lib/pwn/plugins/twitter_api.rb +6 -2
  287. data/lib/pwn/plugins/uri_scheme.rb +4 -1
  288. data/lib/pwn/plugins/vault.rb +12 -3
  289. data/lib/pwn/plugins/vin.rb +24 -12
  290. data/lib/pwn/plugins/voice.rb +7 -2
  291. data/lib/pwn/plugins/volatility.rb +48 -0
  292. data/lib/pwn/plugins/vsphere.rb +9 -5
  293. data/lib/pwn/plugins/xxd.rb +12 -43
  294. data/lib/pwn/plugins/zaproxy.rb +30 -16
  295. data/lib/pwn/plugins.rb +19 -0
  296. data/lib/pwn/reports/ai_red_team.rb +6 -2
  297. data/lib/pwn/reports/csv.rb +8 -1
  298. data/lib/pwn/reports/fuzz.rb +5 -2
  299. data/lib/pwn/reports/html.rb +8 -1
  300. data/lib/pwn/reports/html_footer.rb +4 -3
  301. data/lib/pwn/reports/html_header.rb +6 -2
  302. data/lib/pwn/reports/json.rb +8 -1
  303. data/lib/pwn/reports/markdown.rb +8 -1
  304. data/lib/pwn/reports/pdf.rb +8 -1
  305. data/lib/pwn/reports/phone.rb +5 -2
  306. data/lib/pwn/reports/sast.rb +6 -2
  307. data/lib/pwn/reports/uri_buster.rb +5 -2
  308. data/lib/pwn/reports/xml.rb +8 -1
  309. data/lib/pwn/reports.rb +19 -0
  310. data/lib/pwn/sast/amqp_connect_as_guest.rb +9 -3
  311. data/lib/pwn/sast/apache_file_system_util_api.rb +9 -3
  312. data/lib/pwn/sast/aws.rb +9 -3
  313. data/lib/pwn/sast/banned_function_calls_c.rb +9 -3
  314. data/lib/pwn/sast/base64.rb +9 -3
  315. data/lib/pwn/sast/beef_hook.rb +9 -3
  316. data/lib/pwn/sast/cmd_execution_go_lang.rb +9 -3
  317. data/lib/pwn/sast/cmd_execution_java.rb +9 -3
  318. data/lib/pwn/sast/cmd_execution_python.rb +9 -3
  319. data/lib/pwn/sast/cmd_execution_ruby.rb +9 -3
  320. data/lib/pwn/sast/cmd_execution_scala.rb +9 -3
  321. data/lib/pwn/sast/csrf.rb +9 -3
  322. data/lib/pwn/sast/deserial_java.rb +9 -3
  323. data/lib/pwn/sast/emoticon.rb +9 -3
  324. data/lib/pwn/sast/eval.rb +9 -3
  325. data/lib/pwn/sast/factory.rb +9 -3
  326. data/lib/pwn/sast/http_authorization_header.rb +9 -3
  327. data/lib/pwn/sast/inner_html.rb +9 -3
  328. data/lib/pwn/sast/keystore.rb +9 -3
  329. data/lib/pwn/sast/local_storage.rb +9 -3
  330. data/lib/pwn/sast/location_hash.rb +9 -3
  331. data/lib/pwn/sast/log4j.rb +9 -3
  332. data/lib/pwn/sast/logger.rb +9 -3
  333. data/lib/pwn/sast/md5.rb +9 -3
  334. data/lib/pwn/sast/outer_html.rb +9 -3
  335. data/lib/pwn/sast/padding_oracle.rb +9 -3
  336. data/lib/pwn/sast/password.rb +9 -3
  337. data/lib/pwn/sast/php_input_mechanisms.rb +9 -3
  338. data/lib/pwn/sast/php_type_juggling.rb +9 -3
  339. data/lib/pwn/sast/pom_version.rb +9 -3
  340. data/lib/pwn/sast/port.rb +9 -3
  341. data/lib/pwn/sast/post_message.rb +9 -3
  342. data/lib/pwn/sast/private_key.rb +9 -3
  343. data/lib/pwn/sast/redirect.rb +9 -3
  344. data/lib/pwn/sast/redos.rb +9 -3
  345. data/lib/pwn/sast/shell.rb +9 -3
  346. data/lib/pwn/sast/signature.rb +9 -3
  347. data/lib/pwn/sast/sql.rb +9 -3
  348. data/lib/pwn/sast/ssl.rb +9 -3
  349. data/lib/pwn/sast/sudo.rb +9 -3
  350. data/lib/pwn/sast/task_tag.rb +9 -3
  351. data/lib/pwn/sast/test_case_engine.rb +11 -7
  352. data/lib/pwn/sast/throw_errors.rb +9 -3
  353. data/lib/pwn/sast/token.rb +9 -3
  354. data/lib/pwn/sast/type_script_type_juggling.rb +9 -3
  355. data/lib/pwn/sast/use_after_free.rb +9 -3
  356. data/lib/pwn/sast/version.rb +9 -3
  357. data/lib/pwn/sast/window_location_hash.rb +9 -3
  358. data/lib/pwn/sast.rb +4 -0
  359. data/lib/pwn/sdr/decoder/adsb.rb +36 -5
  360. data/lib/pwn/sdr/decoder/apt.rb +9 -6
  361. data/lib/pwn/sdr/decoder/base.rb +74 -22
  362. data/lib/pwn/sdr/decoder/bluetooth.rb +17 -5
  363. data/lib/pwn/sdr/decoder/dect.rb +12 -3
  364. data/lib/pwn/sdr/decoder/dsp.rb +229 -39
  365. data/lib/pwn/sdr/decoder/flex.rb +59 -11
  366. data/lib/pwn/sdr/decoder/gps.rb +12 -3
  367. data/lib/pwn/sdr/decoder/gsm.rb +24 -4
  368. data/lib/pwn/sdr/decoder/iridium.rb +12 -3
  369. data/lib/pwn/sdr/decoder/lora.rb +13 -4
  370. data/lib/pwn/sdr/decoder/lte.rb +27 -3
  371. data/lib/pwn/sdr/decoder/morse.rb +12 -3
  372. data/lib/pwn/sdr/decoder/p25.rb +12 -3
  373. data/lib/pwn/sdr/decoder/pager.rb +8 -5
  374. data/lib/pwn/sdr/decoder/pocsag.rb +29 -9
  375. data/lib/pwn/sdr/decoder/rds.rb +14 -8
  376. data/lib/pwn/sdr/decoder/rfid.rb +12 -3
  377. data/lib/pwn/sdr/decoder/rtl433.rb +12 -3
  378. data/lib/pwn/sdr/decoder/rtty.rb +8 -5
  379. data/lib/pwn/sdr/decoder/wifi.rb +12 -3
  380. data/lib/pwn/sdr/decoder/zigbee.rb +12 -3
  381. data/lib/pwn/sdr/decoder.rb +9 -0
  382. data/lib/pwn/sdr/flipper_zero.rb +17 -10
  383. data/lib/pwn/sdr/frequency_allocation.rb +4 -1
  384. data/lib/pwn/sdr/gqrx.rb +178 -119
  385. data/lib/pwn/sdr/rfidler.rb +4 -1
  386. data/lib/pwn/sdr/son_micro_rfid.rb +37 -24
  387. data/lib/pwn/sdr.rb +14 -0
  388. data/lib/pwn/sessions.rb +86 -16
  389. data/lib/pwn/setup.rb +94 -37
  390. data/lib/pwn/version.rb +1 -1
  391. data/lib/pwn/www/app_cobalt_io.rb +11 -5
  392. data/lib/pwn/www/bing.rb +10 -5
  393. data/lib/pwn/www/bug_crowd.rb +11 -5
  394. data/lib/pwn/www/checkip.rb +8 -4
  395. data/lib/pwn/www/coinbase_pro.rb +11 -5
  396. data/lib/pwn/www/duckduckgo.rb +12 -6
  397. data/lib/pwn/www/facebook.rb +11 -5
  398. data/lib/pwn/www/github.rb +11 -5
  399. data/lib/pwn/www/google.rb +11 -5
  400. data/lib/pwn/www/hacker_one.rb +20 -9
  401. data/lib/pwn/www/linkedin.rb +11 -5
  402. data/lib/pwn/www/pandora.rb +11 -5
  403. data/lib/pwn/www/pastebin.rb +9 -4
  404. data/lib/pwn/www/paypal.rb +19 -11
  405. data/lib/pwn/www/synack.rb +11 -5
  406. data/lib/pwn/www/torch.rb +13 -8
  407. data/lib/pwn/www/trading_view.rb +11 -5
  408. data/lib/pwn/www/twitter.rb +11 -5
  409. data/lib/pwn/www/uber.rb +11 -5
  410. data/lib/pwn/www/upwork.rb +11 -5
  411. data/lib/pwn/www/wayback_machine.rb +12 -6
  412. data/lib/pwn/www/youtube.rb +10 -5
  413. data/lib/pwn/www.rb +4 -0
  414. data/spec/conventions_spec.rb +118 -2
  415. data/spec/lib/pwn/ai/agent/reward_spec.rb +9 -0
  416. data/spec/lib/pwn/plugins/aflplusplus_spec.rb +13 -0
  417. data/spec/lib/pwn/plugins/artifact_registry_spec.rb +13 -0
  418. data/spec/lib/pwn/plugins/binary_parser_spec.rb +21 -0
  419. data/spec/lib/pwn/plugins/credential_attack_spec.rb +13 -0
  420. data/spec/lib/pwn/plugins/doctor_spec.rb +23 -0
  421. data/spec/lib/pwn/plugins/exploit_dev_spec.rb +23 -0
  422. data/spec/lib/pwn/plugins/frida_spec.rb +13 -0
  423. data/spec/lib/pwn/plugins/gdb_spec.rb +13 -0
  424. data/spec/lib/pwn/plugins/jobs_spec.rb +13 -0
  425. data/spec/lib/pwn/plugins/nuclei_spec.rb +13 -0
  426. data/spec/lib/pwn/plugins/process_tube_spec.rb +13 -0
  427. data/spec/lib/pwn/plugins/radare2_spec.rb +13 -0
  428. data/spec/lib/pwn/plugins/recon_spec.rb +26 -0
  429. data/spec/lib/pwn/plugins/sqlmap_spec.rb +13 -0
  430. data/spec/lib/pwn/plugins/volatility_spec.rb +13 -0
  431. data/third_party/pwn_rdoc.jsonl +126 -5
  432. metadata +47 -3
  433. data/etc/default_skills/pwn/memory_index/references/urls.md +0 -4
  434. data/etc/default_skills/pwn/plugins/transparent_browser/references/urls.md +0 -3
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
data/lib/pwn/ffi/fftw.rb CHANGED
@@ -178,14 +178,39 @@ module PWN
178
178
 
179
179
  public_class_method def self.help
180
180
  puts "USAGE:
181
- #{self}.available? # => true/false
182
- #{self}.rfft(samples:, n: nil) # real→complex, [[re,im],…]
183
- #{self}.rfft_magnitude(samples:, n: nil) # |X[k]|
184
- #{self}.rfft_power_db(samples:, n:, floor: -120.0)
185
- #{self}.cfft(iq:, n: nil, sign: :forward) # complex FFT
186
-
181
+ # Run available and return its result
182
+ #{self}.available?
183
+
184
+ # Run rfft and return its result
185
+ #{self}.rfft(
186
+ samples: 'required - Array<Float> real input (length = n)',
187
+ n: 'optional - FFT size (default samples.length; zero-pads/truncates)'
188
+ )
189
+
190
+ # Run rfft magnitude and return its result
191
+ #{self}.rfft_magnitude(
192
+ samples: 'required - samples value consumed by #rfft_magnitude',
193
+ n: 'optional - FFT size'
194
+ )
195
+
196
+ # Run rfft power db and return its result
197
+ #{self}.rfft_power_db(
198
+ samples: 'required - samples value consumed by #rfft_power_db',
199
+ n: 'optional - FFT size',
200
+ floor: 'optional - dB floor for zeros (default -120.0)'
201
+ )
202
+
203
+ # Run cfft and return its result
204
+ #{self}.cfft(
205
+ iq: 'required - interleaved Array<Float> I/Q (even length)',
206
+ n: 'optional - number of complex samples (default iq.length/2)',
207
+ sign: 'optional - :forward (default) or :backward'
208
+ )
209
+
210
+ # Print the AUTHOR(S) string for this module.
187
211
  #{self}.authors
188
212
  "
213
+ constants.sort
189
214
  end
190
215
  end
191
216
  end
@@ -282,19 +282,70 @@ module PWN
282
282
 
283
283
  public_class_method def self.help
284
284
  puts "USAGE:
285
+ # Run available and return its result
285
286
  #{self}.available?
287
+
288
+ # Run info and return its result
286
289
  #{self}.info
287
- dev = #{self}.open(serial: nil)
288
- #{self}.configure(device: dev, freq_hz:, rate_hz: 10e6, lna_gain: 16, vga_gain: 20, amp: false)
289
- rx = #{self}.start_rx(device: dev)
290
- data = #{self}.read_sync(handle: rx) # cs8 interleaved I/Q
291
- #{self}.stop_rx(handle: rx)
292
- data = #{self}.capture(freq_hz:, rate_hz: 10e6, samples: 262_144)
293
- #{self}.device_info(device: dev)
294
- #{self}.close(device: dev)
295
290
 
291
+ # Open a session or connection and return a handle.
292
+ #{self}.open(
293
+ serial: 'optional - serial value consumed by #open'
294
+ )
295
+
296
+ # Close a session previously returned by #open.
297
+ #{self}.close(
298
+ device: 'optional - device value consumed by #close'
299
+ )
300
+
301
+ # Run configure and return its result
302
+ #{self}.configure(
303
+ device: 'required - pointer from .open',
304
+ freq_hz: 'required - center frequency Hz',
305
+ rate_hz: 'optional - sample rate (default 10e6)',
306
+ lna_gain: 'optional - 0..40 step 8 (default 16)',
307
+ vga_gain: 'optional - 0..62 step 2 (default 20)',
308
+ amp: 'optional - true/false RF amp (default false)',
309
+ bb_bw_hz: 'optional - baseband filter BW Hz'
310
+ )
311
+
312
+ # Run device info and return its result
313
+ #{self}.device_info(
314
+ device: 'required - device value consumed by #device_info'
315
+ )
316
+
317
+ # Run start rx and return its result
318
+ #{self}.start_rx(
319
+ device: 'required - pointer from .open',
320
+ max_queue: 'optional - max buffered chunks (default 64)'
321
+ )
322
+
323
+ # Run read sync and return its result
324
+ #{self}.read_sync(
325
+ handle: 'required - handle from .start_rx',
326
+ timeout: 'optional - seconds to wait for a chunk (default 1.0)'
327
+ )
328
+
329
+ # Run stop rx and return its result
330
+ #{self}.stop_rx(
331
+ handle: 'optional - handle value consumed by #stop_rx'
332
+ )
333
+
334
+ # Run capture and return its result
335
+ #{self}.capture(
336
+ freq_hz: 'required - center frequency Hz',
337
+ rate_hz: 'optional - sample rate (default 10e6)',
338
+ samples: 'optional - I/Q sample pairs to capture (default 262_144)',
339
+ lna_gain: 'optional - optional, vga_gain: optional, amp: optional',
340
+ serial: 'optional - serial value consumed by #capture',
341
+ vga_gain: 'optional - vga gain value consumed by #capture',
342
+ amp: 'optional - amp value consumed by #capture'
343
+ )
344
+
345
+ # Print the AUTHOR(S) string for this module.
296
346
  #{self}.authors
297
347
  "
348
+ constants.sort
298
349
  end
299
350
 
300
351
  class << self
@@ -395,18 +395,71 @@ module PWN
395
395
 
396
396
  public_class_method def self.help
397
397
  puts "USAGE:
398
- #{self}.available? # => true/false
399
- #{self}.freq_demod(iq:, kf: 0.5) # FM I/Q → audio
400
- #{self}.resample(samples:, rate:, as_db: 60.0) # arbitrary rate
401
- #{self}.fir_kaiser(samples:, length: 51, fc: 0.1, as_db: 60.0)
402
- #{self}.dc_block(samples:, m: 7, as_db: 60.0)
403
- #{self}.resample_iq(iq:, rate:, as_db: 60.0) # complex resample
404
- #{self}.mix_down(iq:, freq:) # NCO mix (rad/samp)
405
- #{self}.gmsk_demod(iq:, sps:, m: 3, bt: 0.35) # I/Q → bits
406
- #{self}.mfsk_demod(iq:, m:, sps:, bw: 0.25) # I/Q → symbols
407
-
398
+ # Run available and return its result
399
+ #{self}.available?
400
+
401
+ # Run freq demod and return its result
402
+ #{self}.freq_demod(
403
+ iq: 'required - interleaved I/Q Array<Float> (even length)',
404
+ kf: 'optional - modulation factor (default 0.5)'
405
+ )
406
+
407
+ # Run resample and return its result
408
+ #{self}.resample(
409
+ samples: 'required - samples value consumed by #resample',
410
+ rate: 'required - output/input ratio (>0)',
411
+ as_db: 'optional - stop-band attenuation dB (default 60.0)'
412
+ )
413
+
414
+ # Run fir kaiser and return its result
415
+ #{self}.fir_kaiser(
416
+ samples: 'required - samples value consumed by #fir_kaiser',
417
+ length: 'optional - filter length (default 51, odd preferred)',
418
+ fc: 'optional - normalised cutoff 0..0.5 (default 0.1)',
419
+ as_db: 'optional - stop-band attenuation dB (default 60.0)',
420
+ mu: 'optional - fractional sample offset (default 0.0)'
421
+ )
422
+
423
+ # Run dc block and return its result
424
+ #{self}.dc_block(
425
+ samples: 'required - samples value consumed by #dc_block',
426
+ m: 'optional - prototype semi-length (default 7 → len 15)',
427
+ as_db: 'optional - stop-band attenuation dB (default 60.0)'
428
+ )
429
+
430
+ # Run resample iq and return its result
431
+ #{self}.resample_iq(
432
+ iq: 'required - interleaved I/Q Array<Float>',
433
+ rate: 'required - output/input ratio (>0)',
434
+ as_db: 'optional - stop-band attenuation dB (default 60.0)'
435
+ )
436
+
437
+ # Run mix down and return its result
438
+ #{self}.mix_down(
439
+ iq: 'required - interleaved I/Q Array<Float>',
440
+ freq: 'required - normalised angular freq (rad/sample, i.e. 2π·f/fs)'
441
+ )
442
+
443
+ # Run gmsk demod and return its result
444
+ #{self}.gmsk_demod(
445
+ iq: 'required - interleaved I/Q Array<Float>, length = k·sym·2',
446
+ sps: 'required - samples per symbol (integer ≥ 2)',
447
+ m: 'optional - filter delay (default 3)',
448
+ bt: 'optional - Gaussian BT (default 0.35)'
449
+ )
450
+
451
+ # Run mfsk demod and return its result
452
+ #{self}.mfsk_demod(
453
+ iq: 'required - interleaved I/Q Array<Float>',
454
+ m: 'required - bits per symbol (1=2FSK, 2=4FSK, …)',
455
+ sps: 'required - samples per symbol (integer ≥ 2^m)',
456
+ bw: 'optional - normalised bandwidth 0..0.5 (default 0.25)'
457
+ )
458
+
459
+ # Print the AUTHOR(S) string for this module.
408
460
  #{self}.authors
409
461
  "
462
+ constants.sort
410
463
  end
411
464
 
412
465
  class << self