
PS5 홈브류 인에이블러 페이로드로, 사후 악용 기능을 제공합니다: 커스텀 플러그인/페이로드 로딩, 서명되지 않은 fself/fpkg 지원, 디버그 설정, FTP 서버, 직접 패키지 설치 프로그램.
![]()
이 프로젝트가 유용하다고 생각하시고 지속적인 개발을 지원하고 싶으시다면, 커피 한 잔 사주시는 걸 고려해 주세요!
소스 코드는 GPLv3에 따라 필요한 모든 파일과 함께 Source code 폴더에 제공되며, GPLv3에서 요구하는 대로 빌드할 수 있습니다. 다만 빌드 방법에 대한 안내는 제공하지 않겠습니다. 어떤 개발자든 cmake 사용법을 알아야 하기 때문입니다.
아직 스크립트 실행 정책을 변경하지 않았다면, 다음 중 하나를 수행해야 합니다. 전역적으로 스크립트 실행을 활성화하거나:
Set-ExecutionPolicy Bypass
관리자 PowerShell 창에서 위 명령을 실행하거나, 스크립트 경로를 바꾼 후 다음 명령으로 스크립트를 실행합니다.
powershell.exe -ExecutionPolicy Bypass -File C:\Path\To\send_payload.ps1
스크립트 사용법
.\send_payload.ps1 -Payload "C:\path\to\example.elf" -IP "192.168.xxx.xxx" -Port XXXX
또는
.\send_payload.ps1
cmdlet send_payload.ps1 at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
Payload: C:\path\to\example.elf
IP: 192.168.xxx.xxx
Port: XXXX
etaHEN SDK를 통해 나만의 맞춤형 플러그인을 만들 수 있습니다. 더 많은 정보는 여기
etaHEN의 ini 설정 파일은 /data/etaHEN/config.ini에서 찾을 수 있으며 내장 FTP를 통해 접근할 수 있습니다.
또한 etaHEN을 처음 실행할 때 자동으로 생성됩니다.
| INI 키 | 설명 | 기본값 |
|---|---|---|
PS5Debug | 0 = PS5Debug (Sistr0) 자동 로드 비활성화, 1 = PS5Debug 자동 로드 활성화 | 0 (disabled) |
FTP | 0 = etaHEN 내장 FTP 비활성화, 1 = 활성화 | 1 (enabled) |
discord_rpc | 0 = Discord RPC 서버 비활성화, 1 = 활성화 | 0 (disabled) |
toolbox_auto_start | 0 = 비활성화, 1 = 활성화 | 1 (enabled) |
Allow_data_in_sandbox | 0 = 앱 샌드박스에서 /data 비활성화, 1 = 활성화 | 1 (enabled) |
DPI | 0 = Direct PKG 설치 프로그램 서비스 비활성화, 1 = 활성화 | 0 (disabled) |
DPI_v2 | 0 = DPI 버전 2 비활성화, 1 = 활성화 | 0 (disabled) |
Klog | 0 = 커널 로깅 비활성화, 1 = 활성화 | 0 (disabled) |
ALLOW_FTP_DEV_ACCESS | 0 = FTP 개발자 접근 비활성화, 1 = 활성화 | 0 (disabled) |
StartOption | 0=없음, 1=홈 메뉴, 2=설정, 3=툴박스, 4=itemzflow | 0 (None) |
Rest_Mode_Delay_Seconds | 레스트 모드에서 나올 때 shellui 패치 전 지연 시간(초) | 0 (no delay) |
Util_rest_kill | 0 = 레스트 중 util 데몬 종료 안 함, 1 = 레스트 시 종료 | 0 (disabled) |
Game_rest_kill | 0 = 레스트 중 실행 중인 게임 종료 안 함, 1 = 레스트 시 종료 | 0 (disabled) |
disable_toolbox_auto_start_for_rest_mode | 0 = 비활성화, 1 = 활성화 | 0 (disabled) |
libhijacker_cheats | 0 = libhijacker 치트 비활성화, 1 = 활성화 | 0 (disabled) |
launch_itemzflow | 0 = 비활성화, 1 = itemzflow 자동 실행 활성화 | 0 (disabled) |
testkit | 0 = 비활성화, 1 = 테스트킷 모드 활성화 | 0 (disabled) |
Display_tids | 0 = 비활성화, 1 = 타이틀 ID 표시 활성화 | 0 (disabled) |
APP_JB_Debug_Msg | 0 = 비활성화, 1 = 앱 jailbreak 디버그 메시지 활성화 | 0 (disabled) |
etaHEN_Game_Options | 0 = 비활성화, 1 = etaHEN 게임 옵션 활성화 | 1 (enabled) |
auto_eject_disc | 0 = 비활성화, 1 = 자동 디스크 배출 활성화 | 0 (disabled) |
Cheats_shortcut_opt | 치트 단축키 다중 선택 옵션 | 0 (CHEATS_SC_OFF) |
Toolbox_shortcut_opt | 툴박스 단축키 다중 선택 옵션 | 0 (TOOLBOX_SC_OFF) |
Games_shortcut_opt | 게임 단축키 다중 선택 옵션 | 0 (GAMES_SC_OFF) |
Kstuff_shortcut_opt | kstuff 단축키 다중 선택 옵션 | 0 (KSTUFF_SC_OFF) |
auto_eject_disc | 0 = 비활성화, 1 = 활성화 | 0 (disabled) |
overlay_ram | 0 = 비활성화, 1 = 활성화 | 0 (disabled) |
overlay_cpu | 0 = 비활성화, 1 = 활성화 | 0 (disabled) |
overlay_gpu | 0 = 비활성화, 1 = 활성화 | 0 (disabled) |
overlay_ip | 0 = 비활성화, 1 = 활성화 | 1 (enabled) |
overlay_kstuff | 0 = 비활성화, 1 = 활성화 | 1 (enabled) |
Overlay_pos | 게임 오버레이 다중 선택 옵션 | 0 (OVERLAY_POS_TOP_LEFT) |
etaHEN의 Direct PKG 설치 프로그램은 현재 매우 단순하며 WIP(작업 중)로 간주됩니다. 서비스 흐름은 다음과 같습니다.
{ "url" : "http://xxxx" }
{ "res" : "0" }
enum Commands : int {
INVALID_CMD = -1,
ACTIVE_CMD = 0,
LAUNCH_CMD,
PROCLIST_CMD,
KILL_CMD,
KILL_APP_CMD,
JAILBREAK_CMD
};
struct HijackerCommand
{
int magic = 0xDEADBEEF;
Commands cmd = INVALID_CMD;
int PID = -1;
int ret = -1337;
char msg1[0x500];
char msg2[0x500];
};
int HJOpenConnectionforBC() {
SceNetSockaddrIn address;
address.sin_len = sizeof(address);
address.sin_family = AF_INET;
address.sin_port = sceNetHtons(9028); //command serve port
memset(address.sin_zero, 0, sizeof(address.sin_zero));
sceNetInetPton(AF_INET, "127.0.0.1", &address.sin_addr.s_addr);
int socket = sceNetSocket("IPC_CMD_SERVER", AF_INET, SOCK_STREAM, 0);
if (sceNetConnect(socket, (SceNetSockaddr*)&address, sizeof(address)) < 0) {
close(socket), socket = -1;
}
return socket;
}
bool HJJailbreakforBC(int& sock) {
// send jailbreak IPC command
HijackerCommand cmd;
cmd.PID = getpid();
cmd.cmd = JAILBREAK_CMD;
if (send(sock, (void*)&cmd, sizeof(cmd), MSG_NOSIGNAL) == -1) {
puts("failed to send command");
return false;
}
else {
// get ret val from daemon
recv(sock, reinterpret_cast<void*>(&cmd), sizeof(cmd), MSG_NOSIGNAL);
close(sock), sock = -1;
if (cmd.ret != 0 && cmd.ret != -1337) {
puts("Jailbreak has failed");
return false;
}
return true;
}
return false;
}
int main()
{
int ret = HJOpenConnectionforBC();
if (ret < 0) {
puts("Failed to connect to daemon");
return -1;
}
if (!HJJailbreakforBC(ret))
{
puts("Jailbreak failed");
return -1;
}
return 0;
}