Code Monkey home page Code Monkey logo

r2frida's Introduction

r2frida

Radare2 and Frida better together.

ci

Description

This is a self-contained plugin for radare2 that allows to instrument remote processes using frida.

The radare project brings a complete toolchain for reverse engineering, providing well maintained functionalities and extend its features with other programming languages and tools.

Frida is a dynamic instrumentation toolkit that makes it easy to inspect and manipulate running processes by injecting your own JavaScript, and optionally also communicate with your scripts.

Features

  • Run unmodified Frida scripts (Use the :. command)
  • Execute snippets in C, Javascript or TypeScript in any process
  • Can attach, spawn or launch in local or remote systems
  • List sections, symbols, exports, protocols, classes, methods
  • Search for values in memory inside the agent or from the host
  • Replace method implementations or create hooks with short commands
  • Load libraries and frameworks in the target process
  • Support Dalvik, Java, ObjC, Swift and C interfaces
  • Manipulate file descriptors and environment variables
  • Send signals to the process, continue, breakpoints
  • The r2frida io plugin is also a filesystem fs and debug backend
  • Automate r2 and frida using r2pipe
  • Read/Write process memory
  • Call functions, syscalls and raw code snippets
  • Connect to frida-server via usb or tcp/ip
  • Enumerate apps and processes
  • Trace registers, arguments of functions
  • Tested on x64, arm32 and arm64 for Linux, Windows, macOS, iOS and Android
  • Doesn't require frida to be installed in the host (no need for frida-tools)
  • Extend the r2frida commands with plugins that run in the agent
  • Change page permissions, patch code and data
  • Resolve symbols by name or address and import them as flags into r2
  • Run r2 commands in the host from the agent
  • Use r2 apis and run r2 commands inside the remote target process.
  • Native breakpoints using the :db api
  • Access remote filesystems using the r_fs api.

Installation

The recommended way to install r2frida is via r2pm:

$ r2pm -ci r2frida

Binary builds that don't require compilation will be soon supported in r2pm and r2env. Meanwhile feel free to download the last builds from the Releases page.

Compilation

Dependencies

  • radare2
  • pkg-config (not required on windows)
  • curl or wget
  • make, gcc
  • npm, nodejs (will be soon removed)

In GNU/Debian you will need to install the following packages:

$ sudo apt install -y make gcc libzip-dev nodejs npm curl pkg-config git

Instructions

$ git clone https://github.com/nowsecure/r2frida.git
$ cd r2frida
$ make
$ make user-install

Windows

  • Install meson and Visual Studio
  • Unzip the latest radare2 release zip in the r2frida root directory
  • Rename it to radare2 (instead of radare2-x.y.z)
  • To make the VS compiler available in PATH (preconfigure.bat)
  • Run configure.bat and then make.bat

Usage

For testing, use r2 frida://0, as attaching to the pid0 in frida is a special session that runs in local. Now you can run the :? command to get the list of commands available.

$ r2 'frida://?'
r2 frida://[action]/[link]/[device]/[target]
* action = list | apps | attach | spawn | launch
* link   = local | usb | remote host:port
* device = '' | host:port | device-id
* target = pid | appname | process-name | program-in-path | abspath
Local:
* frida://?                        # show this help
* frida://                         # list local processes
* frida://0                        # attach to frida-helper (no spawn needed)
* frida:///usr/local/bin/rax2      # abspath to spawn
* frida://rax2                     # same as above, considering local/bin is in PATH
* frida://spawn/$(program)         # spawn a new process in the current system
* frida://attach/(target)          # attach to target PID in current host
USB:
* frida://list/usb//               # list processes in the first usb device
* frida://apps/usb//               # list apps in the first usb device
* frida://attach/usb//12345        # attach to given pid in the first usb device
* frida://spawn/usb//appname       # spawn an app in the first resolved usb device
* frida://launch/usb//appname      # spawn+resume an app in the first usb device
Remote:
* frida://attach/remote/10.0.0.3:9999/558 # attach to pid 558 on tcp remote frida-server
Environment: (Use the `%` command to change the environment at runtime)
  R2FRIDA_SAFE_IO=0|1              # Workaround a Frida bug on Android/thumb
  R2FRIDA_DEBUG=0|1                # Used to debug argument parsing behaviour
  R2FRIDA_COMPILER_DISABLE=0|1     # Disable the new frida typescript compiler (`:. foo.ts`)
  R2FRIDA_AGENT_SCRIPT=[file]      # path to file of the r2frida agent

Examples

$ r2 frida://0     # same as frida -p 0, connects to a local session

You can attach, spawn or launch to any program by name or pid, The following line will attach to the first process named rax2 (run rax2 - in another terminal to test this line)

$ r2 frida://rax2  # attach to the first process named `rax2`
$ r2 frida://1234  # attach to the given pid

Using the absolute path of a binary to spawn will spawn the process:

$ r2 frida:///bin/ls
[0x00000000]> :dc        # continue the execution of the target program

Also works with arguments:

$ r2 frida://"/bin/ls -al"

For USB debugging iOS/Android apps use these actions. Note that spawn can be replaced with launch or attach, and the process name can be the bundleid or the PID.

$ r2 frida://spawn/usb/         # enumerate devices
$ r2 frida://spawn/usb//        # enumerate apps in the first iOS device
$ r2 frida://spawn/usb//Weather # Run the weather app

Commands

These are the most frequent commands, so you must learn them and suffix it with ? to get subcommands help.

:i        # get information of the target (pid, name, home, arch, bits, ..)
.:i*      # import the target process details into local r2
:?        # show all the available commands
:dm       # list maps. Use ':dm|head' and seek to the program base address
:iE       # list the exports of the current binary (seek)
:dt fread # trace the 'fread' function
:dt-*     # delete all traces

Plugins

r2frida plugins run in the agent side and are registered with the r2frida.pluginRegister API.

See the plugins/ directory for some more example plugin scripts.

[0x00000000]> cat example.js
r2frida.pluginRegister('test', function(name) {
  if (name === 'test') {
    return function(args) {
      console.log('Hello Args From r2frida plugin', args);
      return 'Things Happen';
    }
  }
});
[0x00000000]> :. example.js   # load the plugin script

The :. command works like the r2's . command, but runs inside the agent.

:. a.js  # run script which registers a plugin
:.       # list plugins
:.-test  # unload a plugin by name
:.. a.js # eternalize script (keeps running after detach)

Termux

If you are willing to install and use r2frida natively on Android via Termux, there are some caveats with the library dependencies because of some symbol resolutions. The way to make this work is by extending the LD_LIBRARY_PATH environment to point to the system directory before the termux libdir.

$ LD_LIBRARY_PATH=/system/lib64:$LD_LIBRARY_PATH r2 frida://...

Troubleshooting

Ensure you are using a modern version of r2 (preferibly last release or git).

Run r2 -L | grep frida to verify if the plugin is loaded, if nothing is printed use the R2_DEBUG=1 environment variable to get some debugging messages to find out the reason.

If you have problems compiling r2frida you can use r2env or fetch the release builds from the GitHub releases page, bear in mind that only MAJOR.MINOR version must match, this is r2-5.7.6 can load any plugin compiled on any version between 5.7.0 and 5.7.8.

Design

 +---------+
 | radare2 |     The radare2 tool, on top of the rest
 +---------+
      :
 +----------+
 | io_frida |    r2frida io plugin
 +----------+
      :
 +---------+
 |  frida  |     Frida host APIs and logic to interact with target
 +---------+
      :
  +-------+
  |  app  |      Target process instrumented by Frida with Javascript
  +-------+

Credits

This plugin has been developed by pancake aka Sergi Alvarez (the author of radare2) for NowSecure.

I would like to thank Ole André for writing and maintaining Frida as well as being so kind to proactively fix bugs and discuss technical details on anything needed to make this union to work. Kudos

r2frida's People

Contributors

0verflowme avatar adrivillab avatar aemmitt-ns avatar alvarofe avatar apkunpacker avatar as0ler avatar berojgaaraadmi avatar dependabot[bot] avatar dweinstein avatar enovella avatar gogo2464 avatar gustavolcr avatar hexploitable avatar kin9-0rz avatar mame82 avatar manouchehri avatar mohamedx99 avatar mriamnobody avatar mrmacete avatar oleavr avatar prodrigestivill avatar radare avatar redmed666 avatar renovate-bot avatar renovate[bot] avatar t3rminalv avatar trufae avatar unabomber78 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

r2frida's Issues

Segmentation fault: 11 on Mac OS Sierra

Hello!
I installed r2frida from r2pm: r2pm -i r2frida
I executed r2 frida:///bin/ls and got an error

$ r2 frida:///bin/ls
syntax error: error in error handling
syntax error: error in error handling
syntax error: error in error handling
Segmentation fault: 11

How to fix it?

Error when building `io_frida.dylib`

I try to install r2frida by executing r2pm install r2frida, but it gives me an error below.

syntax error: error in error handling
syntax error: error in error handling
Processing r2frida ...
Already up-to-date.
Install Done For r2frida
Makefile:1: config.mk: No such file or directory
./configure
checking build system type... x86_64-unknown-darwin
checking host system type... x86_64-unknown-darwin
checking target system type... x86_64-unknown-darwin
checking for working directories... current
using prefix '/usr/local'
checking for c compiler... gcc
checking for c++ compiler... g++
Using PKGCONFIG: pkg-config
checking pkg-config flags for r_core... yes
checking for curl... /usr/bin/curl
checking for wget... /usr/local/bin/wget
checking for git... /usr/bin/git
checking for xz... /usr/local/bin/xz
checking for node... /usr/local/bin/node
checking for npm... /usr/local/bin/npm
creating ./config.mk
cleaning temporally files... done

Final report:
 - WITH_CYLANG = 0
rm -f ext/frida
mkdir -p ext/frida-mac-9.1.26/_
curl -Ls https://github.com/frida/frida/releases/download/9.1.26/frida-core-devkit-9.1.26-mac-x86_64.tar.xz | xz -d | tar -C ext/frida-mac-9.1.26/_ -xf -
mv ext/frida-mac-9.1.26/_/* ext/frida-mac-9.1.26
rmdir ext/frida-mac-9.1.26/_
#mv ext/frida ext/frida-mac-9.1.26
cd ext && ln -fs frida-mac-9.1.26 frida
[ "`readlink ext/frida`" = frida-mac-9.1.26 ] || \
		(cd ext && rm -f frida ; ln -fs frida-mac-9.1.26 frida)
make io_frida.dylib
pkg-config --cflags r_core
-I/usr/local/Cellar/radare2/1.1.0_1/include/libr
c++ src/io_frida.o -o io_frida.dylib -shared -fPIC -L/usr/local/Cellar/radare2/1.1.0_1/lib -lr_core -lr_config -lr_cons -lr_io -lr_util -lr_flag -lr_asm -lr_debug -lr_hash -lr_bin -lr_lang -lr_io -lr_anal -lr_parse -lr_bp -lr_egg -lr_reg -lr_search -lr_syscall -lr_socket -lr_fs -lr_magic -lr_crypto -Wl,-no_compact_unwind ext/frida/libfrida-core.a -lresolv -framework Foundation -lbsm -framework AppKit
Undefined symbols for architecture x86_64:
  "_r_str_appendf", referenced from:
      _slurpFile in io_frida.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [io_frida.dylib] Error 1
make: *** [all] Error 2
ERROR: Build failed

Did I miss any steps here?

-s is not working


$ r2frida -s -U Settings
Missing target

but src/main.js works:

$ node main.js -U Settings
[+] Using usb target
Attaching to Settings using iPhone
[0x00000000]> i
[0x00000000]> e asm.arch = arm
e asm.bits = 64
e asm.os = darwin
e bin.lang = objc
# pid 53855

Implement step-into

r2 can analyze code and determine which are the next possible instructions. like it's done with the dbg.swstep option in the debugger. r2frida can emulate software stepping by using breakpoints on every possible next instruction. This can be tricky sometimes.

Check maps before setting the breakpoint

To avoid users think it's a Frida problem that is not able to set a breakpoint on a non-allocated page, and show proper issue when doing it non-executable regions

Cannot install on OS X El Capitan

Log

$ r2pm -i r2frida
...
cc -c -I/Users/dukebarman/.config/radare2/prefix//include/ -fPIC  -Iext/frida src/io_frida.c -o src/io_frida.o
Package r_io was not found in the pkg-config search path.
Perhaps you should add the directory containing `r_io.pc'
to the PKG_CONFIG_PATH environment variable
No package 'r_io' found
Package r_io was not found in the pkg-config search path.
Perhaps you should add the directory containing `r_io.pc'
to the PKG_CONFIG_PATH environment variable
No package 'r_io' found
src/io_frida.c:3:10: fatal error: 'r_io.h' file not found
#include <r_io.h>
         ^
1 error generated.
Makefile:35: recipe for target 'src/io_frida.o' failed
gmake: *** [src/io_frida.o] Error 1
Package r_io was not found in the pkg-config search path.
Perhaps you should add the directory containing `r_io.pc'
to the PKG_CONFIG_PATH environment variable
No package 'r_io' found
cc -c -I/Users/dukebarman/.config/radare2/prefix//include/ -fPIC  -Iext/frida src/io_frida.c -o src/io_frida.o
Package r_io was not found in the pkg-config search path.
Perhaps you should add the directory containing `r_io.pc'
to the PKG_CONFIG_PATH environment variable
No package 'r_io' found
Package r_io was not found in the pkg-config search path.
Perhaps you should add the directory containing `r_io.pc'
to the PKG_CONFIG_PATH environment variable
No package 'r_io' found
src/io_frida.c:3:10: fatal error: 'r_io.h' file not found
#include <r_io.h>
         ^
1 error generated.
Makefile:35: recipe for target 'src/io_frida.o' failed
gmake: *** [src/io_frida.o] Error 1

Replacing Method Implementation commands

We have commands in r2frida to change the return value of a native function, it will be good to be able to replace the implementation or do the same for managed methods in Java or ObjC, allowing the function to return a specific number, boolean value, string or null.

            var TMS = Java.use("android.telephony.TelephonyManager");
            TMS.getDeviceId.implementation = function () {
                send("Called - deviceID()");
                return "pwn3d";
            };

Duplicates in \is

alvaro@alvaro:~$ r2 frida://cat                           
Warning: r2frida cannot initialize mjolner
fstat : Error: expected a pointer
 -- 255 shades of (truecolor) grey
[0x00000000]> \is write
0x7f51d5666cc0
0x7f51d4e13620
0x7f51d5666cc0
0x7f51d4e13620
0x7f51d5666cc0

I would add modules as well in the output.

Repo Update Needed

Overview

We are asking that you update your Repo to address the issues below. If this Repo is no longer being used please indicate that in a comment below.

  • Add a build badge to your README.md.
  • Add a dependencies badge to your README.md (npm-dm.nowsecure.io).
  • Your repo does not have any tests. Add your tests as well as what framework you are using.
  • Update your dependencies.

Add commands to change function argument parameters

We have commands to change return value of functions, but we cant change function parameters from r2frida yet (unless the user types a long js oneliner). We should be able to do this:

  • Change parameters passed to function when called
  • Remove hook after being executed (one shot hooks)
  • Change return value of function after executing it its body
  • Override function implementation and just return something
  • Implement function body in r2 commands (FUTURE)

Better integration between r2 and frida

So my idea is that we should be able to use r2pipe from frida-target, using the require statement.

the open method should be different, we can add a openFrida method that:

  • dlopen libr2.so
  • resolves r_core_new ... methods like the openNative one
  • open the self:// file

This way the target script can run r2 commands and read/write process memory from inside Frida.
This will be handy for disasm and code analysis

The other part consists in implementing the io connection for frida:// in r2, we should be able to use r2pipe from frida (host)

You can even provide frida builds with r2 inside. Or just like the gadget thing

The != command can be used to send commands to the target frida

Implement more search commands

Other useful / commands to have in r2frida:

  • /v[1,2,4,8] will be also nice
  • /c -- disassemble until instruction matches given string
  •  /R -- search for ROP gadgets (implement rop.js ?)
  • /r -- search for references to address
  • /V min max -- find value in range
  • /w -- wide string (done but not working)
  • /z -- #92

Can't find OpenSSL includes on macOS High Sierra

It looks like the install process can't find the OpenSSL includes on macOS High Sierra. Here's the log:

$ r2pm install r2frida
syntax error: error in error handling
syntax error: error in error handling
syntax error: error in error handling
Already up-to-date.
Install Done For r2frida
[ "`readlink ext/frida`" = frida-macos-10.6.13 ] || \
		(cd ext && rm -f frida ; ln -fs frida-macos-10.6.13 frida)
make io_frida.dylib
cc -c -fPIC -I/usr/local/Cellar/radare2/2.0.1/include/libr -DWITH_CYLANG=0 -Iext/frida src/io_frida.c -o src/io_frida.o
In file included from src/io_frida.c:3:
In file included from /usr/local/Cellar/radare2/2.0.1/include/libr/r_core.h:6:
/usr/local/Cellar/radare2/2.0.1/include/libr/r_socket.h:28:10: fatal error: 'openssl/ssl.h' file not found
#include <openssl/ssl.h>
         ^~~~~~~~~~~~~~~
1 error generated.
make[1]: *** [src/io_frida.o] Error 1
make: *** [all] Error 2
ERROR: Build failed

\resume should be \dc

But they do different things right now

  • \resume -> only useful to resume a spawned process
  • \dc -> continue after breakpoint

\resume is not mnemonic, so it doesnt follows the r2 conventions

Integrate with Travis

Build every commit, add a test to verify that linkage is correct and add badge in README

Store trace logs on host

Showing all the trace logs to the screen is very noisy and problematic. The solution would be:

  • Store trace logs (\dt*) into the host, instead of showing them to stdout
  • Add commands to dump those logs in human readable and JSON formats
  • Add commands to process and filter those logs

make report error

xxd -i < src/_agent.js > src/_agent.h
cc -c -fPIC -I/usr/local/include/libr -DWITH_CYLANG=0 -Iext/frida src/io_frida.c -o src/io_frida.o
src/io_frida.c:72:13: warning: implicit declaration of function 'r_str_appendf' is invalid in C99
[-Wimplicit-function-declaration]
newfile = r_str_appendf (newfile, "%s.js", str);
^
src/io_frida.c:72:11: warning: incompatible integer to pointer conversion assigning to 'char *' from 'int'
[-Wint-conversion]
newfile = r_str_appendf (newfile, "%s.js", str);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 warnings generated.
pkg-config --cflags r_core
-I/usr/local/include/libr
c++ src/io_frida.o -o io_frida.dylib -shared -fPIC -L/usr/local/lib -lr_core -lr_config -lr_cons -lr_io -lr_util -lr_flag -lr_asm -lr_debug -lr_hash -lr_bin -lr_lang -lr_io -lr_anal -lr_parse -lr_bp -lr_egg -lr_reg -lr_search -lr_syscall -lr_socket -lr_fs -lr_magic -lr_crypto -Wl,-no_compact_unwind ext/frida/libfrida-core.a -lresolv -framework Foundation -lbsm -framework AppKit
Undefined symbols for architecture x86_64:
"_r_str_appendf", referenced from:
_slurpFile in io_frida.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [io_frida.dylib] Error 1
make: *** [all] Error 2

Problem with Android ARM

I managed to get r2frida working on my macOS box but it looks like there's something wrong when attaching to a process on the Android device (ARM 32 bit).

Running something like r2 frida://0658d32xxxxxxx/xxx.domain.myapp actually seems to do something as it's attaching to the frida-server on the device but I end up with an r2 instance that is a t 0x00000000 and has all registers at zero and it looks like it's not even talking to the remote process.

Is there any way to debug what's going wrong?

Cheers!

Add allocation commands

We want to manage the heap from Frida.. sooo:

  • das hello world -> Memory.allocString('hello world')
  • ds 1024 -> Memory.alloc(1024);
  • ...

Add command to extend commands in agent side

Expose an API to add/remove commands in the agent side by loading a script to register them.

This will be useful to load OS-specific commands like for iOS, Android, Windows...

Implement watchpoints

  • change memory protections with Memory.protect()
  • hook the setExceptionHandler() and catch if it's R,W,X and the address matches.

Ole André Vadla Ravnås, [19 Feb 2017 01:46]:

(on top of Memory.protect() and Process.setExceptionHandler())

only part I don't like is that Process.setExceptionHandler() is just a single handler obviously
so it would be nice to have API that has a chain of handlers
where they're called in order

Unable to use r2frida on debian distros?

I got this error in two different machines. One of them running ubuntu and debian in the other.

ns352728:~ alvaro$ r2 frida://cat
Cannot create script: Script(line 3544): SyntaxError: invalid escape
Cannot open 'frida://cat'
ns352728:git alvaro$ node --version
v6.9.5
ns352728:git alvaro$ frida-trace -i "write" cat
Attaching...Resolving functions...Instrumenting functions...
write: Auto-generated handler at "/home/alvaro/.config/radare2/r2pm/git/__handlers__/libpthread_2.19.so/write.js"
write: Auto-generated handler at "/home/alvaro/.config/radare2/r2pm/git/__handlers__/libc_2.19.so/write.js"
Started tracing 2 functions. Press Ctrl+C to stop.
           /* TID 0x4128 */
  5045 ms  write(fd=0x1, buf=0x7f463b50d000, count=0x6)
ns352728:git alvaro$ frida --version
9.1.7

The line 3544 at _agent.js is

var c = v <= 0x7f ? String.fromCharCode(v) : '\\x' + v.toString(16);

I am not an expert on js, but I would say that line is valid. Node issue?

Implement drp command

Required to use dL io (r2 debug.io plugin). This way we can use r2frida in debugger mode

Add command to resolve addresses names using Frida

By giving an address in memory, we can grab the symbolname of that location and expose it into r2. We can import all symbols of a module as flags, but it will be nice to also have a single command to resolve an address in frida side, not in r2.

Also, this issue aims to be a point of discussion for deciding better support for this in r2

ic not working on Android

[0x00000000]> \ console.log(Object.keys(Java))
available,androidVersion,synchronized,enumerateLoadedClassesSync,enumerateLoadedClasses,scheduleOnMainThread,perform,performNow,use,openClassFile,choose,cast,isMainThread
[0x00000000]> \ic
cannot read property 'objc_getClassList' of null
|ERROR| Invalid command '\ic' (0x5c)
[0x00000000]>

Implement `pd` in r2frida shell using Instruction.parse() api

I think that disassembling in target side is unnecessary because it slowdowns the execution of the app, so for now there's pa and pad to assemble and disassemble instructions, honoring the e config vars and accepting hexpairs which can be taken with p8

Add dx command to execute code in target process

By default dx 0x804804804

will do the following:

(new NativeFunction('0x804804804', 'pointer', [])();

but it should handle the following things:

  • Symbol resolution (dx getuid)
  • Define function signature inline (dx:ipi write 1 0x804804 10)

NOTES

  • dx in r2 accepts an hexpair of code to run.. this is not doing the same, so maybe we should use a different name for this command.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.