diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..be0a87c --- /dev/null +++ b/Makefile @@ -0,0 +1,37 @@ +LIBPS4 := $(PS4SDK)/libPS4 + +CC := gcc -DPS4 +OBJCOPY := objcopy +ODIR := build +SDIR := source +IDIRS := -I$(LIBPS4)/include -Iinclude +LDIRS := -L$(LIBPS4) +MAPFILE := $(shell basename "$(CURDIR)").map +CFLAGS := $(IDIRS) -O3 -std=c11 -ffunction-sections -fdata-sections -fno-builtin -nostartfiles -nostdlib -Wall -Wextra -Wstrict-aliasing -masm=intel -march=btver2 -mtune=btver2 -m64 -mabi=sysv -mcmodel=small -fpie -fPIC +LFLAGS := $(LDIRS) -Xlinker -T $(LIBPS4)/linker.x -Xlinker -Map="$(MAPFILE)" -Wl,--build-id=none -Wl,--gc-sections +CFILES := $(wildcard $(SDIR)/*.c) +SFILES := $(wildcard $(SDIR)/*.s) +OBJS := $(patsubst $(SDIR)/%.c, $(ODIR)/%.o, $(CFILES)) $(patsubst $(SDIR)/%.s, $(ODIR)/%.o, $(SFILES)) + +LIBS := -lPS4 + +TARGET = $(shell basename "$(CURDIR)").bin + +$(TARGET): $(ODIR) $(OBJS) + $(CC) $(LIBPS4)/crt0.s $(ODIR)/*.o -o temp.t $(CFLAGS) $(LFLAGS) $(LIBS) + $(OBJCOPY) -O binary temp.t "$(TARGET)" + rm -f temp.t + +$(ODIR)/%.o: $(SDIR)/%.c + $(CC) -c -o $@ $< $(CFLAGS) + +$(ODIR)/%.o: $(SDIR)/%.s + $(CC) -c -o $@ $< $(CFLAGS) + +$(ODIR): + @mkdir $@ + +.PHONY: clean + +clean: + rm -rf "$(TARGET)" "$(MAPFILE)" $(ODIR) \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..bb2a18a --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# PS4 Sflash0 NOR Dump Payload + +This payload was made for dumping NOR firmware (so called Sflash0) to USB drive instead using FTP. + +The compiled PS4 payload is available for download in the [release section](https://github.com/Andryshik345/ps4-sflash0-dumper/releases/). + +## How to compile for PS4 + +1. Set up the PS4 payload SDK from https://github.com/Scene-Collective/ps4-payload-sdk. +2. In the ps4-sflash0-dumper directory: `make clean && make` to compile. diff --git a/source/main.c b/source/main.c new file mode 100644 index 0000000..cdd33d4 --- /dev/null +++ b/source/main.c @@ -0,0 +1,60 @@ +#ifdef PS4 +#include "ps4.h" +#endif + +int _main(struct thread *td) { + + + initKernel(); + initLibc(); + initPthread(); + jailbreak(); + initSysUtil(); + + copy_file("/dev/sflash0", "/data/sflash0.bin"); + printf_notification("sflash0 copied!\nChecking file size..."); + + struct stat info; + int res = 0; + + if (!stat("/data/sflash0.bin", &info)) { + if (info.st_size == 33554432) { + printf_notification("sflash0.bin is %d bytes\nDump is correct!", info.st_size); + res = 1; + } + else { + printf_notification("sflash0.bin is %d bytes\nDump is NOT correct!\nTry reboot and run the payload again!", info.st_size); + res = unlink("/data/sflash0.bin"); + return 0; + } + } + else { + printf_notification("sflash0.bin doesn't exist!\nSomething gone wrong..."); + return 0; + } + + if (res == 1) { + printf_notification("Copying sflash0.bin to USB..."); + int usbdir = open("/mnt/usb0/.dirtest", O_WRONLY | O_CREAT | O_TRUNC, 0777); + if (usbdir == -1) { + usbdir = open("/mnt/usb1/.dirtest", O_WRONLY | O_CREAT | O_TRUNC, 0777); + if (usbdir == -1) { + printf_notification("USB not found!\nOnly internal backup was done\n(/data/sflash0.bin)!"); + } + else { + close(usbdir); + unlink("/mnt/usb1/.dirtest"); + copy_file("/data/sflash0.bin", "/mnt/usb1/sflash0.bin"); + printf_notification("Dump copied to USB1 successfully!"); + } + } + else { + close(usbdir); + unlink("/mnt/usb0/.dirtest"); + copy_file("/data/sflash0.bin", "/mnt/usb0/sflash0.bin"); + printf_notification("Dump copied to USB0 successfully!"); + } + } + + return 0; +} \ No newline at end of file