frida 16.2.0 → 16.2.2
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.
- package/BSDmakefile +6 -0
- package/Makefile +16 -0
- package/README.md +14 -11
- package/configure +18 -0
- package/configure.bat +22 -0
- package/dist/native.js +0 -8
- package/lib/application.ts +98 -0
- package/lib/authentication.ts +3 -0
- package/lib/build.py +50 -0
- package/lib/bus.ts +30 -0
- package/lib/cancellable.ts +33 -0
- package/lib/child.ts +15 -0
- package/lib/crash.ts +11 -0
- package/lib/device.ts +329 -0
- package/lib/device_manager.ts +69 -0
- package/lib/endpoint_parameters.ts +56 -0
- package/lib/icon.ts +15 -0
- package/lib/index.ts +311 -0
- package/lib/iostream.ts +78 -0
- package/lib/meson.build +53 -0
- package/lib/native.ts +9 -0
- package/lib/portal_membership.ts +10 -0
- package/lib/portal_service.ts +105 -0
- package/lib/process.ts +57 -0
- package/lib/relay.ts +44 -0
- package/lib/script.ts +352 -0
- package/lib/session.ts +113 -0
- package/lib/signals.ts +45 -0
- package/lib/socket_address.ts +35 -0
- package/lib/spawn.ts +4 -0
- package/lib/system_parameters.ts +78 -0
- package/make.bat +23 -0
- package/meson.build +160 -0
- package/meson.options +11 -0
- package/package.json +27 -6
- package/releng/deps.py +1133 -0
- package/releng/deps.toml +391 -0
- package/releng/devkit-assets/frida-core-example-unix.c +188 -0
- package/releng/devkit-assets/frida-core-example-windows.c +197 -0
- package/releng/devkit-assets/frida-core-example.sln +28 -0
- package/releng/devkit-assets/frida-core-example.vcxproj +157 -0
- package/releng/devkit-assets/frida-core-example.vcxproj.filters +27 -0
- package/releng/devkit-assets/frida-gum-example-unix.c +122 -0
- package/releng/devkit-assets/frida-gum-example-windows.c +132 -0
- package/releng/devkit-assets/frida-gum-example.sln +28 -0
- package/releng/devkit-assets/frida-gum-example.vcxproj +157 -0
- package/releng/devkit-assets/frida-gum-example.vcxproj.filters +27 -0
- package/releng/devkit-assets/frida-gumjs-example-unix.c +84 -0
- package/releng/devkit-assets/frida-gumjs-example-windows.c +91 -0
- package/releng/devkit-assets/frida-gumjs-example.sln +28 -0
- package/releng/devkit-assets/frida-gumjs-example.vcxproj +157 -0
- package/releng/devkit-assets/frida-gumjs-example.vcxproj.filters +27 -0
- package/releng/devkit.py +535 -0
- package/releng/env.py +420 -0
- package/releng/env_android.py +150 -0
- package/releng/env_apple.py +176 -0
- package/releng/env_generic.py +373 -0
- package/releng/frida_version.py +69 -0
- package/releng/machine_file.py +44 -0
- package/releng/machine_spec.py +290 -0
- package/releng/meson/meson.py +27 -0
- package/releng/meson/mesonbuild/__init__.py +0 -0
- package/releng/meson/mesonbuild/_pathlib.py +63 -0
- package/releng/meson/mesonbuild/_typing.py +69 -0
- package/releng/meson/mesonbuild/arglist.py +321 -0
- package/releng/meson/mesonbuild/ast/__init__.py +23 -0
- package/releng/meson/mesonbuild/ast/interpreter.py +441 -0
- package/releng/meson/mesonbuild/ast/introspection.py +374 -0
- package/releng/meson/mesonbuild/ast/postprocess.py +109 -0
- package/releng/meson/mesonbuild/ast/printer.py +620 -0
- package/releng/meson/mesonbuild/ast/visitor.py +161 -0
- package/releng/meson/mesonbuild/backend/__init__.py +0 -0
- package/releng/meson/mesonbuild/backend/backends.py +2047 -0
- package/releng/meson/mesonbuild/backend/ninjabackend.py +3808 -0
- package/releng/meson/mesonbuild/backend/nonebackend.py +26 -0
- package/releng/meson/mesonbuild/backend/vs2010backend.py +2078 -0
- package/releng/meson/mesonbuild/backend/vs2012backend.py +35 -0
- package/releng/meson/mesonbuild/backend/vs2013backend.py +34 -0
- package/releng/meson/mesonbuild/backend/vs2015backend.py +35 -0
- package/releng/meson/mesonbuild/backend/vs2017backend.py +59 -0
- package/releng/meson/mesonbuild/backend/vs2019backend.py +54 -0
- package/releng/meson/mesonbuild/backend/vs2022backend.py +54 -0
- package/releng/meson/mesonbuild/backend/xcodebackend.py +1781 -0
- package/releng/meson/mesonbuild/build.py +3249 -0
- package/releng/meson/mesonbuild/cargo/__init__.py +5 -0
- package/releng/meson/mesonbuild/cargo/builder.py +238 -0
- package/releng/meson/mesonbuild/cargo/cfg.py +274 -0
- package/releng/meson/mesonbuild/cargo/interpreter.py +733 -0
- package/releng/meson/mesonbuild/cargo/manifest.py +227 -0
- package/releng/meson/mesonbuild/cargo/version.py +95 -0
- package/releng/meson/mesonbuild/cmake/__init__.py +28 -0
- package/releng/meson/mesonbuild/cmake/common.py +331 -0
- package/releng/meson/mesonbuild/cmake/data/__init__.py +0 -0
- package/releng/meson/mesonbuild/cmake/data/preload.cmake +82 -0
- package/releng/meson/mesonbuild/cmake/executor.py +241 -0
- package/releng/meson/mesonbuild/cmake/fileapi.py +324 -0
- package/releng/meson/mesonbuild/cmake/generator.py +186 -0
- package/releng/meson/mesonbuild/cmake/interpreter.py +1267 -0
- package/releng/meson/mesonbuild/cmake/toolchain.py +248 -0
- package/releng/meson/mesonbuild/cmake/traceparser.py +814 -0
- package/releng/meson/mesonbuild/cmake/tracetargets.py +161 -0
- package/releng/meson/mesonbuild/compilers/__init__.py +86 -0
- package/releng/meson/mesonbuild/compilers/asm.py +307 -0
- package/releng/meson/mesonbuild/compilers/c.py +788 -0
- package/releng/meson/mesonbuild/compilers/c_function_attributes.py +143 -0
- package/releng/meson/mesonbuild/compilers/compilers.py +1388 -0
- package/releng/meson/mesonbuild/compilers/cpp.py +1035 -0
- package/releng/meson/mesonbuild/compilers/cs.py +136 -0
- package/releng/meson/mesonbuild/compilers/cuda.py +806 -0
- package/releng/meson/mesonbuild/compilers/cython.py +91 -0
- package/releng/meson/mesonbuild/compilers/d.py +861 -0
- package/releng/meson/mesonbuild/compilers/detect.py +1396 -0
- package/releng/meson/mesonbuild/compilers/fortran.py +523 -0
- package/releng/meson/mesonbuild/compilers/java.py +113 -0
- package/releng/meson/mesonbuild/compilers/mixins/__init__.py +0 -0
- package/releng/meson/mesonbuild/compilers/mixins/arm.py +167 -0
- package/releng/meson/mesonbuild/compilers/mixins/ccrx.py +113 -0
- package/releng/meson/mesonbuild/compilers/mixins/clang.py +170 -0
- package/releng/meson/mesonbuild/compilers/mixins/clike.py +1330 -0
- package/releng/meson/mesonbuild/compilers/mixins/compcert.py +117 -0
- package/releng/meson/mesonbuild/compilers/mixins/elbrus.py +93 -0
- package/releng/meson/mesonbuild/compilers/mixins/emscripten.py +89 -0
- package/releng/meson/mesonbuild/compilers/mixins/gnu.py +629 -0
- package/releng/meson/mesonbuild/compilers/mixins/intel.py +167 -0
- package/releng/meson/mesonbuild/compilers/mixins/islinker.py +120 -0
- package/releng/meson/mesonbuild/compilers/mixins/metrowerks.py +279 -0
- package/releng/meson/mesonbuild/compilers/mixins/pgi.py +88 -0
- package/releng/meson/mesonbuild/compilers/mixins/ti.py +130 -0
- package/releng/meson/mesonbuild/compilers/mixins/visualstudio.py +458 -0
- package/releng/meson/mesonbuild/compilers/mixins/xc16.py +111 -0
- package/releng/meson/mesonbuild/compilers/objc.py +120 -0
- package/releng/meson/mesonbuild/compilers/objcpp.py +102 -0
- package/releng/meson/mesonbuild/compilers/rust.py +230 -0
- package/releng/meson/mesonbuild/compilers/swift.py +131 -0
- package/releng/meson/mesonbuild/compilers/vala.py +121 -0
- package/releng/meson/mesonbuild/coredata.py +1532 -0
- package/releng/meson/mesonbuild/dependencies/__init__.py +252 -0
- package/releng/meson/mesonbuild/dependencies/base.py +663 -0
- package/releng/meson/mesonbuild/dependencies/boost.py +1083 -0
- package/releng/meson/mesonbuild/dependencies/cmake.py +656 -0
- package/releng/meson/mesonbuild/dependencies/coarrays.py +80 -0
- package/releng/meson/mesonbuild/dependencies/configtool.py +163 -0
- package/releng/meson/mesonbuild/dependencies/cuda.py +295 -0
- package/releng/meson/mesonbuild/dependencies/data/CMakeLists.txt +102 -0
- package/releng/meson/mesonbuild/dependencies/data/CMakeListsLLVM.txt +204 -0
- package/releng/meson/mesonbuild/dependencies/data/CMakePathInfo.txt +31 -0
- package/releng/meson/mesonbuild/dependencies/data/__init__.py +0 -0
- package/releng/meson/mesonbuild/dependencies/detect.py +225 -0
- package/releng/meson/mesonbuild/dependencies/dev.py +707 -0
- package/releng/meson/mesonbuild/dependencies/dub.py +424 -0
- package/releng/meson/mesonbuild/dependencies/factory.py +146 -0
- package/releng/meson/mesonbuild/dependencies/framework.py +111 -0
- package/releng/meson/mesonbuild/dependencies/hdf5.py +168 -0
- package/releng/meson/mesonbuild/dependencies/misc.py +618 -0
- package/releng/meson/mesonbuild/dependencies/mpi.py +231 -0
- package/releng/meson/mesonbuild/dependencies/pkgconfig.py +570 -0
- package/releng/meson/mesonbuild/dependencies/platform.py +52 -0
- package/releng/meson/mesonbuild/dependencies/python.py +431 -0
- package/releng/meson/mesonbuild/dependencies/qt.py +484 -0
- package/releng/meson/mesonbuild/dependencies/scalapack.py +142 -0
- package/releng/meson/mesonbuild/dependencies/ui.py +281 -0
- package/releng/meson/mesonbuild/depfile.py +82 -0
- package/releng/meson/mesonbuild/envconfig.py +480 -0
- package/releng/meson/mesonbuild/environment.py +987 -0
- package/releng/meson/mesonbuild/interpreter/__init__.py +47 -0
- package/releng/meson/mesonbuild/interpreter/compiler.py +900 -0
- package/releng/meson/mesonbuild/interpreter/dependencyfallbacks.py +386 -0
- package/releng/meson/mesonbuild/interpreter/interpreter.py +3595 -0
- package/releng/meson/mesonbuild/interpreter/interpreterobjects.py +1096 -0
- package/releng/meson/mesonbuild/interpreter/kwargs.py +479 -0
- package/releng/meson/mesonbuild/interpreter/mesonmain.py +487 -0
- package/releng/meson/mesonbuild/interpreter/primitives/__init__.py +29 -0
- package/releng/meson/mesonbuild/interpreter/primitives/array.py +108 -0
- package/releng/meson/mesonbuild/interpreter/primitives/boolean.py +52 -0
- package/releng/meson/mesonbuild/interpreter/primitives/dict.py +88 -0
- package/releng/meson/mesonbuild/interpreter/primitives/integer.py +86 -0
- package/releng/meson/mesonbuild/interpreter/primitives/range.py +38 -0
- package/releng/meson/mesonbuild/interpreter/primitives/string.py +247 -0
- package/releng/meson/mesonbuild/interpreter/type_checking.py +853 -0
- package/releng/meson/mesonbuild/interpreterbase/__init__.py +126 -0
- package/releng/meson/mesonbuild/interpreterbase/_unholder.py +25 -0
- package/releng/meson/mesonbuild/interpreterbase/baseobjects.py +174 -0
- package/releng/meson/mesonbuild/interpreterbase/decorators.py +806 -0
- package/releng/meson/mesonbuild/interpreterbase/disabler.py +35 -0
- package/releng/meson/mesonbuild/interpreterbase/exceptions.py +22 -0
- package/releng/meson/mesonbuild/interpreterbase/helpers.py +67 -0
- package/releng/meson/mesonbuild/interpreterbase/interpreterbase.py +665 -0
- package/releng/meson/mesonbuild/interpreterbase/operator.py +32 -0
- package/releng/meson/mesonbuild/linkers/__init__.py +20 -0
- package/releng/meson/mesonbuild/linkers/base.py +39 -0
- package/releng/meson/mesonbuild/linkers/detect.py +229 -0
- package/releng/meson/mesonbuild/linkers/linkers.py +1614 -0
- package/releng/meson/mesonbuild/mcompile.py +380 -0
- package/releng/meson/mesonbuild/mconf.py +368 -0
- package/releng/meson/mesonbuild/mdevenv.py +234 -0
- package/releng/meson/mesonbuild/mdist.py +376 -0
- package/releng/meson/mesonbuild/mesondata.py +38 -0
- package/releng/meson/mesonbuild/mesonlib.py +23 -0
- package/releng/meson/mesonbuild/mesonmain.py +289 -0
- package/releng/meson/mesonbuild/minit.py +204 -0
- package/releng/meson/mesonbuild/minstall.py +864 -0
- package/releng/meson/mesonbuild/mintro.py +667 -0
- package/releng/meson/mesonbuild/mlog.py +542 -0
- package/releng/meson/mesonbuild/modules/__init__.py +270 -0
- package/releng/meson/mesonbuild/modules/cmake.py +442 -0
- package/releng/meson/mesonbuild/modules/cuda.py +377 -0
- package/releng/meson/mesonbuild/modules/dlang.py +117 -0
- package/releng/meson/mesonbuild/modules/external_project.py +306 -0
- package/releng/meson/mesonbuild/modules/fs.py +323 -0
- package/releng/meson/mesonbuild/modules/gnome.py +2215 -0
- package/releng/meson/mesonbuild/modules/hotdoc.py +487 -0
- package/releng/meson/mesonbuild/modules/i18n.py +405 -0
- package/releng/meson/mesonbuild/modules/icestorm.py +123 -0
- package/releng/meson/mesonbuild/modules/java.py +112 -0
- package/releng/meson/mesonbuild/modules/keyval.py +65 -0
- package/releng/meson/mesonbuild/modules/modtest.py +33 -0
- package/releng/meson/mesonbuild/modules/pkgconfig.py +744 -0
- package/releng/meson/mesonbuild/modules/python.py +556 -0
- package/releng/meson/mesonbuild/modules/python3.py +85 -0
- package/releng/meson/mesonbuild/modules/qt.py +621 -0
- package/releng/meson/mesonbuild/modules/qt4.py +23 -0
- package/releng/meson/mesonbuild/modules/qt5.py +23 -0
- package/releng/meson/mesonbuild/modules/qt6.py +22 -0
- package/releng/meson/mesonbuild/modules/rust.py +355 -0
- package/releng/meson/mesonbuild/modules/simd.py +114 -0
- package/releng/meson/mesonbuild/modules/sourceset.py +291 -0
- package/releng/meson/mesonbuild/modules/wayland.py +151 -0
- package/releng/meson/mesonbuild/modules/windows.py +207 -0
- package/releng/meson/mesonbuild/mparser.py +1114 -0
- package/releng/meson/mesonbuild/msetup.py +365 -0
- package/releng/meson/mesonbuild/msubprojects.py +764 -0
- package/releng/meson/mesonbuild/mtest.py +2201 -0
- package/releng/meson/mesonbuild/munstable_coredata.py +107 -0
- package/releng/meson/mesonbuild/optinterpreter.py +276 -0
- package/releng/meson/mesonbuild/programs.py +367 -0
- package/releng/meson/mesonbuild/rewriter.py +1075 -0
- package/releng/meson/mesonbuild/scripts/__init__.py +10 -0
- package/releng/meson/mesonbuild/scripts/clangformat.py +55 -0
- package/releng/meson/mesonbuild/scripts/clangtidy.py +30 -0
- package/releng/meson/mesonbuild/scripts/cleantrees.py +35 -0
- package/releng/meson/mesonbuild/scripts/cmake_run_ctgt.py +103 -0
- package/releng/meson/mesonbuild/scripts/cmd_or_ps.ps1 +17 -0
- package/releng/meson/mesonbuild/scripts/copy.py +19 -0
- package/releng/meson/mesonbuild/scripts/coverage.py +214 -0
- package/releng/meson/mesonbuild/scripts/delwithsuffix.py +27 -0
- package/releng/meson/mesonbuild/scripts/depfixer.py +495 -0
- package/releng/meson/mesonbuild/scripts/depscan.py +198 -0
- package/releng/meson/mesonbuild/scripts/dirchanger.py +20 -0
- package/releng/meson/mesonbuild/scripts/env2mfile.py +402 -0
- package/releng/meson/mesonbuild/scripts/externalproject.py +106 -0
- package/releng/meson/mesonbuild/scripts/gettext.py +86 -0
- package/releng/meson/mesonbuild/scripts/gtkdochelper.py +286 -0
- package/releng/meson/mesonbuild/scripts/hotdochelper.py +40 -0
- package/releng/meson/mesonbuild/scripts/itstool.py +77 -0
- package/releng/meson/mesonbuild/scripts/meson_exe.py +115 -0
- package/releng/meson/mesonbuild/scripts/msgfmthelper.py +29 -0
- package/releng/meson/mesonbuild/scripts/pycompile.py +54 -0
- package/releng/meson/mesonbuild/scripts/python_info.py +121 -0
- package/releng/meson/mesonbuild/scripts/regen_checker.py +55 -0
- package/releng/meson/mesonbuild/scripts/run_tool.py +58 -0
- package/releng/meson/mesonbuild/scripts/scanbuild.py +57 -0
- package/releng/meson/mesonbuild/scripts/symbolextractor.py +322 -0
- package/releng/meson/mesonbuild/scripts/tags.py +44 -0
- package/releng/meson/mesonbuild/scripts/test_loaded_modules.py +14 -0
- package/releng/meson/mesonbuild/scripts/uninstall.py +41 -0
- package/releng/meson/mesonbuild/scripts/vcstagger.py +35 -0
- package/releng/meson/mesonbuild/scripts/yasm.py +24 -0
- package/releng/meson/mesonbuild/templates/__init__.py +0 -0
- package/releng/meson/mesonbuild/templates/cpptemplates.py +143 -0
- package/releng/meson/mesonbuild/templates/cstemplates.py +90 -0
- package/releng/meson/mesonbuild/templates/ctemplates.py +126 -0
- package/releng/meson/mesonbuild/templates/cudatemplates.py +143 -0
- package/releng/meson/mesonbuild/templates/dlangtemplates.py +109 -0
- package/releng/meson/mesonbuild/templates/fortrantemplates.py +101 -0
- package/releng/meson/mesonbuild/templates/javatemplates.py +94 -0
- package/releng/meson/mesonbuild/templates/mesontemplates.py +70 -0
- package/releng/meson/mesonbuild/templates/objcpptemplates.py +126 -0
- package/releng/meson/mesonbuild/templates/objctemplates.py +126 -0
- package/releng/meson/mesonbuild/templates/rusttemplates.py +79 -0
- package/releng/meson/mesonbuild/templates/samplefactory.py +41 -0
- package/releng/meson/mesonbuild/templates/sampleimpl.py +160 -0
- package/releng/meson/mesonbuild/templates/valatemplates.py +82 -0
- package/releng/meson/mesonbuild/utils/__init__.py +0 -0
- package/releng/meson/mesonbuild/utils/core.py +166 -0
- package/releng/meson/mesonbuild/utils/platform.py +27 -0
- package/releng/meson/mesonbuild/utils/posix.py +32 -0
- package/releng/meson/mesonbuild/utils/universal.py +2445 -0
- package/releng/meson/mesonbuild/utils/vsenv.py +126 -0
- package/releng/meson/mesonbuild/utils/win32.py +29 -0
- package/releng/meson/mesonbuild/wrap/__init__.py +59 -0
- package/releng/meson/mesonbuild/wrap/wrap.py +846 -0
- package/releng/meson/mesonbuild/wrap/wraptool.py +198 -0
- package/releng/meson-scripts/BSDmakefile +6 -0
- package/releng/meson-scripts/Makefile +16 -0
- package/releng/meson-scripts/configure +18 -0
- package/releng/meson-scripts/configure.bat +22 -0
- package/releng/meson-scripts/make.bat +23 -0
- package/releng/meson_configure.py +506 -0
- package/releng/meson_make.py +131 -0
- package/releng/mkdevkit.py +107 -0
- package/releng/mkfatmacho.py +54 -0
- package/releng/post-process-oabi.py +97 -0
- package/releng/progress.py +14 -0
- package/releng/sync-from-upstream.py +185 -0
- package/releng/tomlkit/tomlkit/__init__.py +59 -0
- package/releng/tomlkit/tomlkit/_compat.py +22 -0
- package/releng/tomlkit/tomlkit/_types.py +83 -0
- package/releng/tomlkit/tomlkit/_utils.py +158 -0
- package/releng/tomlkit/tomlkit/api.py +308 -0
- package/releng/tomlkit/tomlkit/container.py +875 -0
- package/releng/tomlkit/tomlkit/exceptions.py +227 -0
- package/releng/tomlkit/tomlkit/items.py +1967 -0
- package/releng/tomlkit/tomlkit/parser.py +1141 -0
- package/releng/tomlkit/tomlkit/py.typed +0 -0
- package/releng/tomlkit/tomlkit/source.py +180 -0
- package/releng/tomlkit/tomlkit/toml_char.py +52 -0
- package/releng/tomlkit/tomlkit/toml_document.py +7 -0
- package/releng/tomlkit/tomlkit/toml_file.py +58 -0
- package/releng/winenv.py +140 -0
- package/scripts/adjust-version.py +19 -0
- package/scripts/detect-version.py +40 -0
- package/scripts/fetch-abi-bits.py +343 -0
- package/scripts/install.js +23 -0
- package/scripts/package.py +15 -0
- package/src/addon.cc +76 -0
- package/src/application.cc +148 -0
- package/src/application.h +31 -0
- package/src/authentication.cc +174 -0
- package/src/authentication.h +24 -0
- package/src/bus.cc +167 -0
- package/src/bus.h +33 -0
- package/src/cancellable.cc +117 -0
- package/src/cancellable.h +31 -0
- package/src/child.cc +150 -0
- package/src/child.h +32 -0
- package/src/crash.cc +122 -0
- package/src/crash.h +30 -0
- package/src/device.cc +1302 -0
- package/src/device.h +55 -0
- package/src/device_manager.cc +362 -0
- package/src/device_manager.h +35 -0
- package/src/endpoint_parameters.cc +171 -0
- package/src/endpoint_parameters.h +28 -0
- package/src/glib_context.cc +62 -0
- package/src/glib_context.h +29 -0
- package/src/glib_object.cc +25 -0
- package/src/glib_object.h +37 -0
- package/src/iostream.cc +247 -0
- package/src/iostream.h +30 -0
- package/src/meson.build +26 -0
- package/src/operation.h +94 -0
- package/src/portal_membership.cc +100 -0
- package/src/portal_membership.h +26 -0
- package/src/portal_service.cc +401 -0
- package/src/portal_service.h +40 -0
- package/src/process.cc +135 -0
- package/src/process.h +30 -0
- package/src/relay.cc +139 -0
- package/src/relay.h +31 -0
- package/src/runtime.cc +443 -0
- package/src/runtime.h +64 -0
- package/src/script.cc +301 -0
- package/src/script.h +36 -0
- package/src/session.cc +860 -0
- package/src/session.h +42 -0
- package/src/signals.cc +334 -0
- package/src/signals.h +47 -0
- package/src/spawn.cc +95 -0
- package/src/spawn.h +27 -0
- package/src/usage_monitor.h +117 -0
- package/src/uv_context.cc +118 -0
- package/src/uv_context.h +40 -0
- package/src/win_delay_load_hook.cc +63 -0
- package/subprojects/frida-core.wrap +8 -0
- package/subprojects/nan.wrap +9 -0
- package/subprojects/packagefiles/nan.patch +13 -0
- package/test/data/index.ts +13 -0
- package/test/data/unixvictim-linux-x86 +0 -0
- package/test/data/unixvictim-linux-x86_64 +0 -0
- package/test/data/unixvictim-macos +0 -0
- package/test/device.ts +27 -0
- package/test/device_manager.ts +16 -0
- package/test/labrat.ts +32 -0
- package/test/script.ts +176 -0
- package/test/session.ts +73 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#include "uv_context.h"
|
|
2
|
+
|
|
3
|
+
#define UV_CONTEXT_LOCK() g_mutex_lock(&mutex_)
|
|
4
|
+
#define UV_CONTEXT_UNLOCK() g_mutex_unlock(&mutex_)
|
|
5
|
+
#define UV_CONTEXT_WAIT() g_cond_wait(&cond_, &mutex_)
|
|
6
|
+
#define UV_CONTEXT_SIGNAL() g_cond_signal(&cond_)
|
|
7
|
+
|
|
8
|
+
using v8::Context;
|
|
9
|
+
using v8::External;
|
|
10
|
+
using v8::Function;
|
|
11
|
+
using v8::FunctionCallbackInfo;
|
|
12
|
+
using v8::Isolate;
|
|
13
|
+
using v8::Local;
|
|
14
|
+
using v8::Object;
|
|
15
|
+
using v8::Value;
|
|
16
|
+
using Nan::HandleScope;
|
|
17
|
+
|
|
18
|
+
namespace frida {
|
|
19
|
+
|
|
20
|
+
UVContext::UVContext(uv_loop_t* loop)
|
|
21
|
+
: usage_count_(0), async_(new uv_async_t), async_resource_("frida"),
|
|
22
|
+
pending_(NULL) {
|
|
23
|
+
async_->data = this;
|
|
24
|
+
uv_async_init(loop, async_, ProcessPendingWrapper);
|
|
25
|
+
uv_unref(reinterpret_cast<uv_handle_t*>(async_));
|
|
26
|
+
|
|
27
|
+
g_mutex_init(&mutex_);
|
|
28
|
+
g_cond_init(&cond_);
|
|
29
|
+
|
|
30
|
+
auto isolate = Isolate::GetCurrent();
|
|
31
|
+
auto context = isolate->GetCurrentContext();
|
|
32
|
+
auto module = Nan::New<Object>();
|
|
33
|
+
auto process_pending = Function::New(context, ProcessPendingWrapper,
|
|
34
|
+
External::New(isolate, this)).ToLocalChecked();
|
|
35
|
+
auto process_pending_name = Nan::New("processPending").ToLocalChecked();
|
|
36
|
+
process_pending->SetName(process_pending_name);
|
|
37
|
+
Nan::Set(module, process_pending_name, process_pending);
|
|
38
|
+
module_.Reset(isolate, module);
|
|
39
|
+
process_pending_.Reset(isolate, process_pending);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
UVContext::~UVContext() {
|
|
43
|
+
process_pending_.Reset();
|
|
44
|
+
module_.Reset();
|
|
45
|
+
g_cond_clear(&cond_);
|
|
46
|
+
g_mutex_clear(&mutex_);
|
|
47
|
+
uv_close(reinterpret_cast<uv_handle_t*>(async_), DeleteAsyncHandle);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
void UVContext::DeleteAsyncHandle(uv_handle_t* handle) {
|
|
51
|
+
delete reinterpret_cast<uv_async_t*>(handle);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
void UVContext::IncreaseUsage() {
|
|
55
|
+
if (++usage_count_ == 1)
|
|
56
|
+
uv_ref(reinterpret_cast<uv_handle_t*>(async_));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
void UVContext::DecreaseUsage() {
|
|
60
|
+
if (usage_count_-- == 1)
|
|
61
|
+
uv_unref(reinterpret_cast<uv_handle_t*>(async_));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
void UVContext::Schedule(std::function<void ()> f) {
|
|
65
|
+
auto work = new std::function<void ()>(f);
|
|
66
|
+
UV_CONTEXT_LOCK();
|
|
67
|
+
pending_ = g_slist_append(pending_, work);
|
|
68
|
+
UV_CONTEXT_UNLOCK();
|
|
69
|
+
uv_async_send(async_);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
void UVContext::Perform(std::function<void ()> f) {
|
|
73
|
+
volatile bool finished = false;
|
|
74
|
+
|
|
75
|
+
Schedule([this, f, &finished]() {
|
|
76
|
+
f();
|
|
77
|
+
|
|
78
|
+
UV_CONTEXT_LOCK();
|
|
79
|
+
finished = true;
|
|
80
|
+
UV_CONTEXT_SIGNAL();
|
|
81
|
+
UV_CONTEXT_UNLOCK();
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
UV_CONTEXT_LOCK();
|
|
85
|
+
while (!finished)
|
|
86
|
+
UV_CONTEXT_WAIT();
|
|
87
|
+
UV_CONTEXT_UNLOCK();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
void UVContext::ProcessPending() {
|
|
91
|
+
UV_CONTEXT_LOCK();
|
|
92
|
+
while (pending_ != NULL) {
|
|
93
|
+
auto work = static_cast<std::function<void ()>*>(pending_->data);
|
|
94
|
+
pending_ = g_slist_delete_link(pending_, pending_);
|
|
95
|
+
UV_CONTEXT_UNLOCK();
|
|
96
|
+
(*work)();
|
|
97
|
+
delete work;
|
|
98
|
+
UV_CONTEXT_LOCK();
|
|
99
|
+
}
|
|
100
|
+
UV_CONTEXT_UNLOCK();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
void UVContext::ProcessPendingWrapper(const FunctionCallbackInfo<Value>& info) {
|
|
104
|
+
UVContext* self = static_cast<UVContext*>(
|
|
105
|
+
info.Data().As<External>()->Value ());
|
|
106
|
+
self->ProcessPending();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
void UVContext::ProcessPendingWrapper(uv_async_t* handle) {
|
|
110
|
+
HandleScope scope;
|
|
111
|
+
|
|
112
|
+
auto self = static_cast<UVContext*>(handle->data);
|
|
113
|
+
auto module = Nan::New<Object>(self->module_);
|
|
114
|
+
auto process_pending = Nan::New<Function>(self->process_pending_);
|
|
115
|
+
self->async_resource_.runInAsyncScope(module, process_pending, 0, NULL);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
}
|
package/src/uv_context.h
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#ifndef FRIDANODE_UV_CONTEXT_H
|
|
2
|
+
#define FRIDANODE_UV_CONTEXT_H
|
|
3
|
+
|
|
4
|
+
#include <glib.h>
|
|
5
|
+
#include <nan.h>
|
|
6
|
+
|
|
7
|
+
#include <functional>
|
|
8
|
+
|
|
9
|
+
namespace frida {
|
|
10
|
+
|
|
11
|
+
class UVContext {
|
|
12
|
+
public:
|
|
13
|
+
UVContext(uv_loop_t* handle);
|
|
14
|
+
~UVContext();
|
|
15
|
+
|
|
16
|
+
void IncreaseUsage();
|
|
17
|
+
void DecreaseUsage();
|
|
18
|
+
|
|
19
|
+
void Schedule(std::function<void ()> f);
|
|
20
|
+
void Perform(std::function<void ()> f);
|
|
21
|
+
|
|
22
|
+
private:
|
|
23
|
+
static void DeleteAsyncHandle(uv_handle_t* handle);
|
|
24
|
+
void ProcessPending();
|
|
25
|
+
static void ProcessPendingWrapper(const v8::FunctionCallbackInfo<v8::Value>& info);
|
|
26
|
+
static void ProcessPendingWrapper(uv_async_t* handle);
|
|
27
|
+
|
|
28
|
+
int usage_count_;
|
|
29
|
+
uv_async_t* async_;
|
|
30
|
+
Nan::AsyncResource async_resource_;
|
|
31
|
+
GMutex mutex_;
|
|
32
|
+
GCond cond_;
|
|
33
|
+
GSList* pending_;
|
|
34
|
+
v8::Persistent<v8::Object> module_;
|
|
35
|
+
v8::Persistent<v8::Function> process_pending_;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
#endif
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* When this file is linked to a DLL, it sets up a delay-load hook that
|
|
3
|
+
* intervenes when the DLL is trying to load the host executable
|
|
4
|
+
* dynamically. Instead of trying to locate the .exe file it'll just
|
|
5
|
+
* return a handle to the process image.
|
|
6
|
+
*
|
|
7
|
+
* This allows compiled addons to work when the host executable is renamed.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#ifdef _MSC_VER
|
|
11
|
+
|
|
12
|
+
#pragma managed(push, off)
|
|
13
|
+
|
|
14
|
+
#ifndef WIN32_LEAN_AND_MEAN
|
|
15
|
+
#define WIN32_LEAN_AND_MEAN
|
|
16
|
+
#endif
|
|
17
|
+
|
|
18
|
+
#include <windows.h>
|
|
19
|
+
|
|
20
|
+
#include <delayimp.h>
|
|
21
|
+
#include <string.h>
|
|
22
|
+
|
|
23
|
+
static FARPROC WINAPI load_exe_hook(unsigned int event, DelayLoadInfo* info) {
|
|
24
|
+
#ifdef FRIDA_NODE_WEBKIT
|
|
25
|
+
static HMODULE node_dll = NULL;
|
|
26
|
+
static HMODULE nw_dll = NULL;
|
|
27
|
+
|
|
28
|
+
switch (event) {
|
|
29
|
+
case dliStartProcessing:
|
|
30
|
+
node_dll = GetModuleHandle("node.dll");
|
|
31
|
+
nw_dll = GetModuleHandle("nw.dll");
|
|
32
|
+
return NULL;
|
|
33
|
+
case dliNotePreLoadLibrary:
|
|
34
|
+
if (_stricmp(info->szDll, "node.exe") == 0)
|
|
35
|
+
return (FARPROC) node_dll;
|
|
36
|
+
return NULL;
|
|
37
|
+
case dliNotePreGetProcAddress: {
|
|
38
|
+
FARPROC ret = GetProcAddress(node_dll, info->dlp.szProcName);
|
|
39
|
+
if (ret)
|
|
40
|
+
return ret;
|
|
41
|
+
return GetProcAddress(nw_dll, info->dlp.szProcName);
|
|
42
|
+
}
|
|
43
|
+
default:
|
|
44
|
+
return NULL;
|
|
45
|
+
}
|
|
46
|
+
#else
|
|
47
|
+
HMODULE m;
|
|
48
|
+
if (event != dliNotePreLoadLibrary)
|
|
49
|
+
return NULL;
|
|
50
|
+
|
|
51
|
+
if (_stricmp(info->szDll, HOST_BINARY) != 0)
|
|
52
|
+
return NULL;
|
|
53
|
+
|
|
54
|
+
m = GetModuleHandle(NULL);
|
|
55
|
+
return (FARPROC) m;
|
|
56
|
+
#endif
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
decltype(__pfnDliNotifyHook2) __pfnDliNotifyHook2 = load_exe_hook;
|
|
60
|
+
|
|
61
|
+
#pragma managed(pop)
|
|
62
|
+
|
|
63
|
+
#endif
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
diff -Nur nan-2.18.0-orig/meson.build nan-2.18.0/meson.build
|
|
2
|
+
--- nan-2.18.0-orig/meson.build 1970-01-01 01:00:00.000000000 +0100
|
|
3
|
+
+++ nan-2.18.0/meson.build 2024-02-27 10:43:03.643648729 +0100
|
|
4
|
+
@@ -0,0 +1,9 @@
|
|
5
|
+
+project('nan', 'cpp',
|
|
6
|
+
+ version: '2.18.0',
|
|
7
|
+
+)
|
|
8
|
+
+
|
|
9
|
+
+nan_dep = declare_dependency(
|
|
10
|
+
+ include_directories: include_directories('.'),
|
|
11
|
+
+)
|
|
12
|
+
+
|
|
13
|
+
+meson.override_dependency('nan', nan_dep)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function targetProgram() {
|
|
2
|
+
const platform = process.platform;
|
|
3
|
+
if (platform === "win32") {
|
|
4
|
+
return "C:\\Windows\\notepad.exe";
|
|
5
|
+
} else if (platform === "darwin") {
|
|
6
|
+
return __dirname + "/unixvictim-macos";
|
|
7
|
+
} else if (platform === "linux" && ["ia32", "x64"].includes(process.arch)) {
|
|
8
|
+
const fridaArch = (process.arch === "x64") ? "x86_64" : "x86";
|
|
9
|
+
return __dirname + "/unixvictim-linux-" + fridaArch;
|
|
10
|
+
} else {
|
|
11
|
+
return "/bin/cat";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/test/device.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as frida from "../lib";
|
|
2
|
+
|
|
3
|
+
import { expect } from "chai";
|
|
4
|
+
import "mocha";
|
|
5
|
+
|
|
6
|
+
declare function gc(): void;
|
|
7
|
+
|
|
8
|
+
describe("Device", function () {
|
|
9
|
+
afterEach(gc);
|
|
10
|
+
|
|
11
|
+
it("should have some metadata", async () => {
|
|
12
|
+
const device = await frida.getLocalDevice();
|
|
13
|
+
expect(device.name).to.equal("Local System");
|
|
14
|
+
expect(device.type).to.equal("local");
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("should enumerate processes", async () => {
|
|
18
|
+
const device = await frida.getLocalDevice();
|
|
19
|
+
|
|
20
|
+
const processes = await device.enumerateProcesses();
|
|
21
|
+
expect(processes.length).to.be.above(0);
|
|
22
|
+
|
|
23
|
+
const process = processes[0];
|
|
24
|
+
expect(process.pid).to.be.at.least(0);
|
|
25
|
+
expect(process.name.length).to.be.greaterThan(0);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as frida from "../lib";
|
|
2
|
+
|
|
3
|
+
import { expect } from "chai";
|
|
4
|
+
import "mocha";
|
|
5
|
+
|
|
6
|
+
declare function gc(): void;
|
|
7
|
+
|
|
8
|
+
describe("DeviceManager", function () {
|
|
9
|
+
afterEach(gc);
|
|
10
|
+
|
|
11
|
+
it("should enumerate devices", async () => {
|
|
12
|
+
const deviceManager = frida.getDeviceManager();
|
|
13
|
+
const devices = await deviceManager.enumerateDevices();
|
|
14
|
+
expect(devices.length).to.be.above(0);
|
|
15
|
+
});
|
|
16
|
+
});
|
package/test/labrat.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as frida from "../lib";
|
|
2
|
+
import { targetProgram } from "./data";
|
|
3
|
+
|
|
4
|
+
export class LabRat {
|
|
5
|
+
private constructor(private _pid: number) {
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
get pid(): number {
|
|
9
|
+
return this._pid;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
static async start(): Promise<LabRat> {
|
|
13
|
+
const pid = await frida.spawn(targetProgram(), {
|
|
14
|
+
stdio: frida.Stdio.Pipe
|
|
15
|
+
});
|
|
16
|
+
await frida.resume(pid);
|
|
17
|
+
// TODO: improve injectors to handle injection into a process that hasn't yet finished initializing
|
|
18
|
+
await sleep(50);
|
|
19
|
+
|
|
20
|
+
return new LabRat(pid);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
stop(): void {
|
|
24
|
+
frida.kill(this._pid);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function sleep(delay: number): Promise<void> {
|
|
29
|
+
return new Promise(resolve => {
|
|
30
|
+
setTimeout(() => { resolve(); }, delay);
|
|
31
|
+
});
|
|
32
|
+
}
|
package/test/script.ts
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import * as frida from "../lib";
|
|
2
|
+
import { LabRat } from "./labrat";
|
|
3
|
+
|
|
4
|
+
import { expect } from "chai";
|
|
5
|
+
import "mocha";
|
|
6
|
+
|
|
7
|
+
declare function gc(): void;
|
|
8
|
+
|
|
9
|
+
describe("Script", function () {
|
|
10
|
+
let target: LabRat;
|
|
11
|
+
let session: frida.Session;
|
|
12
|
+
|
|
13
|
+
beforeEach(async () => {
|
|
14
|
+
target = await LabRat.start();
|
|
15
|
+
session = await frida.attach(target.pid);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
target.stop();
|
|
20
|
+
gc();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("should support rpc", async () => {
|
|
24
|
+
const script = await session.createScript(
|
|
25
|
+
"rpc.exports = {" +
|
|
26
|
+
"add: function (a, b) {" +
|
|
27
|
+
"var result = a + b;" +
|
|
28
|
+
"if (result < 0)" +
|
|
29
|
+
"throw new Error('No');" +
|
|
30
|
+
"return result;" +
|
|
31
|
+
"}," +
|
|
32
|
+
"sub: function (a, b) {" +
|
|
33
|
+
"return a - b;" +
|
|
34
|
+
"}," +
|
|
35
|
+
"speak: function () {" +
|
|
36
|
+
"var buf = Memory.allocUtf8String('Yo');" +
|
|
37
|
+
"return Memory.readByteArray(buf, 2);" +
|
|
38
|
+
"}" +
|
|
39
|
+
"};");
|
|
40
|
+
await script.load();
|
|
41
|
+
|
|
42
|
+
const agent = script.exports;
|
|
43
|
+
|
|
44
|
+
expect(await agent.add(2, 3)).to.equal(5);
|
|
45
|
+
expect(await agent.sub(5, 3)).to.equal(2);
|
|
46
|
+
|
|
47
|
+
let thrownException: Error | null = null;
|
|
48
|
+
try {
|
|
49
|
+
await agent.add(1, -2);
|
|
50
|
+
} catch (e) {
|
|
51
|
+
thrownException = e;
|
|
52
|
+
}
|
|
53
|
+
expect(thrownException).to.not.be.equal(null);
|
|
54
|
+
expect(thrownException.message).to.equal("No");
|
|
55
|
+
|
|
56
|
+
const buf = await agent.speak();
|
|
57
|
+
expect(buf.toJSON().data).to.deep.equal([0x59, 0x6f]);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it("should fail rpc request if post() fails", async () => {
|
|
61
|
+
const script = await session.createScript(
|
|
62
|
+
"rpc.exports = {" +
|
|
63
|
+
"init: function () {" +
|
|
64
|
+
"}" +
|
|
65
|
+
"};");
|
|
66
|
+
await script.load();
|
|
67
|
+
|
|
68
|
+
await session.detach();
|
|
69
|
+
|
|
70
|
+
let thrownException: Error | null = null;
|
|
71
|
+
try {
|
|
72
|
+
await script.exports.init();
|
|
73
|
+
} catch (e) {
|
|
74
|
+
thrownException = e;
|
|
75
|
+
}
|
|
76
|
+
expect(thrownException).to.not.equal(null);
|
|
77
|
+
expect(thrownException.message).to.equal("Script is destroyed");
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("should fail rpc request if script is unloaded mid-request", async () => {
|
|
81
|
+
const script = await session.createScript(
|
|
82
|
+
"rpc.exports = {" +
|
|
83
|
+
"waitForever: function () {" +
|
|
84
|
+
"return new Promise(function () {});" +
|
|
85
|
+
"}" +
|
|
86
|
+
"};");
|
|
87
|
+
await script.load();
|
|
88
|
+
|
|
89
|
+
setTimeout(() => script.unload(), 100);
|
|
90
|
+
|
|
91
|
+
let thrownException: Error | null = null;
|
|
92
|
+
try {
|
|
93
|
+
await script.exports.waitForever();
|
|
94
|
+
} catch (e) {
|
|
95
|
+
thrownException = e;
|
|
96
|
+
}
|
|
97
|
+
expect(thrownException).to.not.equal(null);
|
|
98
|
+
expect(thrownException.message).to.equal("Script is destroyed");
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("should fail rpc request if session gets detached mid-request", async () => {
|
|
102
|
+
const script = await session.createScript(
|
|
103
|
+
"rpc.exports = {" +
|
|
104
|
+
"waitForever: function () {" +
|
|
105
|
+
"return new Promise(function () {});" +
|
|
106
|
+
"}" +
|
|
107
|
+
"};");
|
|
108
|
+
await script.load();
|
|
109
|
+
|
|
110
|
+
setTimeout(() => target.stop(), 100);
|
|
111
|
+
|
|
112
|
+
let thrownException: Error | null = null;
|
|
113
|
+
try {
|
|
114
|
+
await script.exports.waitForever();
|
|
115
|
+
} catch (e) {
|
|
116
|
+
thrownException = e;
|
|
117
|
+
}
|
|
118
|
+
expect(thrownException).to.not.equal(null);
|
|
119
|
+
expect(thrownException.message).to.equal("Script is destroyed");
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("should fail rpc request if cancelled mid-request", async () => {
|
|
123
|
+
const cancellable = new frida.Cancellable();
|
|
124
|
+
|
|
125
|
+
const script = await session.createScript(
|
|
126
|
+
"rpc.exports = {" +
|
|
127
|
+
"waitForever: function () {" +
|
|
128
|
+
"return new Promise(function () {});" +
|
|
129
|
+
"}" +
|
|
130
|
+
"};", {}, cancellable);
|
|
131
|
+
await script.load(cancellable);
|
|
132
|
+
|
|
133
|
+
setTimeout(() => cancellable.cancel(), 100);
|
|
134
|
+
|
|
135
|
+
let thrownException: Error | null = null;
|
|
136
|
+
try {
|
|
137
|
+
await script.exports.waitForever(cancellable);
|
|
138
|
+
} catch (e) {
|
|
139
|
+
thrownException = e;
|
|
140
|
+
}
|
|
141
|
+
expect(thrownException).to.not.equal(null);
|
|
142
|
+
expect(thrownException.message).to.equal("Operation was cancelled");
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it("should support returning rpc exports object from async method", async () => {
|
|
146
|
+
const api = await load();
|
|
147
|
+
expect(await api.hello()).to.equal("Is it me you're looking for?");
|
|
148
|
+
|
|
149
|
+
async function load(): Promise<frida.ScriptExports> {
|
|
150
|
+
const script = await session.createScript(`
|
|
151
|
+
rpc.exports.hello = function () {
|
|
152
|
+
return "Is it me you're looking for?";
|
|
153
|
+
};`);
|
|
154
|
+
await script.load();
|
|
155
|
+
|
|
156
|
+
const api = script.exports;
|
|
157
|
+
|
|
158
|
+
expect(api.then).to.be.undefined;
|
|
159
|
+
expect(api.catch).to.be.undefined;
|
|
160
|
+
expect(api.finally).to.be.undefined;
|
|
161
|
+
|
|
162
|
+
return api;
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it("should support custom log handler", async () => {
|
|
167
|
+
const script = await session.createScript("console.error(new Error('test message'))");
|
|
168
|
+
|
|
169
|
+
script.logHandler = function (level, text) {
|
|
170
|
+
expect(level).to.equal("error");
|
|
171
|
+
expect(text).to.equal("Error: test message");
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
await script.load();
|
|
175
|
+
});
|
|
176
|
+
});
|
package/test/session.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import * as frida from "../lib";
|
|
2
|
+
import { LabRat } from "./labrat";
|
|
3
|
+
|
|
4
|
+
import { expect } from "chai";
|
|
5
|
+
import "mocha";
|
|
6
|
+
|
|
7
|
+
declare function gc(): void;
|
|
8
|
+
|
|
9
|
+
describe("Session", () => {
|
|
10
|
+
let target: LabRat;
|
|
11
|
+
let session: frida.Session;
|
|
12
|
+
|
|
13
|
+
beforeEach(async () => {
|
|
14
|
+
target = await LabRat.start();
|
|
15
|
+
session = await frida.attach(target.pid);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
target.stop();
|
|
20
|
+
gc();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("should have some metadata", () => {
|
|
24
|
+
expect(session.pid).to.equal(target.pid);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it("should support specifying which script runtime to use", async () => {
|
|
28
|
+
expect(await evaluteScript("Script.runtime")).to.equal("QJS");
|
|
29
|
+
expect(await evaluteScript("Script.runtime", { runtime: frida.ScriptRuntime.Default })).to.equal("QJS");
|
|
30
|
+
expect(await evaluteScript("Script.runtime", { runtime: frida.ScriptRuntime.QJS })).to.equal("QJS");
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
await evaluteScript("Script.runtime", { runtime: frida.ScriptRuntime.V8 });
|
|
34
|
+
} catch (e) {
|
|
35
|
+
if (/V8 runtime not available due to build configuration/.test(e.message)) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
throw e;
|
|
39
|
+
}
|
|
40
|
+
expect(await evaluteScript("Script.runtime", { runtime: frida.ScriptRuntime.V8 })).to.equal("V8");
|
|
41
|
+
|
|
42
|
+
const bytes = await session.compileScript("console.log('Hello World!');", { runtime: frida.ScriptRuntime.QJS });
|
|
43
|
+
expect(bytes).instanceOf(Buffer);
|
|
44
|
+
expect(bytes.length).to.be.greaterThan(0);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
async function evaluteScript(expression: string, options?: frida.ScriptOptions): Promise<string> {
|
|
48
|
+
const script = await session.createScript(`send(${expression});`, options);
|
|
49
|
+
|
|
50
|
+
const getMessageRequest = getNextMessage(script);
|
|
51
|
+
await script.load();
|
|
52
|
+
|
|
53
|
+
const message = await getMessageRequest;
|
|
54
|
+
|
|
55
|
+
await script.unload();
|
|
56
|
+
|
|
57
|
+
if (message.type !== frida.MessageType.Send) {
|
|
58
|
+
throw new Error("Unexpected message type");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return message.payload;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function getNextMessage(script: frida.Script): Promise<frida.Message> {
|
|
65
|
+
return new Promise(resolve => {
|
|
66
|
+
script.message.connect(onMessage);
|
|
67
|
+
|
|
68
|
+
function onMessage(message: frida.Message): void {
|
|
69
|
+
resolve(message);
|
|
70
|
+
script.message.disconnect(onMessage);
|
|
71
|
+
}
|
|
72
|
+
})
|
|
73
|
+
}});
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"lib": ["es2017"],
|
|
4
|
+
"target": "es2017",
|
|
5
|
+
"module": "commonjs",
|
|
6
|
+
"declaration": true,
|
|
7
|
+
"outDir": "./dist",
|
|
8
|
+
"typeRoots": [
|
|
9
|
+
"node_modules/@types"
|
|
10
|
+
],
|
|
11
|
+
"types": [
|
|
12
|
+
"node"
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
"include": [
|
|
16
|
+
"lib/**/*"
|
|
17
|
+
]
|
|
18
|
+
}
|