frida 16.2.1 → 16.2.3

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 (386) hide show
  1. package/BSDmakefile +6 -0
  2. package/Makefile +16 -0
  3. package/README.md +14 -11
  4. package/configure +18 -0
  5. package/configure.bat +22 -0
  6. package/dist/native.js +0 -8
  7. package/lib/application.ts +98 -0
  8. package/lib/authentication.ts +3 -0
  9. package/lib/build.py +50 -0
  10. package/lib/bus.ts +30 -0
  11. package/lib/cancellable.ts +33 -0
  12. package/lib/child.ts +15 -0
  13. package/lib/crash.ts +11 -0
  14. package/lib/device.ts +329 -0
  15. package/lib/device_manager.ts +69 -0
  16. package/lib/endpoint_parameters.ts +56 -0
  17. package/lib/icon.ts +15 -0
  18. package/lib/index.ts +311 -0
  19. package/lib/iostream.ts +78 -0
  20. package/lib/meson.build +53 -0
  21. package/lib/native.ts +9 -0
  22. package/lib/portal_membership.ts +10 -0
  23. package/lib/portal_service.ts +105 -0
  24. package/lib/process.ts +57 -0
  25. package/lib/relay.ts +44 -0
  26. package/lib/script.ts +352 -0
  27. package/lib/session.ts +113 -0
  28. package/lib/signals.ts +45 -0
  29. package/lib/socket_address.ts +35 -0
  30. package/lib/spawn.ts +4 -0
  31. package/lib/system_parameters.ts +78 -0
  32. package/make.bat +23 -0
  33. package/meson.build +160 -0
  34. package/meson.options +11 -0
  35. package/package.json +27 -6
  36. package/releng/deps.py +1133 -0
  37. package/releng/deps.toml +391 -0
  38. package/releng/devkit-assets/frida-core-example-unix.c +188 -0
  39. package/releng/devkit-assets/frida-core-example-windows.c +197 -0
  40. package/releng/devkit-assets/frida-core-example.sln +28 -0
  41. package/releng/devkit-assets/frida-core-example.vcxproj +157 -0
  42. package/releng/devkit-assets/frida-core-example.vcxproj.filters +27 -0
  43. package/releng/devkit-assets/frida-gum-example-unix.c +122 -0
  44. package/releng/devkit-assets/frida-gum-example-windows.c +132 -0
  45. package/releng/devkit-assets/frida-gum-example.sln +28 -0
  46. package/releng/devkit-assets/frida-gum-example.vcxproj +157 -0
  47. package/releng/devkit-assets/frida-gum-example.vcxproj.filters +27 -0
  48. package/releng/devkit-assets/frida-gumjs-example-unix.c +84 -0
  49. package/releng/devkit-assets/frida-gumjs-example-windows.c +91 -0
  50. package/releng/devkit-assets/frida-gumjs-example.sln +28 -0
  51. package/releng/devkit-assets/frida-gumjs-example.vcxproj +157 -0
  52. package/releng/devkit-assets/frida-gumjs-example.vcxproj.filters +27 -0
  53. package/releng/devkit.py +535 -0
  54. package/releng/env.py +420 -0
  55. package/releng/env_android.py +150 -0
  56. package/releng/env_apple.py +176 -0
  57. package/releng/env_generic.py +373 -0
  58. package/releng/frida_version.py +69 -0
  59. package/releng/machine_file.py +44 -0
  60. package/releng/machine_spec.py +290 -0
  61. package/releng/meson/meson.py +27 -0
  62. package/releng/meson/mesonbuild/__init__.py +0 -0
  63. package/releng/meson/mesonbuild/_pathlib.py +63 -0
  64. package/releng/meson/mesonbuild/_typing.py +69 -0
  65. package/releng/meson/mesonbuild/arglist.py +321 -0
  66. package/releng/meson/mesonbuild/ast/__init__.py +23 -0
  67. package/releng/meson/mesonbuild/ast/interpreter.py +441 -0
  68. package/releng/meson/mesonbuild/ast/introspection.py +374 -0
  69. package/releng/meson/mesonbuild/ast/postprocess.py +109 -0
  70. package/releng/meson/mesonbuild/ast/printer.py +620 -0
  71. package/releng/meson/mesonbuild/ast/visitor.py +161 -0
  72. package/releng/meson/mesonbuild/backend/__init__.py +0 -0
  73. package/releng/meson/mesonbuild/backend/backends.py +2047 -0
  74. package/releng/meson/mesonbuild/backend/ninjabackend.py +3808 -0
  75. package/releng/meson/mesonbuild/backend/nonebackend.py +26 -0
  76. package/releng/meson/mesonbuild/backend/vs2010backend.py +2078 -0
  77. package/releng/meson/mesonbuild/backend/vs2012backend.py +35 -0
  78. package/releng/meson/mesonbuild/backend/vs2013backend.py +34 -0
  79. package/releng/meson/mesonbuild/backend/vs2015backend.py +35 -0
  80. package/releng/meson/mesonbuild/backend/vs2017backend.py +59 -0
  81. package/releng/meson/mesonbuild/backend/vs2019backend.py +54 -0
  82. package/releng/meson/mesonbuild/backend/vs2022backend.py +54 -0
  83. package/releng/meson/mesonbuild/backend/xcodebackend.py +1781 -0
  84. package/releng/meson/mesonbuild/build.py +3249 -0
  85. package/releng/meson/mesonbuild/cargo/__init__.py +5 -0
  86. package/releng/meson/mesonbuild/cargo/builder.py +238 -0
  87. package/releng/meson/mesonbuild/cargo/cfg.py +274 -0
  88. package/releng/meson/mesonbuild/cargo/interpreter.py +733 -0
  89. package/releng/meson/mesonbuild/cargo/manifest.py +227 -0
  90. package/releng/meson/mesonbuild/cargo/version.py +95 -0
  91. package/releng/meson/mesonbuild/cmake/__init__.py +28 -0
  92. package/releng/meson/mesonbuild/cmake/common.py +331 -0
  93. package/releng/meson/mesonbuild/cmake/data/__init__.py +0 -0
  94. package/releng/meson/mesonbuild/cmake/data/preload.cmake +82 -0
  95. package/releng/meson/mesonbuild/cmake/executor.py +241 -0
  96. package/releng/meson/mesonbuild/cmake/fileapi.py +324 -0
  97. package/releng/meson/mesonbuild/cmake/generator.py +186 -0
  98. package/releng/meson/mesonbuild/cmake/interpreter.py +1267 -0
  99. package/releng/meson/mesonbuild/cmake/toolchain.py +248 -0
  100. package/releng/meson/mesonbuild/cmake/traceparser.py +814 -0
  101. package/releng/meson/mesonbuild/cmake/tracetargets.py +161 -0
  102. package/releng/meson/mesonbuild/compilers/__init__.py +86 -0
  103. package/releng/meson/mesonbuild/compilers/asm.py +307 -0
  104. package/releng/meson/mesonbuild/compilers/c.py +788 -0
  105. package/releng/meson/mesonbuild/compilers/c_function_attributes.py +143 -0
  106. package/releng/meson/mesonbuild/compilers/compilers.py +1388 -0
  107. package/releng/meson/mesonbuild/compilers/cpp.py +1035 -0
  108. package/releng/meson/mesonbuild/compilers/cs.py +136 -0
  109. package/releng/meson/mesonbuild/compilers/cuda.py +806 -0
  110. package/releng/meson/mesonbuild/compilers/cython.py +91 -0
  111. package/releng/meson/mesonbuild/compilers/d.py +861 -0
  112. package/releng/meson/mesonbuild/compilers/detect.py +1396 -0
  113. package/releng/meson/mesonbuild/compilers/fortran.py +523 -0
  114. package/releng/meson/mesonbuild/compilers/java.py +113 -0
  115. package/releng/meson/mesonbuild/compilers/mixins/__init__.py +0 -0
  116. package/releng/meson/mesonbuild/compilers/mixins/arm.py +167 -0
  117. package/releng/meson/mesonbuild/compilers/mixins/ccrx.py +113 -0
  118. package/releng/meson/mesonbuild/compilers/mixins/clang.py +170 -0
  119. package/releng/meson/mesonbuild/compilers/mixins/clike.py +1330 -0
  120. package/releng/meson/mesonbuild/compilers/mixins/compcert.py +117 -0
  121. package/releng/meson/mesonbuild/compilers/mixins/elbrus.py +93 -0
  122. package/releng/meson/mesonbuild/compilers/mixins/emscripten.py +89 -0
  123. package/releng/meson/mesonbuild/compilers/mixins/gnu.py +629 -0
  124. package/releng/meson/mesonbuild/compilers/mixins/intel.py +167 -0
  125. package/releng/meson/mesonbuild/compilers/mixins/islinker.py +120 -0
  126. package/releng/meson/mesonbuild/compilers/mixins/metrowerks.py +279 -0
  127. package/releng/meson/mesonbuild/compilers/mixins/pgi.py +88 -0
  128. package/releng/meson/mesonbuild/compilers/mixins/ti.py +130 -0
  129. package/releng/meson/mesonbuild/compilers/mixins/visualstudio.py +458 -0
  130. package/releng/meson/mesonbuild/compilers/mixins/xc16.py +111 -0
  131. package/releng/meson/mesonbuild/compilers/objc.py +120 -0
  132. package/releng/meson/mesonbuild/compilers/objcpp.py +102 -0
  133. package/releng/meson/mesonbuild/compilers/rust.py +230 -0
  134. package/releng/meson/mesonbuild/compilers/swift.py +131 -0
  135. package/releng/meson/mesonbuild/compilers/vala.py +121 -0
  136. package/releng/meson/mesonbuild/coredata.py +1532 -0
  137. package/releng/meson/mesonbuild/dependencies/__init__.py +252 -0
  138. package/releng/meson/mesonbuild/dependencies/base.py +663 -0
  139. package/releng/meson/mesonbuild/dependencies/boost.py +1083 -0
  140. package/releng/meson/mesonbuild/dependencies/cmake.py +656 -0
  141. package/releng/meson/mesonbuild/dependencies/coarrays.py +80 -0
  142. package/releng/meson/mesonbuild/dependencies/configtool.py +163 -0
  143. package/releng/meson/mesonbuild/dependencies/cuda.py +295 -0
  144. package/releng/meson/mesonbuild/dependencies/data/CMakeLists.txt +102 -0
  145. package/releng/meson/mesonbuild/dependencies/data/CMakeListsLLVM.txt +204 -0
  146. package/releng/meson/mesonbuild/dependencies/data/CMakePathInfo.txt +31 -0
  147. package/releng/meson/mesonbuild/dependencies/data/__init__.py +0 -0
  148. package/releng/meson/mesonbuild/dependencies/detect.py +225 -0
  149. package/releng/meson/mesonbuild/dependencies/dev.py +707 -0
  150. package/releng/meson/mesonbuild/dependencies/dub.py +424 -0
  151. package/releng/meson/mesonbuild/dependencies/factory.py +146 -0
  152. package/releng/meson/mesonbuild/dependencies/framework.py +111 -0
  153. package/releng/meson/mesonbuild/dependencies/hdf5.py +168 -0
  154. package/releng/meson/mesonbuild/dependencies/misc.py +618 -0
  155. package/releng/meson/mesonbuild/dependencies/mpi.py +231 -0
  156. package/releng/meson/mesonbuild/dependencies/pkgconfig.py +570 -0
  157. package/releng/meson/mesonbuild/dependencies/platform.py +52 -0
  158. package/releng/meson/mesonbuild/dependencies/python.py +431 -0
  159. package/releng/meson/mesonbuild/dependencies/qt.py +484 -0
  160. package/releng/meson/mesonbuild/dependencies/scalapack.py +142 -0
  161. package/releng/meson/mesonbuild/dependencies/ui.py +281 -0
  162. package/releng/meson/mesonbuild/depfile.py +82 -0
  163. package/releng/meson/mesonbuild/envconfig.py +480 -0
  164. package/releng/meson/mesonbuild/environment.py +987 -0
  165. package/releng/meson/mesonbuild/interpreter/__init__.py +47 -0
  166. package/releng/meson/mesonbuild/interpreter/compiler.py +900 -0
  167. package/releng/meson/mesonbuild/interpreter/dependencyfallbacks.py +386 -0
  168. package/releng/meson/mesonbuild/interpreter/interpreter.py +3595 -0
  169. package/releng/meson/mesonbuild/interpreter/interpreterobjects.py +1096 -0
  170. package/releng/meson/mesonbuild/interpreter/kwargs.py +479 -0
  171. package/releng/meson/mesonbuild/interpreter/mesonmain.py +487 -0
  172. package/releng/meson/mesonbuild/interpreter/primitives/__init__.py +29 -0
  173. package/releng/meson/mesonbuild/interpreter/primitives/array.py +108 -0
  174. package/releng/meson/mesonbuild/interpreter/primitives/boolean.py +52 -0
  175. package/releng/meson/mesonbuild/interpreter/primitives/dict.py +88 -0
  176. package/releng/meson/mesonbuild/interpreter/primitives/integer.py +86 -0
  177. package/releng/meson/mesonbuild/interpreter/primitives/range.py +38 -0
  178. package/releng/meson/mesonbuild/interpreter/primitives/string.py +247 -0
  179. package/releng/meson/mesonbuild/interpreter/type_checking.py +853 -0
  180. package/releng/meson/mesonbuild/interpreterbase/__init__.py +126 -0
  181. package/releng/meson/mesonbuild/interpreterbase/_unholder.py +25 -0
  182. package/releng/meson/mesonbuild/interpreterbase/baseobjects.py +174 -0
  183. package/releng/meson/mesonbuild/interpreterbase/decorators.py +806 -0
  184. package/releng/meson/mesonbuild/interpreterbase/disabler.py +35 -0
  185. package/releng/meson/mesonbuild/interpreterbase/exceptions.py +22 -0
  186. package/releng/meson/mesonbuild/interpreterbase/helpers.py +67 -0
  187. package/releng/meson/mesonbuild/interpreterbase/interpreterbase.py +665 -0
  188. package/releng/meson/mesonbuild/interpreterbase/operator.py +32 -0
  189. package/releng/meson/mesonbuild/linkers/__init__.py +20 -0
  190. package/releng/meson/mesonbuild/linkers/base.py +39 -0
  191. package/releng/meson/mesonbuild/linkers/detect.py +229 -0
  192. package/releng/meson/mesonbuild/linkers/linkers.py +1614 -0
  193. package/releng/meson/mesonbuild/mcompile.py +380 -0
  194. package/releng/meson/mesonbuild/mconf.py +368 -0
  195. package/releng/meson/mesonbuild/mdevenv.py +234 -0
  196. package/releng/meson/mesonbuild/mdist.py +376 -0
  197. package/releng/meson/mesonbuild/mesondata.py +38 -0
  198. package/releng/meson/mesonbuild/mesonlib.py +23 -0
  199. package/releng/meson/mesonbuild/mesonmain.py +289 -0
  200. package/releng/meson/mesonbuild/minit.py +204 -0
  201. package/releng/meson/mesonbuild/minstall.py +864 -0
  202. package/releng/meson/mesonbuild/mintro.py +667 -0
  203. package/releng/meson/mesonbuild/mlog.py +542 -0
  204. package/releng/meson/mesonbuild/modules/__init__.py +270 -0
  205. package/releng/meson/mesonbuild/modules/cmake.py +442 -0
  206. package/releng/meson/mesonbuild/modules/cuda.py +377 -0
  207. package/releng/meson/mesonbuild/modules/dlang.py +117 -0
  208. package/releng/meson/mesonbuild/modules/external_project.py +306 -0
  209. package/releng/meson/mesonbuild/modules/fs.py +323 -0
  210. package/releng/meson/mesonbuild/modules/gnome.py +2215 -0
  211. package/releng/meson/mesonbuild/modules/hotdoc.py +487 -0
  212. package/releng/meson/mesonbuild/modules/i18n.py +405 -0
  213. package/releng/meson/mesonbuild/modules/icestorm.py +123 -0
  214. package/releng/meson/mesonbuild/modules/java.py +112 -0
  215. package/releng/meson/mesonbuild/modules/keyval.py +65 -0
  216. package/releng/meson/mesonbuild/modules/modtest.py +33 -0
  217. package/releng/meson/mesonbuild/modules/pkgconfig.py +744 -0
  218. package/releng/meson/mesonbuild/modules/python.py +556 -0
  219. package/releng/meson/mesonbuild/modules/python3.py +85 -0
  220. package/releng/meson/mesonbuild/modules/qt.py +621 -0
  221. package/releng/meson/mesonbuild/modules/qt4.py +23 -0
  222. package/releng/meson/mesonbuild/modules/qt5.py +23 -0
  223. package/releng/meson/mesonbuild/modules/qt6.py +22 -0
  224. package/releng/meson/mesonbuild/modules/rust.py +355 -0
  225. package/releng/meson/mesonbuild/modules/simd.py +114 -0
  226. package/releng/meson/mesonbuild/modules/sourceset.py +291 -0
  227. package/releng/meson/mesonbuild/modules/wayland.py +151 -0
  228. package/releng/meson/mesonbuild/modules/windows.py +207 -0
  229. package/releng/meson/mesonbuild/mparser.py +1114 -0
  230. package/releng/meson/mesonbuild/msetup.py +365 -0
  231. package/releng/meson/mesonbuild/msubprojects.py +764 -0
  232. package/releng/meson/mesonbuild/mtest.py +2201 -0
  233. package/releng/meson/mesonbuild/munstable_coredata.py +107 -0
  234. package/releng/meson/mesonbuild/optinterpreter.py +276 -0
  235. package/releng/meson/mesonbuild/programs.py +367 -0
  236. package/releng/meson/mesonbuild/rewriter.py +1075 -0
  237. package/releng/meson/mesonbuild/scripts/__init__.py +10 -0
  238. package/releng/meson/mesonbuild/scripts/clangformat.py +55 -0
  239. package/releng/meson/mesonbuild/scripts/clangtidy.py +30 -0
  240. package/releng/meson/mesonbuild/scripts/cleantrees.py +35 -0
  241. package/releng/meson/mesonbuild/scripts/cmake_run_ctgt.py +103 -0
  242. package/releng/meson/mesonbuild/scripts/cmd_or_ps.ps1 +17 -0
  243. package/releng/meson/mesonbuild/scripts/copy.py +19 -0
  244. package/releng/meson/mesonbuild/scripts/coverage.py +214 -0
  245. package/releng/meson/mesonbuild/scripts/delwithsuffix.py +27 -0
  246. package/releng/meson/mesonbuild/scripts/depfixer.py +495 -0
  247. package/releng/meson/mesonbuild/scripts/depscan.py +198 -0
  248. package/releng/meson/mesonbuild/scripts/dirchanger.py +20 -0
  249. package/releng/meson/mesonbuild/scripts/env2mfile.py +402 -0
  250. package/releng/meson/mesonbuild/scripts/externalproject.py +106 -0
  251. package/releng/meson/mesonbuild/scripts/gettext.py +86 -0
  252. package/releng/meson/mesonbuild/scripts/gtkdochelper.py +286 -0
  253. package/releng/meson/mesonbuild/scripts/hotdochelper.py +40 -0
  254. package/releng/meson/mesonbuild/scripts/itstool.py +77 -0
  255. package/releng/meson/mesonbuild/scripts/meson_exe.py +115 -0
  256. package/releng/meson/mesonbuild/scripts/msgfmthelper.py +29 -0
  257. package/releng/meson/mesonbuild/scripts/pycompile.py +54 -0
  258. package/releng/meson/mesonbuild/scripts/python_info.py +121 -0
  259. package/releng/meson/mesonbuild/scripts/regen_checker.py +55 -0
  260. package/releng/meson/mesonbuild/scripts/run_tool.py +58 -0
  261. package/releng/meson/mesonbuild/scripts/scanbuild.py +57 -0
  262. package/releng/meson/mesonbuild/scripts/symbolextractor.py +322 -0
  263. package/releng/meson/mesonbuild/scripts/tags.py +44 -0
  264. package/releng/meson/mesonbuild/scripts/test_loaded_modules.py +14 -0
  265. package/releng/meson/mesonbuild/scripts/uninstall.py +41 -0
  266. package/releng/meson/mesonbuild/scripts/vcstagger.py +35 -0
  267. package/releng/meson/mesonbuild/scripts/yasm.py +24 -0
  268. package/releng/meson/mesonbuild/templates/__init__.py +0 -0
  269. package/releng/meson/mesonbuild/templates/cpptemplates.py +143 -0
  270. package/releng/meson/mesonbuild/templates/cstemplates.py +90 -0
  271. package/releng/meson/mesonbuild/templates/ctemplates.py +126 -0
  272. package/releng/meson/mesonbuild/templates/cudatemplates.py +143 -0
  273. package/releng/meson/mesonbuild/templates/dlangtemplates.py +109 -0
  274. package/releng/meson/mesonbuild/templates/fortrantemplates.py +101 -0
  275. package/releng/meson/mesonbuild/templates/javatemplates.py +94 -0
  276. package/releng/meson/mesonbuild/templates/mesontemplates.py +70 -0
  277. package/releng/meson/mesonbuild/templates/objcpptemplates.py +126 -0
  278. package/releng/meson/mesonbuild/templates/objctemplates.py +126 -0
  279. package/releng/meson/mesonbuild/templates/rusttemplates.py +79 -0
  280. package/releng/meson/mesonbuild/templates/samplefactory.py +41 -0
  281. package/releng/meson/mesonbuild/templates/sampleimpl.py +160 -0
  282. package/releng/meson/mesonbuild/templates/valatemplates.py +82 -0
  283. package/releng/meson/mesonbuild/utils/__init__.py +0 -0
  284. package/releng/meson/mesonbuild/utils/core.py +166 -0
  285. package/releng/meson/mesonbuild/utils/platform.py +27 -0
  286. package/releng/meson/mesonbuild/utils/posix.py +32 -0
  287. package/releng/meson/mesonbuild/utils/universal.py +2445 -0
  288. package/releng/meson/mesonbuild/utils/vsenv.py +126 -0
  289. package/releng/meson/mesonbuild/utils/win32.py +29 -0
  290. package/releng/meson/mesonbuild/wrap/__init__.py +59 -0
  291. package/releng/meson/mesonbuild/wrap/wrap.py +846 -0
  292. package/releng/meson/mesonbuild/wrap/wraptool.py +198 -0
  293. package/releng/meson-scripts/BSDmakefile +6 -0
  294. package/releng/meson-scripts/Makefile +16 -0
  295. package/releng/meson-scripts/configure +18 -0
  296. package/releng/meson-scripts/configure.bat +22 -0
  297. package/releng/meson-scripts/make.bat +23 -0
  298. package/releng/meson_configure.py +506 -0
  299. package/releng/meson_make.py +131 -0
  300. package/releng/mkdevkit.py +107 -0
  301. package/releng/mkfatmacho.py +54 -0
  302. package/releng/post-process-oabi.py +97 -0
  303. package/releng/progress.py +14 -0
  304. package/releng/sync-from-upstream.py +185 -0
  305. package/releng/tomlkit/tomlkit/__init__.py +59 -0
  306. package/releng/tomlkit/tomlkit/_compat.py +22 -0
  307. package/releng/tomlkit/tomlkit/_types.py +83 -0
  308. package/releng/tomlkit/tomlkit/_utils.py +158 -0
  309. package/releng/tomlkit/tomlkit/api.py +308 -0
  310. package/releng/tomlkit/tomlkit/container.py +875 -0
  311. package/releng/tomlkit/tomlkit/exceptions.py +227 -0
  312. package/releng/tomlkit/tomlkit/items.py +1967 -0
  313. package/releng/tomlkit/tomlkit/parser.py +1141 -0
  314. package/releng/tomlkit/tomlkit/py.typed +0 -0
  315. package/releng/tomlkit/tomlkit/source.py +180 -0
  316. package/releng/tomlkit/tomlkit/toml_char.py +52 -0
  317. package/releng/tomlkit/tomlkit/toml_document.py +7 -0
  318. package/releng/tomlkit/tomlkit/toml_file.py +58 -0
  319. package/releng/winenv.py +140 -0
  320. package/scripts/adjust-version.py +19 -0
  321. package/scripts/detect-version.py +40 -0
  322. package/scripts/fetch-abi-bits.py +343 -0
  323. package/scripts/install.js +23 -0
  324. package/scripts/package.py +15 -0
  325. package/src/addon.cc +76 -0
  326. package/src/application.cc +148 -0
  327. package/src/application.h +31 -0
  328. package/src/authentication.cc +174 -0
  329. package/src/authentication.h +24 -0
  330. package/src/bus.cc +167 -0
  331. package/src/bus.h +33 -0
  332. package/src/cancellable.cc +117 -0
  333. package/src/cancellable.h +31 -0
  334. package/src/child.cc +150 -0
  335. package/src/child.h +32 -0
  336. package/src/crash.cc +122 -0
  337. package/src/crash.h +30 -0
  338. package/src/device.cc +1302 -0
  339. package/src/device.h +55 -0
  340. package/src/device_manager.cc +362 -0
  341. package/src/device_manager.h +35 -0
  342. package/src/endpoint_parameters.cc +171 -0
  343. package/src/endpoint_parameters.h +28 -0
  344. package/src/glib_context.cc +62 -0
  345. package/src/glib_context.h +29 -0
  346. package/src/glib_object.cc +25 -0
  347. package/src/glib_object.h +37 -0
  348. package/src/iostream.cc +247 -0
  349. package/src/iostream.h +30 -0
  350. package/src/meson.build +26 -0
  351. package/src/operation.h +94 -0
  352. package/src/portal_membership.cc +100 -0
  353. package/src/portal_membership.h +26 -0
  354. package/src/portal_service.cc +401 -0
  355. package/src/portal_service.h +40 -0
  356. package/src/process.cc +135 -0
  357. package/src/process.h +30 -0
  358. package/src/relay.cc +139 -0
  359. package/src/relay.h +31 -0
  360. package/src/runtime.cc +443 -0
  361. package/src/runtime.h +64 -0
  362. package/src/script.cc +301 -0
  363. package/src/script.h +36 -0
  364. package/src/session.cc +860 -0
  365. package/src/session.h +42 -0
  366. package/src/signals.cc +334 -0
  367. package/src/signals.h +47 -0
  368. package/src/spawn.cc +95 -0
  369. package/src/spawn.h +27 -0
  370. package/src/usage_monitor.h +117 -0
  371. package/src/uv_context.cc +118 -0
  372. package/src/uv_context.h +40 -0
  373. package/src/win_delay_load_hook.cc +63 -0
  374. package/subprojects/frida-core.wrap +8 -0
  375. package/subprojects/nan.wrap +9 -0
  376. package/subprojects/packagefiles/nan.patch +13 -0
  377. package/test/data/index.ts +13 -0
  378. package/test/data/unixvictim-linux-x86 +0 -0
  379. package/test/data/unixvictim-linux-x86_64 +0 -0
  380. package/test/data/unixvictim-macos +0 -0
  381. package/test/device.ts +27 -0
  382. package/test/device_manager.ts +16 -0
  383. package/test/labrat.ts +32 -0
  384. package/test/script.ts +176 -0
  385. package/test/session.ts +73 -0
  386. package/tsconfig.json +18 -0
package/src/session.cc ADDED
@@ -0,0 +1,860 @@
1
+ #include "session.h"
2
+
3
+ #include "crash.h"
4
+ #include "operation.h"
5
+ #include "portal_membership.h"
6
+ #include "relay.h"
7
+ #include "script.h"
8
+ #include "signals.h"
9
+ #include "usage_monitor.h"
10
+
11
+ #include <cstring>
12
+
13
+ #define SESSION_DATA_CONSTRUCTOR "session:ctor"
14
+
15
+ using std::strcmp;
16
+ using v8::Array;
17
+ using v8::DEFAULT;
18
+ using v8::External;
19
+ using v8::Function;
20
+ using v8::Isolate;
21
+ using v8::Local;
22
+ using v8::Object;
23
+ using v8::Persistent;
24
+ using v8::ReadOnly;
25
+ using v8::String;
26
+ using v8::Uint32;
27
+ using v8::Value;
28
+
29
+ namespace frida {
30
+
31
+ static FridaScriptOptions* ParseScriptOptions(Local<Value> name_value,
32
+ Local<Value> snapshot_value, Local<Value> runtime_value);
33
+ static FridaSnapshotOptions* ParseSnapshotOptions(
34
+ Local<Value> warmup_script_value, Local<Value> runtime_value);
35
+ static void UnrefGBytes(char* data, void* hint);
36
+
37
+ Session::Session(FridaSession* handle, Runtime* runtime)
38
+ : GLibObject(handle, runtime) {
39
+ g_object_ref(handle_);
40
+ }
41
+
42
+ Session::~Session() {
43
+ frida_unref(handle_);
44
+ }
45
+
46
+ void Session::Init(Local<Object> exports, Runtime* runtime) {
47
+ auto isolate = Isolate::GetCurrent();
48
+
49
+ auto name = Nan::New("Session").ToLocalChecked();
50
+ auto tpl = CreateTemplate(name, Session::New, runtime);
51
+
52
+ auto instance_tpl = tpl->InstanceTemplate();
53
+ auto data = Local<Value>();
54
+ Nan::SetAccessor(instance_tpl, Nan::New("isDetached").ToLocalChecked(),
55
+ IsDetached, 0, data, DEFAULT, ReadOnly);
56
+ Nan::SetAccessor(instance_tpl, Nan::New("persistTimeout").ToLocalChecked(),
57
+ GetPersistTimeout, 0, data, DEFAULT, ReadOnly);
58
+ Nan::SetAccessor(instance_tpl, Nan::New("pid").ToLocalChecked(), GetPid, 0,
59
+ data, DEFAULT, ReadOnly);
60
+
61
+ Nan::SetPrototypeMethod(tpl, "detach", Detach);
62
+ Nan::SetPrototypeMethod(tpl, "resume", Resume);
63
+ Nan::SetPrototypeMethod(tpl, "enableChildGating", EnableChildGating);
64
+ Nan::SetPrototypeMethod(tpl, "disableChildGating", DisableChildGating);
65
+ Nan::SetPrototypeMethod(tpl, "createScript", CreateScript);
66
+ Nan::SetPrototypeMethod(tpl, "createScriptFromBytes", CreateScriptFromBytes);
67
+ Nan::SetPrototypeMethod(tpl, "compileScript", CompileScript);
68
+ Nan::SetPrototypeMethod(tpl, "snapshotScript", SnapshotScript);
69
+ Nan::SetPrototypeMethod(tpl, "setupPeerConnection", SetupPeerConnection);
70
+ Nan::SetPrototypeMethod(tpl, "joinPortal", JoinPortal);
71
+
72
+ auto ctor = Nan::GetFunction(tpl).ToLocalChecked();
73
+ Nan::Set(exports, name, ctor);
74
+ runtime->SetDataPointer(SESSION_DATA_CONSTRUCTOR,
75
+ new Persistent<Function>(isolate, ctor));
76
+ }
77
+
78
+ Local<Object> Session::New(gpointer handle, Runtime* runtime) {
79
+ auto ctor = Nan::New<Function>(
80
+ *static_cast<Persistent<Function>*>(
81
+ runtime->GetDataPointer(SESSION_DATA_CONSTRUCTOR)));
82
+ const int argc = 1;
83
+ Local<Value> argv[argc] = { Nan::New<External>(handle) };
84
+ return Nan::NewInstance(ctor, argc, argv).ToLocalChecked();
85
+ }
86
+
87
+ NAN_METHOD(Session::New) {
88
+ if (!info.IsConstructCall()) {
89
+ Nan::ThrowError("Use the `new` keyword to create a new instance");
90
+ return;
91
+ }
92
+
93
+ if (info.Length() != 1 || !info[0]->IsExternal()) {
94
+ Nan::ThrowTypeError("Bad argument, expected raw handle");
95
+ return;
96
+ }
97
+
98
+ auto runtime = GetRuntimeFromConstructorArgs(info);
99
+
100
+ auto handle = static_cast<FridaSession*>(
101
+ Local<External>::Cast(info[0])->Value());
102
+ auto wrapper = new Session(handle, runtime);
103
+ auto obj = info.This();
104
+ wrapper->Wrap(obj);
105
+ Nan::Set(obj, Nan::New("signals").ToLocalChecked(),
106
+ Signals::New(handle, runtime, TransformSignal, runtime));
107
+
108
+ info.GetReturnValue().Set(obj);
109
+ }
110
+
111
+ NAN_PROPERTY_GETTER(Session::GetPid) {
112
+ auto handle = ObjectWrap::Unwrap<Session>(
113
+ info.Holder())->GetHandle<FridaSession>();
114
+
115
+ info.GetReturnValue().Set(Nan::New<Uint32>(
116
+ frida_session_get_pid(handle)));
117
+ }
118
+
119
+ NAN_PROPERTY_GETTER(Session::GetPersistTimeout) {
120
+ auto handle = ObjectWrap::Unwrap<Session>(
121
+ info.Holder())->GetHandle<FridaSession>();
122
+
123
+ info.GetReturnValue().Set(Nan::New<Uint32>(
124
+ frida_session_get_persist_timeout(handle)));
125
+ }
126
+
127
+ NAN_PROPERTY_GETTER(Session::IsDetached) {
128
+ auto handle = ObjectWrap::Unwrap<Session>(
129
+ info.Holder())->GetHandle<FridaSession>();
130
+
131
+ info.GetReturnValue().Set(
132
+ Nan::New(static_cast<bool>(frida_session_is_detached(handle))));
133
+ }
134
+
135
+ namespace {
136
+
137
+ class DetachOperation : public Operation<FridaSession> {
138
+ protected:
139
+ void Begin() {
140
+ frida_session_detach(handle_, cancellable_, OnReady, this);
141
+ }
142
+
143
+ void End(GAsyncResult* result, GError** error) {
144
+ frida_session_detach_finish(handle_, result, error);
145
+ }
146
+
147
+ Local<Value> Result(Isolate* isolate) {
148
+ return Nan::Undefined();
149
+ }
150
+ };
151
+
152
+ }
153
+
154
+ NAN_METHOD(Session::Detach) {
155
+ auto isolate = info.GetIsolate();
156
+ auto wrapper = ObjectWrap::Unwrap<Session>(info.Holder());
157
+
158
+ auto operation = new DetachOperation();
159
+ operation->Schedule(isolate, wrapper, info);
160
+
161
+ info.GetReturnValue().Set(operation->GetPromise(isolate));
162
+ }
163
+
164
+ namespace {
165
+
166
+ class ResumeOperation : public Operation<FridaSession> {
167
+ protected:
168
+ void Begin() {
169
+ frida_session_resume(handle_, cancellable_, OnReady, this);
170
+ }
171
+
172
+ void End(GAsyncResult* result, GError** error) {
173
+ frida_session_resume_finish(handle_, result, error);
174
+ }
175
+
176
+ Local<Value> Result(Isolate* isolate) {
177
+ return Nan::Undefined();
178
+ }
179
+ };
180
+
181
+ }
182
+
183
+ NAN_METHOD(Session::Resume) {
184
+ auto isolate = info.GetIsolate();
185
+ auto wrapper = ObjectWrap::Unwrap<Session>(info.Holder());
186
+
187
+ auto operation = new ResumeOperation();
188
+ operation->Schedule(isolate, wrapper, info);
189
+
190
+ info.GetReturnValue().Set(operation->GetPromise(isolate));
191
+ }
192
+
193
+ namespace {
194
+
195
+ class EnableChildGatingOperation : public Operation<FridaSession> {
196
+ protected:
197
+ void Begin() {
198
+ frida_session_enable_child_gating(handle_, cancellable_, OnReady, this);
199
+ }
200
+
201
+ void End(GAsyncResult* result, GError** error) {
202
+ frida_session_enable_child_gating_finish(handle_, result, error);
203
+ }
204
+
205
+ Local<Value> Result(Isolate* isolate) {
206
+ return Nan::Undefined();
207
+ }
208
+ };
209
+
210
+ }
211
+
212
+ NAN_METHOD(Session::EnableChildGating) {
213
+ auto isolate = info.GetIsolate();
214
+ auto wrapper = ObjectWrap::Unwrap<Session>(info.Holder());
215
+
216
+ auto operation = new EnableChildGatingOperation();
217
+ operation->Schedule(isolate, wrapper, info);
218
+
219
+ info.GetReturnValue().Set(operation->GetPromise(isolate));
220
+ }
221
+
222
+ namespace {
223
+
224
+ class DisableChildGatingOperation : public Operation<FridaSession> {
225
+ protected:
226
+ void Begin() {
227
+ frida_session_disable_child_gating(handle_, cancellable_, OnReady, this);
228
+ }
229
+
230
+ void End(GAsyncResult* result, GError** error) {
231
+ frida_session_disable_child_gating_finish(handle_, result, error);
232
+ }
233
+
234
+ Local<Value> Result(Isolate* isolate) {
235
+ return Nan::Undefined();
236
+ }
237
+ };
238
+
239
+ }
240
+
241
+ NAN_METHOD(Session::DisableChildGating) {
242
+ auto isolate = info.GetIsolate();
243
+ auto wrapper = ObjectWrap::Unwrap<Session>(info.Holder());
244
+
245
+ auto operation = new DisableChildGatingOperation();
246
+ operation->Schedule(isolate, wrapper, info);
247
+
248
+ info.GetReturnValue().Set(operation->GetPromise(isolate));
249
+ }
250
+
251
+ namespace {
252
+
253
+ class CreateScriptOperation : public Operation<FridaSession> {
254
+ public:
255
+ CreateScriptOperation(gchar* source, FridaScriptOptions* options)
256
+ : source_(source),
257
+ options_(options) {
258
+ }
259
+
260
+ ~CreateScriptOperation() {
261
+ g_object_unref(options_);
262
+ g_free(source_);
263
+ }
264
+
265
+ protected:
266
+ void Begin() {
267
+ frida_session_create_script(handle_, source_, options_, cancellable_,
268
+ OnReady, this);
269
+ }
270
+
271
+ void End(GAsyncResult* result, GError** error) {
272
+ script_ = frida_session_create_script_finish(handle_, result, error);
273
+ }
274
+
275
+ Local<Value> Result(Isolate* isolate) {
276
+ auto wrapper = Script::New(script_, runtime_);
277
+ g_object_unref(script_);
278
+ return wrapper;
279
+ }
280
+
281
+ private:
282
+ gchar* source_;
283
+ FridaScriptOptions* options_;
284
+ FridaScript* script_;
285
+ };
286
+
287
+ }
288
+
289
+
290
+ NAN_METHOD(Session::CreateScript) {
291
+ auto isolate = info.GetIsolate();
292
+ auto wrapper = ObjectWrap::Unwrap<Session>(info.Holder());
293
+
294
+ if (info.Length() < 4) {
295
+ Nan::ThrowTypeError("Missing one or more arguments");
296
+ return;
297
+ }
298
+
299
+ auto source_value = info[0];
300
+ auto name_value = info[1];
301
+ auto snapshot_value = info[2];
302
+ auto runtime_value = info[3];
303
+
304
+ bool valid = true;
305
+
306
+ gchar* source;
307
+ Nan::Utf8String val(source_value);
308
+ source = g_strdup(*val);
309
+ if (source == NULL) {
310
+ Nan::ThrowTypeError("Bad argument, 'source' must be a string");
311
+ valid = false;
312
+ }
313
+
314
+ FridaScriptOptions* options = NULL;
315
+ if (valid) {
316
+ options = ParseScriptOptions(name_value, snapshot_value, runtime_value);
317
+ valid = options != NULL;
318
+ }
319
+
320
+ if (!valid) {
321
+ g_free(source);
322
+ g_clear_object(&options);
323
+ return;
324
+ }
325
+
326
+ auto operation = new CreateScriptOperation(source, options);
327
+ operation->Schedule(isolate, wrapper, info);
328
+
329
+ info.GetReturnValue().Set(operation->GetPromise(isolate));
330
+ }
331
+
332
+ namespace {
333
+
334
+ class CreateScriptFromBytesOperation : public Operation<FridaSession> {
335
+ public:
336
+ CreateScriptFromBytesOperation(GBytes* bytes, FridaScriptOptions* options)
337
+ : bytes_(bytes),
338
+ options_(options) {
339
+ }
340
+
341
+ ~CreateScriptFromBytesOperation() {
342
+ g_object_unref(options_);
343
+ g_bytes_unref(bytes_);
344
+ }
345
+
346
+ protected:
347
+ void Begin() {
348
+ frida_session_create_script_from_bytes(handle_, bytes_, options_,
349
+ cancellable_, OnReady, this);
350
+ }
351
+
352
+ void End(GAsyncResult* result, GError** error) {
353
+ script_ = frida_session_create_script_from_bytes_finish(handle_, result,
354
+ error);
355
+ }
356
+
357
+ Local<Value> Result(Isolate* isolate) {
358
+ auto wrapper = Script::New(script_, runtime_);
359
+ g_object_unref(script_);
360
+ return wrapper;
361
+ }
362
+
363
+ private:
364
+ GBytes* bytes_;
365
+ FridaScriptOptions* options_;
366
+ FridaScript* script_;
367
+ };
368
+
369
+ }
370
+
371
+ NAN_METHOD(Session::CreateScriptFromBytes) {
372
+ auto isolate = info.GetIsolate();
373
+ auto wrapper = ObjectWrap::Unwrap<Session>(info.Holder());
374
+
375
+ if (info.Length() < 4) {
376
+ Nan::ThrowTypeError("Missing one or more arguments");
377
+ return;
378
+ }
379
+
380
+ auto bytes_value = info[0];
381
+ auto name_value = info[1];
382
+ auto snapshot_value = info[2];
383
+ auto runtime_value = info[3];
384
+
385
+ bool valid = true;
386
+
387
+ GBytes* bytes = NULL;
388
+ if (node::Buffer::HasInstance(bytes_value)) {
389
+ bytes = g_bytes_new(node::Buffer::Data(bytes_value),
390
+ node::Buffer::Length(bytes_value));
391
+ } else {
392
+ Nan::ThrowTypeError("Bad argument, 'bytes' must be a Buffer");
393
+ valid = false;
394
+ }
395
+
396
+ FridaScriptOptions* options = NULL;
397
+ if (valid) {
398
+ options = ParseScriptOptions(name_value, snapshot_value, runtime_value);
399
+ valid = options != NULL;
400
+ }
401
+
402
+ if (!valid) {
403
+ g_bytes_unref(bytes);
404
+ g_clear_object(&options);
405
+ return;
406
+ }
407
+
408
+ auto operation = new CreateScriptFromBytesOperation(bytes, options);
409
+ operation->Schedule(isolate, wrapper, info);
410
+
411
+ info.GetReturnValue().Set(operation->GetPromise(isolate));
412
+ }
413
+
414
+ namespace {
415
+
416
+ class CompileScriptOperation : public Operation<FridaSession> {
417
+ public:
418
+ CompileScriptOperation(gchar* source, FridaScriptOptions* options)
419
+ : source_(source),
420
+ options_(options) {
421
+ }
422
+
423
+ ~CompileScriptOperation() {
424
+ g_object_unref(options_);
425
+ g_free(source_);
426
+ }
427
+
428
+ protected:
429
+ void Begin() {
430
+ frida_session_compile_script(handle_, source_, options_, cancellable_,
431
+ OnReady, this);
432
+ }
433
+
434
+ void End(GAsyncResult* result, GError** error) {
435
+ bytes_ = frida_session_compile_script_finish(handle_, result, error);
436
+ }
437
+
438
+ Local<Value> Result(Isolate* isolate) {
439
+ gsize size;
440
+ auto data = g_bytes_get_data(bytes_, &size);
441
+ return Nan::NewBuffer(static_cast<char*>(const_cast<void*>(data)), size,
442
+ UnrefGBytes, bytes_).ToLocalChecked();
443
+ }
444
+
445
+ private:
446
+ gchar* source_;
447
+ FridaScriptOptions* options_;
448
+ GBytes* bytes_;
449
+ };
450
+
451
+ }
452
+
453
+ NAN_METHOD(Session::CompileScript) {
454
+ auto isolate = info.GetIsolate();
455
+ auto wrapper = ObjectWrap::Unwrap<Session>(info.Holder());
456
+
457
+ if (info.Length() < 3) {
458
+ Nan::ThrowTypeError("Missing one or more arguments");
459
+ return;
460
+ }
461
+
462
+ auto source_value = info[0];
463
+ auto name_value = info[1];
464
+ auto runtime_value = info[2];
465
+
466
+ bool valid = true;
467
+
468
+ gchar* source;
469
+ Nan::Utf8String val(source_value);
470
+ source = g_strdup(*val);
471
+ if (source == NULL) {
472
+ Nan::ThrowTypeError("Bad argument, 'source' must be a string");
473
+ valid = false;
474
+ }
475
+
476
+ FridaScriptOptions* options = NULL;
477
+ if (valid) {
478
+ options = ParseScriptOptions(name_value, Nan::Null(), runtime_value);
479
+ valid = options != NULL;
480
+ }
481
+
482
+ if (!valid) {
483
+ g_free(source);
484
+ g_clear_object(&options);
485
+ return;
486
+ }
487
+
488
+ auto operation = new CompileScriptOperation(source, options);
489
+ operation->Schedule(isolate, wrapper, info);
490
+
491
+ info.GetReturnValue().Set(operation->GetPromise(isolate));
492
+ }
493
+
494
+ static FridaScriptOptions* ParseScriptOptions(Local<Value> name_value,
495
+ Local<Value> snapshot_value, Local<Value> runtime_value) {
496
+ auto options = frida_script_options_new();
497
+ bool valid = true;
498
+
499
+ if (!name_value->IsNull()) {
500
+ Nan::Utf8String val(name_value);
501
+ const gchar* name = *val;
502
+ if (name != NULL) {
503
+ frida_script_options_set_name(options, name);
504
+ } else {
505
+ Nan::ThrowTypeError("Bad argument, 'name' must be a string");
506
+ valid = false;
507
+ }
508
+ }
509
+
510
+ if (valid && !snapshot_value->IsNull()) {
511
+ if (node::Buffer::HasInstance(snapshot_value)) {
512
+ auto snapshot = g_bytes_new(node::Buffer::Data(snapshot_value),
513
+ node::Buffer::Length(snapshot_value));
514
+ frida_script_options_set_snapshot(options, snapshot);
515
+ g_bytes_unref(snapshot);
516
+ } else {
517
+ Nan::ThrowTypeError("Bad argument, 'snapshot' must be a Buffer");
518
+ valid = false;
519
+ }
520
+ }
521
+
522
+ if (valid && !runtime_value->IsNull()) {
523
+ FridaScriptRuntime runtime;
524
+ valid = Runtime::ValueToEnum(runtime_value, FRIDA_TYPE_SCRIPT_RUNTIME,
525
+ &runtime);
526
+ if (valid) {
527
+ frida_script_options_set_runtime(options, runtime);
528
+ }
529
+ }
530
+
531
+ if (!valid) {
532
+ g_object_unref(options);
533
+ return NULL;
534
+ }
535
+
536
+ return options;
537
+ }
538
+
539
+ namespace {
540
+
541
+ class SnapshotScriptOperation : public Operation<FridaSession> {
542
+ public:
543
+ SnapshotScriptOperation(gchar* embed_script, FridaSnapshotOptions* options)
544
+ : embed_script_(embed_script),
545
+ options_(options) {
546
+ }
547
+
548
+ ~SnapshotScriptOperation() {
549
+ g_object_unref(options_);
550
+ g_free(embed_script_);
551
+ }
552
+
553
+ protected:
554
+ void Begin() {
555
+ frida_session_snapshot_script(handle_, embed_script_, options_,
556
+ cancellable_, OnReady, this);
557
+ }
558
+
559
+ void End(GAsyncResult* result, GError** error) {
560
+ bytes_ = frida_session_snapshot_script_finish(handle_, result, error);
561
+ }
562
+
563
+ Local<Value> Result(Isolate* isolate) {
564
+ gsize size;
565
+ auto data = g_bytes_get_data(bytes_, &size);
566
+ return Nan::NewBuffer(static_cast<char*>(const_cast<void*>(data)), size,
567
+ UnrefGBytes, bytes_).ToLocalChecked();
568
+ }
569
+
570
+ private:
571
+ gchar* embed_script_;
572
+ FridaSnapshotOptions* options_;
573
+ GBytes* bytes_;
574
+ };
575
+
576
+ }
577
+
578
+ NAN_METHOD(Session::SnapshotScript) {
579
+ auto isolate = info.GetIsolate();
580
+ auto wrapper = ObjectWrap::Unwrap<Session>(info.Holder());
581
+
582
+ if (info.Length() < 3) {
583
+ Nan::ThrowTypeError("Missing one or more arguments");
584
+ return;
585
+ }
586
+
587
+ auto embed_script_value = info[0];
588
+ auto warmup_script_value = info[1];
589
+ auto runtime_value = info[2];
590
+
591
+ bool valid = true;
592
+
593
+ gchar* embed_script;
594
+ Nan::Utf8String val(embed_script_value);
595
+ embed_script = g_strdup(*val);
596
+ if (embed_script == NULL) {
597
+ Nan::ThrowTypeError("Bad argument, 'embedScript' must be a string");
598
+ valid = false;
599
+ }
600
+
601
+ FridaSnapshotOptions* options = NULL;
602
+ if (valid) {
603
+ options = ParseSnapshotOptions(warmup_script_value, runtime_value);
604
+ valid = options != NULL;
605
+ }
606
+
607
+ if (!valid) {
608
+ g_free(embed_script);
609
+ g_clear_object(&options);
610
+ return;
611
+ }
612
+
613
+ auto operation = new SnapshotScriptOperation(embed_script, options);
614
+ operation->Schedule(isolate, wrapper, info);
615
+
616
+ info.GetReturnValue().Set(operation->GetPromise(isolate));
617
+ }
618
+
619
+ static FridaSnapshotOptions* ParseSnapshotOptions(
620
+ Local<Value> warmup_script_value, Local<Value> runtime_value) {
621
+ auto options = frida_snapshot_options_new();
622
+ bool valid = true;
623
+
624
+ if (!warmup_script_value->IsNull()) {
625
+ Nan::Utf8String val(warmup_script_value);
626
+ const gchar* warmup_script = *val;
627
+ if (warmup_script != NULL) {
628
+ frida_snapshot_options_set_warmup_script(options, warmup_script);
629
+ } else {
630
+ Nan::ThrowTypeError("Bad argument, 'warmupScript' must be a string");
631
+ valid = false;
632
+ }
633
+ }
634
+
635
+ if (valid && !runtime_value->IsNull()) {
636
+ FridaScriptRuntime runtime;
637
+ valid = Runtime::ValueToEnum(runtime_value, FRIDA_TYPE_SCRIPT_RUNTIME,
638
+ &runtime);
639
+ if (valid) {
640
+ frida_snapshot_options_set_runtime(options, runtime);
641
+ }
642
+ }
643
+
644
+ if (!valid) {
645
+ g_object_unref(options);
646
+ return NULL;
647
+ }
648
+
649
+ return options;
650
+ }
651
+
652
+ namespace {
653
+
654
+ class SetupPeerConnectionOperation : public Operation<FridaSession> {
655
+ public:
656
+ SetupPeerConnectionOperation(FridaPeerOptions* options) : options_(options) {
657
+ }
658
+
659
+ ~SetupPeerConnectionOperation() {
660
+ g_object_unref(options_);
661
+ }
662
+
663
+ protected:
664
+ void Begin() {
665
+ frida_session_setup_peer_connection(handle_, options_, cancellable_,
666
+ OnReady, this);
667
+ }
668
+
669
+ void End(GAsyncResult* result, GError** error) {
670
+ frida_session_setup_peer_connection_finish(handle_, result, error);
671
+ }
672
+
673
+ Local<Value> Result(Isolate* isolate) {
674
+ return Nan::Undefined();
675
+ }
676
+
677
+ private:
678
+ FridaPeerOptions* options_;
679
+ };
680
+
681
+ }
682
+
683
+ NAN_METHOD(Session::SetupPeerConnection) {
684
+ auto isolate = info.GetIsolate();
685
+ auto wrapper = ObjectWrap::Unwrap<Session>(info.Holder());
686
+
687
+ if (info.Length() < 2) {
688
+ Nan::ThrowTypeError("Missing one or more arguments");
689
+ return;
690
+ }
691
+
692
+ auto stun_server_value = info[0];
693
+ auto relays_value = info[1];
694
+
695
+ auto options = frida_peer_options_new();
696
+ bool valid = true;
697
+
698
+ if (!stun_server_value->IsNull()) {
699
+ if (stun_server_value->IsString()) {
700
+ Nan::Utf8String stun_server(stun_server_value);
701
+ frida_peer_options_set_stun_server(options, *stun_server);
702
+ } else {
703
+ Nan::ThrowTypeError("Bad argument, 'stunServer' must be a string");
704
+ valid = false;
705
+ }
706
+ }
707
+
708
+ if (valid) {
709
+ if (relays_value->IsArray()) {
710
+ auto array = Local<Array>::Cast(relays_value);
711
+
712
+ uint32_t n = array->Length();
713
+
714
+ for (uint32_t i = 0; i != n; i++) {
715
+ auto element_value = Nan::Get(array, i).ToLocalChecked();
716
+ FridaRelay* relay = Relay::TryParse(element_value, wrapper->runtime_);
717
+ if (relay == NULL) {
718
+ Nan::ThrowTypeError("Bad argument, 'relays' element type mismatch");
719
+ valid = false;
720
+ break;
721
+ }
722
+ frida_peer_options_add_relay(options, relay);
723
+ }
724
+ } else {
725
+ Nan::ThrowTypeError("Bad argument, 'relays' must be an array");
726
+ valid = false;
727
+ }
728
+ }
729
+
730
+ if (!valid) {
731
+ g_object_unref(options);
732
+ return;
733
+ }
734
+
735
+ auto operation = new SetupPeerConnectionOperation(options);
736
+ operation->Schedule(isolate, wrapper, info);
737
+
738
+ info.GetReturnValue().Set(operation->GetPromise(isolate));
739
+ }
740
+
741
+ namespace {
742
+
743
+ class JoinPortalOperation : public Operation<FridaSession> {
744
+ public:
745
+ JoinPortalOperation(gchar* address, FridaPortalOptions* options)
746
+ : address_(address),
747
+ options_(options) {
748
+ }
749
+
750
+ ~JoinPortalOperation() {
751
+ g_object_unref(options_);
752
+ g_free(address_);
753
+ }
754
+
755
+ protected:
756
+ void Begin() {
757
+ frida_session_join_portal(handle_, address_, options_, cancellable_,
758
+ OnReady, this);
759
+ }
760
+
761
+ void End(GAsyncResult* result, GError** error) {
762
+ membership_ = frida_session_join_portal_finish(handle_, result, error);
763
+ }
764
+
765
+ Local<Value> Result(Isolate* isolate) {
766
+ auto wrapper = PortalMembership::New(membership_, runtime_);
767
+ g_object_unref(membership_);
768
+ return wrapper;
769
+ }
770
+
771
+ private:
772
+ gchar* address_;
773
+ FridaPortalOptions* options_;
774
+ FridaPortalMembership* membership_;
775
+ };
776
+
777
+ }
778
+
779
+ NAN_METHOD(Session::JoinPortal) {
780
+ auto isolate = info.GetIsolate();
781
+ auto wrapper = ObjectWrap::Unwrap<Session>(info.Holder());
782
+
783
+ if (info.Length() < 4) {
784
+ Nan::ThrowTypeError("Missing one or more arguments");
785
+ return;
786
+ }
787
+
788
+ auto address_value = info[0];
789
+ auto certificate_value = info[1];
790
+ auto token_value = info[2];
791
+ auto acl_value = info[3];
792
+
793
+ if (!address_value->IsString()) {
794
+ Nan::ThrowTypeError("Bad argument, 'address' must be a string");
795
+ return;
796
+ }
797
+ Nan::Utf8String address(address_value);
798
+
799
+ auto options = frida_portal_options_new();
800
+ bool valid = true;
801
+
802
+ if (!certificate_value->IsNull()) {
803
+ GTlsCertificate* certificate;
804
+ valid = Runtime::ValueToCertificate(certificate_value, &certificate);
805
+ if (valid) {
806
+ frida_portal_options_set_certificate(options, certificate);
807
+ g_object_unref(certificate);
808
+ }
809
+ }
810
+
811
+ if (valid && !token_value->IsNull()) {
812
+ if (token_value->IsString()) {
813
+ Nan::Utf8String token(token_value);
814
+ frida_portal_options_set_token(options, *token);
815
+ } else {
816
+ Nan::ThrowTypeError("Bad argument, 'token' must be a string");
817
+ valid = false;
818
+ }
819
+ }
820
+
821
+ if (valid && !acl_value->IsNull()) {
822
+ gchar** acl;
823
+ gint acl_length;
824
+ valid = Runtime::ValueToEnvp(acl_value, &acl, &acl_length);
825
+ if (valid) {
826
+ frida_portal_options_set_acl(options, acl, acl_length);
827
+ g_strfreev(acl);
828
+ }
829
+ }
830
+
831
+ if (!valid) {
832
+ g_object_unref(options);
833
+ return;
834
+ }
835
+
836
+ auto operation = new JoinPortalOperation(g_strdup(*address), options);
837
+ operation->Schedule(isolate, wrapper, info);
838
+
839
+ info.GetReturnValue().Set(operation->GetPromise(isolate));
840
+ }
841
+
842
+ Local<Value> Session::TransformSignal(const gchar* name, guint index,
843
+ const GValue* value, gpointer user_data) {
844
+ auto runtime = static_cast<Runtime*>(user_data);
845
+
846
+ if (index == 1 && strcmp(name, "detached") == 0) {
847
+ auto crash = g_value_get_object(value);
848
+ if (crash == NULL)
849
+ return Nan::Null();
850
+ return Crash::New(crash, runtime);
851
+ }
852
+
853
+ return Local<Value>();
854
+ }
855
+
856
+ static void UnrefGBytes(char* data, void* hint) {
857
+ g_bytes_unref(static_cast<GBytes*>(hint));
858
+ }
859
+
860
+ }