devicely 2.2.5 → 2.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/bin/devicely.js +1 -105
  2. package/config/devices.conf +6 -22
  3. package/lib/androidDeviceDetection.js +1 -276
  4. package/lib/appMappings.js +1 -337
  5. package/lib/deviceDetection.js +1 -394
  6. package/lib/devices.js +1 -54
  7. package/lib/doctor.js +1 -94
  8. package/lib/encryption.js +1 -88
  9. package/lib/executor.js +1 -104
  10. package/lib/frontend/asset-manifest.json +3 -3
  11. package/lib/frontend/index.html +1 -1
  12. package/lib/frontend/static/css/main.23bd35c0.css.map +1 -0
  13. package/lib/frontend/static/js/{main.26a24c5c.js → main.4ff1ea70.js} +3 -3
  14. package/lib/frontend/static/js/main.4ff1ea70.js.map +1 -0
  15. package/lib/logger.js +1 -47
  16. package/lib/package-lock.json +1678 -0
  17. package/lib/package.json +30 -0
  18. package/lib/screenshots/screenshot_ios_iPhone17_20260205_225900.png +0 -0
  19. package/lib/screenshots/screenshot_ios_iPhone17_20260205_225942.png +0 -0
  20. package/lib/screenshots/screenshot_ios_iPhone17_20260205_231101.png +0 -0
  21. package/lib/screenshots/screenshot_ios_iPhone17_20260205_232911.png +0 -0
  22. package/lib/screenshots/screenshot_ios_iPhone17_20260208_095103.png +0 -0
  23. package/lib/screenshots/screenshot_ios_iPhone17_20260208_095720.png +0 -0
  24. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_115040.png +0 -0
  25. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_115047.png +0 -0
  26. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_115118.png +0 -0
  27. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_115125.png +0 -0
  28. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_115143.png +0 -0
  29. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_120107.png +0 -0
  30. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_120118.png +0 -0
  31. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_120137.png +0 -0
  32. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_120201.png +0 -0
  33. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_134529.png +0 -0
  34. package/lib/scriptLoader.js +1 -13
  35. package/lib/server.js +1 -3546
  36. package/package.json +14 -3
  37. package/scripts/shell/android_device_control.enc +1 -1
  38. package/scripts/shell/connect_android_usb_multi_final.enc +1 -1
  39. package/scripts/shell/connect_android_wireless.enc +1 -1
  40. package/scripts/shell/connect_android_wireless_multi_final.enc +1 -1
  41. package/scripts/shell/connect_ios_usb_multi_final.enc +1 -1
  42. package/scripts/shell/connect_ios_wireless_multi_final.enc +1 -1
  43. package/scripts/shell/ios_device_control.enc +1 -1
  44. package/scripts/compile-shell-scripts.js +0 -208
  45. package/scripts/encrypt-shell-simple.js +0 -58
  46. package/scripts/obfuscate-shell.js +0 -160
  47. package/scripts/shell/apps_presets.conf +0 -271
  48. package/scripts/shell/devices.conf +0 -24
  49. /package/lib/frontend/static/js/{main.26a24c5c.js.LICENSE.txt → main.4ff1ea70.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"iv":"ac536a9238a8aeea44778fb455fab464","content":"0c3c75e86f588449f322784f40e4de4846123d4164a4ac77ed96a0c58ccc7d1dc8a9dc3fce127e244bd827aa7f238a60dce92a676222f8176476dd2118a59794f2813a2852b8484ce6991e69ee553da3be8c5e8b88857f298c5cd547b9168cd24cc77eb7d9a149f9851707c6fb6af76c779dd315c0183d17804d80840edfefd7e93919e7b901e9d5eeb9b7b64c40752e0050cd376dbe4bd7ffaa5b3c790e4f9447d3e0c8fa25b995239d8f63566cec1f8c46b7be353185ead393984ae64868953bcc44ec37f229b8693baef6da395b08f98a9b7ab4d02c6130dce572e992cc5609e9ffea8d3ad056d514f789f43f99d8a8eedb283ec4bebd336513f9fa1397fde8ece4391298dd7b3c5c176059b72ec1ce0758eda0ecf78e69f5d7ad3f2d96221bcdea6ecb7ad4e0dfef2873d6254e7a273124e60f206fa51b0b4300e65158711c0b693134aee3d6147035fe9deee973c1b1bbe09926a37ad1613b09f33811549d08cd3cfa139ad8e792a64d2a60a2123e86c20483c4e9e9ac7cdea8fc9b19f747b7b8a21e6a12a20a8911373e342b232a2d15451eb6089e435fdd808a7a27704e776a94b2db762987f152231748a497afc05edf302451d0a206b0a79e7d76c720dbd4d59bd57e73c51534c75629707dbec28321555c1e44fd3e83b55a63215047ad1971ca26adee3b3c242be7c6a89e86616e6390dbf390c409b753c15a1b95b9953ff798b2c310947c2b5af5d1031fa82e9710c90f80db3b580727a2e2377006d2ddda296f46c280e2f6956f2fc1c58b7810d387c0d9c85bb97d97cc0bf4b30b58b1ea8d6ad6e76213b4bb43a3a4c12cae8c58e50e926a179221a95075048ccf754feab874b126ac383e95b07a76fe95bec14aae4d51a7e951b045ec8e2876340ac9f5421a3fd27aa6444454691919bd235784eb742a80db5922ba0adf23dca058caac16bfd6e7a1573f6915e27d774ccd79974af9dad8c2e6767fd22ad8f9e03a39694ef25ec4f19f044e6cbc7b0dfcf83d9f195b92222b44402d11d7c6508b00020e3bc43082289d7432026bb0f2f4a6e1673c76fd8faf3bc09766ddd7864ad10cab0b8a8d2ac365a8f448fa0fb2be8c95280ade4bc37da926d844998fe134e77a9e02f46e156bde445ad38834ec7c993762bb1d97a6b7db2fa93354906ae727d3dc247a91baa5aa840ee86c397b642c165f7f91b09be6db42d9fe15d13b7aadd2ca8de7fe769878128738422f33f6f02f7854beb29d04e6932b80d7eb9b882e499f8196f5c618db3802f2d2ae01bd711ac4251d87b774cc3160b23669a5c3f05ae9878e60662f894394d19025755e7fba343285ce3d324ae00cb451242911943a88ea564c42ce85409d0fc68318039b90749548e257a1207bc7c429b7a90d59019c055ddbc6674b6e0ed663038a90c3412d0bbb7859f6b142ec32d35b915f149b22f48f391c964353cb489672318f69a78fc589cb4fdc4e5d97fb173e75ef140b76f584e6381842748f9dcda3ed4aadd0941fc49ecff40185059ba779563cf94f2534d21d7666872abeef509104d83820c4c4d2c5e46d1bad476816bc5a3e874a335b1fcdb870c709f635b9f4f54f1c247fa97646ff6149c6fb4fe0c8f7c1f6f024cdac66948c9107c4dca693231363e86c20b329373267561b896b8271d70a07e42e6238ebe9a3f773081833ea441b0fb242513d54c12fefac1613375e3318538ca7b0675e1aa3f7fb1e2e81d41bed3de8227d25efa4bf5f88847b0397946f30ee82150a456b6044392ea975a3588214ca35c8579a58812ea4643ed1a6f1f11eb367e1c0aa658fe66bd7726c0e15f2251e5840178dd8e16ead9e8b750c35200ff0791ad1c2a4f139940786bc04835cec4afcd99874a9c8bd52f466150c13f0aa9398bebe409a6386bcd09de5c3148fc9e2ebdb5c767dc49eb2a20bec03880f80990cb3113bafa977f2ee4132f7ccaa6b08eb56f8e4eb0f2b3ccb3c97273e0acb06c06f9b24493a9786f499f2b50246e0e713cb7cc23713f565826a2e1c719f6443a381125e374c5f404b32418aefbbdf8cd306adf26e004aabec3898c7b1815a4d1407f988e6a09d898b6aed60777a812a43cf9dd28afa3c979fd9609ccea3d10a7604e7d56672b46fb0a1909b2648c246e2fed1e6c5ef1acf8f52ac60432d959d3f6bda50f9eb14d6be516126cb9e9906fef8b23e5b06535b3eed35dbf964213c9bbae3634dad8d10495da49b0a7db3fd560cb4736e5e7a6c30ec3fde323ffc4007caa16e4d15f7fda512d27b006e97ff1d8bc5fada07d7818b35eeed268fe34e3e073042632c4c91965cd4b7516f47d88d97b8e3dc5370226136797de2d7a4c661e7a6f2b0ef29f13f6f768e4ba52c7d918902080708d0903f67cef44ffe25381be9b6b05a354757c5ec6c06b78d0e7097b77f0d4147c339b4f53a4b0b91eb4d21218b6d72a3ca901d585547698038007d7462fae50d808d72e6934576214cfb32945416550a6326a1aa2bf604c3d9bbaa757530050ee7d5c4c3a3f5c934551d8492860765219490b3bee2946f7a3a9d96b41d82b7d6708a81e5487f6db238dbfa192a1f10021414a9e84b5a91c8b4288d06b0d9803d7f9b56d9e0e6de2895859da9f23cd102e6d770b0cc2237a66f92339ef5786cfea956a53e0b298613479d134c749d6aac2b2d94c0395e9bf04663f489612a03114b8c2aa924363e5f8f69e807575409bfa88b597e296671b098d5e2eb2b3e28d4d7ca12718c73af055f27a7248a195eb0b9d3dce550e69033ccfc5a8b4b23b39b643cd436b6fce0f0e607e556bfb1cab2d5175557536e245100cccd2bf254f1dabcaba63be38ceef615176e286a555bba88fe84d54e5da7b044bf4f169a1b925b1386ea559c5effc3b113410ef0f50c20c966dfa87bf3b4ccc2a69208eb41ca4da71ae0e4d258c0502c0d989d48284df2da1bebd022c9e3324ffb0c95e68945a15fc6a877a3f884a897626287f50271700c69eaeb67d1c7d1da0a6c67db04ab755aa79d982270ffe961bc9257c659a2ca8cf20742a1c93a343fef94a7c816209437b5994c9ec4e5f0b7d3e6977ba7a2b8c8a36d4b7a1952a25fb5d75a88d289ab701c87409f8809229f04014518dc8a062691222de16e77b33e4ebaf83323359a019956d29e10206a42f72b471564f93fdc7db6282284d6145242a54f4ba832677f307aaf97d7e560470086c58cb95bf79450773fa0474354739819d06d1605dd6299488a0bc0f8edfce1325bc1bc706840952f66ad7fa47128b6e472abe67eca169b37872d119a371ea1b9328b1e6dbcec964746e495328ab7a981a090d0d4ce65c6d3fd1b8821d7981cc38368f73258d7cde4eebe62d17d176ca2cc0e8ca7ea574dd97219c231c2fe189711e46e5e93cc6e70089a91ef370017a00290333d4db935c607f748d3431ce4721b75bc6dc29081616cc9e030c32bc1fd1941594d587f34ddfc2350fd94479fc5817a34647c1b91b088ea17762fa53e4856ccfa820114dcb0f4a3cb5042ab0dc52d1889c67fc6c38c6c6c72e6f0b5ba01d37811d3280b3fe25d996760f6b807db7f617efc136b7912e39d9f99a0124314a08e215ccad5a1c479125283464eff5cb51571ec242ecaf3b74a7fa5ddb76429c9465e01399f1dd42037afbe90e3705d0f9e8438f71c0305bdc6815a3644660d79c3e030e626bf0855fe9f0bf5404fc60dd87a6c9976b36808800e4e70d7819ae978bf213d3bdf9d7504241dea2f761cb581d391f2681115d79fca8847279a98fab38fdc080ed3e2417b65a3e09ee19bc8024338bb1aa745b2f42c912d5707e3f0f99e4188c1c557d1fd1a2a1b4e664c3abbdc57ca50b7bf8d17c56f43dce9742e2d1f8e0bd802b4de6884a264cb3c881ef72319f100a2abd111ed49daeffa9ee6cb5656487b2d7320dae4233da0a2096e3d3fad7de9085a0790ce64efc9e4ea8f16ed144edf45cd141bbc69031f978a4b496e5f5669399637ef6d6ea98738204756d9745bd28814e9ee4055881c61d7fe892053010b004aa614a090d630fec356cef8273d0586a54dd452a630fb92c385a4814d65e584c5508f4364037e46c6df704d22e8cb830e08ad8e30878d8596f2e322c536c4ea9f9323a8ea105f889d8d5df3fd5b6ba3ec82bf2f7e61c5e68fc6db4253cc28d4cd16eda9389743fcf6deef9b66f88dbe52d421bf9431cadf7f50a030183dfaa4ba810217b433146966f1b172fb3df6872020179ecaae9d92d48bffb698d4e25279c9d2c201078ae5d6284bb0243170e95a9096f3a72703a79646813ba8120730f4b7e0ace8873cc5fa397304f73be2f31bc238de49b4b5292452dcd7d87886d35d52a5aa403dbe46503432a8f176c3d0aa410250f455d2d78b7f56ace3ffc868eb62cde601974234f6122a447067049f5b369c801b26b5aec5d59ad129437a98dc2e96493ca77aacd8f7dfbfccdccaec2ca4c17f12038f62a443f11b46cb06b70e6f3164d875fcc155997bb949fcb88edd97763f148438e1d34b5b172f55d4359e6f7f66d8f37af8a0888fd3cb68d33f41fce1f866945f6b0d53096724817fad8c1243f5110091653cf820ebeb18304a938818caca9b1294151711553b06f0d1635260201efe4f07fcd18c377385ea3840653e684fc6b716423d99769cfcac57125ead34691aa994970e4a5a02b72a0cc7a09a8d4ca228541b8e384b30d1e0f2a4e9fbd87889f66f5f6bae00f2881e8eac3958459f7bdb2d4a8c92e8a25703c0c89ff969e77b039d76fb1a042e2d4bdda02232a232a1b67d69e7ecbd7e3f3a19114842d0fba4ddc26a4e2a2a9038a6d8e5bc72177b1b0d357c8aa1395ce917af2ceaced73365d7686fa48699b98ce021f36edc7498ef702ee51de4574093ced7b4b93e788414a5e652208d1258d3452ddee5bddbddb8ebda8682475175892ef82c1a778f652ba97eeb22521112a4ebccf5aa7068013b1bf1893c1ef3fc871690573fae127319041bde31187ee74a0b3deef898e6694baf7f128bdd9ef4aeb23481f5ddc58df9208ca147b3b265af5648bc7256ea259154db5a4036afd0c30fa87fa9639da9d0bb569d8883bb932ebd278ee0efe4d652b3719ff49cb73d389f6cbf8ef00b74b3519e727785897e163929fb5fee06594094cb831bb992031ff1fffc6fd1513ba9e0cf4a70451f2fa859895d747280f68fb0d096d8d77dcb11371f9bdfaf79551e8c13c01769db3dd13d36760c465361adbd6bccbc4442fa9d94224318c1cca6b1c37248e8aad691a9d8f188df4edb28b28f8c82f2910322ab54ff07a0cb51ac750d07c8add8ce393d0436bbe5714e811e40d7de06ba3ead429faf9efc4065597f7e9655796acaf93992e288265c011da5a883317e1f597c999da904e578cce37fc66b3a52324c0be67e88f935b32002f6defc84398307cb6da9f9c8ad3e3c1ea769d1e0ad104aa8212e20f79afadb42261ebd2870b70f573f2be22631f066877471e27f471ab8d28fc9a999500a1d4407f0c174694487c37cdf07efdf594dbc75d678e96a491606e74db619f20c95a190f5270267f809c171274e2d1ab50feb2c0f106c53520cbb89e3c621e0b82ca5ee147567dd0b82a72d30c85dabfb5773a791d8bd57a0e9030b8238a311ee9d3e70a320ee765ac761e61ea350c74c15a1e74e9f46506d5bd2505af0c8aa7a0cbbaadf582e93a982eec560dba8447d149379590764791d696ca9f4bf29c2cff4d5cd3ae03629a7b300c4c09ac8194f25d0e99e8411ed8609dd2d5b8d56d8f2c3ef3bba20c81a14bbac0f137ba866e1b9d581e564ed2fb70c6a7fb9392c81af3a4bb1bcd79d00a8e2e702a5934c99c745690fae20834c60e9a9fea416b083220bff1395886b0536f9916c4e0f4c3e473aec23a903899b1aef7f434bb76a661db9852401b04d3ff3124ba3db3b10fb963f4668539b5a58512f0284a95de5d51130ebd208f56523047d6640c0b80f3db223ec407e1ec2a25b472e63a0fae57b35919a69d30a964009bd8831407be85e009f0bfbc05449a2256b620321a250166a15c7d2a16b91a4ba4719d5e25976d674754db81e59d85abf120e9c3b87c04ce420750a7b40c1699bb5e1ebb816df92b1f98f2a1e2fea4c1cfbfb4816bad708bc9ce0b36c4ad332a6b1617e8e5312bcfb174e61159dd5432f6a2b5fc5288b638cd82b519a996f796cfd07da8212b028b9265d9507f903ddeeaa947530d2ce8c01d0f253d09d20d304351522b1d841ea82fb1583cbd73aec7a08187ad1649ff09acb4eb2cb52eea2e42b5477f5d70dba6b3ad6175098732810ab57999251aee0d529995467209fe9bd45a64d5d24311dfeaf081ff31529def03e9afc94ad12ace5d30006205beb4ff36d0c95db917279c54aba40bf0a91a7f1d12e41eea0e82b762547252a06eff004a32bc7a6898de74af7b804113f1898c1ea0a672ff324a4e17d561a800bea0eaa17320e8e57ebfc73464e25b9d75c21d4efc39f9ad8d0f1c1d1d3c5114885dbdbe9ae5da5ac658069e3d491b21fd5444c01690c8c9d94fd87960d2ba3288de5bbef6a1710282faa24812c6215050d5a56f8cf795ee0772b49620f18e1d2187a5fec7f90b659a63583a3e0a70693bb08ea7d460b2ff8bca1ae67179e1816ed7b95563da125e775aebf5f3002e9287188180a0104294b559621055f919f651496b162e0afb1eaca504bc0264cf9475982e42fbeec45d9082fce45a5fae532268944a97002c0fdef478d1ead7e703779edef0999f03ea2def6ff084edcdd295e6082a46452482adb5728847dba02d880d90be44681923af0eebb124db45dc99ef8d291f0ae5500be76575a22072fb5acdd684f020a9623f58a3d48a9e0c657941721630d868113d74660a1a0719b23c660f5a3d4a3ab1c3403f853efea73ffef300c4334f0f1de0e97e8ee73708a1a5bc2758dcf9bc7fb6783873f56367daae15be368679fdf5f01d9be252761d84f6350e713395d4232d115c6829839108fd4b7b6fd9f2f06374c272313a6c0ab9f45c5f17cb2e11ca03580cb2c8979f03802605cb152be989a5d6d65e4e03d58426267aa867454f7b67f6bffbe524fb423fb8d31e3172d11105fda0dee8d90e4ae3934fbff5b313cfb99d8d53e09e4ee4cbd9305bd99a7d222d41b6080956077fd7fe30b29ddea3a5e611828491123868f7529f3fe0d4eadc697df41b8b4f0c3eebb0d05966040543c8815591b0f943b6b412998e97a8b8883513d9a1af9b774962f9fa882a980154d14f778a165a747a4cc8804691b2be9b5bf0b9d2a8166c1bce55f2003d8a6338b3536ef83a2470f72560936ce438fbbb4c7fe94ea18cf680f296a806343b126552c321bc60bf576b89156baa01468e02a154f030f6c18b1c7d2d71cc4ad1f6efec992da0405f433bf8b3d73e5b244bade0f41d592413b9bc2c06cbf2011a92d8da65fface529e6b7c49f3ff8e7a75ba4e788d4e4d18630c7d6327cfc655fec8921afeeee464a3fafe62266e84a11706c5e891559fa8e74c8111190fbb7afc936f1f0d6dbcc23f0e7b88bdbe35858e01cb0f026313f90439fd0d281560c22e83590cd69c23004212473c162a945fc5efe93652a71ba0ee2599dd294e45e6bbb1dcddcdce3d1699f88dab945bfc982f43c984463497755f81acddba15c00f52c8b3f88b299dd9facda70256f40f67aaa923dc5b1846a8d0d403271367f522a175196aa9a2d5f1ce97e7e6b5ffb4ff660e13d4542c42427723ec734bd4c7fdc5e23dc2dd5362d981aaf4b631de697374fa8be640a925d3ca0aa2e7d82e462776d23382a882d575ba823c4434df6d4127f1660b67efe7fb1dd4404e6a2a60ed79fcef2513c87b0b9aedeb07a5e33501d2e148f4bb99a492994c50c8c9a52a323a2b81e8f25c97b60457305ca3432ad041e8a99bb3e2ee42d8b0329acf88875fbb1dbd94dac52054ab7154eade2e65d2e95a168f22214fa47afe55c63fd48ca55631e12f377e9abcd10be65ec2d2efafc6f179ddbce13e66079300f4d58d893c844e09464ce01c5c9eaa0d36f5c687f6725fb7d9e6b72d8a34893f01d395c3cbb8b2a1d66bfab844ce75878e339ce1cdeef4460f468cf9a3b33e5c63ee402bf5f6a4928e87a84f41270b2bd819060fc4bb4ed718ff859932e0e268c79a89ffda26a30d848ad1893e4e6202f24644de5503f585e0ffe213c3f7ee7a34874f5b5024abb9de52aca635194aa6373d0d935c90e00ac5f1c7d7fe55b93a66d38ae9374de0c811b77beb9b1aa2f49c12dc190241ad665a4679efab14e1a5b326e73259bbff5cb60587f0299af89d9c78b8187363da6fba1e9e03f421e5192caf319625638b8cd12047d16882d8ec272730d587efbf6d29fb8c385cc45d5aa5c73bafb1f59b284321813f96e18b611bbccd9e66e9d060e55ea58694d944fe0677f65d7e164f1806a55b04b07f099a8b301149fe5c4c1aa5387775587e79fb9d6898067374fe6a4e6f9a5f3f4a7351b37b774f3a5c735164880bbc903506bf27cc90c1c2dff46089e0b5a333cfab18ce7491550e4c471dfc4daf1d93a90f7ab6e05fd3fd28fc8fb05cc08974c215e9fbb983a4ec01bacc80a5bd2d1c185f38a70fe0804ac5a9d2cff1d1df5cfb29542a9788ef0fb5ea8d4f419593f484f71e9e9fd89226be5410948c46da1f27d04812ecb530256020078c95e37d1107ba5148b583b652024f0ac34b528037ee8cb629a7752b6915cff2b04dc7c48a24b2ee701c88a068f7e0f6933d49e5cda275030f595bc5fcdfbf159f015ee73b7424aca81ad27f92ac5be882ee860832eb5e69f79abe877a6481bf67074fbedc3ff1357cffb49cd55f4786d9d924090db752af184a58f165c037a08784769ec723f9bd0d7fce6d0b6fa2f422a96b7d04c963c32b0c411eb12f763e33dccef13fd70ba1904349e389a87be217f10ea14ea50bc292443fcca5cf9d123e76bbfcce04e5ce936b5f3b8df894acdbf8e72df6efbca40a823a02bc73c48847d12325087ab043dda3575c764ae60e7fd383adddabd6bd2cf302f83fbbca8239a566350a1b72858cd0d310b935d51b16f4c98ff725bca8ecde858206acce3fec4150cf"}
1
+ bb1554d9863a1c588a22ce9faa4910527bd9e6ac42af73bf73a8f7896fb16e104b0f531ac905ce124a921244c457aff674e809dbb0b3caf1a7b850e83b06d4f9a4da56fd8a1c50b786259f07115f92e81d0ac603643509c4940b59b123b03896de3a8c6526da964eb4132d7487f90ccbee20e6e69051816a1214e2ae603409b505525d29b5264225b0875b1cc5f626c7b5f65e6b8f122125d6088889eddfd669a18150a89ac44410c013760599b08104a2bee1982643866dae334994c40bb6fecd1f3dd95acbb4ee5f8f911d1df8a9faee366ef62fc847ee40edff77013a4ec47c34ff222809dc72478944c2a66b7680a10effeeda5902f9fa76471b1e4b3170266af036dd647bed6a4e44235ece45144e5b0b165f18fe18cf0990c76481e9d10931961c51237f63d0d23cab4b3b332f7d38bb74f438df4b75b0ec6cf5a7a4b08d270ea9e408a1840057c2fd33068ee002fdc125330a28702aa7c4d5cfaaf0390cd75c428b4a2b8f42d9b3509109dfc02c2f0c44db440b2e5598f079ef94f5b093fff96c403e4c1cf6b1ea71ced9fc8a0c3f5f25cc29a77182e986025d7944f97511650bdb7e90484cf7954cf22479696e377160b97d1f2add91204aa8e68afef1ba26fdd0642f69e65fcd22cf8b163576432e8bd25b0b6aa47599ae2ed3b6d254a7d2ec96b02db012ee309434f0db5f7219f9d87c4d7be4975a1643d3d237e792cb524de996434d6d5bb39b85b6cf4c23e0ddd38b995503964793b88c2e0e8b33426b2c809120031ac9d73d78f824abff0831dc83b32624a226314f2ef34b5fec51c7866e9e1621b8546349c30e900658f126f2ce330ab17ca8fc71b66a40a440dac117ac401a7a2f41c93ca1979275bbc30c5ed2d6ec11f44be852bb8e6cfdefa11a54fccc69187d168e79e0a637b773f7812ac658c11c190ee6452e3017274623a1534dd6f170c131660a84685711201417c5ca9149f99169a00f06e84f4377d3327fbeec043fef385278d1861abbd8312f92c0932c0453044a5c3de1cccfdbb3f5f9a268e3f78252868e2d45a315993df55e0ecacfb5313ddf6777b08b9f687993751ab90476c89faa3c55fb571bd30c0364f891976ecf26c9a182aabdc444f70f4d4b73a838ac3678b9d07263f4af73cb7de1aa969d247b4e6a41944540c803234e51da9c2a15ec70e233c07b7fac64ca3eba1fd368eeec9f4ad1edb4e1c85c1d85b967ce7ec69f4b5b55aaea75e6d67a0515cc1b7a0e7c4371438b99143150f51563a9898ba7688f1510f7a33fbc7bbf88a20d6922fa87784bfa175b82e4303de236540490ed931c2a24217fce0cfe2bd9ae533cb08c66ffa29f09e70410010d30bd4bfe400050fc4f3c4237670206d3b2125ea165b789e01603b2b9930a681a7154c01c0f6fec994a44bfa4f6b46d3cf485d2c7cc25d0cbade50f85073eacfc13514889a26a9dffac0cfdb45a3f03db718386c4cb87a94a045de9fd2206657121d4df97c9d3abefce095bf976393f5bfa520c7a641917ac7af73a6fd9e0721a34d199aae7b9f1dec03b9a3e8670aae3cb8f2bb5de788b39a536407a61c92a02391b067c5235aee3dbb7ecee0c9a3c8006167d754975261194618b5a5444e74b52b5cf535514b97ce7bc13423eec34548f7b73056496483ac7fae201a39c0043cc305303c6f48a8e35221390428ce3b8d34e84299702c9ee046f8ac09dce3082553ab6ba5a3d3c5a973d179f7fa4f56740ab14ceca59fd91add56c4de56325b6da889d66d43a5f18ce0e88a70d6ae9f6e0985c90716375706886c18244624b214e01efce0a88efe4faaf1f6c16b0cc6ffa08d0f4587ab10f04d51d9ec25d405f2ce54c14eaf07849ea5ade6d2b89376ef8d9ad972705458118e4fb22051c1c78418e408d53a6405bf0fcb60f4f606399ca4f00da9679993dbe92fcdce656639502afb72e12e4ca9c44793bfb795ad4a0ad20aa67f8825121c7f8cee84c4ca7b1b7b5f0ddf811ba158144831c64217757e09574363a0b1885c3eb81d20a6d2be7f4e58cfc828df621b267f6c067212be6fa87edf1ee531fddc3e1f95d06ec09c65117f4ab2e385b192e48491cbb39c97857f1018a9e2c56e55678ec3a239863eb4e4f9ce9a1d39d301a26a766360f2c799758cbef85314be32afb91c7cd2da3b236514578199b2e9817aeae381533e3337efc68605dc34ff3d937114215634a4b09fd29753ac83c9e374979b9b55d74a37b66be8936a96958b1f2d95f11044788c4e75c3d2292230e6b52ee4414991fc1dd5684b145e5d677a2cfe35ab57e3408213ecb62ff339fedffa4783914193309e3255d843f49a20e7f4be5eb7a81d90d3105f06767bfc14a9b03b6fe949822aba7e72ef37d831af92f6ff046891ef2ede976f139153b282087f8a1f0916b282f33c1f96274f23765e6b2d48b52c3713136248f1c6a49be6591d89c76655adc2977ada39a30b54d3e48f7b647160187d3afe5c00a968d45cd21a2e9193316c73bf48b6286821887ecb2d1c1aca67ba6f6f25ac5cc8bf6b01b77c89cdea4e898ec465e8121e4036c9889e1f5948c6ff99c4d4193d73ae1372e3c00b76f21ed55ed79bc9089533805ec9bb3e2c1eb6bb31db0cec0dce0dab207b4159358c85091708ca1fe3f86287e9264936fadc1693739a108a5c087a82e91ea0c721443eb4fa9424b222296a2bb1798025d165c405956adb3944d30e8a7ba339ef656ed855af83b5ab6352601764a1264fab582bf836c0c3e35c52ddc377212150e315c6a2be52abbb2e6e3ee67b821cde0a8aa09ca1263a035c1108e6f550cc70e598f865195dc0866b7b6c1959798cbd43772ad232f4d084afbe06a781a2473053a8719264767584765e0dba3b4a13984d3faa29cea7acf24c9086038972a4fd01f22ea41884eb4ad4c5b4a690b972b4c14a2a9e293596040dc93787e198fe20646fa688bdf03aa46bbf072fb4a80b1fbf4907638c8a45dfff93de1d6b5dc179aa3734dfb95ad6e2167cf12faa94bd29c52ace287e902b3c401fb4128aa1f219e7b71da46ec990909859433cc2a6dfd3a26862ff77c920c6d94f2cbb7e3ef9239d1f0548e5e15bb1b4521c929e4946d34868bc7bbb24ed38119e99e9c925486c82ea7e7ba70e3e754274cfc4cb30707df3563a0d45765d5ddde34a3009e862fc8a1d2afda30ddbd4ad7ff22922eb3dabcc198751c6340f82981f176c98312891bedaa001a9602e622ba6e89fa110ee0d81d136c49a2fa812bd6337faa3cb01bbed2517463b890de22743ad32dd84d2eedea2ac9d5e5724b17365b26bfb00a0d385463face0e117c1744027ba5ded445a6c05eaa304a1f7dcb87451d97b2cd6c360fd1e6e1949e222404051c48547cc87425e0fe117b960b5facf25aabf7ff2a89788a19db618444f9f5abd158b49f5887cca32f4bb7c01a2cddb387b9083009a231a64f7dcdedd3adb2801fc922a633b51a7c0768632809b372b40f915ebb069fdf187b1fec19b45abba4d6a8245bc782e1ad16168ae92aaa98033ee79856c3cccf2222c9fe84d1c6c16441d59532333690517a2380ca51f70a50670321ba79764c34a82c74c7713b374c80293753d56c01430ea7e519d316da78b0187e6854e5e95c0196d05e830b290f4862690d57391843484959fbf46673d99e2820275705b027a5de5e51e41d0c0e5a297ca92c09ba297be8c421bbe5aabd69db04a1b5ce983255eda9c3186c612e6ab89e2d63dbcd563c91d395c0be109431a01ce916ffc4f05ceccf4f09add43bfb7dc82c23546b8d689a68b37ff9d9106ca04d8832aae52d3d675d18d9041458e5a4d285638b34815252bb038c437a92318860b4a168b04e6053cc9efbac57d00d7196a789be62e1f60bda262da2ba1df62c51afdae5227b3d1e0e6a5621c6caf0c438d0d9c03dbe81740d424c6fd0d5402b1fe41b70ec3c0397d7ed7653906f2b1e0dfdefabce2dcc0e0c8e434dbb0269a92f9283876dcfc03ea374ebf1c436169ebd52e11b73d2924ab3e753d9f174b432265cd7768b3ca993469e12db0a0fbbe8cc349b63e42f38427d1bdbb478ee7b044c0dbd2977c58bf72822336c6bbb4011c4def78ac1455205c7378e7a75d9f44482fc40ca44c41a13ae8e1b96f996c5d896008aae28abf7a827c92314b41b4aafb36ed78e12a6ba002cc442ce2fa131e1cdfd38c353db18679aca5d4fa223c65db0e2b3c5f30081c1b1f7fadf1b9b44db6f559fd7b41158411878d28f21371b55ae30851d474155338a1ec2e0e661bab196d29832e4886d685cd91e7852e4573db74c581dbd72d3b4f73e5167266096c9171b7ac33e464285646a1162d26a2afcfd300f32e510d3b56ce15e9270d4dcea4695ccfba4f3fa9984359fcf61e365566a94a9f2883387dd69468aec332bfa0a08def227be82ed80e776ca6a4c61a7d58e26c57bd0bd03cf92f7f3b19de4591a9359b6ae924dfa4a1e6c6eb1fa1181f16241663e414deb9d8910f406ae783724f830537078d5ff99d1c73ba19a2693cdae70685d1818ac6da72e04868eda018d069b0b11d3b3f7dce95e1333bb4cc59aabe5d34886638e9c9722c8b119b6167fe9172030ae99db4d846e3cbd98918b611913a6c0fec26a9468dc775bab044644d237e9ae4b29030999e5e1f58bb3051d1e1e3ff5a5f03c6088db6c70753066b2241830fd350742572ef98ff83982ada52fa94a6b5b52a43d5abc112e1e0335c6bf22373b0b0b7c403eb947154e78992ef3d2d22b7832331946969587a70a051c7f2e2db9bb378cc1acda9bf208acc912b4348a32d783fc65d8e461ef0ff49d05d2275e7053e2257114f5b1a9f66ed8ef7850c93b50caa825788fce52db2f46a7409c474c2270f000e4c5812e24ce84dbd18edb04728ca2e11a098562cc2b6cdde9f593cf8129f8dd51d2982224abb55e66b63fe0a35f3d3fd6431afdd759b0d413686416ed9827ac39849a67759c40f11f25263b59e688230809d19346f18e34370d720ee4f982b35eeb3eb4e1a9123932c90489451a2806cc9a98a59d713aba146917a61408d306d0a76565c61bc21f5d4f17974a139f0b1e527cb5eab3bcb549edf4d7f01ae8d8762834a696d87e32030410cba7c84f4f4e9fac1ba0ecae4a227c9be1ce3a5039e78fa1cc626fbd0c8f605a88472c3fe401d607508591b013680ce74f8034e7f365fc8860e140300db73e86319fa39d74a4aadceff6b1e6c5d71f0aca76b87e6450ab48637483a0db9f8a1871b09e98061437f98e78970fb8c9982ae8689718adc005538f8e832bdfd24516f1e827f91c2ddbaaa41377f60bf9db45c88d0c6872c694255c8dd0b7b40dd8235c4895a4cadb36b093257fa3f846bb7a32a7fb017c4f1d2d67397012468c82acbbc8b3fed94131db247eb25178f92ae9b63938423e2437056fab65afc5693602a348a3541a41c1b56accc755e6243dd3fc1c149d1e9066f1ab4bf0f71da3c9879090b8712fe536b212308f867f618c1c79b5cfa5e3bc76480a507f7232331f8200722e292dd6b5d75d87c634e0f28e68f8a15b1e05e17961abac03b407d71c33b5449e338bc2ecd69d6705f8c2158e395fee150a9a314ce14321ca57a72d6b557e80e848d98c3502c7e7e43658f2e1da79055de7c9e7928ebd8ecdc87ec78059a1a0ea8aaa9ca6f4bdc549508b302212edcd3437c870bca4643c13bebabea033dcdbe24ce745b90a08221eeaefe3323088b891ff901a578ffbb793c605697641462ddb0598a4661eb4b73d268a492ec199a2e3b672daf15d14a195c5cec37987ca44095fa69e1e24c157889d58a1b68bedde6ffa1c308cb215f25b4b0d576b6c2e23e3cf32245c9ce3cf13f3a9dd48a8b2819237cf6824b9a6591ba92112a6e5798eb19b1356cc2faa7817886ec2e5a0addccd70448ece9e402cdfa5899104e2c17c8e669b6e95b049b5effbae0c2a581583974e419ef0a5264e8a3fa71c70b818231c776b426ee66dd441ca2d5ede9424cfb5f66dc5b17874d9ac9877eb36fb473068885f44dcb8a8ff5a1a28b73e4649cc04f49a730809184da86f0fec135903720a5e13c03c6269b3728ee33b56a1c5b56ab37f1ead0ccf5a1d1f648f302c0bcc98430b6b7d67799c73c224546f2478fd0ac9404efaa662e08efeb7a49a96d4a41b1ed42ebc697bdb498eb4e37885159244f410edd695b581f05e31266c02cbfd3a2b662625d4c835498e750e77667938aa7aa0910b8a4aa3b0433c410ffb053bc48ec10461fbb9ec7ef20c53ed365878d5d5ee08005c6525bdec844acc3bc8b4efb434e79f389d0de1ba4ab6d60bd878f6c5c6d292f64d134bf330149b440c10293869addc2e749cfc3a04080fb8d86cf6b4eafcddd3199e78741747806f55d27a303ecac9a258858e19848db96b6d9449513fca67a025f5e7b17f556fe2447121a83b651e9c87785566abadcb4f8e14a76a150b336e6e1f3cef2c94ea6f4d779e15b87153065ee030b720026b2394c6b0c5440f5a3a8843f43cec4eb094a3edd168a9fe071f5c17587b716ddb19f3e8df40e6354ee6a265aedd71d8acc10b055df713d25c7be9d18428102c7fe9e899df877d49f983b9d2aa57233d913e44b60c5795c98d2fd801215eec964bc10d70954a27370735e32022cdc516b4394ee67f2f8cdcd7732a044123ee662a11554e9156afc61e939b7f189041d3454373c554f7e591dd3522e511bbffe891864c38f4324f360d575c784a176ee27537388187907abfc87b1cb3c99fb691428def9b0eaec2d6d1412e6d82ce00693f6133dc7f682decafa5b925aaf322128100455a7e4353508c54d83ac1878cf355df2b44f606ce990191ad0416244cb2f5071c5c70a5d8132f10e20401ce26654e379f2ebf130d6b4e8ce7b13c4d7c24c333a2f2584da876fe01763d7e687f65d52d17ecdacc84bfdf5c32ee2491845c9cef4e92df51b3a8f1708899602873ffdcb081aaedd67c105e87f22b8b16159c1ea6285eb05a3d787b9bcf0815bd7d955fbb2a617139af07c62df8a5c4f6fcb184fd2e0a39e98c05cf473564faa344e296d900616f480ff0034860d4dbd67b6e2941cdd15fcc9c5c09c75e28d88d5b4064e53fa0a40acddd34603ad3615e418ac13265c06c139b39e63daa956b2e811bdfa488a5702e77bf95aacf9ac08c6379a97d6bf5659d1f04537edc7343423c6254059f81b33b88d9207a5c164a019c0662e5ff6791df1e914019aeccf2ddef10fd99ad48236cd28d5fd0a1cfcb0f79d020f38f9e825b2d6b33186a79405f3c124c6a206cb315f3b041cb1b0344a273d8d842fb0919cb39d61470468ab2ae6ddc5154953013ca64b022134cd29a0a7582ff41cdef8efdb021ff3823c2f2ed6807d2000ed3a4d16bbadc286f9ffc7679f85dcd6b25e86323fcdd283566b9646fded17bc2fcd2ad5918b27863f109f71857cf4e92a5d7917a2a2f00ee48e0da6dccd4a6b8a0a87ab04b42aea4202dad93f80511f2c4e196ec18fbf127ef97662c527c5547a8a2efa8c78f2eabfb353ca8b19c096552398cc09117821fec204433540be18830c9ce8241b0fcecba0bfa0a639f0ad797b08dd21b4020f239a0d942b25993cbb15e6af9df1dbf23656301b6d91f8a2433e47480efce78f58e52cb18ea59ae6d349cad28ee05ce7fdd8b2576e14ddc85664a38da5e805a2be65c5b2997d8e0ef9d7f27bf9879ff9a5c10f597a7d4e4e0e0bae8ae1bd71fac81c9ce6e08c6de6fed9a310803359c5412543e9b41665276c1dcb758c0c7156a94f40d5a645fdfab2cd7c9c5a04851e5872ad0c4d826ccd1a0e74683d607567d83055400fafd115c8b3181915e5daf9af8cc5d649f58fb034881a80584f88cb784e5d09db9de2ff70fdc0694b4194d9fb107228f66450f671eb93ce06a20913b58c586f6b2ad975de496b3ea63e804385fa4afd418ef76d08299272bc1c831fb2276a3437191eadbf7145f16cb296703511096d21d34ee21a9ac3f5fde074e961e6f955f30b68a45a09b91745d75eba3663dcf062624af56d97a32be3b2e65bd7c9c8e974901c27053e3f83b43c0cc0e651fc2d903cb63820fce43ff115d7eed4696ba39b175f38fb301f5194ed6b8845e836e0b56e0ff09fc0b99a780581d19d31a9485eac629ff1ca66b18d8e6683c0901785a2d6889755f4c7c1095c1c565321fe1e40a3d964d2eac51f3cc7537c99d9fa217d8387bbc7db0ab1071864aa17f829373bc38d1006c83f90badfd8f0d38bf10eda94ec6f5ed9c07da60dba4cbf29877ee5dc9eb63f87059467aa310ad379d89b25665712a4a98333aeeb68613797ceca3b834a1a34a0ebad2c23d55f5b945bc0cf4d9273a8b49d5d3065a0cbd408ec9a9416df688093e7543b1e46e1fd08288ae40335d13d3562c80d7f9bb82d6af7abd46dddbae593f976a3f5909b3c5c9f1b27a421f943583db42d2e8918f5b92addc47a0ee2996eecf5ad0401d12b2b13eecb3d16512735f8d608d239932f299987249a7dabdddfebaa52c50485da6a1fe40762e930daf7a33d751694f72c20c6dd5446d09aa2c61953df4554ead075293f74eccb8b81195e5e96bbab135c05fb94bb091fd878b518049589bb8b15d5496874e58d23a20e58dc106a5f0274e72b7ba55bad7160d6366eca2e37066a6a5560bdca26fe8656fd268e7b163fcf7f80048deab642f7cea6bb05541fbb5c1b7f53da66e97f60e7872262d1151ca799aaa4e3a9de70b96ba9d5d3b0cfd0191ac230276127c14601d5053d5cf272708b37a527dd69a9cb448cc45b79f94765d85e54bd2c1191049c42cb33c840171db8690cc17600acc8357633689a1e14916e742ef5f7ca866fdf930aced1bb2aa5af54fddd07cd4ab011640d41042fd15bdad0062fb03d0a5697ddc3c8547cad0cd17396d38817f4adf1f5fc2c71674c0f056e320e489c5f3cb1615ea5a749c5dcdb659618fedb5880fed14116e11145a9c4d03d40ad2ab2488520e636339b9999928b5a7eefc74c4d6481c48b37a18e6fee1e61c0c89657c1c01defdbfcaaf04adcc86ce7bc57a069db7345f70afa4ae2fd6a221ae97d2a79d1b4aad7ea30aa0ea7ba4dab98cbd024fe8
@@ -1,208 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Shell Script Compiler using shc
5
- * Compiles shell scripts to binary executables for protection
6
- */
7
-
8
- const { execSync, spawn } = require('child_process');
9
- const fs = require('fs');
10
- const path = require('path');
11
- const os = require('os');
12
-
13
- const SCRIPTS_DIR = path.join(__dirname, 'shell');
14
- const DIST_SHELL_DIR = path.join(__dirname, '../dist/scripts/shell');
15
-
16
- // Ensure dist directory structure exists
17
- function ensureDistStructure() {
18
- const dirs = [
19
- path.join(__dirname, '../dist'),
20
- path.join(__dirname, '../dist/scripts'),
21
- DIST_SHELL_DIR
22
- ];
23
-
24
- dirs.forEach(dir => {
25
- if (!fs.existsSync(dir)) {
26
- fs.mkdirSync(dir, { recursive: true });
27
- }
28
- });
29
- }
30
-
31
- // Check if shc is installed
32
- function checkShcInstalled() {
33
- try {
34
- execSync('which shc', { stdio: 'pipe' });
35
- return true;
36
- } catch (error) {
37
- return false;
38
- }
39
- }
40
-
41
- // Install shc if not present
42
- function installShc() {
43
- console.log('📥 Installing shc (Shell Script Compiler)...');
44
-
45
- const platform = os.platform();
46
-
47
- try {
48
- if (platform === 'darwin') {
49
- console.log(' Using Homebrew to install shc...');
50
- execSync('brew install shc', { stdio: 'inherit' });
51
- } else if (platform === 'linux') {
52
- console.log(' Installing shc on Linux...');
53
- // Try different package managers
54
- try {
55
- execSync('sudo apt-get update && sudo apt-get install -y shc', { stdio: 'inherit' });
56
- } catch (e) {
57
- try {
58
- execSync('sudo yum install -y shc', { stdio: 'inherit' });
59
- } catch (e2) {
60
- console.error('❌ Could not install shc. Please install manually.');
61
- return false;
62
- }
63
- }
64
- } else {
65
- console.error('❌ Unsupported platform for automatic shc installation.');
66
- return false;
67
- }
68
- console.log('✅ shc installed successfully!');
69
- return true;
70
- } catch (error) {
71
- console.error('❌ Failed to install shc:', error.message);
72
- return false;
73
- }
74
- }
75
-
76
- // Compile a single shell script
77
- function compileShellScript(scriptPath, outputDir) {
78
- const scriptName = path.basename(scriptPath, '.sh');
79
- const outputBinary = path.join(outputDir, scriptName);
80
-
81
- console.log(`🔒 Compiling: ${scriptName}.sh -> ${scriptName} (binary)`);
82
-
83
- try {
84
- // Copy script to output directory first
85
- const tempScript = path.join(outputDir, path.basename(scriptPath));
86
- fs.copyFileSync(scriptPath, tempScript);
87
-
88
- // Compile with shc
89
- // -f: input file
90
- // -o: output binary file
91
- // -r: make binary relocatable (not require original .sh file)
92
- // -v: verbose
93
- const cmd = `shc -r -f "${tempScript}" -o "${outputBinary}"`;
94
- execSync(cmd, { stdio: 'pipe' });
95
-
96
- // Make binary executable
97
- fs.chmodSync(outputBinary, 0o755);
98
-
99
- // Clean up temporary files created by shc
100
- const tempFiles = [
101
- tempScript + '.x.c', // C source file
102
- tempScript // Original script copy
103
- ];
104
-
105
- tempFiles.forEach(file => {
106
- if (fs.existsSync(file)) {
107
- fs.unlinkSync(file);
108
- }
109
- });
110
-
111
- console.log(` ✓ Binary created: ${scriptName}`);
112
- return true;
113
- } catch (error) {
114
- console.error(` ❌ Failed to compile ${scriptName}:`, error.message);
115
- // Copy the original script as fallback
116
- fs.copyFileSync(scriptPath, path.join(outputDir, path.basename(scriptPath)));
117
- console.log(` ⚠️ Fallback: Copied original script`);
118
- return false;
119
- }
120
- }
121
-
122
- // Compile all shell scripts
123
- function compileAllScripts() {
124
- console.log('\n🛡️ Shell Script Protection Starting...\n');
125
-
126
- // Ensure dist structure exists
127
- ensureDistStructure();
128
-
129
- // Check/install shc
130
- if (!checkShcInstalled()) {
131
- console.log('⚠️ shc not found. Attempting to install...');
132
- if (!installShc()) {
133
- console.error('❌ Cannot proceed without shc. Exiting...');
134
- process.exit(1);
135
- }
136
- } else {
137
- console.log('✅ shc is installed');
138
- }
139
-
140
- // Ensure output directory exists
141
- if (!fs.existsSync(DIST_SHELL_DIR)) {
142
- fs.mkdirSync(DIST_SHELL_DIR, { recursive: true });
143
- }
144
-
145
- // Get all shell scripts
146
- if (!fs.existsSync(SCRIPTS_DIR)) {
147
- console.error(`❌ Scripts directory not found: ${SCRIPTS_DIR}`);
148
- process.exit(1);
149
- }
150
-
151
- const shellScripts = fs.readdirSync(SCRIPTS_DIR)
152
- .filter(file => file.endsWith('.sh'))
153
- .map(file => path.join(SCRIPTS_DIR, file));
154
-
155
- if (shellScripts.length === 0) {
156
- console.log('⚠️ No shell scripts found to compile');
157
- return;
158
- }
159
-
160
- console.log(`\n📋 Found ${shellScripts.length} shell scripts to compile\n`);
161
-
162
- let successCount = 0;
163
- let failCount = 0;
164
-
165
- // Compile each script
166
- shellScripts.forEach(scriptPath => {
167
- if (compileShellScript(scriptPath, DIST_SHELL_DIR)) {
168
- successCount++;
169
- } else {
170
- failCount++;
171
- }
172
- });
173
-
174
- // Summary
175
- console.log('\n' + '='.repeat(60));
176
- console.log('📊 Compilation Summary');
177
- console.log('='.repeat(60));
178
- console.log(`✅ Successfully compiled: ${successCount}`);
179
- if (failCount > 0) {
180
- console.log(`⚠️ Failed compilations: ${failCount}`);
181
- }
182
- console.log('='.repeat(60));
183
-
184
- // Remove .sh files from distribution (keep only binaries)
185
- console.log('\n🗑️ Removing .sh files from distribution (keeping only binaries)...');
186
- const shFiles = fs.readdirSync(DIST_SHELL_DIR).filter(f => f.endsWith('.sh'));
187
- shFiles.forEach(shFile => {
188
- const filePath = path.join(DIST_SHELL_DIR, shFile);
189
- fs.unlinkSync(filePath);
190
- console.log(` ✓ Removed: ${shFile}`);
191
- });
192
-
193
- console.log('\n✅ Shell script protection complete!');
194
- console.log(`📁 Protected scripts in: ${DIST_SHELL_DIR}`);
195
- console.log(`🛡️ Only binary executables remain (${successCount} files)\n`);
196
- }
197
-
198
- // Run if called directly
199
- if (require.main === module) {
200
- try {
201
- compileAllScripts();
202
- } catch (error) {
203
- console.error('❌ Error during compilation:', error);
204
- process.exit(1);
205
- }
206
- }
207
-
208
- module.exports = { compileAllScripts, compileShellScript };
@@ -1,58 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Simple Shell Script Encryption
5
- * Uses centralized encryption config for consistency
6
- */
7
-
8
- const fs = require('fs');
9
- const path = require('path');
10
- const { encrypt } = require('../lib/encryption');
11
-
12
- // Encrypt a file
13
- function encryptFile(inputPath, outputPath) {
14
- const content = fs.readFileSync(inputPath, 'utf8');
15
- const encryptedData = encrypt(content);
16
-
17
- fs.writeFileSync(outputPath, encryptedData);
18
- console.log(` ✓ ${path.basename(inputPath)} → ${path.basename(outputPath)}`);
19
- }
20
-
21
- // Encrypt all shell scripts
22
- function encryptShellScripts(sourceDir, outputDir) {
23
- console.log('🔐 Encrypting shell scripts...\n');
24
-
25
- if (!fs.existsSync(outputDir)) {
26
- fs.mkdirSync(outputDir, { recursive: true });
27
- }
28
-
29
- const scripts = [
30
- 'android_device_control.sh',
31
- 'connect_android_usb_multi_final.sh',
32
- 'connect_android_wireless.sh',
33
- 'connect_android_wireless_multi_final.sh',
34
- 'connect_ios_usb_multi_final.sh',
35
- 'connect_ios_wireless_multi_final.sh',
36
- 'ios_device_control.sh'
37
- ];
38
-
39
- let encrypted = 0;
40
- scripts.forEach(script => {
41
- const srcPath = path.join(sourceDir, script);
42
- if (fs.existsSync(srcPath)) {
43
- const encPath = path.join(outputDir, script.replace('.sh', '.enc'));
44
- encryptFile(srcPath, encPath);
45
- encrypted++;
46
- }
47
- });
48
-
49
- console.log(`\n✅ Encrypted ${encrypted} shell scripts\n`);
50
- }
51
-
52
- module.exports = { encryptShellScripts };
53
-
54
- if (require.main === module) {
55
- const srcDir = path.join(__dirname, '../../');
56
- const outDir = path.join(__dirname, '../dist/scripts/shell');
57
- encryptShellScripts(srcDir, outDir);
58
- }
@@ -1,160 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Shell Script Obfuscator
5
- * Obfuscates shell scripts using base64 encoding and encryption
6
- * Cross-platform compatible
7
- */
8
-
9
- const fs = require('fs');
10
- const path = require('path');
11
- const crypto = require('crypto');
12
-
13
- // Generate a key from package info (consistent across installations)
14
- function generateKey() {
15
- const pkg = require('../package.json');
16
- return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
17
- }
18
-
19
- // Encrypt script content
20
- function encryptScript(content) {
21
- const key = generateKey();
22
- const iv = crypto.randomBytes(16);
23
- const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
24
-
25
- let encrypted = cipher.update(content, 'utf8', 'hex');
26
- encrypted += cipher.final('hex');
27
-
28
- return {
29
- iv: iv.toString('hex'),
30
- content: encrypted
31
- };
32
- }
33
-
34
- // Create wrapper script that decrypts and executes
35
- function createWrapper(scriptName, encrypted) {
36
- return `#!/bin/bash
37
- # Protected Shell Script - Devicely
38
- # This script is encrypted for code protection
39
-
40
- SCRIPT_DIR="$(cd "$(dirname "\${BASH_SOURCE[0]}")" && pwd)"
41
- NODE_BIN="node"
42
-
43
- # Check if node is available
44
- if ! command -v node &> /dev/null; then
45
- echo "Error: Node.js is required to run Devicely"
46
- exit 1
47
- fi
48
-
49
- # Decrypt and execute
50
- $NODE_BIN -e "
51
- const crypto = require('crypto');
52
- const pkg = require('$SCRIPT_DIR/../../package.json');
53
-
54
- function generateKey() {
55
- return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
56
- }
57
-
58
- function decrypt(iv, content) {
59
- const key = generateKey();
60
- const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
61
- let decrypted = decipher.update(content, 'hex', 'utf8');
62
- decrypted += decipher.final('utf8');
63
- return decrypted;
64
- }
65
-
66
- const encrypted = {
67
- iv: '${encrypted.iv}',
68
- content: '${encrypted.content}'
69
- };
70
-
71
- const script = decrypt(encrypted.iv, encrypted.content);
72
- const { spawn } = require('child_process');
73
-
74
- // Get arguments passed to this wrapper
75
- // When called as: node -e "..." -- arg1 arg2
76
- // process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
77
- // So we need slice(1) not slice(2)
78
- const args = process.argv.slice(1);
79
-
80
- // Create a temporary file for the decrypted script
81
- const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
82
- require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
83
-
84
- // Execute the decrypted script with arguments using spawn
85
- const child = spawn(tmpScript, args, {
86
- stdio: 'inherit',
87
- env: process.env
88
- });
89
-
90
- child.on('exit', (code) => {
91
- // Clean up temp file
92
- try { require('fs').unlinkSync(tmpScript); } catch(e) {}
93
- process.exit(code || 0);
94
- });
95
-
96
- child.on('error', (error) => {
97
- // Clean up temp file on error
98
- try { require('fs').unlinkSync(tmpScript); } catch(e) {}
99
- console.error('Error executing script:', error);
100
- process.exit(1);
101
- });
102
- "
103
- `;
104
- }
105
-
106
- // Obfuscate all shell scripts
107
- function obfuscateShellScripts(shellDir, outputDir) {
108
- console.log('🔐 Obfuscating shell scripts...');
109
-
110
- if (!fs.existsSync(shellDir)) {
111
- console.error('❌ Shell scripts directory not found');
112
- return;
113
- }
114
-
115
- if (!fs.existsSync(outputDir)) {
116
- fs.mkdirSync(outputDir, { recursive: true });
117
- }
118
-
119
- const shellScripts = fs.readdirSync(shellDir).filter(f => f.endsWith('.sh'));
120
-
121
- if (shellScripts.length === 0) {
122
- console.log('⚠️ No shell scripts found');
123
- return;
124
- }
125
-
126
- let processed = 0;
127
- shellScripts.forEach(script => {
128
- try {
129
- const scriptPath = path.join(shellDir, script);
130
- const content = fs.readFileSync(scriptPath, 'utf8');
131
-
132
- // Encrypt the script
133
- const encrypted = encryptScript(content);
134
-
135
- // Create wrapper script
136
- const wrapper = createWrapper(script, encrypted);
137
-
138
- // Write wrapper to output
139
- const outputPath = path.join(outputDir, script);
140
- fs.writeFileSync(outputPath, wrapper);
141
- fs.chmodSync(outputPath, 0o755);
142
-
143
- console.log(` ✓ ${script} → encrypted wrapper`);
144
- processed++;
145
- } catch (error) {
146
- console.error(` ❌ Failed to obfuscate ${script}:`, error.message);
147
- }
148
- });
149
-
150
- console.log(`✅ Obfuscated ${processed} shell scripts`);
151
- }
152
-
153
- module.exports = { obfuscateShellScripts };
154
-
155
- // Run if called directly
156
- if (require.main === module) {
157
- const shellSrc = path.join(__dirname, 'shell');
158
- const distShell = path.join(__dirname, '../dist/scripts/shell');
159
- obfuscateShellScripts(shellSrc, distShell);
160
- }