Giter VIP home page Giter VIP logo

ps4jb's Introduction

ps4jb

This is a full chain exploit for PS4 firmware 6.72. Basically this is TheFlow's POC together with PS4-specific kROP & kernel patches. Mira is used as a HEN payload.

Building from source

To build from source, clone this repository recursively, and run these commands:

cd src
make

You will get a fresh copy of the binary build in src/build/.

Dependencies: python3, gcc, ROPgadget. Note: Mira is not being built from source

Adding your own payloads

miraldr.c loads 65536 bytes at address stored in JS variable mira_blob into RWX memory and jumps to it. At this point only the minimal patches (amd64_syscall, mmap, mprotect, kexec) are applied (i.e. the process is still "sandboxed"). Normally mira_blob contains MiraLoader.

mira_blob_2_len bytes at mira_blob_2 are sent to 127.0.0.1:9021 in a background thread. If mira_blob contains MiraLoader this will be run in the same way but with the full patchset applied & already jailbroken.

Credits

ps4jb's People

Contributors

ermaccw avatar hugofpaiva avatar kmeps4 avatar pauljenkin avatar sleirsgoevy avatar theherogac avatar theoneeyedgrimreaper avatar tihmstar avatar vizreyner 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ps4jb's Issues

Can you port the freebsd poc to ps4?

Sinse no one else is working on the port of 7.55 port for free bsd version of the flow exploit wanna know if you still working on it or you starred something new

Nothing

Got kernel offsets and dumped webkit.bin on 7.55, will it help?

Linux payload of 6.72 doesn't work.

I am on 6.72 PS4 Slim CUH-2108B Belize model.
Your linux payload doesn't work neither for usb nor for files in user/system/boot/.
Linux from other host (Leeful) works which implies there is no problem in my console.
But I want to boot it internally by keeping files in user/system/boot and only your host boot from it, but no longer.
If I run JB->Mira->Linux, then it is infinite loading screen which eventually crashes system
If I run JB->Linux, then it either kernel panics ir crashes or infinite loading screen.
This is on 6.72.
On 7.02 everything is fine.
I hope you will look into it and fix it as soon as possible.
Thanks

Add 1GB vram linux loader on 6.72

You have only one linux loader for 6.72 and I even don't know which one (seems 3gb vram loader).
It would be great if you add another one (1GB vram) on 6.72 as you did for 7.02.
7.02 has 2 loaders, please also do it for 6.72.

make releases

there are no releases, and it sucks to build the src everytime

fakeusb working on the wrong way

When I move to package installer only pkgs on my usb stick are shown but not the pkg on the fakeusb directory.
I use ps4 explorer to take a look and I found that files from fakeusb directory shows on usb1 folder in mnt and my usb drive files still on usb0. I restarted my ps4 and run the payload again and again but the files only move from fakeusb to usb1 how can I solve that ?
Note* (My ps4 slim have only 1 working usb port)

6.20 port?

I have successfully ported Mira(w hen) to 6.20, but the current exploit used on 6.20 breaks rootvnode/open , I tried to build your exploit but it doesn't want to work for me

I can provide you with everything you need to port, modules, kernel dump and offsets already ported

Please reply to this comment or tag me on

Discord: https://discord.me/dks

Or tag me in a post on Twitter

https://twitter.com/LightningMods_?s=09

Pullrequest

I added a couple changes but wasn't sure how to best make a pull request so here there are.
Would be nice if you could merge:

Patch1: Add --no-dynamic-linker flag
src/payloads/linux/ps4-kexec/Makefile

-	-Os -Wall -Werror -Wl,--build-id=none,-T,kexec.ld,--nmagic \
+	-Os -Wall -Werror -Wl,--no-dynamic-linker,--build-id=none,-T,kexec.ld,--nmagic \


Patch2: Add -fno-stack-protector flag
src/payloads/lib/Makefile

-	gcc -c -isystem ../../8cc/freebsd-headers -nostdinc dl.c -o dl.o
+	gcc -c -isystem ../../8cc/freebsd-headers -nostdinc dl.c -o dl.o -fno-stack-protector

Patch3: 
	- Prefer USB over local config
	- make bootargs and vram configurable from file
src/payloads/linux/main.c

---------------------------------- PATCHFILE -----------------------------------------
diff --git a/src/payloads/linux/main.c b/src/payloads/linux/main.c
index 4e0db5a..eb1fd53 100644
--- a/src/payloads/linux/main.c
+++ b/src/payloads/linux/main.c
@@ -103,6 +103,15 @@ void alert(const char* msg)
 #define VRAM_GB 1
 #endif
 
+#ifndef VRAM_GB_MIN
+#define VRAM_GB_MIN 1
+#endif
+
+#ifndef VRAM_GB_MAX
+#define VRAM_GB_MAX 3
+#endif
+
+
 int main()
 {
     struct sigaction sa = {
@@ -113,23 +122,55 @@ int main()
     sigaction(SIGSTOP, &sa, NULL);
     sigaction(SIGTERM, &sa, NULL);
     sigaction(SIGKILL, &sa, NULL);
-    char* kernel;
-    unsigned long long kernel_size;
-    char* initrd;
-    unsigned long long initrd_size;
-#define L(name, where, wheresz)\
-    if(read_file("/user/system/boot/" name, where, wheresz)\
-    && read_file("/mnt/usb0/" name, where, wheresz)\
-    && read_file("/mnt/usb1/" name, where, wheresz))\
+    char* kernel = NULL;
+    unsigned long long kernel_size = 0;
+    char* initrd = NULL;
+    unsigned long long initrd_size = 0;
+    char* cmdline = NULL;
+    unsigned long long cmdline_size = 0;
+    char* vramstr = NULL;
+    unsigned long long vramstr_size = 0;
+    
+    int vramgb = 0;
+
+#define L(name, where, wheresz, is_fatal)\
+    if(read_file("/mnt/usb0/" name, where, wheresz)\
+    && read_file("/mnt/usb1/" name, where, wheresz)\
+    && read_file("/user/system/boot/" name, where, wheresz))\
     {\
         alert("Failed to load file: " name ".\nPaths checked:\n/user/system/boot/" name "\n/mnt/usb0/" name "\n/mnt/usb1/" name);\
-        return 1;\
+        if (is_fatal) return 1;\
     }
-    L("bzImage", &kernel, &kernel_size);
-    L("initramfs.cpio.gz", &initrd, &initrd_size);
-    char* cmdline = "panic=0 clocksource=tsc radeon.dpm=0 console=tty0 console=ttyS0,115200n8 "
-                    "console=uart8250,mmio32,0xd0340000 video=HDMI-A-1:1920x1080-24@60 "
-                    "consoleblank=0 net.ifnames=0 drm.debug=0";
+    L("bzImage", &kernel, &kernel_size, 1);
+    L("initramfs.cpio.gz", &initrd, &initrd_size, 1);
+        
+    L("bootargs.txt", &cmdline, &cmdline_size, 0);
+
+    if (cmdline && cmdline_size){
+	for (int i=0; i<cmdline_size; i++) {
+            if (cmdline[i] == '\n') {
+                cmdline[i] = '\0';
+                break;
+            }
+        }
+    }else{
+        cmdline = "panic=0 clocksource=tsc radeon.dpm=0 console=tty0 console=ttyS0,115200n8 "
+                  "console=uart8250,mmio32,0xd0340000 video=HDMI-A-1:1920x1080-24@60 "
+                  "consoleblank=0 net.ifnames=0 drm.debug=0";
+    }
+
+    L("vram.txt", &vramstr, &vramstr_size, 0);
+
+    if (vramstr && vramstr_size){
+        vramgb = atoi(vramstr);
+        if (vramgb < VRAM_GB_MIN || vramgb > VRAM_GB_MAX){
+            vramgb = VRAM_GB;
+        }
+    }else{
+        vramgb = VRAM_GB;
+    }
+
+
     kexec(kernel_main, (void*)0);
     long x, y;
     struct thr_param thr = {
     ```

DarkModderVC is profiting from your work

The developer / copier (DarkModderVC) is just copying your c-code.js file whenever you update it. He includes this file in his repository and claiming its more stable than your release

All he is doing is

  1. take your c-code.js
  2. remove the comments
  3. Split them into 5 files
  4. Instead of using HTML as fronted, he is using javascript

Note: so far he has received around $430 in donations using PSXHAX forum

I also have discussed the same with PSXHAX forum admin about this,
They have replied that if your are Ok with his claim, they will continue recognise Darkmodders work separately else, there will one thread related to your work (which will include Darkmodders work as side note)

If at all you are planning to take donations, Please share your paypal / Kofi links so that we can add it in PSXHAX

His Github page
https://github.com/DarkModderVC/PS4JB

i know that you are working on many thing which all are thankful for, I just reached out to you since it was hard to digest that some one is shadowing your work and getting all the credits

Freezing issue

Sir Errors are Fixed in Debug Setting.And No crashes But when we start game the game freezes nothing works not even controller

Few issues I thought I should describe

  1. first of all, rest mode isn't working in 7.02 using hen, it works in chendo's exploit though, and worked in 6.72.
  2. second, when trying to run the jailbreak, few seconds later you can't run a payload, but need to run it immediately, an issue that wasn't in 6.72 either, however, if you run the webkit exploit you can wait afterwards as long as you want, and inject the jailbreak successfully even after 1 minute, but after jailbreak u have few seconds the ability to inject a payload, which means that the issue is on the jailbreak's end most probably, in chendo's exploit you can inject payloads after how long time as you want with no problem, my guess is that the leaks in 702.js might be problematic, or that the duplicated functions might be (addrof, fakeobj, hex), or the "eval.call".

Common files Merge and compress code

Is it necessary that all the files are separated? That is, what if we join all the files to one in common?

Also, doing an "uglify" of the c-code.js to reduce size (comment, blank spaces and line breaks) I did a test, the original file (6,739 KB) is reduced (5,062KB) almost 25% less in load.

I have a PS4 6.72 and I can test, even so, what would be the ideal environment to test? a BSD OS with a specific version?

I am a Javascript programmer and I have seen that the code is very inefficient in memory, but reading a little more, I have seen that this is the intention because it is the weakness that exploit uses, even so, perhaps there are points that can be improved to "keep running into the race."

The abuse of "var" when in some cases you can use "let" ("var" are static variables, they are in the entire execution life cycle, while "let" is context specific, its life is within a function and are not visible from the outside.

You can evaluate these options to improve performance, even so, I hope your opinion.

Mira no HB html and js file, missing in cache

For some reason the below two line are missing in the the current cache.manifest
mira-nohb.html
mira/mira2-nohb.js

Note: I tested the patch.py, while generating the cache.manifest it adds the above two line automatically

Crash game

even with the latest update the crash problem with games is not totally solved

External HDD issue

Thank you so much for your outstanding job. There is an issue with the Mira+Hen. If you have a usb external hdd attached as an external storage for game installs, the games does not work from the external storage. This is quite an important issue to be resolved!

FTP payload does not work.

I can't connect to the PS4.

Статус:	Соединяюсь с 192.168.1.239:2121...
Ошибка:	Соединение прервано пользователем
Статус:	Отключен от сервера
Статус:	Соединяюсь с 192.168.1.239:2121...
Статус:	Соединение установлено, ожидание приглашения...
Статус:	Обычный FTP небезопасен. Пожалуйста, переключитесь на FTP через TLS.
Команда:	USER anonymous
Ответ:	331 Please specify the password.
Команда:	PASS *********************
Ответ:	230 Login successful.
Команда:	SYST
Ошибка:	Соединение закрыто сервером
Ошибка:	Невозможно подключиться к серверу
Статус:	Ожидание повтора...
Статус:	Соединяюсь с 192.168.1.239:2121...
Статус:	Соединение установлено, ожидание приглашения...
Ответ:	220 FTP ready
Статус:	Обычный FTP небезопасен. Пожалуйста, переключитесь на FTP через TLS.
Команда:	USER anonymous
Ответ:	331 Please specify the password.
Команда:	PASS *********************
Ответ:	230 Login successful.
Команда:	SYST
Ошибка:	Соединение закрыто сервером
Ошибка:	Невозможно подключиться к серверу

What's wrong?

Include "stability change" from DarkModderVC

So someone who goes by the name of "DarkModderVC" has created a shadow copy of this project here, with claims about improved stability.

I had a look at what was changed and the main difference seems that the jb script ('c-code.js') was split across five files ('jb.js' + 'set[1-4].js'). The scripts (or rather script src tags) are then written into the document one after each other at the end of syscall2 (see 'functions.js').

So the jb script of size 6.9MB is split into 1.4/1.6MB chunks - stability would only improve with that given that the files are loaded sequentially, which I assume happens.

Anyway, @sleirsgoevy have you seen this change and is it something worth implementing here in the main project?

Cheers - Cypher

(Personal note: Even though I like that people come up with ideas to improve someone else's work I find it highly disrespectful a) not to fork the repository, but create a copy so that it looks like your own project b) not start off with mentioning the original author of the project, but name the author last in the credits. Lastly, I'd rather like to see a PR to the main project or at least a description of the improvements. So yes, it would be nice to include the improvements here, if any useful, and see DarkModderVC's side-show go obsolete.)

BRO you can add Ibernation mode without lost mod ps4?

another developer already make it for dont lost mod 7.55 when go in sleep mode, maybe you can implement it on your mod? it can be great... because i want game on hamachi but in the version goldhen hamachi dont work.... or you can send a version of hamachi compatible for goldhen?

compile from source issue

Hi @Sleirgoevy,
Thank yo so much for your hardwork and contribution to the scene, I'm trying to build your exploit from the source to be able to modify the miraldr part in your exploit but everytime i got this following problem:
mkdir -p build python3 scripts/syscall_names.py < bad_hoist/dumps/syscalls.txt > build/syscall_names.txt make[1]: Leaving directory '/mnt/d/Projects/C-C++/PS4/ps4jb/src/8cc' mkdir -p build/oldjb 8cc/8cc/python/rop-ps4-8cc /dev/stdout 8cc/librop/*.c printf_stub.c 8cc/ps4/*.c oldkex.c | python3 8cc/bad_hoist/rop/compiler.py /dev/stdin 8cc/bad_hoist/dumps/gadgets.txt > build/oldjb/c-code.js Traceback (most recent call last): File "8cc/bad_hoist/rop/compiler.py", line 149, in <module> print(main(*sys.argv[1:])) File "8cc/bad_hoist/rop/compiler.py", line 144, in main gadgets = parse_gadgets(read_gadgets(g)) File "8cc/bad_hoist/rop/compiler.py", line 27, in parse_gadgets binrepr = bytes.fromhex(binrepr) ValueError: non-hexadecimal number found in fromhex() arg at position 15 Makefile:12: recipe for target 'build/oldjb/c-code.js' failed make: *** [build/oldjb/c-code.js] Error 1

So could you please advice me about how to solve this issue, i had dumped my webkit, libc, libkernel many times with the same issue, also does oldjb is needed or we can remove it from build process at all.

FAKEUSB doesn't work.

I've copied the pkg in /user/home/fakeusb but Package Installer doesn't see anything.

Really annoying since regular Mira breaks Remote PKG Installer...

Fakeusb, can't delete files

I'm trying to delete unneeded files from /user/home/fakeusb
But can't

No matter how i'm trying, through FTP or file explorer - i can't
No matter is fakeusb loaded or not.
20200806_115549_00583732

Cache functionality

will it be possible to add cache functionality and remove the comments in c-code.js file
by this way people who are using this exploit from internet, will be benefited

Advantages

  1. c-code.js comments reduction will save 1.5 MB download
  2. caching will save 7 MB download per execution

i created the below python script to automatically add this ( please see if this can help, in any way)

  1. the script generate Cache manifest file
  2. it removes the comments from c-code.js file
  3. it update the index.html with cache functionality
  4. the script is executed from root directory
# Python3
from pathlib import Path
from glob import glob
import os

#list of file and folders which are exempted from cache
ignoreItms=["src","README.md","Cache.manifest","Patch.py"]

# jb code file
JbFile="jb/c-code.js"

#Initial page
index="index.html"

#function to create cache manifest file
def createManiFest():
	ManifestTxt="CACHE MANIFEST\n"
	ManifestTxt+="\n"+"CACHE:"
	cacheArray=[]
	
	#iterating thorugh base folder to list out all the files
	for itm in glob("*"):
		
		if itm in ignoreItms:
			#if the item is present in ignore list it will continue without adding
			continue
		#check if its a file or folder
		if os.path.isfile(itm):
			#if file add it to cache array
			cacheArray.append(os.path.basename(itm))
		else:
			#if folder recursively find files in it
			for path in Path('').rglob('{}/*'.format(itm)):
				cacheArray.append(str(path))

	# sort the array to make the file look nice
	cacheArray.sort()
	ManifestTxt+="\n"+"\n".join(cacheArray)
	ManifestTxt+="\n\n"+"NETWORK:"
	ManifestTxt+="\n"+"*"
	open('Cache.manifest','w').write(ManifestTxt)

def trimCCodeJs():
	newTxt=""
	#loop through all the line of code js
	for ln in open(JbFile).read().split('\n'):
		#check if the line has execution code,if not then continue to next line
		if ln.count(";")<=0:
			continue
		# trim the line only till the end of code
		lntext=ln[:ln.find(';')+1]
		newTxt+=lntext+"\n"
	open(JbFile,'w').write(newTxt.strip())
	
def updateIndex():
	indexTxt=open(index).read().strip()
	# replace the html tag with html manifest tag, if html tage already has manifest it wont be added
	indexTxt=indexTxt.replace('<html>','<html manifest="Cache.manifest">')
	
	#check if html already have cach instructions, if not add it
	if indexTxt.count("window.applicationCache.ondownloading")<=0:
		CacheScriptTxt="""<body>
<script>window.applicationCache.ondownloading=function(){alert("Caching started !!")};window.applicationCache.onprogress=function(a){document.getElementById("progress").innerHTML="<h3'>Caching Status: "+(Math.round(100*(a.loaded/a.total)))+"% Completed</h3>"};window.applicationCache.oncached=function(){alert("Page Cached!!")};</script>"""
	
		indexTxt=indexTxt.replace('<body>',CacheScriptTxt)
	open(index,'w').write(indexTxt)
		
createManiFest()
trimCCodeJs()
updateIndex()

@sleirsgoevy, I am really fascinated on how quickly you have implemented this,
I mean no disrespect, This only a request

Compiling problem

I'm trying to compile your jb from source on a Linux server. I've got python 3.7.5, ROPgadget v6.3, my PS4 is running 6.72.

When trying to work with the gadgets.txt file, I get the following error:

8cc/8cc/python/rop-ps4-8cc /dev/stdout 8cc/librop/.c printf_stub.c 8cc/ps4/.c oldkex.c | python3 8cc/bad_hoist/rop/compiler.py /dev/stdin 8cc/bad_hoist/dumps/gadgets.txt > build/oldjb/c-code.js
Traceback (most recent call last):
File "8cc/bad_hoist/rop/compiler.py", line 149, in <module>
print(main(*sys.argv[1:]))
File "8cc/bad_hoist/rop/compiler.py", line 146, in main
return final_pass(asm, labels, gadgets)
File "8cc/bad_hoist/rop/compiler.py", line 107, in final_pass
raise SyntaxError(i)
SyntaxError: mov [rax], rdi
make: *** [Makefile:13: build/oldjb/c-code.js] Error 1

I've uploaded my gadgets.txt file here:

https://drive.google.com/file/d/1whWO2dIq3spzV3pwC6frf5gNWz3be7cn/view?usp=sharing

I'm not sure if I'm missing something, maybe a python library?

browser white screen

Hi there,
I am using a ps4 with firmware version 6.72 and trying to get the procedure to work on my MacBookPro,
but when I navigate to the IP and port 8080 on the ps4 I get just white screen, after reloading a couple of time I get the message: "There is not enough free system memory", but when I press "OK" I do not see any link to start MIRA.
Also in the Readme it is written that the binary will be placed in src/build but I do not see that folder being created after make, not sure if the binary is placed somewhere else.

from my terminal I can see:

curl 192.168.178.115:8080

<script> function print(){} </script> <script src="/exploit.js"></script> <script src="/helpers.js"></script> <script src="/server.js"></script>

❯ python
Python 3.7.7 (default, Jun 11 2020, 12:57:36)
[Clang 11.0.0 (clang-1100.0.33.16)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

❯ gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.0 (clang-1100.0.33.16)
Target: x86_64-apple-darwin19.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

Do you have any ideas on what I could try?

Request: C source code

Would it be possible to make the C sources available so we can modify and re-compile the ROP chains?

Crash on Rest mode

When position is in Rest Mode, then I want to turn on.. can not turn on, it freeze does not appear at all on the screen. sometime power like shutdown.

Parse Error

I am getting the below error, while doing a Make from Src

[WARN] parse.c:2184: ps4jb/src/8cc/8cc/include/stdarg.h:1:1: type specifier missing, assuming int

[ERROR] parse.c:2214: ps4jb/src/8cc/8cc/include/stdarg.h:1:4: ';' or ',' are expected, but got /

Note: i see that some other user also have had the same error, it was resolved by removing simlinks.
In my case i am not sure on how to resolve this.
Any help would be appreciated

I am using : linux

Parser error

[WARN] parse.c:2184: ps4jb/src/8cc/8cc/include/stdarg.h:1:1: type specifier missing, assuming int

[ERROR] parse.c:2214: ps4jb/src/8cc/8cc/include/stdarg.h:1:4: ';' or ',' are expected, but got /

Linux loader for 7.02

Hi
Anyone work on port Linux loader for 7.02? Really looking forward to this thing.

No mira2-nohb.js exists

When trying to run the new MIRA_NOHB option i get "GET /mira/mira2-nohb.js" Error (404): "Not found" in the terminal.
There is also no reference in the Makefile on how to build one.

Payload loader?

It'd be nice to have an option to launch your own payloads via netcat.

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.