Skip to content

Commit

Permalink
Add frida-portal and massive connectivity improvements
Browse files Browse the repository at this point in the history
- Introduce PortalService API and daemon, a network service that
  orchestrates a cluster of remote processes instrumented by Frida.
  Implements both a frida-server compatible control interface, as well
  as a cluster interface that agents and gadgets in target processes can
  talk to. Connected controllers can enumerate processes as if they were
  local to the system where the portal is running, and are able to
  attach() and also enable spawn-gating to apply early instrumentation.
- Add Session.join_portal(), making it easy to share control of a
  process with a remote PortalService, joining its cluster together with
  other nodes.
- Add “connect” interaction to frida-gadget, so it can join a
  PortalService cluster as well.
- Add PortalClient, used to implement Session.join_portal() and
  frida-gadget's “connect” interaction. Connects to the PortalService
  and joins its cluster. Implements automatic reconnect in case of
  transient failures. Also supports specifying an ACL, which is a list
  of tags that the PortalService must require connected controllers to
  possess at least one of. It's up to the application to implement
  tagging of controllers based on e.g. authentication.
- Add Device.bus API to allow clients connected to a PortalService to
  exchange application-specific messages with it. Requires instantiating
  the service using the API in order to wire up message handlers and
  protocol logic.
- Add Session persistence support, enabled by specifying a non-zero
  “persist_timeout” option when attach()ing to a process. When the
  server subsequently detects that the client owning the session got
  disconnected, it will allow scripts to stay loaded until the timeout
  (in seconds) is reached. Any script and debugger messages emitted in
  the meantime are queued, and may later be delivered if the client
  returns before the timeout is reached.
- Add TLS support, enabled by specifying a certificate. On the server
  end this is a PEM with a public and private key, where the server
  will accept any certificate from the client's side. However for the
  client this is a PEM with the public key of a trusted CA, which the
  server's certificate must match or be derived from.
- Add authentication support, enabled by specifying a token. The daemons
  allow specifying a static token through a CLI option, and the APIs
  allow plugging in a custom authentication backend -- which means the
  token can be interpreted as desired.
- Add protocol-level keepalives.
- Add WebGatewayService API and daemon, allowing browsers to talk to a
  control service such as frida-server.
- Implement WebRTC Data Channel compatible peer-to-peer support, enabled
  by calling setup_peer_connection() on Session. This allows a direct
  connection to be established between the client and the remote
  process, which is useful when talking to it through e.g. a portal.
- Optimize protocol by skipping the DBus authentication handshake and
  telling GDBus not to fetch properties, saving an additional roundtrip.
- Drop deprecated protocol bits, such as Session.enable_jit().
- Bump protocol version to v15.

Kudos to @dweinstein for suggesting and helping shape the portal
feature, and @asabil, @meme, and @mrmacete, for reviewing and helping
shape and name things.
  • Loading branch information
oleavr committed Jun 8, 2021
1 parent 2cb83c8 commit a5e3af6
Show file tree
Hide file tree
Showing 125 changed files with 12,754 additions and 4,121 deletions.
6 changes: 3 additions & 3 deletions config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@
/* Define to 1 if you have the <locale.h> header file. */
#mesondefine HAVE_LOCALE_H

/* Define to 1 if libnice is available. */
#mesondefine HAVE_NICE

/* Define to 1 if you have the <xlocale.h> header file. */
#mesondefine HAVE_XLOCALE_H

Expand All @@ -60,9 +63,6 @@
/* Define to 1 if libc is uClibc. */
#mesondefine HAVE_UCLIBC

/* Define to 1 if gioschannel is available. */
#mesondefine HAVE_GIOSCHANNEL

/* Define to 1 if gioopenssl is available. */
#mesondefine HAVE_GIOOPENSSL

Expand Down
115 changes: 85 additions & 30 deletions frida-core.vcxproj

Large diffs are not rendered by default.

42 changes: 36 additions & 6 deletions frida-core.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,6 @@
<CustomBuild Include="src\frida.vala">
<Filter>Source Files</Filter>
</CustomBuild>
<None Include="src\debugger.vala">
<Filter>Source Files</Filter>
</None>
<None Include="src\host-session-service.vala">
<Filter>Source Files</Filter>
</None>
Expand Down Expand Up @@ -134,9 +131,6 @@
<ClCompile Include="src\frida-glue.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="$(IntDir)src\debugger.c">
<Filter>Source Files\generated\core</Filter>
</ClCompile>
<ClCompile Include="$(IntDir)src\host-session-service.c">
<Filter>Source Files\generated\core</Filter>
</ClCompile>
Expand Down Expand Up @@ -238,6 +232,24 @@
<ClCompile Include="$(IntDir)src\droidy\jdwp.c">
<Filter>Source Files\generated\droidy</Filter>
</ClCompile>
<ClCompile Include="$(IntDir)src\async-task.c">
<Filter>Source Files\generated\core</Filter>
</ClCompile>
<ClCompile Include="$(IntDir)src\control-service.c">
<Filter>Source Files\generated\core</Filter>
</ClCompile>
<ClCompile Include="$(IntDir)src\endpoint.c">
<Filter>Source Files\generated\core</Filter>
</ClCompile>
<ClCompile Include="$(IntDir)src\file-monitor.c">
<Filter>Source Files\generated\core</Filter>
</ClCompile>
<ClCompile Include="$(IntDir)src\portal-service.c">
<Filter>Source Files\generated\core</Filter>
</ClCompile>
<ClCompile Include="$(IntDir)src\web-gateway-service.c">
<Filter>Source Files\generated\core</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="src\droidy\injector.vala">
Expand All @@ -246,5 +258,23 @@
<None Include="src\droidy\jdwp.vala">
<Filter>Source Files\droidy</Filter>
</None>
<None Include="src\async-task.vala">
<Filter>Source Files</Filter>
</None>
<None Include="src\control-service.vala">
<Filter>Source Files</Filter>
</None>
<None Include="src\endpoint.vala">
<Filter>Source Files</Filter>
</None>
<None Include="src\file-monitor.vala">
<Filter>Source Files</Filter>
</None>
<None Include="src\portal-service.vala">
<Filter>Source Files</Filter>
</None>
<None Include="src\web-gateway-service.vala">
<Filter>Source Files</Filter>
</None>
</ItemGroup>
</Project>
40 changes: 20 additions & 20 deletions frida-gadget.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -86,72 +86,72 @@
<ModuleDefinitionFile>lib\gadget\frida-gadget.def</ModuleDefinitionFile>
<SubSystem>Windows</SubSystem>
<TargetMachine>MachineX86</TargetMachine>
<AdditionalDependencies>gum-32.lib;gumjs-32.lib;frida-interfaces-32.lib;frida-payload-32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(IntDir)..\frida-interfaces-32;$(IntDir)..\frida-payload-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>gum-32.lib;gumjs-32.lib;frida-base-32.lib;frida-payload-32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(IntDir)..\frida-base-32;$(IntDir)..\frida-payload-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
<ClCompile>
<PreprocessorDefinitions>HAVE_I386=1;HAVE_WINDOWS=1;HAVE_GIOSCHANNEL=1;G_LOG_DOMAIN="Frida";$(FridaComponentDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir)..\frida-interfaces-32;$(IntDir)..\frida-payload-32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>$(FridaCoreDefines);$(FridaComponentDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir)..\frida-base-32;$(IntDir)..\frida-payload-32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Link>
<ModuleDefinitionFile>lib\gadget\frida-gadget.def</ModuleDefinitionFile>
<SubSystem>Windows</SubSystem>
<TargetMachine>MachineX64</TargetMachine>
<AdditionalDependencies>gum-64.lib;gumjs-64.lib;frida-interfaces-64.lib;frida-payload-64.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(IntDir)..\frida-interfaces-64;$(IntDir)..\frida-payload-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>gum-64.lib;gumjs-64.lib;frida-base-64.lib;frida-payload-64.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(IntDir)..\frida-base-64;$(IntDir)..\frida-payload-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
<ClCompile>
<PreprocessorDefinitions>HAVE_I386=1;HAVE_WINDOWS=1;HAVE_GIOSCHANNEL=1;G_LOG_DOMAIN="Frida";$(FridaComponentDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir)..\frida-interfaces-64;$(IntDir)..\frida-payload-64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>$(FridaCoreDefines);$(FridaComponentDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir)..\frida-base-64;$(IntDir)..\frida-payload-64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Link>
<ModuleDefinitionFile>lib\gadget\frida-gadget.def</ModuleDefinitionFile>
<SubSystem>Windows</SubSystem>
<TargetMachine>MachineX86</TargetMachine>
<AdditionalDependencies>gum-32.lib;gumjs-32.lib;frida-interfaces-32.lib;frida-payload-32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(IntDir)..\frida-interfaces-32;$(IntDir)..\frida-payload-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>gum-32.lib;gumjs-32.lib;frida-base-32.lib;frida-payload-32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(IntDir)..\frida-base-32;$(IntDir)..\frida-payload-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
<ClCompile>
<PreprocessorDefinitions>HAVE_I386=1;HAVE_WINDOWS=1;HAVE_GIOSCHANNEL=1;G_LOG_DOMAIN="Frida";$(FridaComponentDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir)..\frida-interfaces-32;$(IntDir)..\frida-payload-32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>$(FridaCoreDefines);$(FridaComponentDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir)..\frida-base-32;$(IntDir)..\frida-payload-32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Link>
<ModuleDefinitionFile>lib\gadget\frida-gadget.def</ModuleDefinitionFile>
<SubSystem>Windows</SubSystem>
<TargetMachine>MachineX64</TargetMachine>
<AdditionalDependencies>gum-64.lib;gumjs-64.lib;frida-interfaces-64.lib;frida-payload-64.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(IntDir)..\frida-interfaces-64;$(IntDir)..\frida-payload-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>gum-64.lib;gumjs-64.lib;frida-base-64.lib;frida-payload-64.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(IntDir)..\frida-base-64;$(IntDir)..\frida-payload-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
<ClCompile>
<PreprocessorDefinitions>HAVE_I386=1;HAVE_WINDOWS=1;HAVE_GIOSCHANNEL=1;G_LOG_DOMAIN="Frida";$(FridaComponentDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir)..\frida-interfaces-64;$(IntDir)..\frida-payload-64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>$(FridaCoreDefines);$(FridaComponentDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir)..\frida-base-64;$(IntDir)..\frida-payload-64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup>
<CustomBuild Include="lib\gadget\gadget.vala">
<FileType>Document</FileType>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(ValaCompiler)" lib/gadget/gadget.vala -D WINDOWS --ccode --directory=$(IntDir) --library=frida-gadget --header=$(IntDir)frida-gadget.h --symbols=$(IntDir)frida-gadget.symbols --vapidir="$(IntDir)..\frida-interfaces-32" --vapidir="$(IntDir)..\frida-interfaces-64" --vapidir="$(IntDir)..\frida-payload-32" --vapidir="$(IntDir)..\frida-payload-64" $(ValaFlags) --pkg config --pkg=gee-0.8 --pkg=gio-2.0 --pkg=json-glib-1.0 --pkg=frida-gum-1.0 --pkg=frida-gumjs-1.0 --pkg=frida-interfaces --pkg=frida-payload || exit 1
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(ValaCompiler)" lib/gadget/gadget.vala --ccode --directory=$(IntDir) --library=frida-gadget --header=$(IntDir)frida-gadget.h --symbols=$(IntDir)frida-gadget.symbols --vapidir="$(IntDir)..\frida-base-32" --vapidir="$(IntDir)..\frida-base-64" --vapidir="$(IntDir)..\frida-payload-32" --vapidir="$(IntDir)..\frida-payload-64" $(ValaFlags) $(FridaCoreValaFlags) --pkg config --pkg=gee-0.8 --pkg=gio-2.0 --pkg=nice --pkg=json-glib-1.0 --pkg=frida-gum-1.0 --pkg=frida-gumjs-1.0 --pkg=frida-base --pkg=frida-payload || exit 1
echo &gt; "$(IntDir)valacode.stamp"</Command>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compiling vala code</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)valacode.stamp;%(Outputs)</Outputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ValaCompiler);%(AdditionalInputs)</AdditionalInputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(ValaCompiler)" lib/gadget/gadget.vala -D WINDOWS --ccode --directory=$(IntDir) --library=frida-gadget --header=$(IntDir)frida-gadget.h --symbols=$(IntDir)frida-gadget.symbols --vapidir="$(IntDir)..\frida-interfaces-32" --vapidir="$(IntDir)..\frida-interfaces-64" --vapidir="$(IntDir)..\frida-payload-32" --vapidir="$(IntDir)..\frida-payload-64" $(ValaFlags) --pkg config --pkg=gee-0.8 --pkg=gio-2.0 --pkg=json-glib-1.0 --pkg=frida-gum-1.0 --pkg=frida-gumjs-1.0 --pkg=frida-interfaces --pkg=frida-payload || exit 1
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(ValaCompiler)" lib/gadget/gadget.vala --ccode --directory=$(IntDir) --library=frida-gadget --header=$(IntDir)frida-gadget.h --symbols=$(IntDir)frida-gadget.symbols --vapidir="$(IntDir)..\frida-base-32" --vapidir="$(IntDir)..\frida-base-64" --vapidir="$(IntDir)..\frida-payload-32" --vapidir="$(IntDir)..\frida-payload-64" $(ValaFlags) $(FridaCoreValaFlags) --pkg config --pkg=gee-0.8 --pkg=gio-2.0 --pkg=nice --pkg=json-glib-1.0 --pkg=frida-gum-1.0 --pkg=frida-gumjs-1.0 --pkg=frida-base --pkg=frida-payload || exit 1
echo &gt; "$(IntDir)valacode.stamp"</Command>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compiling vala code</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)valacode.stamp;%(Outputs)</Outputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(ValaCompiler);%(AdditionalInputs)</AdditionalInputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(ValaCompiler)" lib/gadget/gadget.vala -D WINDOWS --ccode --directory=$(IntDir) --library=frida-gadget --header=$(IntDir)frida-gadget.h --symbols=$(IntDir)frida-gadget.symbols --vapidir="$(IntDir)..\frida-interfaces-32" --vapidir="$(IntDir)..\frida-interfaces-64" --vapidir="$(IntDir)..\frida-payload-32" --vapidir="$(IntDir)..\frida-payload-64" $(ValaFlags) --pkg config --pkg=gee-0.8 --pkg=gio-2.0 --pkg=json-glib-1.0 --pkg=frida-gum-1.0 --pkg=frida-gumjs-1.0 --pkg=frida-interfaces --pkg=frida-payload || exit 1
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(ValaCompiler)" lib/gadget/gadget.vala --ccode --directory=$(IntDir) --library=frida-gadget --header=$(IntDir)frida-gadget.h --symbols=$(IntDir)frida-gadget.symbols --vapidir="$(IntDir)..\frida-base-32" --vapidir="$(IntDir)..\frida-base-64" --vapidir="$(IntDir)..\frida-payload-32" --vapidir="$(IntDir)..\frida-payload-64" $(ValaFlags) $(FridaCoreValaFlags) --pkg config --pkg=gee-0.8 --pkg=gio-2.0 --pkg=nice --pkg=json-glib-1.0 --pkg=frida-gum-1.0 --pkg=frida-gumjs-1.0 --pkg=frida-base --pkg=frida-payload || exit 1
echo &gt; "$(IntDir)valacode.stamp"</Command>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling vala code</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)valacode.stamp;%(Outputs)</Outputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ValaCompiler);%(AdditionalInputs)</AdditionalInputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(ValaCompiler)" lib/gadget/gadget.vala -D WINDOWS --ccode --directory=$(IntDir) --library=frida-gadget --header=$(IntDir)frida-gadget.h --symbols=$(IntDir)frida-gadget.symbols --vapidir="$(IntDir)..\frida-interfaces-32" --vapidir="$(IntDir)..\frida-interfaces-64" --vapidir="$(IntDir)..\frida-payload-32" --vapidir="$(IntDir)..\frida-payload-64" $(ValaFlags) --pkg config --pkg=gee-0.8 --pkg=gio-2.0 --pkg=json-glib-1.0 --pkg=frida-gum-1.0 --pkg=frida-gumjs-1.0 --pkg=frida-interfaces --pkg=frida-payload || exit 1
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(ValaCompiler)" lib/gadget/gadget.vala --ccode --directory=$(IntDir) --library=frida-gadget --header=$(IntDir)frida-gadget.h --symbols=$(IntDir)frida-gadget.symbols --vapidir="$(IntDir)..\frida-base-32" --vapidir="$(IntDir)..\frida-base-64" --vapidir="$(IntDir)..\frida-payload-32" --vapidir="$(IntDir)..\frida-payload-64" $(ValaFlags) $(FridaCoreValaFlags) --pkg config --pkg=gee-0.8 --pkg=gio-2.0 --pkg=nice --pkg=json-glib-1.0 --pkg=frida-gum-1.0 --pkg=frida-gumjs-1.0 --pkg=frida-base --pkg=frida-payload || exit 1
echo &gt; "$(IntDir)valacode.stamp"</Command>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling vala code</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)valacode.stamp;%(Outputs)</Outputs>
Expand Down
Loading

0 comments on commit a5e3af6

Please sign in to comment.