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/sdr/gqrx.rb CHANGED
@@ -3006,142 +3006,201 @@ module PWN
3006
3006
  # Display Usage for this Module
3007
3007
 
3008
3008
  public_class_method def self.help
3009
- puts <<~USAGE
3010
- USAGE:
3011
- gqrx_sock = #{self}.connect(
3012
- target: 'optional - GQRX target IP address (defaults to 127.0.0.1)',
3013
- port: 'optional - GQRX target port (defaults to 7356)'
3014
- )
3009
+ puts "USAGE:
3010
+ # Run a command and return raw text output.
3011
+ #{self}.cmd(
3012
+ gqrx_sock: 'required - GQRX socket object returned from #connect method',
3013
+ cmd: 'required - GQRX command to execute',
3014
+ resp_ok: 'optional - Expected response from GQRX to indicate success'
3015
+ )
3015
3016
 
3016
- gqrx_resp = #{self}.cmd(
3017
- gqrx_sock: 'required - GQRX socket object returned from #connect method',
3018
- cmd: 'required - GQRX command to send',
3019
- resp_ok: 'optional - Expected OK response (defaults to nil / no check)'
3020
- )
3017
+ # Run connect and return its result
3018
+ #{self}.connect(
3019
+ target: 'optional - hostname, IP, or CIDR to scan',
3020
+ port: 'optional - TCP/UDP port number'
3021
+ )
3021
3022
 
3022
- freq_obj = #{self}.init_freq(
3023
- gqrx_sock: 'required - GQRX socket object returned from #connect method',
3024
- freq: 'required - Frequency to set',
3025
- precision: 'optional - Frequency step precision (number of digits; defaults to 6)',
3026
- demodulator_mode: 'optional - Demodulator mode (defaults to WFM)',
3027
- bandwidth: 'optional - Bandwidth (defaults to "200.000")',
3028
- decoder: 'optional - Decoder key (e.g., :gsm / :rds) to start live decoding',
3029
- interactive: 'optional - false decoder.sample Hash (default true = TTY decode)',
3030
- settle_secs: 'optional - seconds for decoder.sample (RDS default 8)',
3031
- suppress_details: 'optional - Boolean to include extra frequency details in return hash (defaults to false)',
3032
- keep_alive: 'optional - Boolean to keep GQRX connection alive after method completion (defaults to false)'
3033
- )
3023
+ # Run init freq and return its result
3024
+ #{self}.init_freq(
3025
+ gqrx_sock: 'required - GQRX socket object returned from #connect method',
3026
+ freq: 'required - Frequency to set',
3027
+ demodulator_mode: 'optional - Demodulator mode (defaults to WFM)',
3028
+ bandwidth: 'optional - Bandwidth (defaults to 200.000)',
3029
+ squelch: 'optional - Squelch level to set (Defaults to current value)',
3030
+ decoder: 'optional - Decoder key (e.g., :gsm / :rds) to start live decoding (starts recording if provided)',
3031
+ interactive: 'optional - Boolean; when false AND decoder responds to .sample, call sample (non-interactive Hash) instead of decode (TTY). Defaults to true.',
3032
+ settle_secs: 'optional - Seconds for decoder.sample (e.g. RDS; default 8)',
3033
+ udp_ip: 'optional - UDP IP address for decoder module (defaults to 127.0.0.1)',
3034
+ udp_port: 'optional - UDP port for decoder module (defaults to 7355)',
3035
+ suppress_details: 'optional - Boolean to include extra frequency details in return hash (defaults to false)',
3036
+ keep_alive: 'optional - Boolean to keep GQRX connection alive after method completion (defaults to false)',
3037
+ precision: 'optional - precision value consumed by #init_freq'
3038
+ )
3034
3039
 
3035
- scan_resp = #{self}.scan_range(
3036
- gqrx_sock: 'required - GQRX socket object returned from #connect method',
3037
- ranges: 'required - Array of Hash objects with :start_freq and :target_freq keys defining scan ranges',
3038
- demodulator_mode: 'optional - Demodulator mode (e.g. WFM, AM, FM, USB, LSB, RAW, CW, RTTY / defaults to WFM)',
3039
- bandwidth: 'optional - Bandwidth in Hz (Defaults to "200.000")',
3040
- precision: 'optional - Precision (Defaults to 1)',
3041
- strength_lock: 'optional - Strength lock (defaults to -70.0)',
3042
- squelch: 'optional - Squelch level (defaults to strength_lock - 3.0)',
3043
- audio_gain_db: 'optional - Audio gain in dB (defaults to 0.0)',
3044
- rf_gain: 'optional - RF gain (defaults to 0.0)',
3045
- intermediate_gain: 'optional - Intermediate gain (defaults to 32.0)',
3046
- baseband_gain: 'optional - Baseband gain (defaults to 10.0)',
3047
- keep_looping: 'optional - Boolean to keep scanning indefinitely (defaults to false)',
3048
- scan_log: 'optional - Path to save detected signals log (defaults to /tmp/pwn_sdr_gqrx_scan_<start_freq>-<target_freq>_<timestamp>.json)',
3049
- location: 'optional - Location string to include in AI analysis (e.g., "New York, NY", 90210, GPS coords, etc.)'
3050
- )
3040
+ # Run scan range and return its result
3041
+ #{self}.scan_range(
3042
+ gqrx_sock: 'required - GQRX socket object returned from #connect method',
3043
+ ranges: 'required - Array of Hash objects with :start_freq and :target_freq keys defining scan ranges',
3044
+ demodulator_mode: 'optional - Demodulator mode (e.g. WFM, AM, FM, USB, LSB, RAW, CW, RTTY / defaults to WFM)',
3045
+ bandwidth: 'optional - Bandwidth in Hz (Defaults to 200.000)',
3046
+ precision: 'optional - Frequency step precision (number of digits; defaults to 1)',
3047
+ strength_lock: 'optional - Strength lock in dBFS (defaults to -70.0)',
3048
+ squelch: 'optional - Squelch level in dBFS (defaults to strength_lock - 3.0)',
3049
+ audio_gain_db: 'optional - Audio gain in dB (defaults to 0.0)',
3050
+ rf_gain: 'optional - RF gain (defaults to 0.0)',
3051
+ intermediate_gain: 'optional - Intermediate gain (defaults to 32.0)',
3052
+ baseband_gain: 'optional - Baseband gain (defaults to 10.0)',
3053
+ keep_looping: 'optional - Boolean to keep scanning indefinitely (defaults to false)',
3054
+ scan_log: 'optional - Path to save detected signals log (defaults to /tmp/pwn_sdr_gqrx_scan_<start_freq>-<target_freq>_<timestamp>_lN.json)',
3055
+ location: 'optional - Location string to include in AI analysis (e.g., New York, NY, 90210, GPS coords, etc.)',
3056
+ decoder: 'optional - decoder value consumed by #scan_range'
3057
+ )
3051
3058
 
3052
- snapshot = #{self}.get_spectrum_snapshot(
3053
- gqrx_sock: 'required - GQRX socket object returned from #connect method',
3054
- center_freq: 'optional - Center frequency (Hz) for snapshot (defaults to current tuned freq)',
3055
- sample_rate: 'optional - Instantaneous bandwidth / sample rate in Hz (defaults to 1_000_000)',
3056
- nfft: 'optional - FFT bin size (defaults to 2048)',
3057
- avg: 'optional - Number of FFT averages (defaults to 8)',
3058
- capture_secs: 'optional - Duration of I/Q capture in seconds (defaults to 0.10)',
3059
- strength_offset_db: 'optional - Add this many dB to all power levels (defaults to 0.0)'
3060
- )
3059
+ # Run analyze scan and return its result
3060
+ #{self}.analyze_scan(
3061
+ scan_resp: 'required - Scan response hash returned from #scan_range method',
3062
+ target: 'optional - GQRX target IP address (defaults to 127.0.0.1)',
3063
+ port: 'optional - GQRX target port (defaults to 7356)'
3064
+ )
3061
3065
 
3062
- fast_scan_resp = #{self}.fast_scan_range(
3063
- gqrx_sock: 'required - GQRX socket object returned from #connect method',
3064
- ranges: 'required - Array of Hash objects with :start_freq and :target_freq keys defining scan ranges',
3065
- sample_rate: 'optional - Chunk size / visible span in Hz (defaults to 1_000_000)',
3066
- nfft: 'optional - FFT size (defaults to 2048)',
3067
- avg: 'optional - Number of averages (defaults to 8)',
3068
- capture_secs: 'optional - Seconds of capture per chunk (defaults to 0.10)',
3069
- strength_lock: 'optional - Minimum signal strength in dBFS to report (defaults to -70.0; only meaningful with strength_offset_db calibration)',
3070
- min_snr_db: 'optional - Minimum SNR in dB above per-chunk noise floor to report (defaults to 12.0)',
3071
- precision: 'optional - Band-plan channel raster; detections snapped to 10**(precision-1) Hz grid (defaults to 5)',
3072
- min_bw_ratio: 'optional - Reject FFT peaks narrower than min_bw_ratio * plan bandwidth as spurs (defaults to 0.0 = off; half-power carrier BW is often << plan BW)',
3073
- demodulator_mode: 'optional - Demodulator mode APPLIED to GQRX + attributed to detections (defaults to WFM)',
3074
- bandwidth: 'optional - Passband bandwidth APPLIED to GQRX + attributed (defaults to "200.000")',
3075
- squelch: 'optional - Squelch level in dBFS APPLIED to GQRX (defaults to strength_lock - 3.0)',
3076
- audio_gain_db: 'optional - Audio gain in dB APPLIED to GQRX (defaults to 0.0)',
3077
- rf_gain: 'optional - RF gain APPLIED to GQRX (defaults to 0.0)',
3078
- intermediate_gain: 'optional - Intermediate gain APPLIED to GQRX (defaults to 32.0)',
3079
- baseband_gain: 'optional - Baseband gain APPLIED to GQRX (defaults to 10.0)',
3080
- decoder: 'optional - Decoder key (e.g. :gsm) to attribute to each detection',
3081
- location: 'optional - Location string to include in AI analysis',
3082
- keep_spectrum: 'optional - If true, include full spectrum data in result (can be large, defaults to false)',
3083
- refine: 'optional - After panoramic FFT, re-walk each detection with traditional edge_detection + find_best_peak scoped around the candidate to lock the exact channel frequency (defaults to true)',
3084
- strength_offset_db: 'optional - Add this many dB to all power levels (defaults to 0.0)',
3085
- scan_log: 'optional - Path to save detected signals log (defaults to /tmp/pwn_sdr_gqrx_scan_<start_freq>-<target_freq>_<timestamp>.json)'
3086
- )
3066
+ # Run analyze log and return its result
3067
+ #{self}.analyze_log(
3068
+ scan_log: 'required - Path to signals log file',
3069
+ target: 'optional - GQRX target IP address (defaults to 127.0.0.1)',
3070
+ port: 'optional - GQRX target port (defaults to 7356)'
3071
+ )
3087
3072
 
3088
- #{self}.analyze_scan(
3089
- scan_resp: 'required - Scan response object from #scan_range or #fast_scan_range method',
3090
- target: 'optional - GQRX target IP address (defaults to 127.0.0.1)',
3091
- port: 'optional - GQRX target port (defaults to 7356)'
3092
- )
3073
+ # Run listen udp and return its result
3074
+ #{self}.listen_udp(
3075
+ udp_ip: 'optional - IP address to bind UDP listener (defaults to 127.0.0.1)',
3076
+ upd_port: 'optional - Port to bind UDP listener (defaults to 7355)',
3077
+ udp_port: 'optional - udp port value consumed by #listen_udp'
3078
+ )
3093
3079
 
3094
- #{self}.analyze_log(
3095
- scan_log: 'required - Path to signals log file',
3096
- target: 'optional - GQRX target IP address (defaults to 127.0.0.1)',
3097
- port: 'optional - GQRX target port (defaults to 7356)'
3098
- )
3080
+ # Run disconnect udp and return its result
3081
+ #{self}.disconnect_udp(
3082
+ udp_listener: 'required - UDP socket object returned from #listen_udp method'
3083
+ )
3099
3084
 
3100
- udp_listener = #{self}.listen_udp(
3101
- udp_ip: 'optional - IP address to bind UDP listener (defaults to 127.0.0.1)',
3102
- udp_port: 'optional - Port to bind UDP listener (defaults to 7355)'
3103
- )
3085
+ # Run record and return its result
3086
+ #{self}.record(
3087
+ gqrx_sock: 'required - GQRX socket object returned from #connect method'
3088
+ )
3104
3089
 
3105
- #{self}.disconnect_udp(
3106
- udp_listener: 'required - UDP socket object returned from #listen_udp method'
3107
- )
3090
+ # Run stop recording and return its result
3091
+ #{self}.stop_recording(
3092
+ gqrx_sock: 'required - GQRX socket object returned from #connect method',
3093
+ iq_raw_file: 'required - iq_raw_file returned from #connect method'
3094
+ )
3108
3095
 
3109
- iq_raw_file = #{self}.record(
3110
- gqrx_sock: 'required - GQRX socket object returned from #connect method'
3111
- )
3096
+ # Run disconnect and return its result
3097
+ #{self}.disconnect(
3098
+ gqrx_sock: 'required - GQRX socket object returned from #connect method'
3099
+ )
3112
3100
 
3113
- #{self}.stop_recording(
3114
- gqrx_sock: 'required - GQRX socket object returned from #connect method',
3115
- iq_raw_file: 'required - iq_raw_file returned from #record method'
3116
- )
3101
+ # GQRX *device* sample-rate configuration
3102
+ #{self}.config_path(
3103
+ path: 'optional - absolute path to a GQRX .conf (defaults to ~/.config/gqrx/default.conf or recentconfig)'
3104
+ )
3117
3105
 
3118
- #{self}.read_input_config(
3119
- path: 'optional - GQRX conf (defaults to ~/.config/gqrx/default.conf)'
3120
- )
3106
+ # Run read input config and return its result
3107
+ #{self}.read_input_config(
3108
+ path: 'optional - GQRX conf path (defaults to #config_path)'
3109
+ )
3121
3110
 
3122
- #{self}.device_input_rates(
3123
- device: 'optional - SoapySDR device args (defaults to conf [input] device=)'
3124
- )
3111
+ # Run device input rates and return its result
3112
+ #{self}.device_input_rates(
3113
+ device: 'optional - SoapySDR args string (defaults to [input] device= from conf)',
3114
+ path: 'optional - GQRX conf path used when :device omitted'
3115
+ )
3125
3116
 
3126
- #{self}.set_input_rate(
3127
- input_rate: 'required - Input rate Hz (rewrites conf [input] sample_rate=)',
3128
- path: 'optional - GQRX conf path',
3129
- clamp: 'optional - Snap to nearest device-legal rate (default true)',
3130
- restart: 'optional - Kill+respawn gqrx so rate takes effect (default false)'
3131
- )
3117
+ # Run nearest input rate and return its result
3118
+ #{self}.nearest_input_rate(
3119
+ input_rate: 'required - desired input rate Hz',
3120
+ rates: 'optional - Array of legal rates (defaults to #device_input_rates)',
3121
+ sample_rate: 'optional - sample rate value consumed by #nearest_input_rate',
3122
+ device: 'optional - device value consumed by #nearest_input_rate',
3123
+ path: 'optional - filesystem path to read or write'
3124
+ )
3132
3125
 
3133
- #{self}.apply_band_plan_input_rate(
3134
- band_plan: 'required - e.g. :fm_radio / :ads_b1090 (reads FrequencyAllocation input_rate)',
3135
- clamp: 'optional - Snap to device-legal rate (default true)',
3136
- restart: 'optional - Bounce GQRX after write (default false)'
3137
- )
3126
+ # Run set input rate and return its result
3127
+ #{self}.set_input_rate(
3128
+ input_rate: 'required - desired GQRX Input rate in Hz (Integer)',
3129
+ path: 'optional - GQRX conf path (defaults to #config_path)',
3130
+ clamp: 'optional - snap to nearest legal device rate (default true)',
3131
+ restart: 'optional - kill+respawn gqrx so the new rate is applied (default false)',
3132
+ gqrx_bin: 'optional - gqrx binary path when restart:true (default `which gqrx`)',
3133
+ sample_rate: 'optional - sample rate value consumed by #set_input_rate'
3134
+ )
3138
3135
 
3139
- #{self}.disconnect(
3140
- gqrx_sock: 'required - GQRX socket object returned from #connect method'
3141
- )
3136
+ # Run apply band plan input rate and return its result
3137
+ #{self}.apply_band_plan_input_rate(
3138
+ band_plan: 'required - key from PWN::SDR::FrequencyAllocation.band_plans (e.g. :fm_radio, :ads_b1090)',
3139
+ path: 'optional - GQRX conf path',
3140
+ clamp: 'optional - snap to device-legal rate (default true)',
3141
+ restart: 'optional - bounce GQRX after write (default false)',
3142
+ input_rate: 'optional - override the band-plan recommended rate',
3143
+ profile: 'optional - profile value consumed by #apply_band_plan_input_rate (defaults to opts[:assume_band_plan])',
3144
+ assume_band_plan: 'optional - assume band plan value consumed by #apply_band_plan_input_rate',
3145
+ sample_rate: 'optional - sample rate value consumed by #apply_band_plan_input_rate',
3146
+ gqrx_bin: 'optional - gqrx bin value consumed by #apply_band_plan_input_rate'
3147
+ )
3148
+
3149
+ # Run restart gqrx and return its result
3150
+ #{self}.restart_gqrx(
3151
+ gqrx_bin: 'optional - path to gqrx binary',
3152
+ conf_path: 'optional - pass -c <conf> on relaunch'
3153
+ )
3142
3154
 
3143
- #{self}.authors
3144
- USAGE
3155
+ # Run get spectrum snapshot and return its result
3156
+ #{self}.get_spectrum_snapshot(
3157
+ gqrx_sock: 'required - gqrx sock value consumed by #get_spectrum_snapshot',
3158
+ center_freq: 'optional - center freq value consumed by #get_spectrum_snapshot',
3159
+ sample_rate: 'optional - sample rate value consumed by #get_spectrum_snapshot',
3160
+ nfft: 'required - nfft value consumed by #get_spectrum_snapshot',
3161
+ avg: 'optional - avg value consumed by #get_spectrum_snapshot',
3162
+ capture_secs: 'optional - capture secs value consumed by #get_spectrum_snapshot',
3163
+ strength_offset_db: 'optional - strength offset db value consumed by #get_spectrum_snapshot',
3164
+ channel_bw_hz: 'optional - channel bw hz value consumed by #get_spectrum_snapshot',
3165
+ plan_bw_hz: 'optional - plan bw hz value consumed by #get_spectrum_snapshot',
3166
+ peak_height_db: 'optional - peak height db value consumed by #get_spectrum_snapshot',
3167
+ step_hz: 'optional - step hz value consumed by #get_spectrum_snapshot',
3168
+ peak_prom_db: 'optional - peak prom db value consumed by #get_spectrum_snapshot',
3169
+ raster_hz: 'optional - raster hz value consumed by #get_spectrum_snapshot'
3170
+ )
3171
+
3172
+ # Run fast scan range and return its result
3173
+ #{self}.fast_scan_range(
3174
+ gqrx_sock: 'required - GQRX socket object',
3175
+ ranges: 'required - Array<Hash> of {start_freq:, target_freq: }',
3176
+ sample_rate: 'optional - Set this to GQRX visible input sample rate (the span width)',
3177
+ nfft: 'optional - FFT size',
3178
+ avg: 'optional - avg value consumed by #fast_scan_range',
3179
+ capture_secs: 'optional - capture secs value consumed by #fast_scan_range',
3180
+ strength_lock: 'optional - strength lock value consumed by #fast_scan_range',
3181
+ min_snr_db: 'optional - Minimum SNR in dB above per-chunk noise floor to report (defaults to 12.0)',
3182
+ precision: 'optional - Band-plan channel raster; detections snapped to 10**(precision-1) Hz grid (defaults to 5)',
3183
+ min_bw_ratio: 'optional - Reject FFT peaks narrower than min_bw_ratio * plan bandwidth as spurs (defaults to 0.0 = off; half-power carrier BW is often << plan BW)',
3184
+ demodulator_mode: 'optional - Demodulator mode APPLIED to GQRX + attributed to detections (defaults to WFM)',
3185
+ bandwidth: 'optional - Passband bandwidth APPLIED to GQRX + attributed to detections (defaults to 200.000)',
3186
+ squelch: 'optional - Squelch level APPLIED to GQRX (defaults to strength_lock - 3.0)',
3187
+ audio_gain_db: 'optional - Audio gain in dB APPLIED to GQRX (defaults to 0.0)',
3188
+ rf_gain: 'optional - RF gain APPLIED to GQRX (defaults to 0.0)',
3189
+ intermediate_gain: 'optional - Intermediate gain APPLIED to GQRX (defaults to 32.0)',
3190
+ baseband_gain: 'optional - Baseband gain APPLIED to GQRX (defaults to 10.0)',
3191
+ decoder: 'optional - Decoder key (e.g. :gsm) to attribute to detections',
3192
+ location: 'optional - Location string for AI analysis',
3193
+ keep_spectrum: 'optional - if true return raw spectrum arrays too (large)',
3194
+ refine: 'optional - After panoramic FFT, re-walk each detection with traditional edge_detection + find_best_peak scoped around the candidate to lock the exact channel frequency (defaults to true)',
3195
+ scan_log: 'optional - scan log value consumed by #fast_scan_range',
3196
+ strength_offset_db: 'optional - strength offset db value consumed by #fast_scan_range',
3197
+ ai_analysis: 'optional - ai analysis value consumed by #fast_scan_range'
3198
+ )
3199
+
3200
+ # Print the AUTHOR(S) string for this module.
3201
+ #{self}.authors
3202
+ "
3203
+ constants.sort
3145
3204
  end
3146
3205
  end
3147
3206
  end
@@ -44,12 +44,15 @@ module PWN
44
44
 
45
45
  public_class_method def self.help
46
46
  puts "USAGE:
47
+ # Run connect via screen and return its result
47
48
  #{self}.connect_via_screen(
48
- block_dev: 'optional serial block device path (defaults to /dev/ttyUSB0)'
49
+ block_dev: 'optional - serial block device path (defaults to /dev/ttyUSB0)'
49
50
  )
50
51
 
52
+ # Print the AUTHOR(S) string for this module.
51
53
  #{self}.authors
52
54
  "
55
+ constants.sort
53
56
  end
54
57
  end
55
58
  end
@@ -711,62 +711,75 @@ module PWN
711
711
 
712
712
  public_class_method def self.help
713
713
  puts "USAGE:
714
- son_micro_rfid_obj = #{self}.connect(
715
- block_dev: 'optional serial block device path (defaults to /dev/ttyUSB0)',
716
- baud: 'optional (defaults to 19_200)',
717
- data_bits: 'optional (defaults to 8)',
718
- stop_bits: 'optional (defaults to 1)',
714
+ # Run connect and return its result
715
+ #{self}.connect(
716
+ block_dev: 'optional - serial block device path (defaults to /dev/ttyUSB0)',
717
+ baud: 'optional - (defaults to 19_200)',
718
+ data_bits: 'optional - (defaults to 8)',
719
+ stop_bits: 'optional - (defaults to 1)',
719
720
  parity: 'optional - :even|:mark|:odd|:space|:none (defaults to :none)',
720
- flow_control: 'optional - :none|:hard|:soft (defaults to :none)'
721
+ flow_control: 'optional - :none||:hard||:soft (defaults to :none)'
721
722
  )
722
723
 
723
- cmds = #{self}.list_cmds
724
+ # Run list cmds and return its result
725
+ #{self}.list_cmds
724
726
 
725
- params = #{self}.list_params(
727
+ # Run list params and return its result
728
+ #{self}.list_params(
726
729
  cmd: 'required - cmd returned from #list_cmds method'
727
730
  )
728
731
 
729
- parsed_cmd_resp_arr = #{self}.exec(
730
- son_micro_rfid_obj: 'required son_micro_rfid_obj returned from #connect method',
732
+ # Run exec and return its result
733
+ #{self}.exec(
734
+ son_micro_rfid_obj: 'required - son_micro_rfid_obj returned from #connect method',
731
735
  cmd: 'required - cmd returned from #list_cmds method',
732
736
  params: 'optional - parameters for specific command returned from #list_params method'
733
737
  )
734
738
 
735
- rfid_data = #{self}.read_tag(
736
- son_micro_rfid_obj: 'required son_micro_rfid_obj returned from #connect method',
739
+ # Run read tag and return its result
740
+ #{self}.read_tag(
741
+ son_micro_rfid_obj: 'required - son_micro_rfid_obj returned from #connect method',
737
742
  authn: 'optional - authentication flag (default: false)',
738
743
  key: 'optional - key for authentication (default: [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])'
739
744
  )
740
745
 
741
- rfid_data = #{self}.write_tag(
742
- son_micro_rfid_obj: 'required son_micro_rfid_obj returned from #connect method',
743
- rfid_data: 'required - RFID data to write',
746
+ # Run write tag and return its result
747
+ #{self}.write_tag(
748
+ son_micro_rfid_obj: 'required - son_micro_rfid_obj returned from #connect method',
749
+ rfid_data: 'required - RFID data to write (see #read_tag for structure)',
744
750
  authn: 'optional - authentication flag (default: false)',
745
751
  key: 'optional - key for authentication (default: [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])'
746
752
  )
747
753
 
748
- rfid_data = #{self}.backup_tag(
749
- son_micro_rfid_obj: 'required son_micro_rfid_obj returned from #connect method'
754
+ # Run backup tag and return its result
755
+ #{self}.backup_tag(
756
+ son_micro_rfid_obj: 'required - son_micro_rfid_obj returned from #connect method'
750
757
  )
751
758
 
752
- rfid_data = #{self}.clone_tag(
753
- son_micro_rfid_obj: 'required son_micro_rfid_obj returned from #connect method'
759
+ # Run clone tag and return its result
760
+ #{self}.clone_tag(
761
+ son_micro_rfid_obj: 'required - son_micro_rfid_obj returned from #connect method'
754
762
  )
755
763
 
756
- rfid_data = #{self}.load_tag_from_file(
757
- son_micro_rfid_obj: 'required son_micro_rfid_obj returned from #connect method'
764
+ # Run load tag from file and return its result
765
+ #{self}.load_tag_from_file(
766
+ son_micro_rfid_obj: 'required - son_micro_rfid_obj returned from #connect method'
758
767
  )
759
768
 
760
- rfid_data = #{self}.update_tag(
761
- son_micro_rfid_obj: 'required son_micro_rfid_obj returned from #connect method'
769
+ # Run update tag and return its result
770
+ #{self}.update_tag(
771
+ son_micro_rfid_obj: 'required - son_micro_rfid_obj returned from #connect method'
762
772
  )
763
773
 
774
+ # Run disconnect and return its result
764
775
  #{self}.disconnect(
765
- son_micro_rfid_obj: 'required son_micro_rfid_obj returned from #connect method'
776
+ son_micro_rfid_obj: 'required - son_micro_rfid_obj returned from #connect method'
766
777
  )
767
778
 
779
+ # Print the AUTHOR(S) string for this module.
768
780
  #{self}.authors
769
781
  "
782
+ constants.sort
770
783
  end
771
784
  end
772
785
  end
data/lib/pwn/sdr.rb CHANGED
@@ -44,6 +44,20 @@ module PWN
44
44
  end
45
45
 
46
46
  public_class_method def self.help
47
+ puts "USAGE:
48
+ # Run hz to s and return its result
49
+ #{self}.hz_to_s(
50
+ freq: 'required - frequency in Hz (Integer or String)'
51
+ )
52
+
53
+ # Run hz to i and return its result
54
+ #{self}.hz_to_i(
55
+ freq: 'required - frequency string (e.g. 2.450.000.000)'
56
+ )
57
+
58
+ # Display a List of Every PWN::AI Module
59
+ #{self}.authors
60
+ "
47
61
  constants.sort
48
62
  end
49
63
  end
data/lib/pwn/sessions.rb CHANGED
@@ -539,22 +539,92 @@ module PWN
539
539
 
540
540
  # Display Usage for this Module
541
541
  public_class_method def self.help
542
- puts <<~USAGE
543
- USAGE:
544
- sess = PWN::Sessions.create(title: 'recon on target.com')
545
- PWN::Sessions.append(session_id: sess[:id], role: 'user', content: 'Run NmapIt...')
546
- transcript = PWN::Sessions.load(session_id: sess[:id])
547
- hist = PWN::Sessions.to_response_history(session_id: sess[:id])
548
- msgs = PWN::Sessions.to_llm_messages(session_id: sess[:id])
549
- PWN::Sessions.recall(query: 'hping3', exclude_session_id: sess[:id])
550
- PWN::Sessions.previous_id(exclude_session_id: sess[:id])
551
- PWN::Sessions.list
552
- PWN::Sessions.stats
553
- PWN::Sessions.delete(session_id: sess[:id], force: true)
554
- PWN::Sessions.lean!(dry_run: true) # pin gold/mistake refs; drop stubs/age
555
-
556
- #{self}.authors
557
- USAGE
542
+ puts "USAGE:
543
+ # Run sessions dir and return its result
544
+ #{self}.sessions_dir
545
+
546
+ # Run list and return its result
547
+ #{self}.list
548
+
549
+ # Run create and return its result
550
+ #{self}.create(
551
+ title: 'optional - human title',
552
+ source: 'optional - e.g. pwn-ai (defaults to pwn-ai)',
553
+ id: 'optional - fixed session id (tests / replay); default timestamp_hex'
554
+ )
555
+
556
+ # Run append and return its result
557
+ #{self}.append(
558
+ session_id: 'required - session id value consumed by #append',
559
+ role: 'optional - user|assistant|system|observation',
560
+ content: 'optional - the message or obs'
561
+ )
562
+
563
+ # Run load and return its result
564
+ #{self}.load(
565
+ session_id: 'optional - session id value consumed by #load'
566
+ )
567
+
568
+ # Newest session that is not exclude_session_id (the prior pwn-ai run)
569
+ #{self}.previous_id(
570
+ exclude_session_id: 'optional - current session to skip'
571
+ )
572
+
573
+ # Search prior session transcripts for query terms. Current session is
574
+ #{self}.recall(
575
+ query: 'optional - substring / tokens to match',
576
+ exclude_session_id: 'optional - skip this id (current session)',
577
+ include_current: 'optional - Boolean include excluded id (default false)',
578
+ limit: 'optional - max hits (default 12)',
579
+ max_files: 'optional - newest files to scan (default 40)',
580
+ truncate: 'optional - chars per hit (default 280)'
581
+ )
582
+
583
+ # Run to response history and return its result
584
+ #{self}.to_response_history(
585
+ session_id: 'optional - session id value consumed by #to_response_history'
586
+ )
587
+
588
+ # Current-session conversation for the next LLM call. User + assistant
589
+ #{self}.to_llm_messages(
590
+ session_id: 'optional - session id value consumed by #to_llm_messages',
591
+ max_chars: 'optional - max chars value consumed by #to_llm_messages',
592
+ skip_request: 'optional - skip request value consumed by #to_llm_messages'
593
+ )
594
+
595
+ # Refuses deletion of pinned sessions (hot/gold/mistake/current) unless force:true
596
+ #{self}.delete(
597
+ session_id: 'required - session id value consumed by #delete',
598
+ force: 'optional - Boolean bypass pin policy (default false)',
599
+ current_session_id: 'optional - current session id value consumed by #delete'
600
+ )
601
+
602
+ # Run stats and return its result
603
+ #{self}.stats
604
+
605
+ # Run lean and return its result
606
+ #{self}.lean!(
607
+ dry_run: 'optional - Boolean (default false)',
608
+ retain_days: 'optional - drop unreferenced older than this',
609
+ hot_days: 'optional - always keep newer than this',
610
+ max_files: 'optional - soft file cap after protections',
611
+ current_session_id: 'optional - never delete this id',
612
+ tool_content_max: 'optional - tool content max value consumed by #lean!',
613
+ assistant_content_max: 'optional - assistant content max value consumed by #lean!'
614
+ )
615
+
616
+ # Build the pin set from learning gold + open mistakes + hot files + current
617
+ #{self}.protected_session_ids(
618
+ now: 'optional - now value consumed by #protected_session_ids (defaults to Time.now.utc)',
619
+ hot_days: 'optional - hot days value consumed by #protected_session_ids',
620
+ retain_days: 'optional - retain days value consumed by #protected_session_ids',
621
+ current_session_id: 'optional - current session id value consumed by #protected_session_ids'
622
+ )
623
+
624
+ # Print the AUTHOR(S) string for this module.
625
+ #{self}.authors
626
+ "
627
+ constants.sort
558
628
  end
559
629
  end
560
630
  end