mirror of
https://github.com/Pharaoh2k/ps5debug-NG.git
synced 2026-10-22 11:53:13 -05:00
Makes the "initial" 8-13.x support from v1.2.5 actually functional. HW-validated on FW 8.xx, 9.xx, 10.xx and 12.xx (all watchpoint types, breakpoints, title id, content id, version etc.). FW-agnostic by design; 11/13.x are lower-risk but not tested. Memory write (poke) on FW >= 9: - mdbg write op (0x13) is kernel-gated with EPERM on FW >= 9, so pokes failed. Route writes through a DMAP page-table walk (kernel_copyin on the physical alias) on FW >= 9; mdbg stays the path on < 9 and as a fallback. - PROC_ALLOC pre-faults its pages so writes land on freshly-allocated demand-zero memory. Breakpoints / watchpoints on FW 9.x-13.x: - Extend the kernel-dbreg allowlist to 9.00-13.20; HW BP/WP were silently no-oping on 9.x+. - SW (INT3) breakpoints write the 0xCC via the DMAP path (mdbg rejected it on FW >= 9). - Clear DR6 after each debug exception: FW 11/12 stops re-delivering a HW BP/WP trap after a few hits when the sticky DR6 status is left set; plus re-arm the debug regs for data watchpoints. Game ID / Content ID / Version - firmware-agnostic: - Resolve title id and content id by pattern-scanning the proc struct instead of per-FW offsets (which shifted at 8.x and 12.x). - Foreground-app command resolves the title id robustly so the param.sfo game version reads correctly on 12.x. Console crash on client disconnect (SIGPIPE): - Closing the client mid-operation raised SIGPIPE in the server thread and killed the host SceShellCore. Suppress it: MSG_NOSIGNAL on sends + SO_NOSIGPIPE on the sockets. Load notification now shows the running firmware version, and the credits line was updated. Documentation: - Rewrote PROTOCOL.md against the v1.2.6 sources (commands, packet structs, status/bit-swap semantics, scan/xref wire formats, enums). - Corrected and expanded README: per-release firmware support table with verification status, and accuracy fixes throughout. Bump version 1.2.5 to 1.2.6.
118 lines
4.9 KiB
C
118 lines
4.9 KiB
C
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
#pragma once
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
|
|
struct cmd_packet;
|
|
|
|
int proc_handle(int fd, struct cmd_packet *packet, unsigned char client_idx);
|
|
|
|
int proc_list_handle(int fd, struct cmd_packet *packet);
|
|
int proc_read_handle(int fd, struct cmd_packet *packet);
|
|
int proc_read_stack_handle(int fd, struct cmd_packet *packet);
|
|
int proc_write_handle(int fd, struct cmd_packet *packet);
|
|
int proc_maps_handle(int fd, struct cmd_packet *packet);
|
|
int proc_info_handle(int fd, struct cmd_packet *packet);
|
|
int proc_protect_handle(int fd, struct cmd_packet *packet);
|
|
int proc_unknown_d_handle(int fd, struct cmd_packet *packet);
|
|
|
|
int proc_install_handle(int fd, struct cmd_packet *packet);
|
|
int proc_call_handle(int fd, struct cmd_packet *packet);
|
|
int proc_elf_handle(int fd, struct cmd_packet *packet);
|
|
int proc_elf_rpc_handle(int fd, struct cmd_packet *packet);
|
|
|
|
long proc_load_elf_inject(uint32_t pid, char *elf_buf, const char *thread_name);
|
|
long sys_proc_elf(unsigned long pid, unsigned long elf, unsigned long length);
|
|
|
|
int ptrace_io_write_d(int pid, void *src_local, void *dst_target, uint64_t len);
|
|
int proc_alloc_handle(int fd, struct cmd_packet *packet);
|
|
int proc_free_handle(int fd, struct cmd_packet *packet);
|
|
int proc_alloc_hinted_handle(int fd, struct cmd_packet *packet);
|
|
|
|
int proc_disasm_region_handle(int fd, struct cmd_packet *packet);
|
|
int proc_extract_code_xrefs_handle(int fd, struct cmd_packet *packet);
|
|
int proc_find_xrefs_to_handle(int fd, struct cmd_packet *packet);
|
|
|
|
struct sys_proc_call_args;
|
|
int proc_remote_alloc(uint32_t pid, uint64_t *out_addr,
|
|
uint64_t length, uint64_t hint);
|
|
int proc_remote_free (uint32_t pid, uint64_t addr, uint64_t length);
|
|
int proc_remote_call (int pid, struct sys_proc_call_args *args);
|
|
|
|
struct elev_state {
|
|
unsigned long saved_authid;
|
|
uint8_t saved_caps[16];
|
|
int valid;
|
|
};
|
|
long ptrace_raw (int op, int pid, void *addr, int data);
|
|
long ptrace_elev(int op, int pid, void *addr, int data);
|
|
int elev_save_and_set(struct elev_state *st);
|
|
void elev_restore (struct elev_state *st);
|
|
|
|
long sys_proc_rw_w0(uint64_t pid, uint64_t address, uint64_t length,
|
|
void *data, uint64_t arg5);
|
|
long sys_proc_rw_w1(uint64_t pid, uint64_t address, uint64_t length,
|
|
void *data, uint64_t arg5);
|
|
|
|
int proc_scan_handle(int fd, struct cmd_packet *packet);
|
|
int proc_scan_aob_handle(int fd, struct cmd_packet *packet);
|
|
int proc_scan_aob_multi_handle(int fd, struct cmd_packet *packet);
|
|
int proc_scan_start_handle(int fd, struct cmd_packet *packet);
|
|
int proc_scan_count_handle(int fd, struct cmd_packet *packet);
|
|
int proc_scan_get_handle(int fd, struct cmd_packet *packet);
|
|
int proc_auth_handle(int fd, struct cmd_packet *packet);
|
|
int proc_assemble_handle(int fd, struct cmd_packet *packet);
|
|
|
|
bool proc_scan_legacy_compareValues(unsigned char cmpType, unsigned char valType,
|
|
uint64_t valueLength,
|
|
const void *scanValue,
|
|
const void *memValue,
|
|
const void *extraValue);
|
|
|
|
bool proc_scan_compareValues(unsigned char cmpType, unsigned char valType,
|
|
uint64_t valueLength,
|
|
const void *scanValue,
|
|
const void *memValue,
|
|
const void *prevValue,
|
|
const void *mask);
|
|
|
|
bool aob_match(uint64_t pattern_length,
|
|
const uint8_t *pattern,
|
|
const uint8_t *memory,
|
|
uint64_t unused,
|
|
const uint8_t *mask);
|
|
|
|
bool fuzzy_double_compare(double scanV, double memV, double tolerance);
|
|
bool fuzzy_float_compare(float scanV, float memV, float tolerance);
|
|
|
|
uint64_t proc_scan_getSizeOfValueType(unsigned char valType);
|
|
|
|
uint32_t auth_lfsr_next(void);
|
|
void auth_lfsr_set_state(uint32_t a, uint32_t b, uint32_t c, uint32_t d);
|
|
void auth_keystream_fill(uint8_t *out, uint64_t length);
|
|
void proc_auth_xor_keystream(const uint8_t *in, uint8_t *out, uint16_t length);
|
|
|
|
extern const uint8_t g_cmptype_needs_value [16];
|
|
extern const uint8_t g_cmptype_needs_extra [16];
|
|
extern const uint8_t g_cmptype_needs_previous[16];
|
|
|
|
extern uint32_t g_proc_auth_state;
|
|
|
|
int sys_proc_vm_map(uint32_t pid, void **out_maps, int *out_count);
|
|
|
|
struct proc_vm_map_entry;
|
|
int proc_ptwalk_augment(uint32_t pid,
|
|
struct proc_vm_map_entry *v, int v_count,
|
|
struct proc_vm_map_entry **out_buf, int *out_count);
|
|
|
|
int proc_ptwalk_read(uint32_t pid, uint64_t va, uint64_t len, void *dst);
|
|
|
|
int proc_ptwalk_write(uint32_t pid, uint64_t va, uint64_t len, const void *src);
|
|
|
|
int proc_aux_range_contains(uint32_t pid, uint64_t addr, uint64_t len);
|
|
|
|
void proc_read_mem(uint32_t pid, uint64_t addr, uint64_t len, void *buf);
|
|
void proc_write_mem(uint32_t pid, uint64_t addr, uint64_t len, const void *buf);
|