diff --git a/app-crypt/haiti-hash/haiti-hash-1.3.0.ebuild b/app-crypt/haiti-hash/haiti-hash-1.3.0.ebuild index bcd4ff425..0afd0de32 100644 --- a/app-crypt/haiti-hash/haiti-hash-1.3.0.ebuild +++ b/app-crypt/haiti-hash/haiti-hash-1.3.0.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_EXTRAINSTALL="data" diff --git a/app-forensics/origami-pdf/origami-pdf-2.1.0.ebuild b/app-forensics/origami-pdf/origami-pdf-2.1.0.ebuild index f6c2b002d..3ed59dbd2 100644 --- a/app-forensics/origami-pdf/origami-pdf-2.1.0.ebuild +++ b/app-forensics/origami-pdf/origami-pdf-2.1.0.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_NAME="origami" RUBY_FAKEGEM_TASK_TEST="test" diff --git a/app-forensics/zsteg/zsteg-0.2.13.ebuild b/app-forensics/zsteg/zsteg-0.2.13.ebuild index f9c860497..8a51c9cd0 100644 --- a/app-forensics/zsteg/zsteg-0.2.13.ebuild +++ b/app-forensics/zsteg/zsteg-0.2.13.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_GEMSPEC="${PN}.gemspec" inherit ruby-fakegem diff --git a/app-text/cewl/cewl-9999.ebuild b/app-text/cewl/cewl-9999.ebuild index 50956c66f..fc9c1f450 100644 --- a/app-text/cewl/cewl-9999.ebuild +++ b/app-text/cewl/cewl-9999.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-ng DESCRIPTION="A custom word list generator" diff --git a/dev-ruby/cms_scanner/cms_scanner-0.14.3.ebuild b/dev-ruby/cms_scanner/cms_scanner-0.14.3.ebuild index 5c16be422..35a1ab166 100644 --- a/dev-ruby/cms_scanner/cms_scanner-0.14.3.ebuild +++ b/dev-ruby/cms_scanner/cms_scanner-0.14.3.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_EXTRAINSTALL="app" inherit ruby-fakegem diff --git a/dev-ruby/cms_scanner/cms_scanner-0.15.0.ebuild b/dev-ruby/cms_scanner/cms_scanner-0.15.0.ebuild index 311db6106..8fce8e7d4 100644 --- a/dev-ruby/cms_scanner/cms_scanner-0.15.0.ebuild +++ b/dev-ruby/cms_scanner/cms_scanner-0.15.0.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_EXTRAINSTALL="app" inherit ruby-fakegem diff --git a/dev-ruby/cookiejar/cookiejar-0.3.3.ebuild b/dev-ruby/cookiejar/cookiejar-0.3.3.ebuild index 113b780eb..eb5291586 100644 --- a/dev-ruby/cookiejar/cookiejar-0.3.3.ebuild +++ b/dev-ruby/cookiejar/cookiejar-0.3.3.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/data_objects/data_objects-0.10.17-r1.ebuild b/dev-ruby/data_objects/data_objects-0.10.17-r1.ebuild index a405716ef..f452778fd 100644 --- a/dev-ruby/data_objects/data_objects-0.10.17-r1.ebuild +++ b/dev-ruby/data_objects/data_objects-0.10.17-r1.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="yard" RUBY_FAKEGEM_DOCDIR="doc" diff --git a/dev-ruby/dm-core/dm-core-1.2.1.ebuild b/dev-ruby/dm-core/dm-core-1.2.1.ebuild index 397c0abbc..19f0c65ee 100644 --- a/dev-ruby/dm-core/dm-core-1.2.1.ebuild +++ b/dev-ruby/dm-core/dm-core-1.2.1.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="yard" RUBY_FAKEGEM_DOCDIR="doc" diff --git a/dev-ruby/dm-do-adapter/dm-do-adapter-1.2.0.ebuild b/dev-ruby/dm-do-adapter/dm-do-adapter-1.2.0.ebuild index 9adde5118..682c15855 100644 --- a/dev-ruby/dm-do-adapter/dm-do-adapter-1.2.0.ebuild +++ b/dev-ruby/dm-do-adapter/dm-do-adapter-1.2.0.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" #RUBY_FAKEGEM_TASK_DOC="yard" diff --git a/dev-ruby/dm-migrations/dm-migrations-1.2.0.ebuild b/dev-ruby/dm-migrations/dm-migrations-1.2.0.ebuild index 55110156b..249213e5e 100644 --- a/dev-ruby/dm-migrations/dm-migrations-1.2.0.ebuild +++ b/dev-ruby/dm-migrations/dm-migrations-1.2.0.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="yard" RUBY_FAKEGEM_DOCDIR="doc" diff --git a/dev-ruby/dm-serializer/dm-serializer-1.2.2.ebuild b/dev-ruby/dm-serializer/dm-serializer-1.2.2.ebuild index 68a7c653e..acd897ea6 100644 --- a/dev-ruby/dm-serializer/dm-serializer-1.2.2.ebuild +++ b/dev-ruby/dm-serializer/dm-serializer-1.2.2.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="yard" RUBY_FAKEGEM_DOCDIR="doc" diff --git a/dev-ruby/dm-sqlite-adapter/dm-sqlite-adapter-1.2.0.ebuild b/dev-ruby/dm-sqlite-adapter/dm-sqlite-adapter-1.2.0.ebuild index 839b89880..165ba7ed8 100644 --- a/dev-ruby/dm-sqlite-adapter/dm-sqlite-adapter-1.2.0.ebuild +++ b/dev-ruby/dm-sqlite-adapter/dm-sqlite-adapter-1.2.0.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="yard" RUBY_FAKEGEM_DOCDIR="doc" diff --git a/dev-ruby/dm-timestamps/dm-timestamps-1.2.0.ebuild b/dev-ruby/dm-timestamps/dm-timestamps-1.2.0.ebuild index e35d45c75..6b6fd7622 100644 --- a/dev-ruby/dm-timestamps/dm-timestamps-1.2.0.ebuild +++ b/dev-ruby/dm-timestamps/dm-timestamps-1.2.0.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="yard" RUBY_FAKEGEM_DOCDIR="doc" diff --git a/dev-ruby/dm-validations/dm-validations-1.2.0.ebuild b/dev-ruby/dm-validations/dm-validations-1.2.0.ebuild index d8c1436a9..19d478747 100644 --- a/dev-ruby/dm-validations/dm-validations-1.2.0.ebuild +++ b/dev-ruby/dm-validations/dm-validations-1.2.0.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="yard" RUBY_FAKEGEM_DOCDIR="doc" diff --git a/dev-ruby/do_sqlite3/do_sqlite3-0.10.17-r1.ebuild b/dev-ruby/do_sqlite3/do_sqlite3-0.10.17-r1.ebuild index 44d091115..99071bc8e 100644 --- a/dev-ruby/do_sqlite3/do_sqlite3-0.10.17-r1.ebuild +++ b/dev-ruby/do_sqlite3/do_sqlite3-0.10.17-r1.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_TEST="spec" diff --git a/dev-ruby/docopt/docopt-0.6.1.ebuild b/dev-ruby/docopt/docopt-0.6.1.ebuild index dd05b77e1..661c0fc33 100644 --- a/dev-ruby/docopt/docopt-0.6.1.ebuild +++ b/dev-ruby/docopt/docopt-0.6.1.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/em-http-request/em-http-request-1.1.7.ebuild b/dev-ruby/em-http-request/em-http-request-1.1.7.ebuild index 31c03f781..752576fa3 100644 --- a/dev-ruby/em-http-request/em-http-request-1.1.7.ebuild +++ b/dev-ruby/em-http-request/em-http-request-1.1.7.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/em-socksify/em-socksify-0.3.2.ebuild b/dev-ruby/em-socksify/em-socksify-0.3.2.ebuild index 29df14a05..460e4b289 100644 --- a/dev-ruby/em-socksify/em-socksify-0.3.2.ebuild +++ b/dev-ruby/em-socksify/em-socksify-0.3.2.ebuild @@ -4,7 +4,7 @@ EAPI=8 #eventmachine does not support ruby27 yet -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/espeak-ruby/espeak-ruby-1.0.4.ebuild b/dev-ruby/espeak-ruby/espeak-ruby-1.0.4.ebuild index 138e6c022..e4aa351d8 100644 --- a/dev-ruby/espeak-ruby/espeak-ruby-1.0.4.ebuild +++ b/dev-ruby/espeak-ruby/espeak-ruby-1.0.4.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/ethon/ethon-0.15.0.ebuild b/dev-ruby/ethon/ethon-0.15.0.ebuild index 10e9e7f46..fcb80eee2 100644 --- a/dev-ruby/ethon/ethon-0.15.0.ebuild +++ b/dev-ruby/ethon/ethon-0.15.0.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby27 ruby30 ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_EXTRADOC="CHANGELOG.md README.md" diff --git a/dev-ruby/fastercsv/fastercsv-1.5.5.ebuild b/dev-ruby/fastercsv/fastercsv-1.5.5.ebuild index a76e8cc0f..daa538310 100644 --- a/dev-ruby/fastercsv/fastercsv-1.5.5.ebuild +++ b/dev-ruby/fastercsv/fastercsv-1.5.5.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/faye-websocket/faye-websocket-0.11.0.ebuild b/dev-ruby/faye-websocket/faye-websocket-0.11.0.ebuild index d04a5d4a2..d5b0239d3 100644 --- a/dev-ruby/faye-websocket/faye-websocket-0.11.0.ebuild +++ b/dev-ruby/faye-websocket/faye-websocket-0.11.0.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/get_process_mem/get_process_mem-0.2.5.ebuild b/dev-ruby/get_process_mem/get_process_mem-0.2.5.ebuild index 0200d5d9b..ed02e5d04 100644 --- a/dev-ruby/get_process_mem/get_process_mem-0.2.5.ebuild +++ b/dev-ruby/get_process_mem/get_process_mem-0.2.5.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/get_process_mem/get_process_mem-0.2.7.ebuild b/dev-ruby/get_process_mem/get_process_mem-0.2.7.ebuild index 0200d5d9b..ed02e5d04 100644 --- a/dev-ruby/get_process_mem/get_process_mem-0.2.7.ebuild +++ b/dev-ruby/get_process_mem/get_process_mem-0.2.7.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/hashie-forbidden_attributes/hashie-forbidden_attributes-0.1.1.ebuild b/dev-ruby/hashie-forbidden_attributes/hashie-forbidden_attributes-0.1.1.ebuild index b0c815390..cbcda201e 100644 --- a/dev-ruby/hashie-forbidden_attributes/hashie-forbidden_attributes-0.1.1.ebuild +++ b/dev-ruby/hashie-forbidden_attributes/hashie-forbidden_attributes-0.1.1.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem DESCRIPTION="Automatic strong parameter detection with Hashie and Forbidden Attributes" diff --git a/dev-ruby/hrr_rb_ssh/hrr_rb_ssh-0.4.2.ebuild b/dev-ruby/hrr_rb_ssh/hrr_rb_ssh-0.4.2.ebuild index 399a86ead..abed152a0 100644 --- a/dev-ruby/hrr_rb_ssh/hrr_rb_ssh-0.4.2.ebuild +++ b/dev-ruby/hrr_rb_ssh/hrr_rb_ssh-0.4.2.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/io-console/io-console-0.5.6-r1.ebuild b/dev-ruby/io-console/io-console-0.5.6-r1.ebuild index 50d13effd..89d7d4444 100644 --- a/dev-ruby/io-console/io-console-0.5.6-r1.ebuild +++ b/dev-ruby/io-console/io-console-0.5.6-r1.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_EXTENSIONS=(ext/io/console/extconf.rb) inherit ruby-fakegem diff --git a/dev-ruby/iostruct/iostruct-0.0.5.ebuild b/dev-ruby/iostruct/iostruct-0.0.5.ebuild index 01e26cc2a..e6eaa1bc9 100644 --- a/dev-ruby/iostruct/iostruct-0.0.5.ebuild +++ b/dev-ruby/iostruct/iostruct-0.0.5.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_GEMSPEC="${PN}.gemspec" inherit ruby-fakegem diff --git a/dev-ruby/irb/irb-1.2.7.ebuild b/dev-ruby/irb/irb-1.2.7.ebuild index 56affa6b4..a9005ad2f 100644 --- a/dev-ruby/irb/irb-1.2.7.ebuild +++ b/dev-ruby/irb/irb-1.2.7.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_BINDIR="exe" inherit ruby-fakegem diff --git a/dev-ruby/irb/irb-1.2.9.ebuild b/dev-ruby/irb/irb-1.2.9.ebuild index 56affa6b4..a9005ad2f 100644 --- a/dev-ruby/irb/irb-1.2.9.ebuild +++ b/dev-ruby/irb/irb-1.2.9.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_BINDIR="exe" inherit ruby-fakegem diff --git a/dev-ruby/louis/louis-2.3.1.ebuild b/dev-ruby/louis/louis-2.3.1.ebuild index 14fc2ba31..2d1f7e3a4 100644 --- a/dev-ruby/louis/louis-2.3.1.ebuild +++ b/dev-ruby/louis/louis-2.3.1.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="yard" RUBY_FAKEGEM_DOCDIR="doc" diff --git a/dev-ruby/louis/louis-2.3.2.ebuild b/dev-ruby/louis/louis-2.3.2.ebuild index 14fc2ba31..2d1f7e3a4 100644 --- a/dev-ruby/louis/louis-2.3.2.ebuild +++ b/dev-ruby/louis/louis-2.3.2.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="yard" RUBY_FAKEGEM_DOCDIR="doc" diff --git a/dev-ruby/metasploit-payloads/metasploit-payloads-2.0.45.ebuild b/dev-ruby/metasploit-payloads/metasploit-payloads-2.0.45.ebuild index 19fe5f618..ce5669fb5 100644 --- a/dev-ruby/metasploit-payloads/metasploit-payloads-2.0.45.ebuild +++ b/dev-ruby/metasploit-payloads/metasploit-payloads-2.0.45.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" diff --git a/dev-ruby/metasploit-payloads/metasploit-payloads-2.0.47.ebuild b/dev-ruby/metasploit-payloads/metasploit-payloads-2.0.47.ebuild index 19fe5f618..ce5669fb5 100644 --- a/dev-ruby/metasploit-payloads/metasploit-payloads-2.0.47.ebuild +++ b/dev-ruby/metasploit-payloads/metasploit-payloads-2.0.47.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" diff --git a/dev-ruby/metasploit_payloads-mettle/metasploit_payloads-mettle-1.0.17.ebuild b/dev-ruby/metasploit_payloads-mettle/metasploit_payloads-mettle-1.0.17.ebuild index a60879f9f..ae944ca5f 100644 --- a/dev-ruby/metasploit_payloads-mettle/metasploit_payloads-mettle-1.0.17.ebuild +++ b/dev-ruby/metasploit_payloads-mettle/metasploit_payloads-mettle-1.0.17.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" diff --git a/dev-ruby/mini_exiftool/mini_exiftool-2.10.0.ebuild b/dev-ruby/mini_exiftool/mini_exiftool-2.10.0.ebuild index 730c8a3ed..b8ec40dd0 100644 --- a/dev-ruby/mini_exiftool/mini_exiftool-2.10.0.ebuild +++ b/dev-ruby/mini_exiftool/mini_exiftool-2.10.0.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/msfrpc-client/msfrpc-client-1.1.2.ebuild b/dev-ruby/msfrpc-client/msfrpc-client-1.1.2.ebuild index 5f6fa2d47..4b6c264cb 100644 --- a/dev-ruby/msfrpc-client/msfrpc-client-1.1.2.ebuild +++ b/dev-ruby/msfrpc-client/msfrpc-client-1.1.2.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="yard" RUBY_FAKEGEM_DOCDIR="doc" diff --git a/dev-ruby/opt_parse_validator/opt_parse_validator-1.10.0.ebuild b/dev-ruby/opt_parse_validator/opt_parse_validator-1.10.0.ebuild index e61b1ccdb..04df53b5c 100644 --- a/dev-ruby/opt_parse_validator/opt_parse_validator-1.10.0.ebuild +++ b/dev-ruby/opt_parse_validator/opt_parse_validator-1.10.0.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/opt_parse_validator/opt_parse_validator-1.10.1.ebuild b/dev-ruby/opt_parse_validator/opt_parse_validator-1.10.1.ebuild index 6a1402b61..2e11bf0dc 100644 --- a/dev-ruby/opt_parse_validator/opt_parse_validator-1.10.1.ebuild +++ b/dev-ruby/opt_parse_validator/opt_parse_validator-1.10.1.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/otr-activerecord/otr-activerecord-2.1.2.ebuild b/dev-ruby/otr-activerecord/otr-activerecord-2.1.2.ebuild index 6930ce4c9..ed9c67406 100644 --- a/dev-ruby/otr-activerecord/otr-activerecord-2.1.2.ebuild +++ b/dev-ruby/otr-activerecord/otr-activerecord-2.1.2.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/parseconfig/parseconfig-1.1.2.ebuild b/dev-ruby/parseconfig/parseconfig-1.1.2.ebuild index 6ee23e9a1..84e3d4c76 100644 --- a/dev-ruby/parseconfig/parseconfig-1.1.2.ebuild +++ b/dev-ruby/parseconfig/parseconfig-1.1.2.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_EXTRADOC="Changelog README.md" diff --git a/dev-ruby/reline/reline-0.1.10.ebuild b/dev-ruby/reline/reline-0.1.10.ebuild index 90d97d931..69e9c7905 100644 --- a/dev-ruby/reline/reline-0.1.10.ebuild +++ b/dev-ruby/reline/reline-0.1.10.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/reline/reline-0.1.5.ebuild b/dev-ruby/reline/reline-0.1.5.ebuild index 90d97d931..69e9c7905 100644 --- a/dev-ruby/reline/reline-0.1.5.ebuild +++ b/dev-ruby/reline/reline-0.1.5.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/reline/reline-0.1.9.ebuild b/dev-ruby/reline/reline-0.1.9.ebuild index 90d97d931..69e9c7905 100644 --- a/dev-ruby/reline/reline-0.1.9.ebuild +++ b/dev-ruby/reline/reline-0.1.9.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/reline/reline-0.2.5.ebuild b/dev-ruby/reline/reline-0.2.5.ebuild index 90d97d931..69e9c7905 100644 --- a/dev-ruby/reline/reline-0.2.5.ebuild +++ b/dev-ruby/reline/reline-0.2.5.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/rex-arch/rex-arch-0.1.13.ebuild b/dev-ruby/rex-arch/rex-arch-0.1.13.ebuild index 4c4b5cf77..f297ce80f 100644 --- a/dev-ruby/rex-arch/rex-arch-0.1.13.ebuild +++ b/dev-ruby/rex-arch/rex-arch-0.1.13.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_RECIPE_TEST="none" RUBY_FAKEGEM_TASK_DOC="" diff --git a/dev-ruby/rex-arch/rex-arch-0.1.14.ebuild b/dev-ruby/rex-arch/rex-arch-0.1.14.ebuild index b439469fb..0a0deefda 100644 --- a/dev-ruby/rex-arch/rex-arch-0.1.14.ebuild +++ b/dev-ruby/rex-arch/rex-arch-0.1.14.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_RECIPE_TEST="none" RUBY_FAKEGEM_TASK_DOC="" diff --git a/dev-ruby/rex-bin_tools/rex-bin_tools-0.1.6-r1.ebuild b/dev-ruby/rex-bin_tools/rex-bin_tools-0.1.6-r1.ebuild index 72acb0e6d..65f4ae8a1 100644 --- a/dev-ruby/rex-bin_tools/rex-bin_tools-0.1.6-r1.ebuild +++ b/dev-ruby/rex-bin_tools/rex-bin_tools-0.1.6-r1.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" RUBY_FAKEGEM_EXTRAINSTALL="data" diff --git a/dev-ruby/rex-bin_tools/rex-bin_tools-0.1.7.ebuild b/dev-ruby/rex-bin_tools/rex-bin_tools-0.1.7.ebuild index b6c3087b4..17135db1d 100644 --- a/dev-ruby/rex-bin_tools/rex-bin_tools-0.1.7.ebuild +++ b/dev-ruby/rex-bin_tools/rex-bin_tools-0.1.7.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" RUBY_FAKEGEM_EXTRAINSTALL="data" diff --git a/dev-ruby/rex-core/rex-core-0.1.13.ebuild b/dev-ruby/rex-core/rex-core-0.1.13.ebuild index 1d2c8361f..5a740bbf0 100644 --- a/dev-ruby/rex-core/rex-core-0.1.13.ebuild +++ b/dev-ruby/rex-core/rex-core-0.1.13.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/rex-core/rex-core-0.1.14.ebuild b/dev-ruby/rex-core/rex-core-0.1.14.ebuild index e07cc2ce8..d389dc634 100644 --- a/dev-ruby/rex-core/rex-core-0.1.14.ebuild +++ b/dev-ruby/rex-core/rex-core-0.1.14.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/rex-core/rex-core-0.1.16.ebuild b/dev-ruby/rex-core/rex-core-0.1.16.ebuild index 5d7e58453..c181b6b33 100644 --- a/dev-ruby/rex-core/rex-core-0.1.16.ebuild +++ b/dev-ruby/rex-core/rex-core-0.1.16.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/rex-encoder/rex-encoder-0.1.4.ebuild b/dev-ruby/rex-encoder/rex-encoder-0.1.4.ebuild index e7b26e6ed..902255890 100644 --- a/dev-ruby/rex-encoder/rex-encoder-0.1.4.ebuild +++ b/dev-ruby/rex-encoder/rex-encoder-0.1.4.ebuild @@ -4,7 +4,7 @@ EAPI=8 #wait for metasm ruby27 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" # Specs are not provided in the gem RUBY_FAKEGEM_RECIPE_TEST="none" diff --git a/dev-ruby/rex-encoder/rex-encoder-0.1.5.ebuild b/dev-ruby/rex-encoder/rex-encoder-0.1.5.ebuild index ed2941780..875ad3784 100644 --- a/dev-ruby/rex-encoder/rex-encoder-0.1.5.ebuild +++ b/dev-ruby/rex-encoder/rex-encoder-0.1.5.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" # Specs are not provided in the gem RUBY_FAKEGEM_RECIPE_TEST="none" diff --git a/dev-ruby/rex-exploitation/rex-exploitation-0.1.24-r1.ebuild b/dev-ruby/rex-exploitation/rex-exploitation-0.1.24-r1.ebuild index b4bc793ce..7604f28f0 100644 --- a/dev-ruby/rex-exploitation/rex-exploitation-0.1.24-r1.ebuild +++ b/dev-ruby/rex-exploitation/rex-exploitation-0.1.24-r1.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_RECIPE_TEST="none" RUBY_FAKEGEM_RECIPE_DOC="rdoc" diff --git a/dev-ruby/rex-exploitation/rex-exploitation-0.1.25.ebuild b/dev-ruby/rex-exploitation/rex-exploitation-0.1.25.ebuild index b4bc793ce..7604f28f0 100644 --- a/dev-ruby/rex-exploitation/rex-exploitation-0.1.25.ebuild +++ b/dev-ruby/rex-exploitation/rex-exploitation-0.1.25.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_RECIPE_TEST="none" RUBY_FAKEGEM_RECIPE_DOC="rdoc" diff --git a/dev-ruby/rex-exploitation/rex-exploitation-0.1.27.ebuild b/dev-ruby/rex-exploitation/rex-exploitation-0.1.27.ebuild index 278a4b9e5..f4e6de453 100644 --- a/dev-ruby/rex-exploitation/rex-exploitation-0.1.27.ebuild +++ b/dev-ruby/rex-exploitation/rex-exploitation-0.1.27.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_RECIPE_TEST="none" RUBY_FAKEGEM_RECIPE_DOC="rdoc" diff --git a/dev-ruby/rex-java/rex-java-0.1.5.ebuild b/dev-ruby/rex-java/rex-java-0.1.5.ebuild index 00f931604..6815d52d3 100644 --- a/dev-ruby/rex-java/rex-java-0.1.5.ebuild +++ b/dev-ruby/rex-java/rex-java-0.1.5.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" #RUBY_FAKEGEM_RECIPE_TEST="rspec3" RUBY_FAKEGEM_TASK_DOC="" diff --git a/dev-ruby/rex-java/rex-java-0.1.6.ebuild b/dev-ruby/rex-java/rex-java-0.1.6.ebuild index 642b87dbd..03e7b966e 100644 --- a/dev-ruby/rex-java/rex-java-0.1.6.ebuild +++ b/dev-ruby/rex-java/rex-java-0.1.6.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" #RUBY_FAKEGEM_RECIPE_TEST="rspec3" RUBY_FAKEGEM_TASK_DOC="" diff --git a/dev-ruby/rex-mime/rex-mime-0.1.5.ebuild b/dev-ruby/rex-mime/rex-mime-0.1.5.ebuild index 01ffc198a..9bb193ca3 100644 --- a/dev-ruby/rex-mime/rex-mime-0.1.5.ebuild +++ b/dev-ruby/rex-mime/rex-mime-0.1.5.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex-mime/rex-mime-0.1.6.ebuild b/dev-ruby/rex-mime/rex-mime-0.1.6.ebuild index 01ffc198a..9bb193ca3 100644 --- a/dev-ruby/rex-mime/rex-mime-0.1.6.ebuild +++ b/dev-ruby/rex-mime/rex-mime-0.1.6.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex-nop/rex-nop-0.1.1.ebuild b/dev-ruby/rex-nop/rex-nop-0.1.1.ebuild index 3418d798e..321abf11a 100644 --- a/dev-ruby/rex-nop/rex-nop-0.1.1.ebuild +++ b/dev-ruby/rex-nop/rex-nop-0.1.1.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex-nop/rex-nop-0.1.2.ebuild b/dev-ruby/rex-nop/rex-nop-0.1.2.ebuild index 4456967c0..fecba9058 100644 --- a/dev-ruby/rex-nop/rex-nop-0.1.2.ebuild +++ b/dev-ruby/rex-nop/rex-nop-0.1.2.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex-ole/rex-ole-0.1.6.ebuild b/dev-ruby/rex-ole/rex-ole-0.1.6.ebuild index fa0290a05..817c936de 100644 --- a/dev-ruby/rex-ole/rex-ole-0.1.6.ebuild +++ b/dev-ruby/rex-ole/rex-ole-0.1.6.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" #RUBY_FAKEGEM_RECIPE_TEST="rspec3" RUBY_FAKEGEM_TASK_DOC="" diff --git a/dev-ruby/rex-ole/rex-ole-0.1.7.ebuild b/dev-ruby/rex-ole/rex-ole-0.1.7.ebuild index 4c80a51b2..72c6d126d 100644 --- a/dev-ruby/rex-ole/rex-ole-0.1.7.ebuild +++ b/dev-ruby/rex-ole/rex-ole-0.1.7.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" #RUBY_FAKEGEM_RECIPE_TEST="rspec3" RUBY_FAKEGEM_TASK_DOC="" diff --git a/dev-ruby/rex-powershell/rex-powershell-0.1.88.ebuild b/dev-ruby/rex-powershell/rex-powershell-0.1.88.ebuild index e859afc96..bed89ae82 100644 --- a/dev-ruby/rex-powershell/rex-powershell-0.1.88.ebuild +++ b/dev-ruby/rex-powershell/rex-powershell-0.1.88.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_EXTRAINSTALL="data" RUBY_FAKEGEM_RECIPE_TEST="none" diff --git a/dev-ruby/rex-powershell/rex-powershell-0.1.90.ebuild b/dev-ruby/rex-powershell/rex-powershell-0.1.90.ebuild index e859afc96..bed89ae82 100644 --- a/dev-ruby/rex-powershell/rex-powershell-0.1.90.ebuild +++ b/dev-ruby/rex-powershell/rex-powershell-0.1.90.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_EXTRAINSTALL="data" RUBY_FAKEGEM_RECIPE_TEST="none" diff --git a/dev-ruby/rex-random_identifier/rex-random_identifier-0.1.4.ebuild b/dev-ruby/rex-random_identifier/rex-random_identifier-0.1.4.ebuild index 1d1b4d08d..87576d800 100644 --- a/dev-ruby/rex-random_identifier/rex-random_identifier-0.1.4.ebuild +++ b/dev-ruby/rex-random_identifier/rex-random_identifier-0.1.4.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" # Upstream has specs but they are not released and upstream is not tagged RUBY_FAKEGEM_RECIPE_TEST="none" diff --git a/dev-ruby/rex-random_identifier/rex-random_identifier-0.1.5.ebuild b/dev-ruby/rex-random_identifier/rex-random_identifier-0.1.5.ebuild index baf21b987..f8de9809a 100644 --- a/dev-ruby/rex-random_identifier/rex-random_identifier-0.1.5.ebuild +++ b/dev-ruby/rex-random_identifier/rex-random_identifier-0.1.5.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" # Upstream has specs but they are not released and upstream is not tagged RUBY_FAKEGEM_RECIPE_TEST="none" diff --git a/dev-ruby/rex-registry/rex-registry-0.1.3.ebuild b/dev-ruby/rex-registry/rex-registry-0.1.3.ebuild index 883398e72..c11e1ea73 100644 --- a/dev-ruby/rex-registry/rex-registry-0.1.3.ebuild +++ b/dev-ruby/rex-registry/rex-registry-0.1.3.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" #RUBY_FAKEGEM_RECIPE_TEST="rspec3" RUBY_FAKEGEM_TASK_DOC="" diff --git a/dev-ruby/rex-registry/rex-registry-0.1.4.ebuild b/dev-ruby/rex-registry/rex-registry-0.1.4.ebuild index be4a5ca82..a3f6f2923 100644 --- a/dev-ruby/rex-registry/rex-registry-0.1.4.ebuild +++ b/dev-ruby/rex-registry/rex-registry-0.1.4.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" #RUBY_FAKEGEM_RECIPE_TEST="rspec3" RUBY_FAKEGEM_TASK_DOC="" diff --git a/dev-ruby/rex-rop_builder/rex-rop_builder-0.1.3.ebuild b/dev-ruby/rex-rop_builder/rex-rop_builder-0.1.3.ebuild index bd450c77a..ee2193ed6 100644 --- a/dev-ruby/rex-rop_builder/rex-rop_builder-0.1.3.ebuild +++ b/dev-ruby/rex-rop_builder/rex-rop_builder-0.1.3.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex-rop_builder/rex-rop_builder-0.1.4.ebuild b/dev-ruby/rex-rop_builder/rex-rop_builder-0.1.4.ebuild index a5d309169..aeba31270 100644 --- a/dev-ruby/rex-rop_builder/rex-rop_builder-0.1.4.ebuild +++ b/dev-ruby/rex-rop_builder/rex-rop_builder-0.1.4.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex-socket/rex-socket-0.1.24.ebuild b/dev-ruby/rex-socket/rex-socket-0.1.24.ebuild index f222287a0..97d8bfeda 100644 --- a/dev-ruby/rex-socket/rex-socket-0.1.24.ebuild +++ b/dev-ruby/rex-socket/rex-socket-0.1.24.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_RECIPE_TEST="none" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex-socket/rex-socket-0.1.25.ebuild b/dev-ruby/rex-socket/rex-socket-0.1.25.ebuild index 4b0d45e30..f024ec6db 100644 --- a/dev-ruby/rex-socket/rex-socket-0.1.25.ebuild +++ b/dev-ruby/rex-socket/rex-socket-0.1.25.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_RECIPE_TEST="none" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex-socket/rex-socket-0.1.29.ebuild b/dev-ruby/rex-socket/rex-socket-0.1.29.ebuild index 4b0d45e30..f024ec6db 100644 --- a/dev-ruby/rex-socket/rex-socket-0.1.29.ebuild +++ b/dev-ruby/rex-socket/rex-socket-0.1.29.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_RECIPE_TEST="none" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex-sslscan/rex-sslscan-0.1.5.ebuild b/dev-ruby/rex-sslscan/rex-sslscan-0.1.5.ebuild index 9bd809e20..faa29d93f 100644 --- a/dev-ruby/rex-sslscan/rex-sslscan-0.1.5.ebuild +++ b/dev-ruby/rex-sslscan/rex-sslscan-0.1.5.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" #RUBY_FAKEGEM_RECIPE_TEST="rspec3" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex-sslscan/rex-sslscan-0.1.6.ebuild b/dev-ruby/rex-sslscan/rex-sslscan-0.1.6.ebuild index 9bd809e20..faa29d93f 100644 --- a/dev-ruby/rex-sslscan/rex-sslscan-0.1.6.ebuild +++ b/dev-ruby/rex-sslscan/rex-sslscan-0.1.6.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" #RUBY_FAKEGEM_RECIPE_TEST="rspec3" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex-struct2/rex-struct2-0.1.1.ebuild b/dev-ruby/rex-struct2/rex-struct2-0.1.1.ebuild index f0b1cad20..26f4d6b7f 100644 --- a/dev-ruby/rex-struct2/rex-struct2-0.1.1.ebuild +++ b/dev-ruby/rex-struct2/rex-struct2-0.1.1.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" #RUBY_FAKEGEM_RECIPE_TEST="rspec3" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex-struct2/rex-struct2-0.1.2.ebuild b/dev-ruby/rex-struct2/rex-struct2-0.1.2.ebuild index 9c9ccc21f..cc1ec63b2 100644 --- a/dev-ruby/rex-struct2/rex-struct2-0.1.2.ebuild +++ b/dev-ruby/rex-struct2/rex-struct2-0.1.2.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex-struct2/rex-struct2-0.1.3.ebuild b/dev-ruby/rex-struct2/rex-struct2-0.1.3.ebuild index 00f85086a..ed1d3e7b4 100644 --- a/dev-ruby/rex-struct2/rex-struct2-0.1.3.ebuild +++ b/dev-ruby/rex-struct2/rex-struct2-0.1.3.ebuild @@ -2,7 +2,7 @@ # Distributed under the terms of the GNU General Public License v2 EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex-text/rex-text-0.2.28.ebuild b/dev-ruby/rex-text/rex-text-0.2.28.ebuild index d2fd57685..30e21bf2e 100644 --- a/dev-ruby/rex-text/rex-text-0.2.28.ebuild +++ b/dev-ruby/rex-text/rex-text-0.2.28.ebuild @@ -2,7 +2,7 @@ # Distributed under the terms of the GNU General Public License v2 EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" # Specs are not bundled in the gem and upstream source is not tagged RUBY_FAKEGEM_RECIPE_TEST="none" diff --git a/dev-ruby/rex-text/rex-text-0.2.29.ebuild b/dev-ruby/rex-text/rex-text-0.2.29.ebuild index d2fd57685..30e21bf2e 100644 --- a/dev-ruby/rex-text/rex-text-0.2.29.ebuild +++ b/dev-ruby/rex-text/rex-text-0.2.29.ebuild @@ -2,7 +2,7 @@ # Distributed under the terms of the GNU General Public License v2 EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" # Specs are not bundled in the gem and upstream source is not tagged RUBY_FAKEGEM_RECIPE_TEST="none" diff --git a/dev-ruby/rex-text/rex-text-0.2.34.ebuild b/dev-ruby/rex-text/rex-text-0.2.34.ebuild index d2fd57685..30e21bf2e 100644 --- a/dev-ruby/rex-text/rex-text-0.2.34.ebuild +++ b/dev-ruby/rex-text/rex-text-0.2.34.ebuild @@ -2,7 +2,7 @@ # Distributed under the terms of the GNU General Public License v2 EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" # Specs are not bundled in the gem and upstream source is not tagged RUBY_FAKEGEM_RECIPE_TEST="none" diff --git a/dev-ruby/rex-zip/rex-zip-0.1.3.ebuild b/dev-ruby/rex-zip/rex-zip-0.1.3.ebuild index 71ddb7121..b1d20fed6 100644 --- a/dev-ruby/rex-zip/rex-zip-0.1.3.ebuild +++ b/dev-ruby/rex-zip/rex-zip-0.1.3.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" #RUBY_FAKEGEM_RECIPE_TEST="rspec3" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex-zip/rex-zip-0.1.4.ebuild b/dev-ruby/rex-zip/rex-zip-0.1.4.ebuild index 71ddb7121..b1d20fed6 100644 --- a/dev-ruby/rex-zip/rex-zip-0.1.4.ebuild +++ b/dev-ruby/rex-zip/rex-zip-0.1.4.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" #RUBY_FAKEGEM_RECIPE_TEST="rspec3" RUBY_FAKEGEM_TASK_DOC="" RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/rex/rex-2.0.13.ebuild b/dev-ruby/rex/rex-2.0.13.ebuild index 9f8aa0b14..19a81c8f9 100644 --- a/dev-ruby/rex/rex-2.0.13.ebuild +++ b/dev-ruby/rex/rex-2.0.13.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" #RUBY_FAKEGEM_RECIPE_TEST="rspec3" #RUBY_FAKEGEM_TASK_DOC="" #RUBY_FAKEGEM_BINWRAP="" diff --git a/dev-ruby/spider/spider-0.5.4.ebuild b/dev-ruby/spider/spider-0.5.4.ebuild index e62a8adf1..8ee7539ae 100644 --- a/dev-ruby/spider/spider-0.5.4.ebuild +++ b/dev-ruby/spider/spider-0.5.4.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_RECIPE_TEST="rspec3" inherit ruby-fakegem diff --git a/dev-ruby/swagger-blocks/swagger-blocks-3.0.0.ebuild b/dev-ruby/swagger-blocks/swagger-blocks-3.0.0.ebuild index 0bf074d37..3990ed8e7 100644 --- a/dev-ruby/swagger-blocks/swagger-blocks-3.0.0.ebuild +++ b/dev-ruby/swagger-blocks/swagger-blocks-3.0.0.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/sys-proctable/sys-proctable-1.2.2.ebuild b/dev-ruby/sys-proctable/sys-proctable-1.2.2.ebuild index 9fcfe94a8..0d1cb923b 100644 --- a/dev-ruby/sys-proctable/sys-proctable-1.2.2.ebuild +++ b/dev-ruby/sys-proctable/sys-proctable-1.2.2.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/sys-proctable/sys-proctable-1.2.6.ebuild b/dev-ruby/sys-proctable/sys-proctable-1.2.6.ebuild index 9fcfe94a8..0d1cb923b 100644 --- a/dev-ruby/sys-proctable/sys-proctable-1.2.6.ebuild +++ b/dev-ruby/sys-proctable/sys-proctable-1.2.6.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/typhoeus/typhoeus-1.4.1.ebuild b/dev-ruby/typhoeus/typhoeus-1.4.1.ebuild index 2e68ad1f6..8330c8ccc 100644 --- a/dev-ruby/typhoeus/typhoeus-1.4.1.ebuild +++ b/dev-ruby/typhoeus/typhoeus-1.4.1.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_EXTRADOC="CHANGELOG.md README.md UPGRADE.md" RUBY_FAKEGEM_TASK_DOC="" diff --git a/dev-ruby/unix-crypt/unix-crypt-1.3.0.ebuild b/dev-ruby/unix-crypt/unix-crypt-1.3.0.ebuild index ce143b933..3e82a4aa2 100644 --- a/dev-ruby/unix-crypt/unix-crypt-1.3.0.ebuild +++ b/dev-ruby/unix-crypt/unix-crypt-1.3.0.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-fakegem diff --git a/dev-ruby/zpng/zpng-0.4.5.ebuild b/dev-ruby/zpng/zpng-0.4.5.ebuild index 21f9ef0e5..87eb860ec 100644 --- a/dev-ruby/zpng/zpng-0.4.5.ebuild +++ b/dev-ruby/zpng/zpng-0.4.5.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_GEMSPEC="${PN}.gemspec" inherit ruby-fakegem diff --git a/dev-util/reflutter/files/356.patch b/dev-util/reflutter/files/356.patch new file mode 100644 index 000000000..b05e266a1 --- /dev/null +++ b/dev-util/reflutter/files/356.patch @@ -0,0 +1,1801 @@ +diff '--color=auto' -Naur ./reflutter-0.8.5.orig/reflutter/__init__.py reflutter-0.8.5/reflutter/__init__.py +--- ./reflutter-0.8.5.orig/reflutter/__init__.py 1970-01-01 07:30:00.000000000 +0730 ++++ reflutter-0.8.5/reflutter/__init__.py 2025-05-25 18:30:06.000000000 +0800 +@@ -0,0 +1,142 @@ ++#!/usr/bin/env python3 ++ ++import argparse ++import os ++import csv ++ ++try: ++ from . import utils ++except Exception: ++ import utils ++ ++from urllib.request import urlretrieve ++from zipfile import ZipFile ++from os.path import join ++import zipfile ++ ++# inits ++patch_dump = False ++build_engine = False ++ ++ ++def _patch_file(file_name: str): ++ print("[*] Processing...") ++ zip_stored = False ++ libapp_arm64 = "", "" ++ libapp_arm = "", "" ++ libapp_x86 = "", "" ++ libapp_x64 = "", "" ++ libapp_ios = "", "" ++ libapp_hash = "" ++ global patch_dump ++ with ZipFile(file_name, "r") as zip_object: ++ list_of_file_names = zip_object.namelist() ++ zip_object.extractall("release") ++ for file_name in list_of_file_names: ++ if file_name.endswith("App.framework/App") or file_name.endswith( ++ "FlutterApp.framework/FlutterApp" ++ ): ++ zip_object.extract(file_name, "libappTmp") ++ libapp_ios = file_name, utils.elff(join("libappTmp", file_name)) ++ libapp_hash = libapp_ios[1] ++ if file_name.endswith("v8a/libapp.so"): ++ if zip_object.getinfo(file_name).compress_type == zipfile.ZIP_STORED: ++ zip_stored = True ++ zip_object.extract(file_name, "libappTmp") ++ libapp_arm64 = file_name, utils.elff(join("libappTmp", file_name)) ++ libapp_hash = libapp_arm64[1] ++ if file_name.endswith("v7a/libapp.so"): ++ if zip_object.getinfo(file_name).compress_type == zipfile.ZIP_STORED: ++ zip_stored = True ++ zip_object.extract(file_name, "libappTmp") ++ libapp_arm = file_name, utils.elff(join("libappTmp", file_name)) ++ libapp_hash = libapp_arm[1] ++ if file_name.endswith("64/libapp.so"): ++ if zip_object.getinfo(file_name).compress_type == zipfile.ZIP_STORED: ++ zip_stored = True ++ zip_object.extract(file_name, "libappTmp") ++ libapp_x64 = file_name, utils.elff(join("libappTmp", file_name)) ++ libapp_hash = libapp_arm[1] ++ if file_name.endswith("86/libflutter.so"): ++ zip_object.extract(file_name, "libappTmp") ++ libapp_x86 = file_name, utils.elff(join("libappTmp", file_name)) ++ libapp_hash = libapp_arm[1] ++ zip_object.close() ++ utils.replace_flutter_lib( ++ libapp_hash, ++ libapp_arm64, ++ libapp_arm, ++ libapp_x64, ++ libapp_x86, ++ libapp_ios, ++ zip_stored, ++ patch_dump, ++ ) ++ ++ ++def _build_engine(libapp_hash: str): ++ global patch_dump ++ if not os.path.exists("enginehash.csv"): ++ urlretrieve( ++ "https://raw.githubusercontent.com/Impact-I/reFlutter/main/enginehash.csv", ++ "enginehash.csv", ++ ) ++ ++ with open("enginehash.csv") as f_obj: ++ utils.replace_file_text( ++ "src/src/flutter/BUILD.gn", ++ ' if (is_android) {\n public_deps +=\n [ "//flutter/shell/platform/android:flutter_shell_native_unittests" ]\n }', ++ "", ++ ) ++ read = csv.DictReader(f_obj, delimiter=",") ++ row_count = sum(1 for _ in read) ++ f_obj.seek(0) ++ reader = csv.DictReader(f_obj, delimiter=",") ++ i = -row_count ++ for line in reader: ++ i = i + 1 ++ if libapp_hash in line["Snapshot_Hash"]: ++ print(line["Engine_commit"]) ++ if ( ++ os.path.exists("src/third_party/dart/runtime/vm/dart.cc") ++ or os.path.exists("tools/generate_package_config/pubspec.yaml") ++ or os.path.exists("deps") ++ or os.path.exists("src/flutter/third_party/dart/runtime/vm/dart.cc") ++ or os.path.exists( ++ "engine/src/flutter/third_party/dart/runtime/vm/dart.cc" ++ ) ++ ): ++ utils.patch_source(libapp_hash, abs(i), patch_dump) ++ ++ ++def main(): ++ global patch_dump, build_engine ++ parser = argparse.ArgumentParser(description="reflutter") ++ parser.add_argument( ++ "-b", ++ "--build-engine", ++ help="Enable build engine", ++ ) ++ parser.add_argument( ++ "-p", ++ "--patch-dump", ++ action="store_true", ++ default=False, ++ help="Enable patch dump", ++ ) ++ parser.add_argument("target", nargs="?", help="APK or IPA file") ++ ++ args = parser.parse_args() ++ if args.build_engine: ++ build_engine = True ++ ++ if args.patch_dump: ++ patch_dump = True ++ ++ if build_engine: ++ _build_engine(args.build_engine) ++ else: ++ if args.target: ++ _patch_file(args.target) ++ else: ++ parser.print_usage() +diff '--color=auto' -Naur ./reflutter-0.8.5.orig/reflutter/utils.py reflutter-0.8.5/reflutter/utils.py +--- ./reflutter-0.8.5.orig/reflutter/utils.py 1970-01-01 07:30:00.000000000 +0730 ++++ reflutter-0.8.5/reflutter/utils.py 2025-05-25 18:30:06.000000000 +0800 +@@ -0,0 +1,616 @@ ++#!/usr/bin/env python3 ++ ++import os ++import shutil ++import sys ++from urllib.request import urlopen, urlretrieve ++from os.path import join ++import zipfile ++import string ++import re ++ ++OLD_SOCKET_PATCH_LAST_VERSION = 58 ++ ++ ++def replace_file_text(fname, textOrig, textReplace): ++ if fname[:15] == "src/third_party": # fix for new flutter source path ++ if not os.path.exists(fname): ++ new_third_party_path = "src/flutter/" + "/".join(fname.split("/")[1:]) ++ if os.path.exists(new_third_party_path): ++ fname = new_third_party_path ++ else: ++ # https://github.com/flutter/flutter/tree/master/engine ++ fname = "engine/src/flutter/" + "/".join(fname.split("/")[1:]) ++ try: ++ with open(fname, "r") as file: ++ filedata = file.read() ++ filedata = filedata.replace(textOrig, textReplace) ++ with open(fname, "w") as file: ++ file.write(filedata) ++ except (IOError, OSError): ++ pass ++ ++ ++def zip_dir(path: str, ziph: zipfile.ZipFile, zip_stored: bool): ++ for root, _, files in os.walk(path): ++ for file in files: ++ if type(file) is str: ++ if ( ++ file.endswith(".so") ++ and zip_stored ++ or file.endswith("resources.arsc") ++ ): ++ ziph.write( ++ os.path.join(root, file), ++ os.path.relpath( ++ os.path.join(root.replace("release/", ""), file), ++ os.path.join(path, ".."), ++ ), ++ zipfile.ZIP_STORED, ++ ) ++ else: ++ ziph.write( ++ os.path.join(root, file), ++ os.path.relpath( ++ os.path.join(root.replace("release/", ""), file), ++ os.path.join(path, ".."), ++ ), ++ zipfile.ZIP_DEFLATED, ++ ) ++ else: ++ ziph.write( ++ os.path.join(root, file), ++ os.path.relpath( ++ os.path.join(root.replace("release/", ""), file), ++ os.path.join(path, ".."), ++ ), ++ zipfile.ZIP_DEFLATED, ++ ) ++ ++ ++def check_libapp_hash(libapp_hash: str) -> int | None: ++ if libapp_hash == "": ++ print( ++ "\nIs this really a Flutter app? \nThere was no libapp.so (Android) or App (iOS) found in the package.\n\n Make sure there is arm64-v8a/libapp.so or App.framework/App file in the package. If flutter library name differs you need to rename it properly before patching.\n" ++ ) ++ sys.exit() ++ resp = ( ++ urlopen( ++ "https://raw.githubusercontent.com/Impact-I/reFlutter/main/enginehash.csv" ++ ) ++ .read() ++ .decode("utf-8") ++ ) ++ if libapp_hash not in resp: ++ shutil.rmtree("libappTmp") ++ print( ++ "\n Engine SnapshotHash: " ++ + libapp_hash ++ + "\n\n This engine is currently not supported.\n Most likely this flutter application uses the Debug version engine which you need to build manually using Docker at the moment.\n More details: https://github.com/Impact-I/reFlutter\n" ++ ) ++ sys.exit() ++ ++ resp = resp.splitlines() ++ _index = 0 ++ for _ in resp: ++ _index += 1 ++ if libapp_hash in _: ++ break ++ return len(resp) + 1 - _index ++ ++ ++def elff(fname: str) -> str: ++ libapp_hash = "" ++ min = 32 ++ f = open(fname, errors="ignore") ++ result = "" ++ for c in f.read(): ++ if c in string.printable: ++ result += c ++ continue ++ if len(result) >= min: ++ hashT = re.findall(r"([a-f\d]{32})", result) ++ if len(hashT) > 0: ++ f.close() ++ libapp_hash = hashT[0] ++ return libapp_hash ++ result = "" ++ return libapp_hash ++ ++ ++def not_except(filename: str): ++ try: ++ os.remove(filename) ++ except Exception: ++ pass ++ ++ ++def convert_ip_fix(IPBurp: str): ++ intoct = list(IPBurp.split(".")) ++ finallistIP = list(IPBurp.split(".")) ++ intoct.sort(key=lambda s: len(s)) ++ intoct.reverse() ++ for i in intoct: ++ if ( ++ len(i) != 3 and int(i) > 7 and int(i) > 63 and len(".".join(intoct)) < 15 ++ ): # 64-99 ++ intoct[intoct.index(i)] = str(oct(int(i))).replace("o", "") ++ elif len(i) != 3 and 7 < int(i) < 64 and len(".".join(intoct)) < 15: # 8-63 ++ intoct[intoct.index(i)] = str(oct(int(i))).replace("o", "") ++ elif len(i) < 3 and int(i) < 8 and len(".".join(intoct)) < 15: # 0-7 ++ intoct[intoct.index(i)] = intoct[intoct.index(i)].zfill(3) ++ for i in intoct: ++ if i.startswith("0"): ++ if len(i) != 3 and int(i, 8) > 7 and len(".".join(intoct)) > 15: # 8-63 ++ intoct[intoct.index(i)] = str(int(i, 8)).replace("o", "") ++ elif len(i) < 3 and int(i) < 8 and len(".".join(intoct)) < 15: # 0-7 ++ intoct[intoct.index(i)] = intoct[intoct.index(i)].zfill(3) ++ elif ( ++ len(i) == 3 and int(i) > 7 and int(i) > 99 and len(".".join(intoct)) > 15 ++ ): # 64-99 ++ intoct[intoct.index(i)] = str(oct(int(i))).replace("o", "") ++ for i in intoct: ++ nn = intoct.index(i) ++ if i.startswith("0"): ++ if len(i) > 2 and int(i) > 7 and len(".".join(intoct)) > 15: # 8-63 ++ intoct[nn] = str(int(i, 8)).replace("o", "") ++ elif ( ++ len(i) != 3 and int(i) > 7 and int(i) > 63 and len(".".join(intoct)) < 15 ++ ): # 0-7 ++ intoct[nn] = str(oct(int(i))).replace("o", "") ++ for i in intoct: ++ if len(i) < 3 and int(i) < 8 and len(".".join(intoct)) < 15: ++ intoct[intoct.index(i)] = str(int(i)).zfill(2) ++ for f in finallistIP: ++ for i in intoct: ++ if i.startswith("0"): ++ if f == str(int(i, 8)): ++ mi = finallistIP.index(f) ++ finallistIP[mi] = i.replace("o", "") ++ if len(".".join(finallistIP)) > 15: ++ finallistIP[mi] = str(int(i, 8)).replace("o", "") ++ if len(".".join(finallistIP)) < 15: ++ for f in finallistIP: ++ if len(f) < 3 and int(f) < 8: ++ finallistIP[finallistIP.index(f)] = str(int(f)).zfill(2) ++ return ".".join(finallistIP) ++ ++ ++def input_burp_ip() -> str: ++ burp_ip = input("\nExample: (192.168.1.154) etc.\nPlease enter your BurpSuite IP: ") ++ if not re.match(r"[0-9]+(?:\.[0-9]+){3}", burp_ip): ++ print("Invalid IP Address") ++ input_burp_ip() ++ return convert_ip_fix(burp_ip) ++ ++ ++def replace_flutter_lib( ++ libapp_hash: str, ++ libapp_arm64: tuple, ++ libapp_arm: tuple, ++ libapp_x64: tuple, ++ libapp_x86: tuple, ++ libapp_ios: tuple, ++ zip_stored: bool, ++ patch_dump: bool, ++): ++ flutter_version_index = check_libapp_hash(libapp_hash) ++ ++ burp_ip = None ++ if ( ++ flutter_version_index is not None ++ and flutter_version_index <= OLD_SOCKET_PATCH_LAST_VERSION ++ ): ++ burp_ip = input_burp_ip() ++ get_network_lib( ++ libapp_arm64, ++ libapp_arm, ++ libapp_x64, ++ libapp_x86, ++ libapp_ios, ++ patch_dump, ++ burp_ip, ++ ) ++ if ( ++ os.path.exists("libflutter_arm64.so") ++ or os.path.exists("libflutter_arm.so") ++ or os.path.exists("libflutter_x64.so") ++ or os.path.exists("libflutter_x86.so") ++ or os.path.exists("Flutter") ++ ): ++ try: ++ shutil.move( ++ "Flutter", ++ join( ++ "release", ++ libapp_ios[0] ++ .replace("App.framework/App", "Flutter.framework/Flutter") ++ .replace( ++ "FlutterApp.framework/FlutterApp", "Flutter.framework/Flutter" ++ ), ++ ), ++ ) ++ except Exception: ++ pass ++ try: ++ shutil.move( ++ "libflutter_arm64.so", ++ join("release", libapp_arm64[0].replace("libapp.so", "libflutter.so")), ++ ) ++ except Exception: ++ pass ++ try: ++ shutil.move( ++ "libflutter_arm.so", ++ join("release", libapp_arm[0].replace("libapp.so", "libflutter.so")), ++ ) ++ except Exception: ++ pass ++ try: ++ shutil.move( ++ "libflutter_x64.so", ++ join("release", libapp_x64[0].replace("libapp.so", "libflutter.so")), ++ ) ++ except Exception: ++ pass ++ try: ++ shutil.move("libflutter_x86.so", join("release", libapp_x86[0])) ++ except Exception: ++ pass ++ ++ zipf = zipfile.ZipFile("release.RE.zip", "w", zipfile.ZIP_DEFLATED) ++ zip_dir("release/", zipf, zip_stored) ++ zipf.close() ++ shutil.rmtree("libappTmp") ++ shutil.rmtree("release") ++ print("\nSnapshotHash: " + libapp_hash) ++ if len(libapp_ios[1]) != 0: ++ shutil.move("release.RE.zip", "release.RE.ipa") ++ print("The resulting ipa file: ./release.RE.ipa") ++ if ( ++ flutter_version_index is not None ++ and flutter_version_index > OLD_SOCKET_PATCH_LAST_VERSION ++ ): ++ print( ++ "Please sign & install the ipa file.\n\nConfigure Potatso (iOS) to use your Burp Suite proxy server.\n" ++ ) ++ else: ++ print( ++ "Please sign & install the ipa file\n\nConfigure Burp Suite proxy server to listen on *:8083\nProxy Tab -> Options -> Proxy Listeners -> Edit -> Binding Tab\n\nThen enable invisible proxying in Request Handling Tab\nSupport Invisible Proxying -> true\n" ++ ) ++ else: ++ shutil.move("release.RE.zip", "release.RE.apk") ++ print("The resulting apk file: ./release.RE.apk") ++ if ( ++ flutter_version_index is not None ++ and flutter_version_index > OLD_SOCKET_PATCH_LAST_VERSION ++ ): ++ print( ++ "Please sign, align & install the apk file.\n\nConfigure TunProxy (Android) to use your Burp Suite proxy server.\n" ++ ) ++ else: ++ print( ++ "Please sign, align & install the apk file\n\nConfigure Burp Suite proxy server to listen on *:8083\nProxy Tab -> Options -> Proxy Listeners -> Edit -> Binding Tab\n\nThen enable invisible proxying in Request Handling Tab\nSupport Invisible Proxying -> true\n" ++ ) ++ sys.exit() ++ ++ ++def get_network_lib( ++ libapp_arm64: tuple, ++ libapp_arm: tuple, ++ libapp_x64: tuple, ++ libapp_x86: tuple, ++ libapp_ios: tuple, ++ patch_dump: bool, ++ burp_ip: str | None, ++): ++ verUrl = "v2-" ++ if patch_dump: ++ verUrl = "v3-" ++ if len(libapp_ios[1]) != 0: ++ try: ++ urlretrieve( ++ "https://github.com/Impact-I/reFlutter/releases/download/ios-" ++ + verUrl ++ + libapp_ios[1] ++ + "/Flutter", ++ "Flutter", ++ ) ++ except Exception: ++ libapp_ios = "", "" ++ not_except("Flutter") ++ if len(libapp_arm64[1]) != 0: ++ try: ++ urlretrieve( ++ "https://github.com/Impact-I/reFlutter/releases/download/android-" ++ + verUrl ++ + libapp_arm64[1] ++ + "/libflutter_arm64.so", ++ "libflutter_arm64.so", ++ ) ++ except Exception: ++ libapp_arm64 = "", "" ++ not_except("libflutter_arm64.so") ++ if len(libapp_arm[1]) != 0: ++ try: ++ urlretrieve( ++ "https://github.com/Impact-I/reFlutter/releases/download/android-" ++ + verUrl ++ + libapp_arm[1] ++ + "/libflutter_arm.so", ++ "libflutter_arm.so", ++ ) ++ except Exception: ++ libapp_arm = "", "" ++ not_except("libflutter_arm.so") ++ if len(libapp_x64[1]) != 0: ++ try: ++ urlretrieve( ++ "https://github.com/Impact-I/reFlutter/releases/download/android-" ++ + verUrl ++ + libapp_x64[1] ++ + "/libflutter_x64.so", ++ "libflutter_x64.so", ++ ) ++ except Exception: ++ libapp_x64 = "", "" ++ not_except("libflutter_x64.so") ++ if len(libapp_x86[1]) != 0: ++ try: ++ urlretrieve( ++ "https://github.com/Impact-I/reFlutter/releases/download/android-" ++ + verUrl ++ + libapp_x86[1] ++ + "/libflutter_x86.so", ++ "libflutter_x86.so", ++ ) ++ except Exception: ++ libapp_x86 = "", "" ++ not_except("libflutter_x86.so") ++ ++ if burp_ip is not None: ++ patch_library( ++ libapp_arm64, libapp_arm, libapp_x64, libapp_x86, libapp_ios, burp_ip ++ ) ++ ++ ++def patch_library( ++ libapp_arm64: tuple, ++ libapp_arm: tuple, ++ libapp_x64: tuple, ++ libapp_x86: tuple, ++ libapp_ios: tuple, ++ burp_ip: str, ++): ++ if len(libapp_ios[1]) != 0: ++ buffer = ( ++ open("Flutter", "rb") ++ .read() ++ .replace(b"192.168.133.104", burp_ip.encode("ascii")) ++ ) ++ open("Flutter", "wb").write(buffer) ++ if len(libapp_arm64[1]) != 0: ++ buffer = ( ++ open("libflutter_arm64.so", "rb") ++ .read() ++ .replace(b"192.168.133.104", burp_ip.encode("ascii")) ++ ) ++ open("libflutter_arm64.so", "wb").write(buffer) ++ if len(libapp_arm[1]) != 0: ++ buffer = ( ++ open("libflutter_arm.so", "rb") ++ .read() ++ .replace(b"192.168.133.104", burp_ip.encode("ascii")) ++ ) ++ open("libflutter_arm.so", "wb").write(buffer) ++ if len(libapp_x64[1]) != 0: ++ buffer = ( ++ open("libflutter_x64.so", "rb") ++ .read() ++ .replace(b"192.168.133.104", burp_ip.encode("ascii")) ++ ) ++ open("libflutter_x64.so", "wb").write(buffer) ++ if len(libapp_x86[1]) != 0: ++ buffer = ( ++ open("libflutter_x86.so", "rb") ++ .read() ++ .replace(b"192.168.133.104", burp_ip.encode("ascii")) ++ ) ++ open("libflutter_x86.so", "wb").write(buffer) ++ ++ ++def patch_source(libapp_hash: str, ver: int, patch_dump: bool): ++ try: ++ os.makedirs(os.path.join(os.environ["HOME"], "Documents")) ++ except Exception: ++ pass ++ try: ++ os.makedirs("Documents") ++ except Exception: ++ pass ++ replace_file_text( ++ "DEPS", ++ "'src/third_party/dart/third_party/pkg/stagehand':\n Var('dart_git') + '/stagehand.git@e64ac90cac508981011299c4ceb819149e71f1bd',", ++ "", ++ ) ++ replace_file_text( ++ "DEPS", ++ "'src/third_party/dart/third_party/pkg/stagehand':\n Var('dart_git') + '/stagehand.git' + '@' + Var('dart_stagehand_tag'),", ++ "", ++ ) ++ replace_file_text( ++ "DEPS", ++ "'src/third_party/dart/third_party/pkg/tflite_native':\n Var('dart_git') + '/tflite_native.git' + '@' + Var('dart_tflite_native_rev'),", ++ "", ++ ) ++ replace_file_text( ++ "src/third_party/dart/DEPS", ++ 'Var("dart_root") + "/third_party/pkg/tflite_native":\n Var("dart_git") + "tflite_native.git" + "@" + Var("tflite_native_rev"),', ++ "", ++ ) ++ replace_file_text( ++ "DEPS", ++ 'Var("dart_root") + "/third_party/pkg/tflite_native":\n Var("dart_git") + "tflite_native.git" + "@" + Var("tflite_native_rev"),', ++ "", ++ ) ++ ++ if ver >= 24 and patch_dump: ++ replace_file_text( ++ "src/third_party/dart/runtime/vm/clustered_snapshot.cc", ++ "monomorphic_entry_point + unchecked_offset", ++ "previous_text_offset_", ++ ) ++ if ver < 24 and patch_dump: ++ replace_file_text( ++ "src/third_party/dart/runtime/vm/clustered_snapshot.cc", ++ "monomorphic_entry_point + unchecked_offset", ++ "bare_offset", ++ ) ++ if ver < 39 and patch_dump: ++ replace_file_text( ++ "src/third_party/dart/runtime/vm/app_snapshot.cc", ++ "monomorphic_entry_point + unchecked_offset", ++ "previous_text_offset_", ++ ) ++ if ver > 38 and patch_dump: ++ replace_file_text( ++ "src/third_party/dart/runtime/vm/app_snapshot.cc", ++ """code->untag()->monomorphic_unchecked_entry_point_ = ++ monomorphic_entry_point + unchecked_offset;""", ++ """auto& offset = instructions_table_.rodata()->entries()[instructions_table_.rodata()->first_entry_with_code + instructions_index_ - 1].pc_offset;\ncode->untag()->monomorphic_unchecked_entry_point_ = offset;""", ++ ) ++ ++ # new fix for patch dump ++ replace_file_text( ++ "src/third_party/dart/runtime/vm/app_snapshot.cc", ++ "ASSERT(code->IsCode());", ++ 'ASSERT(code->IsCode());\n auto& rClass = Class::Handle(func.Owner()); auto& rLib = Library::Handle(rClass.library()); auto& rlibName = String::Handle(rLib.url()); char offsetString[70]; snprintf(offsetString, sizeof(offsetString), "0x%016" PRIxPTR, static_cast(code->untag()->monomorphic_unchecked_entry_point_)); JSONWriter js; js.OpenObject(); js.PrintProperty("method_name", func.UserVisibleNameCString()); js.PrintProperty("offset", offsetString); js.PrintProperty("library_url", rlibName.ToCString()); js.PrintProperty("class_name", rClass.UserVisibleNameCString()); js.CloseObject(); char* buffer = nullptr; intptr_t buffer_length = 0; js.Steal(&buffer, &buffer_length); struct stat entry_info; int exists = 0; if (stat("/data/data/", &entry_info)==0 && S_ISDIR(entry_info.st_mode)){ exists = 1; } if(exists == 1){ pid_t pid = getpid(); char path[64] = { 0 }; snprintf(path, sizeof(path), "/proc/%d/cmdline", pid); FILE *cmdline = fopen(path, "r"); if (cmdline) { char chm[264] = { 0 }; char pat[264] = { 0 }; char application_id[64] = { 0 }; fread(application_id, sizeof(application_id), 1, cmdline); snprintf(pat, sizeof(pat), "/data/data/%s/dump.dart", application_id); do { FILE *f = fopen(pat, "a+"); fprintf(f, "%s", buffer); fflush(f); fclose(f); snprintf(chm, sizeof(chm), "/data/data/%s",application_id); chmod(chm, S_IRWXU|S_IRWXG|S_IRWXO); chmod(pat, S_IRWXU|S_IRWXG|S_IRWXO); } while (0); fclose(cmdline); } } if(exists == 0){ char pat[264] = { 0 }; snprintf(pat, sizeof(pat), "%s/Documents/dump.dart", getenv("HOME")); OS::PrintErr("reFlutter dump file: %s",pat); do { FILE *f = fopen(pat, "a+"); fprintf(f, "%s", buffer); fflush(f); fclose(f); } while (0); }\n', ++ ) ++ ++ if patch_dump: ++ replace_file_text( ++ "src/third_party/dart/runtime/vm/dart.cc", ++ "FLAG_print_class_table)", ++ "true)", ++ ) ++ replace_file_text( ++ "src/third_party/dart/runtime/vm/dart_api_impl.cc", ++ "FLAG_print_class_table)", ++ "true)", ++ ) ++ replace_file_text( ++ "src/third_party/dart/runtime/vm/class_table.cc", ++ '#include "vm/visitor.h"', ++ '#include "vm/visitor.h"\n#include ', ++ ) ++ replace_file_text( ++ "src/third_party/dart/runtime/vm/app_snapshot.cc", ++ '#include "vm/version.h"', ++ '#include "vm/version.h"\n#include ', ++ ) ++ ++ if ver > 27: ++ replace_file_text( ++ "src/flutter/BUILD.gn", ++ ' if (is_android) {\n public_deps +=\n [ "//flutter/shell/platform/android:flutter_shell_native_unittests" ]\n }', ++ "", ++ ) ++ ++ if 27 < ver < 53 and patch_dump: ++ replace_file_text( ++ "src/third_party/dart/runtime/vm/class_table.cc", ++ "::Print() {", ++ '::Print() { OS::PrintErr("reFlutter");\n char pushArr[1600000]="";\n', ++ ) ++ replace_file_text( ++ "src/third_party/dart/runtime/vm/class_table.cc", ++ 'OS::PrintErr("%" Pd ": %s\\n", i, name.ToCString());', ++ '\n auto& funcs = Array::Handle(cls.functions()); if (funcs.Length()>1000) { continue; } char classText[2500000]=""; String& supname = String::Handle(); name = cls.Name(); strcat(classText,cls.ToCString()); Class& supcls = Class::Handle(); supcls = cls.SuperClass(); if (!supcls.IsNull()) { supname = supcls.Name(); strcat(classText," extends "); strcat(classText,supname.ToCString()); } const auto& interfaces = Array::Handle(cls.interfaces()); auto& interface = Instance::Handle(); for (intptr_t in = 0;in < interfaces.Length(); in++) { interface^=interfaces.At(in); if(in==0){strcat(classText," implements ");} if(in>0){strcat(classText," , ");} strcat(classText,interface.ToCString()); } strcat(classText," {\\n"); const auto& fields = Array::Handle(cls.fields()); auto& field = Field::Handle(); auto& fieldType = AbstractType::Handle(); String& fieldTypeName = String::Handle(); String& finame = String::Handle(); Instance& instance2 = Instance::Handle(); for (intptr_t f = 0; f < fields.Length(); f++) { field ^= fields.At(f); finame = field.name(); fieldType = field.type(); fieldTypeName = fieldType.Name(); strcat(classText," "); strcat(classText,fieldTypeName.ToCString()); strcat(classText," "); strcat(classText,finame.ToCString()); if(field.is_static()){ instance2 ^= field.StaticValue(); strcat(classText," = "); strcat(classText,instance2.ToCString()); strcat(classText," ;\\n"); } else { strcat(classText," = "); strcat(classText," nonstatic;\\n"); } } for (intptr_t c = 0; c < funcs.Length(); c++) { auto& func = Function::Handle(); func = cls.FunctionFromIndex(c); String& signature = String::Handle(); signature = func.InternalSignature();auto& codee = Code::Handle(func.CurrentCode()); if(!func.IsLocalFunction()) { strcat(classText," \\n "); strcat(classText,func.ToCString()); strcat(classText," "); strcat(classText,signature.ToCString()); strcat(classText," { \\n\\n "); char append[70]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } else { auto& parf = Function::Handle(); parf=func.parent_function(); String& signParent = String::Handle(); signParent = parf.InternalSignature(); strcat(classText," \\n "); strcat(classText,parf.ToCString()); strcat(classText," "); strcat(classText,signParent.ToCString()); strcat(classText," { \\n\\n "); char append[80]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } } strcat(classText," \\n }\\n\\n"); const Library& libr = Library::Handle(cls.library());if (!libr.IsNull()) { auto& owner_class = Class::Handle(); owner_class = libr.toplevel_class(); auto& funcsTopLevel = Array::Handle(owner_class.functions()); char pushTmp[1000]; String& owner_name = String::Handle(); owner_name = libr.url(); snprintf(pushTmp, sizeof(pushTmp), "\'%s\',",owner_name.ToCString()); if (funcsTopLevel.Length()>0&&strstr(pushArr, pushTmp) == NULL) { strcat(pushArr,pushTmp); strcat(classText,"Library:"); strcat(classText,pushTmp); strcat(classText," {\\n"); for (intptr_t c = 0; c < funcsTopLevel.Length(); c++) { auto& func = Function::Handle(); func = owner_class.FunctionFromIndex(c); String& signature = String::Handle(); signature = func.InternalSignature(); auto& codee = Code::Handle(func.CurrentCode()); if(!func.IsLocalFunction()) { strcat(classText," \\n "); strcat(classText,func.ToCString()); strcat(classText," "); strcat(classText,signature.ToCString()); strcat(classText," { \\n\\n "); char append[70]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } else { auto& parf = Function::Handle(); parf=func.parent_function(); String& signParent = String::Handle(); signParent = parf.InternalSignature(); strcat(classText," \\n "); strcat(classText,parf.ToCString()); strcat(classText," "); strcat(classText,signParent.ToCString()); strcat(classText," { \\n\\n "); char append[80]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } } strcat(classText," \\n }\\n\\n");}} struct stat entry_info; int exists = 0; if (stat("/data/data/", &entry_info)==0 && S_ISDIR(entry_info.st_mode)){ exists=1; } if(exists==1){ pid_t pid = getpid(); char path[64] = { 0 }; snprintf(path, sizeof(path), "/proc/%d/cmdline", pid); FILE *cmdline = fopen(path, "r"); if (cmdline) { char chm[264] = { 0 }; char pat[264] = { 0 }; char application_id[64] = { 0 }; fread(application_id, sizeof(application_id), 1, cmdline); snprintf(pat, sizeof(pat), "/data/data/%s/dump.dart", application_id); do { FILE *f = fopen(pat, "a+"); fprintf(f, "%s",classText); fflush(f); fclose(f); snprintf(chm, sizeof(chm), "/data/data/%s",application_id); chmod(chm, S_IRWXU|S_IRWXG|S_IRWXO); chmod(pat, S_IRWXU|S_IRWXG|S_IRWXO); } while (0); fclose(cmdline); } } if(exists==0){ char pat[264] = { 0 }; snprintf(pat, sizeof(pat), "%s/Documents/dump.dart", getenv("HOME")); OS::PrintErr("reFlutter dump file: %s",pat); do { FILE *f = fopen(pat, "a+"); fprintf(f, "%s",classText); fflush(f); fclose(f); } while (0); }', ++ ) ++ elif ver < 28 and patch_dump: ++ replace_file_text( ++ "src/third_party/dart/runtime/vm/class_table.cc", ++ "::Print() {", ++ '::Print() { OS::PrintErr("reFlutter");\n char pushArr[1600000]="";\n', ++ ) ++ replace_file_text( ++ "src/third_party/dart/runtime/vm/class_table.cc", ++ 'OS::PrintErr("%" Pd ": %s\\n", i, name.ToCString());', ++ '\n auto& funcs = Array::Handle(cls.functions()); if (funcs.Length()>1000) { continue; } char classText[2500000]=""; String& supname = String::Handle(); name = cls.Name(); strcat(classText,cls.ToCString()); Class& supcls = Class::Handle(); supcls = cls.SuperClass(); if (!supcls.IsNull()) { supname = supcls.Name(); strcat(classText," extends "); strcat(classText,supname.ToCString()); } const auto& interfaces = Array::Handle(cls.interfaces()); auto& interface = Instance::Handle(); for (intptr_t in = 0;in < interfaces.Length(); in++) { interface^=interfaces.At(in); if(in==0){strcat(classText," implements ");} if(in>0){strcat(classText," , ");} strcat(classText,interface.ToCString()); } strcat(classText," {\\n"); const auto& fields = Array::Handle(cls.fields()); auto& field = Field::Handle(); auto& fieldType = AbstractType::Handle(); String& fieldTypeName = String::Handle(); String& finame = String::Handle(); Instance& instance2 = Instance::Handle(); for (intptr_t f = 0; f < fields.Length(); f++) { field ^= fields.At(f); finame = field.name(); fieldType = field.type(); fieldTypeName = fieldType.Name(); strcat(classText," "); strcat(classText,fieldTypeName.ToCString()); strcat(classText," "); strcat(classText,finame.ToCString()); if(field.is_static()){ instance2 = field.StaticValue(); strcat(classText," = "); strcat(classText,instance2.ToCString()); strcat(classText," ;\\n"); } else { strcat(classText," = "); strcat(classText," nonstatic;\\n"); } } for (intptr_t c = 0; c < funcs.Length(); c++) { auto& func = Function::Handle(); func = cls.FunctionFromIndex(c); String& signature = String::Handle(); signature = func.Signature();auto& codee = Code::Handle(func.CurrentCode()); if(!func.IsLocalFunction()) { strcat(classText," \\n "); strcat(classText,func.ToCString()); strcat(classText," "); strcat(classText,signature.ToCString()); strcat(classText," { \\n\\n "); char append[70]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } else { auto& parf = Function::Handle(); parf=func.parent_function(); String& signParent = String::Handle(); signParent = parf.Signature(); strcat(classText," \\n "); strcat(classText,parf.ToCString()); strcat(classText," "); strcat(classText,signParent.ToCString()); strcat(classText," { \\n\\n "); char append[80]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } } strcat(classText," \\n }\\n\\n"); const Library& libr = Library::Handle(cls.library());if (!libr.IsNull()) { auto& owner_class = Class::Handle(); owner_class = libr.toplevel_class(); auto& funcsTopLevel = Array::Handle(owner_class.functions()); char pushTmp[1000]; String& owner_name = String::Handle(); owner_name = libr.url(); snprintf(pushTmp, sizeof(pushTmp), "\'%s\',",owner_name.ToCString()); if (funcsTopLevel.Length()>0&&strstr(pushArr, pushTmp) == NULL) { strcat(pushArr,pushTmp); strcat(classText,"Library:"); strcat(classText,pushTmp); strcat(classText," {\\n"); for (intptr_t c = 0; c < funcsTopLevel.Length(); c++) { auto& func = Function::Handle(); func = owner_class.FunctionFromIndex(c); String& signature = String::Handle(); signature = func.Signature(); auto& codee = Code::Handle(func.CurrentCode()); if(!func.IsLocalFunction()) { strcat(classText," \\n "); strcat(classText,func.ToCString()); strcat(classText," "); strcat(classText,signature.ToCString()); strcat(classText," { \\n\\n "); char append[70]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } else { auto& parf = Function::Handle(); parf=func.parent_function(); String& signParent = String::Handle(); signParent = parf.Signature(); strcat(classText," \\n "); strcat(classText,parf.ToCString()); strcat(classText," "); strcat(classText,signParent.ToCString()); strcat(classText," { \\n\\n "); char append[80]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } } strcat(classText," \\n }\\n\\n");}} struct stat entry_info; int exists = 0; if (stat("/data/data/", &entry_info)==0 && S_ISDIR(entry_info.st_mode)){ exists=1; } if(exists==1){ pid_t pid = getpid(); char path[64] = { 0 }; snprintf(path, sizeof(path), "/proc/%d/cmdline", pid); FILE *cmdline = fopen(path, "r"); if (cmdline) { char chm[264] = { 0 }; char pat[264] = { 0 }; char application_id[64] = { 0 }; fread(application_id, sizeof(application_id), 1, cmdline); snprintf(pat, sizeof(pat), "/data/data/%s/dump.dart", application_id); do { FILE *f = fopen(pat, "a+"); fprintf(f, "%s",classText); fflush(f); fclose(f); snprintf(chm, sizeof(chm), "/data/data/%s",application_id); chmod(chm, S_IRWXU|S_IRWXG|S_IRWXO); chmod(pat, S_IRWXU|S_IRWXG|S_IRWXO); } while (0); fclose(cmdline); } } if(exists==0){ char pat[264] = { 0 }; snprintf(pat, sizeof(pat), "%s/Documents/dump.dart", getenv("HOME")); OS::PrintErr("reFlutter dump file: %s",pat); do { FILE *f = fopen(pat, "a+"); fprintf(f, "%s",classText); fflush(f); fclose(f); } while (0); }', ++ ) ++ replace_file_text( ++ "src/third_party/dart/tools/make_version.py", ++ "snapshot_hash = MakeSnapshotHashString()", ++ "snapshot_hash = '" + libapp_hash + "'", ++ ) ++ ++ replace_file_text( ++ "src/third_party/boringssl/src/ssl/ssl_x509.cc", ++ "static bool ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session,\n SSL_HANDSHAKE *hs,\n uint8_t *out_alert) {", ++ "static bool ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session,\n SSL_HANDSHAKE *hs,\n uint8_t *out_alert) {return true;", ++ ) ++ replace_file_text( ++ "src/third_party/boringssl/src/ssl/ssl_x509.cc", ++ "static int ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session,\n SSL_HANDSHAKE *hs,\n uint8_t *out_alert) {", ++ "static int ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session,\n SSL_HANDSHAKE *hs,\n uint8_t *out_alert) {return 1;", ++ ) ++ ++ if ver == 26 or ver == 27: ++ replace_file_text( ++ "tools/generate_package_config/pubspec.yaml", ++ "package_config: any", ++ "package_config: 1.9.3", ++ ) ++ if ver == 24: ++ replace_file_text( ++ "DEPS", ++ "flutter_internal/android/sdk/licenses", ++ "flutter/android/sdk/licenses", ++ ) ++ if ver == 14 or ver == 13: ++ replace_file_text( ++ "DEPS", ++ " 'src/third_party/dart/pkg/analysis_server/language_model': {\n 'packages': [\n {\n 'package': 'dart/language_model',\n 'version': 'lIRt14qoA1Cocb8j3yw_Fx5cfYou2ddam6ArBm4AI6QC',\n }\n ],\n 'dep_type': 'cipd',\n },\n", ++ "", ++ ) ++ if 13 >= ver > 10: ++ replace_file_text( ++ "DEPS", ++ " 'src/third_party/tonic':\n Var('fuchsia_git') + '/tonic' + '@' + '1a8ed9be2e2b56b32e888266d6db465d36012df4',\n", ++ "", ++ ) ++ try: ++ shutil.copytree("../tonic", "src/third_party/tonic") ++ except Exception: ++ pass ++ if 10 >= ver > 6: ++ replace_file_text( ++ "DEPS", ++ " 'src/third_party/tonic':\n Var('fuchsia_git') + '/tonic' + '@' + 'bd27b4549199df72fcaeefd259ebc12a31c2e4ee',\n", ++ "", ++ ) ++ try: ++ shutil.copytree("../tonic", "src/third_party/tonic") ++ except Exception: ++ pass ++ if ver == 11 or ver == 10 or ver == 9 or ver == 8: ++ replace_file_text( ++ "DEPS", ++ " 'src/third_party/dart/tools/sdks': {\n 'packages': [\n {\n 'package': 'dart/dart-sdk/${{platform}}',\n 'version': 'version:2.4.0'\n }\n ],\n 'dep_type': 'cipd',\n },\n", ++ "", ++ ) ++ replace_file_text( ++ "DEPS", ++ " 'src/third_party/dart/pkg/analysis_server/language_model': {\n 'packages': [\n {\n 'package': 'dart/language_model',\n 'version': '9fJQZ0TrnAGQKrEtuL3-AXbUfPzYxqpN_OBHr9P4hE4C',\n }\n ],\n 'dep_type': 'cipd',\n },\n", ++ "", ++ ) ++ replace_file_text( ++ "DEPS", ++ " 'src/third_party/dart/pkg/analysis_server/language_model': {\n 'packages': [\n {\n 'package': 'dart/language_model',\n 'version': 'EFtZ0Z5T822s4EUOOaWeiXUppRGKp5d9Z6jomJIeQYcC',\n }\n ],\n 'dep_type': 'cipd',\n },\n", ++ "", ++ ) ++ replace_file_text( ++ "DEPS", ++ " 'src/third_party/dart/pkg/analysis_server/language_model': {\n 'packages': [\n {\n 'package': 'dart/language_model',\n 'version': 'gABkW8D_-f45it57vQ_ZTKFwev16RcCjvrdTCytEnQgC',\n }\n ],\n 'dep_type': 'cipd',\n },\n", ++ "", ++ ) +diff '--color=auto' -Naur ./reflutter-0.8.5.orig/reflutter.egg-info/dependency_links.txt reflutter-0.8.5/reflutter.egg-info/dependency_links.txt +--- ./reflutter-0.8.5.orig/reflutter.egg-info/dependency_links.txt 2025-05-25 22:17:32.000000000 +0800 ++++ reflutter-0.8.5/reflutter.egg-info/dependency_links.txt 1970-01-01 07:30:00.000000000 +0730 +@@ -1 +0,0 @@ +- +diff '--color=auto' -Naur ./reflutter-0.8.5.orig/reflutter.egg-info/entry_points.txt reflutter-0.8.5/reflutter.egg-info/entry_points.txt +--- ./reflutter-0.8.5.orig/reflutter.egg-info/entry_points.txt 2025-05-25 22:17:32.000000000 +0800 ++++ reflutter-0.8.5/reflutter.egg-info/entry_points.txt 1970-01-01 07:30:00.000000000 +0730 +@@ -1,2 +0,0 @@ +-[console_scripts] +-reflutter = src.__init__:main +diff '--color=auto' -Naur ./reflutter-0.8.5.orig/reflutter.egg-info/PKG-INFO reflutter-0.8.5/reflutter.egg-info/PKG-INFO +--- ./reflutter-0.8.5.orig/reflutter.egg-info/PKG-INFO 2025-05-25 22:17:32.000000000 +0800 ++++ reflutter-0.8.5/reflutter.egg-info/PKG-INFO 1970-01-01 07:30:00.000000000 +0730 +@@ -1,222 +0,0 @@ +-Metadata-Version: 2.4 +-Name: reflutter +-Version: 0.8.5 +-Summary: Reverse Flutter +-Home-page: https://github.com/Impact-I/reFlutter +-Author: impact +-Author-email: routeros7.1@gmail.com +-License: GPLv3+ +-Keywords: distutils setuptools egg pip requirements +-Platform: any +-Classifier: Development Status :: 5 - Production/Stable +-Classifier: Intended Audience :: Developers +-Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+) +-Classifier: Programming Language :: Python :: 2 +-Classifier: Programming Language :: Python :: 2.7 +-Classifier: Programming Language :: Python :: 3 +-Classifier: Programming Language :: Python :: 3.3 +-Classifier: Programming Language :: Python :: 3.4 +-Classifier: Programming Language :: Python :: 3.5 +-Classifier: Programming Language :: Python :: 3.6 +-Classifier: Programming Language :: Python :: Implementation :: PyPy +-Classifier: Topic :: Software Development :: Build Tools +-Requires-Python: >3.9 +-Description-Content-Type: text/markdown +-License-File: LICENSE +-Dynamic: author +-Dynamic: author-email +-Dynamic: classifier +-Dynamic: description +-Dynamic: description-content-type +-Dynamic: home-page +-Dynamic: keywords +-Dynamic: license +-Dynamic: license-file +-Dynamic: platform +-Dynamic: requires-python +-Dynamic: summary +- +-[![stars](https://img.shields.io/github/stars/Impact-I/reFlutter)](https://github.com/Impact-I/reFlutter/stargazers) +- +-

+- +-**Read more on the blog:** +- +-This framework helps with Flutter apps reverse engineering using the patched version of the Flutter library which is already compiled and ready for app repacking. This library has snapshot deserialization process modified to allow you perform dynamic analysis in a convenient way. +- +-Key features: +- +-- `socket.cc` is patched for traffic monitoring and interception; +-- `dart.cc` is modified to print classes, functions and some fields; +-- display absolute code offset for functions; +-- contains minor changes for successful compilation; +-- if you would like to implement your own patches, manual Flutter code changes are supported using a specially crafted `Dockerfile`. +- +-### Supported engines +- +-- Android: arm64, arm32; +-- iOS: arm64; +-- Release: Stable, Beta +- +-### Install +- +-``` +-# Linux, Windows, MacOS +-pip3 install reflutter==0.8.5 +-``` +- +-### Usage +- +-```console +-impact@f:~$ reflutter main.apk +- +-Please enter your Burp Suite IP: +- +-SnapshotHash: 8ee4ef7a67df9845fba331734198a953 +-The resulting apk file: ./release.RE.apk +-Please sign the apk file +- +-impact@f:~$ reflutter main.ipa +-``` +- +-### Traffic interception +- +-You need to specify the IP of your Burp Suite Proxy Server located in the same network where the device with the Flutter application is. Then configure the Proxy in `BurpSuite -> Listener Proxy -> Options tab`: +- +-- Add port: `8083` +-- Bind to address: `All interfaces` +-- Request handling: Support invisible proxying = `True` +- +-

+- +-No certificate installation or root access is required for Android. reFlutter also allows bypassing some of the Flutter certificate pinning implementations. +- +-> ⚠️ **Note:** Starting from Flutter version **3.24.0** (snapshot hash: `80a49c7111088100a233b2ae788e1f48`), the hardcoded proxy IP and port have been removed. You now need to configure your proxy directly on the device. +- +-#### On Android: +- +-Use ADB to configure the device’s proxy: +- +-```bash +-adb -s shell "settings put global http_proxy " +-``` +- +-Sign, align, and install the APK. Optionally configure **TunProxy** to route traffic through Burp Suite. +- +-#### On iOS: +- +-Sign and install the IPA. Configure **Potatso** to use your Burp Suite proxy server. +- +-### Usage on Android +- +-The resulting apk must be aligned and signed. A recommended tool is [uber-apk-signer](https://github.com/patrickfav/uber-apk-signer/releases/tag/v1.2.1): +- +-```bash +-java -jar uber-apk-signer.jar --allowResign -a release.RE.apk +-``` +- +-Run the app on a device. Determine `_kDartIsolateSnapshotInstructions` via binary search. reFlutter writes the dump file to the app's root folder and sets 777 permissions. Retrieve it using: +- +-```bash +-adb -d shell "cat /data/data//dump.dart" > dump.dart +-``` +- +-
+-file contents +- +-```dart +-Library:'package:anyapp/navigation/DeepLinkImpl.dart' Class: Navigation extends Object { +-String* DeepUrl = anyapp://evil.com/ ; +-... +-``` +- +-
+- +-### Usage on iOS +- +-After running `reflutter main.ipa`, execute the app on device. The dump file path is printed to Xcode console logs: +- +-``` +-Current working dir: /private/var/mobile/Containers/Data/Application//dump.dart +-``` +- +-Retrieve the file from the device. +- +-

+- +-### Frida +- +-Use dump offsets in the Frida [script](https://github.com/Impact-I/reFlutter/blob/main/frida.js): +- +-```bash +-frida -U -f -l frida.js +-``` +- +-To find `_kDartIsolateSnapshotInstructions`: +- +-```bash +-readelf -Ws libapp.so +-``` +- +-Look for the `Value` field. +- +-### To Do +- +-- [x] Display absolute code offset for functions; +-- [ ] Extract more strings and fields; +-- [x] Add socket patch; +-- [ ] Extend engine support to Debug using Fork and Github Actions; +-- [ ] Improve detection of `App.framework` and `libapp.so` inside zip archive +- +-### Build Engine +- +-Engines are built using [GitHub Actions](https://github.com/Impact-I/reFlutter/actions) based on data in [enginehash.csv](https://github.com/Impact-I/reFlutter/blob/main/enginehash.csv). Snapshot hash is retrieved from: +- +-``` +-https://storage.googleapis.com/flutter_infra_release/flutter//android-arm64-release/linux-x64.zip +-``` +- +-
+-release +- +-[![gif](https://user-images.githubusercontent.com/87244850/135758767-47b7d51f-8b6c-40b5-85aa-a13c5a94423a.gif)](https://github.com/Impact-I/reFlutter/actions) +- +-
+- +-### Custom Build +- +-Manual Flutter code patching is supported using Docker: +- +-```bash +-git clone https://github.com/Impact-I/reFlutter && cd reFlutter +-docker build -t reflutter -f Dockerfile . +-``` +- +-Run with: +- +-```bash +-docker run -it -v "$(pwd):/t" -e HASH_PATCH= -e COMMIT= reflutter +-``` +- +-Example: +- +-```bash +-docker run -it -v "$(pwd):/t" -e HASH_PATCH=aa64af18e7d086041ac127cc4bc50c5e -e COMMIT=d44b5a94c976fbb65815374f61ab5392a220b084 reflutter +-``` +- +-#### Example: Build Android ARM64 (Linux/Windows) +- +-```bash +-docker run -e WAIT=300 -e x64=0 -e arm=0 -e HASH_PATCH= -e COMMIT= --rm -iv${PWD}:/t reflutter +-``` +- +-Flags: +- +-- `-e x64=0`: disables x64 build +-- `-e arm64=0`: disables arm64 build +-- `-e arm=0`: disables arm32 build +-- `-e WAIT=300`: time in seconds to modify source before build +-- `-e HASH_PATCH`: snapshot hash from `enginehash.csv` +-- `-e COMMIT`: engine commit hash +- +---- +diff '--color=auto' -Naur ./reflutter-0.8.5.orig/reflutter.egg-info/SOURCES.txt reflutter-0.8.5/reflutter.egg-info/SOURCES.txt +--- ./reflutter-0.8.5.orig/reflutter.egg-info/SOURCES.txt 2025-05-25 22:17:32.000000000 +0800 ++++ reflutter-0.8.5/reflutter.egg-info/SOURCES.txt 1970-01-01 07:30:00.000000000 +0730 +@@ -1,10 +0,0 @@ +-LICENSE +-README.md +-setup.py +-reflutter.egg-info/PKG-INFO +-reflutter.egg-info/SOURCES.txt +-reflutter.egg-info/dependency_links.txt +-reflutter.egg-info/entry_points.txt +-reflutter.egg-info/top_level.txt +-src/__init__.py +-src/utils.py +\ No newline at end of file +diff '--color=auto' -Naur ./reflutter-0.8.5.orig/reflutter.egg-info/top_level.txt reflutter-0.8.5/reflutter.egg-info/top_level.txt +--- ./reflutter-0.8.5.orig/reflutter.egg-info/top_level.txt 2025-05-25 22:17:32.000000000 +0800 ++++ reflutter-0.8.5/reflutter.egg-info/top_level.txt 1970-01-01 07:30:00.000000000 +0730 +@@ -1 +0,0 @@ +-src +diff '--color=auto' -Naur ./reflutter-0.8.5.orig/setup.py reflutter-0.8.5/setup.py +--- ./reflutter-0.8.5.orig/setup.py 2025-05-25 18:30:06.000000000 +0800 ++++ reflutter-0.8.5/setup.py 2025-08-16 13:57:12.924784767 +0800 +@@ -38,7 +38,7 @@ + classifiers=CLASSIFIERS, + entry_points={ + "console_scripts": [ +- "reflutter = src.__init__:main", ++ "reflutter = reflutter.__init__:main", + ], + }, + python_requires=">3.9", +diff '--color=auto' -Naur ./reflutter-0.8.5.orig/src/__init__.py reflutter-0.8.5/src/__init__.py +--- ./reflutter-0.8.5.orig/src/__init__.py 2025-05-25 18:30:06.000000000 +0800 ++++ reflutter-0.8.5/src/__init__.py 1970-01-01 07:30:00.000000000 +0730 +@@ -1,142 +0,0 @@ +-#!/usr/bin/env python3 +- +-import argparse +-import os +-import csv +- +-try: +- from . import utils +-except Exception: +- import utils +- +-from urllib.request import urlretrieve +-from zipfile import ZipFile +-from os.path import join +-import zipfile +- +-# inits +-patch_dump = False +-build_engine = False +- +- +-def _patch_file(file_name: str): +- print("[*] Processing...") +- zip_stored = False +- libapp_arm64 = "", "" +- libapp_arm = "", "" +- libapp_x86 = "", "" +- libapp_x64 = "", "" +- libapp_ios = "", "" +- libapp_hash = "" +- global patch_dump +- with ZipFile(file_name, "r") as zip_object: +- list_of_file_names = zip_object.namelist() +- zip_object.extractall("release") +- for file_name in list_of_file_names: +- if file_name.endswith("App.framework/App") or file_name.endswith( +- "FlutterApp.framework/FlutterApp" +- ): +- zip_object.extract(file_name, "libappTmp") +- libapp_ios = file_name, utils.elff(join("libappTmp", file_name)) +- libapp_hash = libapp_ios[1] +- if file_name.endswith("v8a/libapp.so"): +- if zip_object.getinfo(file_name).compress_type == zipfile.ZIP_STORED: +- zip_stored = True +- zip_object.extract(file_name, "libappTmp") +- libapp_arm64 = file_name, utils.elff(join("libappTmp", file_name)) +- libapp_hash = libapp_arm64[1] +- if file_name.endswith("v7a/libapp.so"): +- if zip_object.getinfo(file_name).compress_type == zipfile.ZIP_STORED: +- zip_stored = True +- zip_object.extract(file_name, "libappTmp") +- libapp_arm = file_name, utils.elff(join("libappTmp", file_name)) +- libapp_hash = libapp_arm[1] +- if file_name.endswith("64/libapp.so"): +- if zip_object.getinfo(file_name).compress_type == zipfile.ZIP_STORED: +- zip_stored = True +- zip_object.extract(file_name, "libappTmp") +- libapp_x64 = file_name, utils.elff(join("libappTmp", file_name)) +- libapp_hash = libapp_arm[1] +- if file_name.endswith("86/libflutter.so"): +- zip_object.extract(file_name, "libappTmp") +- libapp_x86 = file_name, utils.elff(join("libappTmp", file_name)) +- libapp_hash = libapp_arm[1] +- zip_object.close() +- utils.replace_flutter_lib( +- libapp_hash, +- libapp_arm64, +- libapp_arm, +- libapp_x64, +- libapp_x86, +- libapp_ios, +- zip_stored, +- patch_dump, +- ) +- +- +-def _build_engine(libapp_hash: str): +- global patch_dump +- if not os.path.exists("enginehash.csv"): +- urlretrieve( +- "https://raw.githubusercontent.com/Impact-I/reFlutter/main/enginehash.csv", +- "enginehash.csv", +- ) +- +- with open("enginehash.csv") as f_obj: +- utils.replace_file_text( +- "src/src/flutter/BUILD.gn", +- ' if (is_android) {\n public_deps +=\n [ "//flutter/shell/platform/android:flutter_shell_native_unittests" ]\n }', +- "", +- ) +- read = csv.DictReader(f_obj, delimiter=",") +- row_count = sum(1 for _ in read) +- f_obj.seek(0) +- reader = csv.DictReader(f_obj, delimiter=",") +- i = -row_count +- for line in reader: +- i = i + 1 +- if libapp_hash in line["Snapshot_Hash"]: +- print(line["Engine_commit"]) +- if ( +- os.path.exists("src/third_party/dart/runtime/vm/dart.cc") +- or os.path.exists("tools/generate_package_config/pubspec.yaml") +- or os.path.exists("deps") +- or os.path.exists("src/flutter/third_party/dart/runtime/vm/dart.cc") +- or os.path.exists( +- "engine/src/flutter/third_party/dart/runtime/vm/dart.cc" +- ) +- ): +- utils.patch_source(libapp_hash, abs(i), patch_dump) +- +- +-def main(): +- global patch_dump, build_engine +- parser = argparse.ArgumentParser(description="reflutter") +- parser.add_argument( +- "-b", +- "--build-engine", +- help="Enable build engine", +- ) +- parser.add_argument( +- "-p", +- "--patch-dump", +- action="store_true", +- default=False, +- help="Enable patch dump", +- ) +- parser.add_argument("target", nargs="?", help="APK or IPA file") +- +- args = parser.parse_args() +- if args.build_engine: +- build_engine = True +- +- if args.patch_dump: +- patch_dump = True +- +- if build_engine: +- _build_engine(args.build_engine) +- else: +- if args.target: +- _patch_file(args.target) +- else: +- parser.print_usage() +diff '--color=auto' -Naur ./reflutter-0.8.5.orig/src/utils.py reflutter-0.8.5/src/utils.py +--- ./reflutter-0.8.5.orig/src/utils.py 2025-05-25 18:30:06.000000000 +0800 ++++ reflutter-0.8.5/src/utils.py 1970-01-01 07:30:00.000000000 +0730 +@@ -1,616 +0,0 @@ +-#!/usr/bin/env python3 +- +-import os +-import shutil +-import sys +-from urllib.request import urlopen, urlretrieve +-from os.path import join +-import zipfile +-import string +-import re +- +-OLD_SOCKET_PATCH_LAST_VERSION = 58 +- +- +-def replace_file_text(fname, textOrig, textReplace): +- if fname[:15] == "src/third_party": # fix for new flutter source path +- if not os.path.exists(fname): +- new_third_party_path = "src/flutter/" + "/".join(fname.split("/")[1:]) +- if os.path.exists(new_third_party_path): +- fname = new_third_party_path +- else: +- # https://github.com/flutter/flutter/tree/master/engine +- fname = "engine/src/flutter/" + "/".join(fname.split("/")[1:]) +- try: +- with open(fname, "r") as file: +- filedata = file.read() +- filedata = filedata.replace(textOrig, textReplace) +- with open(fname, "w") as file: +- file.write(filedata) +- except (IOError, OSError): +- pass +- +- +-def zip_dir(path: str, ziph: zipfile.ZipFile, zip_stored: bool): +- for root, _, files in os.walk(path): +- for file in files: +- if type(file) is str: +- if ( +- file.endswith(".so") +- and zip_stored +- or file.endswith("resources.arsc") +- ): +- ziph.write( +- os.path.join(root, file), +- os.path.relpath( +- os.path.join(root.replace("release/", ""), file), +- os.path.join(path, ".."), +- ), +- zipfile.ZIP_STORED, +- ) +- else: +- ziph.write( +- os.path.join(root, file), +- os.path.relpath( +- os.path.join(root.replace("release/", ""), file), +- os.path.join(path, ".."), +- ), +- zipfile.ZIP_DEFLATED, +- ) +- else: +- ziph.write( +- os.path.join(root, file), +- os.path.relpath( +- os.path.join(root.replace("release/", ""), file), +- os.path.join(path, ".."), +- ), +- zipfile.ZIP_DEFLATED, +- ) +- +- +-def check_libapp_hash(libapp_hash: str) -> int | None: +- if libapp_hash == "": +- print( +- "\nIs this really a Flutter app? \nThere was no libapp.so (Android) or App (iOS) found in the package.\n\n Make sure there is arm64-v8a/libapp.so or App.framework/App file in the package. If flutter library name differs you need to rename it properly before patching.\n" +- ) +- sys.exit() +- resp = ( +- urlopen( +- "https://raw.githubusercontent.com/Impact-I/reFlutter/main/enginehash.csv" +- ) +- .read() +- .decode("utf-8") +- ) +- if libapp_hash not in resp: +- shutil.rmtree("libappTmp") +- print( +- "\n Engine SnapshotHash: " +- + libapp_hash +- + "\n\n This engine is currently not supported.\n Most likely this flutter application uses the Debug version engine which you need to build manually using Docker at the moment.\n More details: https://github.com/Impact-I/reFlutter\n" +- ) +- sys.exit() +- +- resp = resp.splitlines() +- _index = 0 +- for _ in resp: +- _index += 1 +- if libapp_hash in _: +- break +- return len(resp) + 1 - _index +- +- +-def elff(fname: str) -> str: +- libapp_hash = "" +- min = 32 +- f = open(fname, errors="ignore") +- result = "" +- for c in f.read(): +- if c in string.printable: +- result += c +- continue +- if len(result) >= min: +- hashT = re.findall(r"([a-f\d]{32})", result) +- if len(hashT) > 0: +- f.close() +- libapp_hash = hashT[0] +- return libapp_hash +- result = "" +- return libapp_hash +- +- +-def not_except(filename: str): +- try: +- os.remove(filename) +- except Exception: +- pass +- +- +-def convert_ip_fix(IPBurp: str): +- intoct = list(IPBurp.split(".")) +- finallistIP = list(IPBurp.split(".")) +- intoct.sort(key=lambda s: len(s)) +- intoct.reverse() +- for i in intoct: +- if ( +- len(i) != 3 and int(i) > 7 and int(i) > 63 and len(".".join(intoct)) < 15 +- ): # 64-99 +- intoct[intoct.index(i)] = str(oct(int(i))).replace("o", "") +- elif len(i) != 3 and 7 < int(i) < 64 and len(".".join(intoct)) < 15: # 8-63 +- intoct[intoct.index(i)] = str(oct(int(i))).replace("o", "") +- elif len(i) < 3 and int(i) < 8 and len(".".join(intoct)) < 15: # 0-7 +- intoct[intoct.index(i)] = intoct[intoct.index(i)].zfill(3) +- for i in intoct: +- if i.startswith("0"): +- if len(i) != 3 and int(i, 8) > 7 and len(".".join(intoct)) > 15: # 8-63 +- intoct[intoct.index(i)] = str(int(i, 8)).replace("o", "") +- elif len(i) < 3 and int(i) < 8 and len(".".join(intoct)) < 15: # 0-7 +- intoct[intoct.index(i)] = intoct[intoct.index(i)].zfill(3) +- elif ( +- len(i) == 3 and int(i) > 7 and int(i) > 99 and len(".".join(intoct)) > 15 +- ): # 64-99 +- intoct[intoct.index(i)] = str(oct(int(i))).replace("o", "") +- for i in intoct: +- nn = intoct.index(i) +- if i.startswith("0"): +- if len(i) > 2 and int(i) > 7 and len(".".join(intoct)) > 15: # 8-63 +- intoct[nn] = str(int(i, 8)).replace("o", "") +- elif ( +- len(i) != 3 and int(i) > 7 and int(i) > 63 and len(".".join(intoct)) < 15 +- ): # 0-7 +- intoct[nn] = str(oct(int(i))).replace("o", "") +- for i in intoct: +- if len(i) < 3 and int(i) < 8 and len(".".join(intoct)) < 15: +- intoct[intoct.index(i)] = str(int(i)).zfill(2) +- for f in finallistIP: +- for i in intoct: +- if i.startswith("0"): +- if f == str(int(i, 8)): +- mi = finallistIP.index(f) +- finallistIP[mi] = i.replace("o", "") +- if len(".".join(finallistIP)) > 15: +- finallistIP[mi] = str(int(i, 8)).replace("o", "") +- if len(".".join(finallistIP)) < 15: +- for f in finallistIP: +- if len(f) < 3 and int(f) < 8: +- finallistIP[finallistIP.index(f)] = str(int(f)).zfill(2) +- return ".".join(finallistIP) +- +- +-def input_burp_ip() -> str: +- burp_ip = input("\nExample: (192.168.1.154) etc.\nPlease enter your BurpSuite IP: ") +- if not re.match(r"[0-9]+(?:\.[0-9]+){3}", burp_ip): +- print("Invalid IP Address") +- input_burp_ip() +- return convert_ip_fix(burp_ip) +- +- +-def replace_flutter_lib( +- libapp_hash: str, +- libapp_arm64: tuple, +- libapp_arm: tuple, +- libapp_x64: tuple, +- libapp_x86: tuple, +- libapp_ios: tuple, +- zip_stored: bool, +- patch_dump: bool, +-): +- flutter_version_index = check_libapp_hash(libapp_hash) +- +- burp_ip = None +- if ( +- flutter_version_index is not None +- and flutter_version_index <= OLD_SOCKET_PATCH_LAST_VERSION +- ): +- burp_ip = input_burp_ip() +- get_network_lib( +- libapp_arm64, +- libapp_arm, +- libapp_x64, +- libapp_x86, +- libapp_ios, +- patch_dump, +- burp_ip, +- ) +- if ( +- os.path.exists("libflutter_arm64.so") +- or os.path.exists("libflutter_arm.so") +- or os.path.exists("libflutter_x64.so") +- or os.path.exists("libflutter_x86.so") +- or os.path.exists("Flutter") +- ): +- try: +- shutil.move( +- "Flutter", +- join( +- "release", +- libapp_ios[0] +- .replace("App.framework/App", "Flutter.framework/Flutter") +- .replace( +- "FlutterApp.framework/FlutterApp", "Flutter.framework/Flutter" +- ), +- ), +- ) +- except Exception: +- pass +- try: +- shutil.move( +- "libflutter_arm64.so", +- join("release", libapp_arm64[0].replace("libapp.so", "libflutter.so")), +- ) +- except Exception: +- pass +- try: +- shutil.move( +- "libflutter_arm.so", +- join("release", libapp_arm[0].replace("libapp.so", "libflutter.so")), +- ) +- except Exception: +- pass +- try: +- shutil.move( +- "libflutter_x64.so", +- join("release", libapp_x64[0].replace("libapp.so", "libflutter.so")), +- ) +- except Exception: +- pass +- try: +- shutil.move("libflutter_x86.so", join("release", libapp_x86[0])) +- except Exception: +- pass +- +- zipf = zipfile.ZipFile("release.RE.zip", "w", zipfile.ZIP_DEFLATED) +- zip_dir("release/", zipf, zip_stored) +- zipf.close() +- shutil.rmtree("libappTmp") +- shutil.rmtree("release") +- print("\nSnapshotHash: " + libapp_hash) +- if len(libapp_ios[1]) != 0: +- shutil.move("release.RE.zip", "release.RE.ipa") +- print("The resulting ipa file: ./release.RE.ipa") +- if ( +- flutter_version_index is not None +- and flutter_version_index > OLD_SOCKET_PATCH_LAST_VERSION +- ): +- print( +- "Please sign & install the ipa file.\n\nConfigure Potatso (iOS) to use your Burp Suite proxy server.\n" +- ) +- else: +- print( +- "Please sign & install the ipa file\n\nConfigure Burp Suite proxy server to listen on *:8083\nProxy Tab -> Options -> Proxy Listeners -> Edit -> Binding Tab\n\nThen enable invisible proxying in Request Handling Tab\nSupport Invisible Proxying -> true\n" +- ) +- else: +- shutil.move("release.RE.zip", "release.RE.apk") +- print("The resulting apk file: ./release.RE.apk") +- if ( +- flutter_version_index is not None +- and flutter_version_index > OLD_SOCKET_PATCH_LAST_VERSION +- ): +- print( +- "Please sign, align & install the apk file.\n\nConfigure TunProxy (Android) to use your Burp Suite proxy server.\n" +- ) +- else: +- print( +- "Please sign, align & install the apk file\n\nConfigure Burp Suite proxy server to listen on *:8083\nProxy Tab -> Options -> Proxy Listeners -> Edit -> Binding Tab\n\nThen enable invisible proxying in Request Handling Tab\nSupport Invisible Proxying -> true\n" +- ) +- sys.exit() +- +- +-def get_network_lib( +- libapp_arm64: tuple, +- libapp_arm: tuple, +- libapp_x64: tuple, +- libapp_x86: tuple, +- libapp_ios: tuple, +- patch_dump: bool, +- burp_ip: str | None, +-): +- verUrl = "v2-" +- if patch_dump: +- verUrl = "v3-" +- if len(libapp_ios[1]) != 0: +- try: +- urlretrieve( +- "https://github.com/Impact-I/reFlutter/releases/download/ios-" +- + verUrl +- + libapp_ios[1] +- + "/Flutter", +- "Flutter", +- ) +- except Exception: +- libapp_ios = "", "" +- not_except("Flutter") +- if len(libapp_arm64[1]) != 0: +- try: +- urlretrieve( +- "https://github.com/Impact-I/reFlutter/releases/download/android-" +- + verUrl +- + libapp_arm64[1] +- + "/libflutter_arm64.so", +- "libflutter_arm64.so", +- ) +- except Exception: +- libapp_arm64 = "", "" +- not_except("libflutter_arm64.so") +- if len(libapp_arm[1]) != 0: +- try: +- urlretrieve( +- "https://github.com/Impact-I/reFlutter/releases/download/android-" +- + verUrl +- + libapp_arm[1] +- + "/libflutter_arm.so", +- "libflutter_arm.so", +- ) +- except Exception: +- libapp_arm = "", "" +- not_except("libflutter_arm.so") +- if len(libapp_x64[1]) != 0: +- try: +- urlretrieve( +- "https://github.com/Impact-I/reFlutter/releases/download/android-" +- + verUrl +- + libapp_x64[1] +- + "/libflutter_x64.so", +- "libflutter_x64.so", +- ) +- except Exception: +- libapp_x64 = "", "" +- not_except("libflutter_x64.so") +- if len(libapp_x86[1]) != 0: +- try: +- urlretrieve( +- "https://github.com/Impact-I/reFlutter/releases/download/android-" +- + verUrl +- + libapp_x86[1] +- + "/libflutter_x86.so", +- "libflutter_x86.so", +- ) +- except Exception: +- libapp_x86 = "", "" +- not_except("libflutter_x86.so") +- +- if burp_ip is not None: +- patch_library( +- libapp_arm64, libapp_arm, libapp_x64, libapp_x86, libapp_ios, burp_ip +- ) +- +- +-def patch_library( +- libapp_arm64: tuple, +- libapp_arm: tuple, +- libapp_x64: tuple, +- libapp_x86: tuple, +- libapp_ios: tuple, +- burp_ip: str, +-): +- if len(libapp_ios[1]) != 0: +- buffer = ( +- open("Flutter", "rb") +- .read() +- .replace(b"192.168.133.104", burp_ip.encode("ascii")) +- ) +- open("Flutter", "wb").write(buffer) +- if len(libapp_arm64[1]) != 0: +- buffer = ( +- open("libflutter_arm64.so", "rb") +- .read() +- .replace(b"192.168.133.104", burp_ip.encode("ascii")) +- ) +- open("libflutter_arm64.so", "wb").write(buffer) +- if len(libapp_arm[1]) != 0: +- buffer = ( +- open("libflutter_arm.so", "rb") +- .read() +- .replace(b"192.168.133.104", burp_ip.encode("ascii")) +- ) +- open("libflutter_arm.so", "wb").write(buffer) +- if len(libapp_x64[1]) != 0: +- buffer = ( +- open("libflutter_x64.so", "rb") +- .read() +- .replace(b"192.168.133.104", burp_ip.encode("ascii")) +- ) +- open("libflutter_x64.so", "wb").write(buffer) +- if len(libapp_x86[1]) != 0: +- buffer = ( +- open("libflutter_x86.so", "rb") +- .read() +- .replace(b"192.168.133.104", burp_ip.encode("ascii")) +- ) +- open("libflutter_x86.so", "wb").write(buffer) +- +- +-def patch_source(libapp_hash: str, ver: int, patch_dump: bool): +- try: +- os.makedirs(os.path.join(os.environ["HOME"], "Documents")) +- except Exception: +- pass +- try: +- os.makedirs("Documents") +- except Exception: +- pass +- replace_file_text( +- "DEPS", +- "'src/third_party/dart/third_party/pkg/stagehand':\n Var('dart_git') + '/stagehand.git@e64ac90cac508981011299c4ceb819149e71f1bd',", +- "", +- ) +- replace_file_text( +- "DEPS", +- "'src/third_party/dart/third_party/pkg/stagehand':\n Var('dart_git') + '/stagehand.git' + '@' + Var('dart_stagehand_tag'),", +- "", +- ) +- replace_file_text( +- "DEPS", +- "'src/third_party/dart/third_party/pkg/tflite_native':\n Var('dart_git') + '/tflite_native.git' + '@' + Var('dart_tflite_native_rev'),", +- "", +- ) +- replace_file_text( +- "src/third_party/dart/DEPS", +- 'Var("dart_root") + "/third_party/pkg/tflite_native":\n Var("dart_git") + "tflite_native.git" + "@" + Var("tflite_native_rev"),', +- "", +- ) +- replace_file_text( +- "DEPS", +- 'Var("dart_root") + "/third_party/pkg/tflite_native":\n Var("dart_git") + "tflite_native.git" + "@" + Var("tflite_native_rev"),', +- "", +- ) +- +- if ver >= 24 and patch_dump: +- replace_file_text( +- "src/third_party/dart/runtime/vm/clustered_snapshot.cc", +- "monomorphic_entry_point + unchecked_offset", +- "previous_text_offset_", +- ) +- if ver < 24 and patch_dump: +- replace_file_text( +- "src/third_party/dart/runtime/vm/clustered_snapshot.cc", +- "monomorphic_entry_point + unchecked_offset", +- "bare_offset", +- ) +- if ver < 39 and patch_dump: +- replace_file_text( +- "src/third_party/dart/runtime/vm/app_snapshot.cc", +- "monomorphic_entry_point + unchecked_offset", +- "previous_text_offset_", +- ) +- if ver > 38 and patch_dump: +- replace_file_text( +- "src/third_party/dart/runtime/vm/app_snapshot.cc", +- """code->untag()->monomorphic_unchecked_entry_point_ = +- monomorphic_entry_point + unchecked_offset;""", +- """auto& offset = instructions_table_.rodata()->entries()[instructions_table_.rodata()->first_entry_with_code + instructions_index_ - 1].pc_offset;\ncode->untag()->monomorphic_unchecked_entry_point_ = offset;""", +- ) +- +- # new fix for patch dump +- replace_file_text( +- "src/third_party/dart/runtime/vm/app_snapshot.cc", +- "ASSERT(code->IsCode());", +- 'ASSERT(code->IsCode());\n auto& rClass = Class::Handle(func.Owner()); auto& rLib = Library::Handle(rClass.library()); auto& rlibName = String::Handle(rLib.url()); char offsetString[70]; snprintf(offsetString, sizeof(offsetString), "0x%016" PRIxPTR, static_cast(code->untag()->monomorphic_unchecked_entry_point_)); JSONWriter js; js.OpenObject(); js.PrintProperty("method_name", func.UserVisibleNameCString()); js.PrintProperty("offset", offsetString); js.PrintProperty("library_url", rlibName.ToCString()); js.PrintProperty("class_name", rClass.UserVisibleNameCString()); js.CloseObject(); char* buffer = nullptr; intptr_t buffer_length = 0; js.Steal(&buffer, &buffer_length); struct stat entry_info; int exists = 0; if (stat("/data/data/", &entry_info)==0 && S_ISDIR(entry_info.st_mode)){ exists = 1; } if(exists == 1){ pid_t pid = getpid(); char path[64] = { 0 }; snprintf(path, sizeof(path), "/proc/%d/cmdline", pid); FILE *cmdline = fopen(path, "r"); if (cmdline) { char chm[264] = { 0 }; char pat[264] = { 0 }; char application_id[64] = { 0 }; fread(application_id, sizeof(application_id), 1, cmdline); snprintf(pat, sizeof(pat), "/data/data/%s/dump.dart", application_id); do { FILE *f = fopen(pat, "a+"); fprintf(f, "%s", buffer); fflush(f); fclose(f); snprintf(chm, sizeof(chm), "/data/data/%s",application_id); chmod(chm, S_IRWXU|S_IRWXG|S_IRWXO); chmod(pat, S_IRWXU|S_IRWXG|S_IRWXO); } while (0); fclose(cmdline); } } if(exists == 0){ char pat[264] = { 0 }; snprintf(pat, sizeof(pat), "%s/Documents/dump.dart", getenv("HOME")); OS::PrintErr("reFlutter dump file: %s",pat); do { FILE *f = fopen(pat, "a+"); fprintf(f, "%s", buffer); fflush(f); fclose(f); } while (0); }\n', +- ) +- +- if patch_dump: +- replace_file_text( +- "src/third_party/dart/runtime/vm/dart.cc", +- "FLAG_print_class_table)", +- "true)", +- ) +- replace_file_text( +- "src/third_party/dart/runtime/vm/dart_api_impl.cc", +- "FLAG_print_class_table)", +- "true)", +- ) +- replace_file_text( +- "src/third_party/dart/runtime/vm/class_table.cc", +- '#include "vm/visitor.h"', +- '#include "vm/visitor.h"\n#include ', +- ) +- replace_file_text( +- "src/third_party/dart/runtime/vm/app_snapshot.cc", +- '#include "vm/version.h"', +- '#include "vm/version.h"\n#include ', +- ) +- +- if ver > 27: +- replace_file_text( +- "src/flutter/BUILD.gn", +- ' if (is_android) {\n public_deps +=\n [ "//flutter/shell/platform/android:flutter_shell_native_unittests" ]\n }', +- "", +- ) +- +- if 27 < ver < 53 and patch_dump: +- replace_file_text( +- "src/third_party/dart/runtime/vm/class_table.cc", +- "::Print() {", +- '::Print() { OS::PrintErr("reFlutter");\n char pushArr[1600000]="";\n', +- ) +- replace_file_text( +- "src/third_party/dart/runtime/vm/class_table.cc", +- 'OS::PrintErr("%" Pd ": %s\\n", i, name.ToCString());', +- '\n auto& funcs = Array::Handle(cls.functions()); if (funcs.Length()>1000) { continue; } char classText[2500000]=""; String& supname = String::Handle(); name = cls.Name(); strcat(classText,cls.ToCString()); Class& supcls = Class::Handle(); supcls = cls.SuperClass(); if (!supcls.IsNull()) { supname = supcls.Name(); strcat(classText," extends "); strcat(classText,supname.ToCString()); } const auto& interfaces = Array::Handle(cls.interfaces()); auto& interface = Instance::Handle(); for (intptr_t in = 0;in < interfaces.Length(); in++) { interface^=interfaces.At(in); if(in==0){strcat(classText," implements ");} if(in>0){strcat(classText," , ");} strcat(classText,interface.ToCString()); } strcat(classText," {\\n"); const auto& fields = Array::Handle(cls.fields()); auto& field = Field::Handle(); auto& fieldType = AbstractType::Handle(); String& fieldTypeName = String::Handle(); String& finame = String::Handle(); Instance& instance2 = Instance::Handle(); for (intptr_t f = 0; f < fields.Length(); f++) { field ^= fields.At(f); finame = field.name(); fieldType = field.type(); fieldTypeName = fieldType.Name(); strcat(classText," "); strcat(classText,fieldTypeName.ToCString()); strcat(classText," "); strcat(classText,finame.ToCString()); if(field.is_static()){ instance2 ^= field.StaticValue(); strcat(classText," = "); strcat(classText,instance2.ToCString()); strcat(classText," ;\\n"); } else { strcat(classText," = "); strcat(classText," nonstatic;\\n"); } } for (intptr_t c = 0; c < funcs.Length(); c++) { auto& func = Function::Handle(); func = cls.FunctionFromIndex(c); String& signature = String::Handle(); signature = func.InternalSignature();auto& codee = Code::Handle(func.CurrentCode()); if(!func.IsLocalFunction()) { strcat(classText," \\n "); strcat(classText,func.ToCString()); strcat(classText," "); strcat(classText,signature.ToCString()); strcat(classText," { \\n\\n "); char append[70]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } else { auto& parf = Function::Handle(); parf=func.parent_function(); String& signParent = String::Handle(); signParent = parf.InternalSignature(); strcat(classText," \\n "); strcat(classText,parf.ToCString()); strcat(classText," "); strcat(classText,signParent.ToCString()); strcat(classText," { \\n\\n "); char append[80]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } } strcat(classText," \\n }\\n\\n"); const Library& libr = Library::Handle(cls.library());if (!libr.IsNull()) { auto& owner_class = Class::Handle(); owner_class = libr.toplevel_class(); auto& funcsTopLevel = Array::Handle(owner_class.functions()); char pushTmp[1000]; String& owner_name = String::Handle(); owner_name = libr.url(); snprintf(pushTmp, sizeof(pushTmp), "\'%s\',",owner_name.ToCString()); if (funcsTopLevel.Length()>0&&strstr(pushArr, pushTmp) == NULL) { strcat(pushArr,pushTmp); strcat(classText,"Library:"); strcat(classText,pushTmp); strcat(classText," {\\n"); for (intptr_t c = 0; c < funcsTopLevel.Length(); c++) { auto& func = Function::Handle(); func = owner_class.FunctionFromIndex(c); String& signature = String::Handle(); signature = func.InternalSignature(); auto& codee = Code::Handle(func.CurrentCode()); if(!func.IsLocalFunction()) { strcat(classText," \\n "); strcat(classText,func.ToCString()); strcat(classText," "); strcat(classText,signature.ToCString()); strcat(classText," { \\n\\n "); char append[70]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } else { auto& parf = Function::Handle(); parf=func.parent_function(); String& signParent = String::Handle(); signParent = parf.InternalSignature(); strcat(classText," \\n "); strcat(classText,parf.ToCString()); strcat(classText," "); strcat(classText,signParent.ToCString()); strcat(classText," { \\n\\n "); char append[80]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } } strcat(classText," \\n }\\n\\n");}} struct stat entry_info; int exists = 0; if (stat("/data/data/", &entry_info)==0 && S_ISDIR(entry_info.st_mode)){ exists=1; } if(exists==1){ pid_t pid = getpid(); char path[64] = { 0 }; snprintf(path, sizeof(path), "/proc/%d/cmdline", pid); FILE *cmdline = fopen(path, "r"); if (cmdline) { char chm[264] = { 0 }; char pat[264] = { 0 }; char application_id[64] = { 0 }; fread(application_id, sizeof(application_id), 1, cmdline); snprintf(pat, sizeof(pat), "/data/data/%s/dump.dart", application_id); do { FILE *f = fopen(pat, "a+"); fprintf(f, "%s",classText); fflush(f); fclose(f); snprintf(chm, sizeof(chm), "/data/data/%s",application_id); chmod(chm, S_IRWXU|S_IRWXG|S_IRWXO); chmod(pat, S_IRWXU|S_IRWXG|S_IRWXO); } while (0); fclose(cmdline); } } if(exists==0){ char pat[264] = { 0 }; snprintf(pat, sizeof(pat), "%s/Documents/dump.dart", getenv("HOME")); OS::PrintErr("reFlutter dump file: %s",pat); do { FILE *f = fopen(pat, "a+"); fprintf(f, "%s",classText); fflush(f); fclose(f); } while (0); }', +- ) +- elif ver < 28 and patch_dump: +- replace_file_text( +- "src/third_party/dart/runtime/vm/class_table.cc", +- "::Print() {", +- '::Print() { OS::PrintErr("reFlutter");\n char pushArr[1600000]="";\n', +- ) +- replace_file_text( +- "src/third_party/dart/runtime/vm/class_table.cc", +- 'OS::PrintErr("%" Pd ": %s\\n", i, name.ToCString());', +- '\n auto& funcs = Array::Handle(cls.functions()); if (funcs.Length()>1000) { continue; } char classText[2500000]=""; String& supname = String::Handle(); name = cls.Name(); strcat(classText,cls.ToCString()); Class& supcls = Class::Handle(); supcls = cls.SuperClass(); if (!supcls.IsNull()) { supname = supcls.Name(); strcat(classText," extends "); strcat(classText,supname.ToCString()); } const auto& interfaces = Array::Handle(cls.interfaces()); auto& interface = Instance::Handle(); for (intptr_t in = 0;in < interfaces.Length(); in++) { interface^=interfaces.At(in); if(in==0){strcat(classText," implements ");} if(in>0){strcat(classText," , ");} strcat(classText,interface.ToCString()); } strcat(classText," {\\n"); const auto& fields = Array::Handle(cls.fields()); auto& field = Field::Handle(); auto& fieldType = AbstractType::Handle(); String& fieldTypeName = String::Handle(); String& finame = String::Handle(); Instance& instance2 = Instance::Handle(); for (intptr_t f = 0; f < fields.Length(); f++) { field ^= fields.At(f); finame = field.name(); fieldType = field.type(); fieldTypeName = fieldType.Name(); strcat(classText," "); strcat(classText,fieldTypeName.ToCString()); strcat(classText," "); strcat(classText,finame.ToCString()); if(field.is_static()){ instance2 = field.StaticValue(); strcat(classText," = "); strcat(classText,instance2.ToCString()); strcat(classText," ;\\n"); } else { strcat(classText," = "); strcat(classText," nonstatic;\\n"); } } for (intptr_t c = 0; c < funcs.Length(); c++) { auto& func = Function::Handle(); func = cls.FunctionFromIndex(c); String& signature = String::Handle(); signature = func.Signature();auto& codee = Code::Handle(func.CurrentCode()); if(!func.IsLocalFunction()) { strcat(classText," \\n "); strcat(classText,func.ToCString()); strcat(classText," "); strcat(classText,signature.ToCString()); strcat(classText," { \\n\\n "); char append[70]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } else { auto& parf = Function::Handle(); parf=func.parent_function(); String& signParent = String::Handle(); signParent = parf.Signature(); strcat(classText," \\n "); strcat(classText,parf.ToCString()); strcat(classText," "); strcat(classText,signParent.ToCString()); strcat(classText," { \\n\\n "); char append[80]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } } strcat(classText," \\n }\\n\\n"); const Library& libr = Library::Handle(cls.library());if (!libr.IsNull()) { auto& owner_class = Class::Handle(); owner_class = libr.toplevel_class(); auto& funcsTopLevel = Array::Handle(owner_class.functions()); char pushTmp[1000]; String& owner_name = String::Handle(); owner_name = libr.url(); snprintf(pushTmp, sizeof(pushTmp), "\'%s\',",owner_name.ToCString()); if (funcsTopLevel.Length()>0&&strstr(pushArr, pushTmp) == NULL) { strcat(pushArr,pushTmp); strcat(classText,"Library:"); strcat(classText,pushTmp); strcat(classText," {\\n"); for (intptr_t c = 0; c < funcsTopLevel.Length(); c++) { auto& func = Function::Handle(); func = owner_class.FunctionFromIndex(c); String& signature = String::Handle(); signature = func.Signature(); auto& codee = Code::Handle(func.CurrentCode()); if(!func.IsLocalFunction()) { strcat(classText," \\n "); strcat(classText,func.ToCString()); strcat(classText," "); strcat(classText,signature.ToCString()); strcat(classText," { \\n\\n "); char append[70]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } else { auto& parf = Function::Handle(); parf=func.parent_function(); String& signParent = String::Handle(); signParent = parf.Signature(); strcat(classText," \\n "); strcat(classText,parf.ToCString()); strcat(classText," "); strcat(classText,signParent.ToCString()); strcat(classText," { \\n\\n "); char append[80]; snprintf(append, sizeof(append), " Code Offset: _kDartIsolateSnapshotInstructions + 0x%016" PRIxPTR "\\n",static_cast(codee.MonomorphicUncheckedEntryPoint())); strcat(classText,append); strcat(classText," \\n }\\n"); } } strcat(classText," \\n }\\n\\n");}} struct stat entry_info; int exists = 0; if (stat("/data/data/", &entry_info)==0 && S_ISDIR(entry_info.st_mode)){ exists=1; } if(exists==1){ pid_t pid = getpid(); char path[64] = { 0 }; snprintf(path, sizeof(path), "/proc/%d/cmdline", pid); FILE *cmdline = fopen(path, "r"); if (cmdline) { char chm[264] = { 0 }; char pat[264] = { 0 }; char application_id[64] = { 0 }; fread(application_id, sizeof(application_id), 1, cmdline); snprintf(pat, sizeof(pat), "/data/data/%s/dump.dart", application_id); do { FILE *f = fopen(pat, "a+"); fprintf(f, "%s",classText); fflush(f); fclose(f); snprintf(chm, sizeof(chm), "/data/data/%s",application_id); chmod(chm, S_IRWXU|S_IRWXG|S_IRWXO); chmod(pat, S_IRWXU|S_IRWXG|S_IRWXO); } while (0); fclose(cmdline); } } if(exists==0){ char pat[264] = { 0 }; snprintf(pat, sizeof(pat), "%s/Documents/dump.dart", getenv("HOME")); OS::PrintErr("reFlutter dump file: %s",pat); do { FILE *f = fopen(pat, "a+"); fprintf(f, "%s",classText); fflush(f); fclose(f); } while (0); }', +- ) +- replace_file_text( +- "src/third_party/dart/tools/make_version.py", +- "snapshot_hash = MakeSnapshotHashString()", +- "snapshot_hash = '" + libapp_hash + "'", +- ) +- +- replace_file_text( +- "src/third_party/boringssl/src/ssl/ssl_x509.cc", +- "static bool ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session,\n SSL_HANDSHAKE *hs,\n uint8_t *out_alert) {", +- "static bool ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session,\n SSL_HANDSHAKE *hs,\n uint8_t *out_alert) {return true;", +- ) +- replace_file_text( +- "src/third_party/boringssl/src/ssl/ssl_x509.cc", +- "static int ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session,\n SSL_HANDSHAKE *hs,\n uint8_t *out_alert) {", +- "static int ssl_crypto_x509_session_verify_cert_chain(SSL_SESSION *session,\n SSL_HANDSHAKE *hs,\n uint8_t *out_alert) {return 1;", +- ) +- +- if ver == 26 or ver == 27: +- replace_file_text( +- "tools/generate_package_config/pubspec.yaml", +- "package_config: any", +- "package_config: 1.9.3", +- ) +- if ver == 24: +- replace_file_text( +- "DEPS", +- "flutter_internal/android/sdk/licenses", +- "flutter/android/sdk/licenses", +- ) +- if ver == 14 or ver == 13: +- replace_file_text( +- "DEPS", +- " 'src/third_party/dart/pkg/analysis_server/language_model': {\n 'packages': [\n {\n 'package': 'dart/language_model',\n 'version': 'lIRt14qoA1Cocb8j3yw_Fx5cfYou2ddam6ArBm4AI6QC',\n }\n ],\n 'dep_type': 'cipd',\n },\n", +- "", +- ) +- if 13 >= ver > 10: +- replace_file_text( +- "DEPS", +- " 'src/third_party/tonic':\n Var('fuchsia_git') + '/tonic' + '@' + '1a8ed9be2e2b56b32e888266d6db465d36012df4',\n", +- "", +- ) +- try: +- shutil.copytree("../tonic", "src/third_party/tonic") +- except Exception: +- pass +- if 10 >= ver > 6: +- replace_file_text( +- "DEPS", +- " 'src/third_party/tonic':\n Var('fuchsia_git') + '/tonic' + '@' + 'bd27b4549199df72fcaeefd259ebc12a31c2e4ee',\n", +- "", +- ) +- try: +- shutil.copytree("../tonic", "src/third_party/tonic") +- except Exception: +- pass +- if ver == 11 or ver == 10 or ver == 9 or ver == 8: +- replace_file_text( +- "DEPS", +- " 'src/third_party/dart/tools/sdks': {\n 'packages': [\n {\n 'package': 'dart/dart-sdk/${{platform}}',\n 'version': 'version:2.4.0'\n }\n ],\n 'dep_type': 'cipd',\n },\n", +- "", +- ) +- replace_file_text( +- "DEPS", +- " 'src/third_party/dart/pkg/analysis_server/language_model': {\n 'packages': [\n {\n 'package': 'dart/language_model',\n 'version': '9fJQZ0TrnAGQKrEtuL3-AXbUfPzYxqpN_OBHr9P4hE4C',\n }\n ],\n 'dep_type': 'cipd',\n },\n", +- "", +- ) +- replace_file_text( +- "DEPS", +- " 'src/third_party/dart/pkg/analysis_server/language_model': {\n 'packages': [\n {\n 'package': 'dart/language_model',\n 'version': 'EFtZ0Z5T822s4EUOOaWeiXUppRGKp5d9Z6jomJIeQYcC',\n }\n ],\n 'dep_type': 'cipd',\n },\n", +- "", +- ) +- replace_file_text( +- "DEPS", +- " 'src/third_party/dart/pkg/analysis_server/language_model': {\n 'packages': [\n {\n 'package': 'dart/language_model',\n 'version': 'gABkW8D_-f45it57vQ_ZTKFwev16RcCjvrdTCytEnQgC',\n }\n ],\n 'dep_type': 'cipd',\n },\n", +- "", +- ) diff --git a/dev-util/reflutter/reflutter-0.8.5-r1.ebuild b/dev-util/reflutter/reflutter-0.8.5-r1.ebuild new file mode 100644 index 000000000..5c2206a97 --- /dev/null +++ b/dev-util/reflutter/reflutter-0.8.5-r1.ebuild @@ -0,0 +1,24 @@ +# Copyright 2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +PYTHON_COMPAT=( python3_{11..13} ) + +DISTUTILS_USE_PEP517=setuptools +inherit distutils-r1 pypi + +DESCRIPTION="Flutter apps reverse engineering" +HOMEPAGE="https://github.com/Impact-I/reFlutter" + +LICENSE="GPL-3" +SLOT="0" +KEYWORDS="amd64 ~arm64 x86" +IUSE="test" +RESTRICT="!test? ( test )" + +REQUIRED_USE="${PYTHON_REQUIRED_USE}" + +PATCHES=( + "${FILESDIR}/356.patch" +) diff --git a/net-analyzer/whatweb/whatweb-0.5.5.ebuild b/net-analyzer/whatweb/whatweb-0.5.5.ebuild index 5cf118c4a..3319b6bcb 100644 --- a/net-analyzer/whatweb/whatweb-0.5.5.ebuild +++ b/net-analyzer/whatweb/whatweb-0.5.5.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-single DESCRIPTION="Next generation web scanner, identifies what software websites are running" diff --git a/net-analyzer/wpscan/wpscan-3.8.27.ebuild b/net-analyzer/wpscan/wpscan-3.8.27.ebuild index f1c42c10c..1c465f813 100644 --- a/net-analyzer/wpscan/wpscan-3.8.27.ebuild +++ b/net-analyzer/wpscan/wpscan-3.8.27.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_EXTRAINSTALL="app bin spec" RUBY_FAKEGEM_GEMSPEC="wpscan.gemspec" diff --git a/net-analyzer/wpscan/wpscan-3.8.28.ebuild b/net-analyzer/wpscan/wpscan-3.8.28.ebuild index 5aa6cdcfb..be3155187 100644 --- a/net-analyzer/wpscan/wpscan-3.8.28.ebuild +++ b/net-analyzer/wpscan/wpscan-3.8.28.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RUBY_FAKEGEM_EXTRAINSTALL="app bin spec" RUBY_FAKEGEM_GEMSPEC="wpscan.gemspec" diff --git a/net-wireless/blue_hydra/blue_hydra-1.9.20.ebuild b/net-wireless/blue_hydra/blue_hydra-1.9.20.ebuild index 75d643740..a5fa8619d 100644 --- a/net-wireless/blue_hydra/blue_hydra-1.9.20.ebuild +++ b/net-wireless/blue_hydra/blue_hydra-1.9.20.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RSPEC_VERSION="3" inherit ruby-ng systemd diff --git a/net-wireless/blue_hydra/blue_hydra-9999.ebuild b/net-wireless/blue_hydra/blue_hydra-9999.ebuild index 75d643740..a5fa8619d 100644 --- a/net-wireless/blue_hydra/blue_hydra-9999.ebuild +++ b/net-wireless/blue_hydra/blue_hydra-9999.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" RSPEC_VERSION="3" inherit ruby-ng systemd diff --git a/www-apps/beef/beef-0.5.4.0.ebuild b/www-apps/beef/beef-0.5.4.0.ebuild index 9d92ccfd8..f99842fb4 100644 --- a/www-apps/beef/beef-0.5.4.0.ebuild +++ b/www-apps/beef/beef-0.5.4.0.ebuild @@ -3,7 +3,7 @@ EAPI=8 -USE_RUBY="ruby31 ruby32" +USE_RUBY="ruby32 ruby33" inherit ruby-single #default fails, looks too complex