Files
2026-02-17 22:43:40 +01:00

1082 lines
35 KiB
C++

#include <errno.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stddef.h>
#include <stdint.h>
#include <kernel.h>
#include <pthread.h>
#include <message_dialog.h>
#include <ime_dialog.h>
#include <libsysmodule.h>
#include <system_service.h>
#include <np.h>
#include <np/np_common.h>
#include <np/np_npid.h>
#include <np/np_auth.h>
#include <np/np_word_filter.h>
#include <np/np_webapi.h>
#include <np_commerce_dialog.h>
#include <common_dialog.h>
#include <user_service.h>
#include <net.h>
#include <pad.h>
#include "Syscall.h"
#include "utility"
int (*sceSysUtilSendSystemNotificationWithText)(
int messageType,
const char* message
);
int (*sceNpCheckNpAvailabilityOriginal)(void);
int (*sceNpGetStateOriginal)(
SceUserServiceUserId userId,
int* state
);
int (*sceNpGetOnlineIdOriginal)(
SceUserServiceUserId userId,
SceNpOnlineId* onlineId
);
int (*sceNpGetAccountIdOriginal)(
SceUserServiceUserId userId,
SceNpAccountId* accountId
);
int (*sceNpRegisterStateCallbackOriginal)(
SceNpStateCallbackA callback,
void* userdata
);
int (*sceNpRegisterGamePresenceCallbackOriginal)(
SceNpGamePresenceCallbackA callback,
void* userdata
);
int32_t(*sceUserServiceGetEventOriginal)(
SceUserServiceEvent* event
);
int (*sceNpGetGamePresenceStatusOriginal)(
SceUserServiceUserId userId,
SceNpGamePresenceStatus* status
);
int (*sceNpGetNpIdOriginal)(
SceUserServiceUserId userId,
SceNpId* npId
);
int (*sceCommonDialogInitializeOriginal)(void);
int (*sceNpAuthCreateAsyncRequestOriginal)(
const SceNpAuthCreateAsyncRequestParameter*
);
int (*sceNpCreateAsyncRequestOriginal)(
const SceNpCreateAsyncRequestParameter*
);
int (*sceNpPollAsyncOriginal)(
int reqId,
int* result
);
int (*sceNpAuthPollAsyncOriginal)(
int reqId,
int* result
);
int (*sceNpAuthGetAuthorizationCodeOriginal)(
int reqId,
const SceNpAuthGetAuthorizationCodeParameterA* param,
SceNpAuthorizationCode* authCode,
int* issuerId
);
int32_t(*sceNpCommerceDialogInitializeOriginal)(void);
int32_t(*sceNpCommerceDialogOpenOriginal)(
const SceNpCommerceDialogParam* param
);
SceCommonDialogStatus(*sceNpCommerceDialogUpdateStatusOriginal)(void);
int32_t(*sceNpCommerceDialogTerminateOriginal)(void);
int32_t(*sceNpCommerceDialogGetResultOriginal)(
SceNpCommerceDialogResult* result
);
int32_t(*sceNpCommerceShowPsStoreIconOriginal)(
SceNpCommercePsStoreIconPos pos
);
int32_t(*sceNpCommerceHidePsStoreIconOriginal)(void);
int (*sceNpBandwidthTestInitStartOriginal)(
const SceNpBandwidthTestInitParam* param
);
int (*sceNpBandwidthTestGetStatusOriginal)(
int contextId,
int* status
);
int (*sceNpBandwidthTestShutdownOriginal)(
int contextId,
SceNpBandwidthTestResult* result
);
int (*sceNpGetParentalControlInfoOriginal)(
int reqId,
SceUserServiceUserId userId,
int8_t* age,
SceNpParentalControlInfo* info
);
int (*sceNpCheckPlusOriginal)(
int reqId,
const SceNpCheckPlusParameter* param,
SceNpCheckPlusResult* result
);
int (*sceNpSetContentRestrictionOriginal)(
const SceNpContentRestriction* restriction
);
int (*sceNpGetAccountCountryOriginal)(
SceUserServiceUserId userId,
SceNpCountryCode* countryCode
);
int (*sceNpGetAccountDateOfBirthOriginal)(
SceUserServiceUserId userId,
SceNpDate* date
);
int (*sceNpWordFilterCreateTitleCtxOriginal)(
SceUserServiceUserId selfId
);
int (*sceNpWordFilterCreateAsyncRequestOriginal)(
int titleCtxId,
const SceNpWordFilterCreateAsyncRequestParameter* param
);
int (*sceNpWordFilterSanitizeCommentOriginal)(
int reqId,
const char* comment,
char* sanitizedComment,
void* option
);
int (*sceNpWordFilterPollAsyncOriginal)(
int reqId,
int* result
);
int32_t(*sceNpWebApiUtilityParseNpIdOriginal)(const char* jsonNpId, SceNpId* npId);
#include <np/np_npid.h>
int sceNpGetOnlineIdHook(int32_t userid, SceNpOnlineId* onlineId)
{
printf("[NP] sceNpGetOnlineIdHook(userId=%d)\n", userid);
memcpy(onlineId->data, "DontCry361x", 13);
onlineId->term = '\0';
return 0;
}
int sceNpCheckNpAvailabilityhook()
{
printf("[NP] sceNpCheckNpAvailabilityHook() -> OK\n");
return 0;
}
#define ENABLE_HOOK_LOGS 1
#if ENABLE_HOOK_LOGS
#define HOOK_LOG(fmt, ...) \
printf("[HOOK] " fmt "\n", ##__VA_ARGS__)
#else
#define HOOK_LOG(fmt, ...)
#endif
int sceNpGetStateHook(int32_t userId, int* state)
{
*state = 2;
HOOK_LOG("sceNpGetState(userId=%d) -> state=%d", userId, *state);
return 0;
}
int sceNpGetAccountIdHook(int32_t userId, SceNpAccountId* accountId)
{
*accountId = 0x1;
HOOK_LOG("userId=%d accountId=0x%lX", userId, *accountId);
return 0;
}
static SceNpStateCallbackA g_state_cb = NULL;
static void* g_state_userdata = NULL;
static int g_state_cb_id = 1;
int sceNpRegisterStateCallbackHook(SceNpStateCallbackA callback, void* userdata)
{
g_state_cb = callback;
g_state_userdata = userdata;
HOOK_LOG("callback=%p userdata=%p id=%d", callback, userdata, g_state_cb_id);
return g_state_cb_id;
}
static SceNpGamePresenceCallbackA g_presence_cb = NULL;
static void* g_presence_userdata = NULL;
static int g_presence_cb_id = 2;
int sceNpRegisterGamePresenceCallbackHook(SceNpGamePresenceCallbackA callback, void* userdata)
{
g_presence_cb = callback;
g_presence_userdata = userdata;
HOOK_LOG("callback=%p userdata=%p id=%d", callback, userdata, g_presence_cb_id);
return g_presence_cb_id;
}
static int g_user_logged_in = 0;
static SceUserServiceUserId g_user_id = 1;
static int g_login_event_pending = 1;
static int g_logout_event_pending = 0;
int32_t sceUserServiceGetEventHook(SceUserServiceEvent* event)
{
return SCE_USER_SERVICE_ERROR_NO_EVENT;
}
int sceNpGetGamePresenceStatusHook(SceUserServiceUserId userId, SceNpGamePresenceStatus* pStatus)
{
*pStatus = SCE_NP_GAME_PRESENCE_STATUS_ONLINE;
return 0;
}
int sceNpGetNpIdHook(SceUserServiceUserId userId, SceNpId* npId)
{
memset(npId, 0, sizeof(SceNpId));
memcpy(npId->handle.data, "DontCry361x", 13);
npId->handle.term = '\0';
return 0;
}
static int g_common_dialog_system_initialized = 0;
int sceCommonDialogInitializeHook()
{
g_common_dialog_system_initialized = 1;
return SCE_OK;
}
#define FAKE_ONLINE_ID "DontCry361x"
int32_t sceNpWebApiUtilityParseNpIdHook(const char* pJsonNpId, SceNpId* pNpId)
{
memset(pNpId, 0, sizeof(SceNpId));
memcpy(
pNpId->handle.data,
FAKE_ONLINE_ID,
strlen(FAKE_ONLINE_ID)
);
pNpId->handle.term = '\0';
return SCE_OK;
}
#include <np/np_auth.h>
#define MAX_AUTH_REQUESTS 16
static int g_next_auth_req_id = 1;
static int g_active_auth_requests = 0;
static int g_auth_request_alive[MAX_AUTH_REQUESTS];
int sceNpAuthCreateAsyncRequestHook(const SceNpAuthCreateAsyncRequestParameter* pParam)
{
int reqId = g_next_auth_req_id++;
g_active_auth_requests++;
g_auth_request_alive[reqId % MAX_AUTH_REQUESTS] = 1;
HOOK_LOG("AUTH async created reqId=%d active=%d",
reqId, g_active_auth_requests);
return reqId;
}
#define MAX_NP_REQUESTS 32
static int g_next_np_req_id = 1;
static int g_active_np_requests = 0;
static int g_np_request_alive[MAX_NP_REQUESTS];
int sceNpCreateAsyncRequestHook(const SceNpCreateAsyncRequestParameter* pParam)
{
int reqId = g_next_np_req_id++;
g_active_np_requests++;
g_np_request_alive[reqId % MAX_NP_REQUESTS] = 1;
HOOK_LOG("NP async created reqId=%d active=%d",
reqId, g_active_np_requests);
return reqId;
}
#define MAX_NP_REQUESTS 32
static int g_np_request_finished[MAX_NP_REQUESTS];
#include <np.h>
int sceNpPollAsyncHook(int reqId, int* pResult)
{
static int logged[MAX_NP_REQUESTS] = { 0 };
int idx = reqId % MAX_NP_REQUESTS;
if (!g_np_request_finished[idx] && !logged[idx]) {
HOOK_LOG("reqId=%d FINISHED", reqId);
logged[idx] = 1;
}
*pResult = SCE_OK;
g_np_request_finished[idx] = 1;
return SCE_NP_POLL_ASYNC_RET_FINISHED;
}
#define MAX_AUTH_REQUESTS 16
static int g_auth_request_finished[MAX_AUTH_REQUESTS];
int sceNpAuthPollAsyncHook(int reqId, int* pResult)
{
if (reqId <= 0 || !pResult) {
return SCE_NP_AUTH_ERROR_INVALID_ARGUMENT;
}
int idx = reqId % MAX_AUTH_REQUESTS;
if (!g_auth_request_alive[idx]) {
return SCE_NP_AUTH_ERROR_REQUEST_NOT_FOUND;
}
if (!g_auth_request_finished[idx]) {
g_auth_request_finished[idx] = 1;
*pResult = SCE_OK;
return SCE_NP_AUTH_POLL_ASYNC_RET_FINISHED;
}
*pResult = SCE_OK;
return SCE_NP_AUTH_POLL_ASYNC_RET_FINISHED;
}
#define FAKE_AUTH_CODE "FAKE_AUTH_CODE_1234567890" //im 99% sure this is wrong?
int sceNpAuthGetAuthorizationCodeHook(int reqId, const SceNpAuthGetAuthorizationCodeParameterA* param, SceNpAuthorizationCode* authCode, int* issuerId)
{
if (reqId <= 0 || !param || !authCode) {
return SCE_NP_AUTH_ERROR_INVALID_ARGUMENT;
}
if (param->size != sizeof(SceNpAuthGetAuthorizationCodeParameterA)) {
return SCE_NP_AUTH_ERROR_INVALID_SIZE;
}
if (!param->clientId || !param->scope) {
return SCE_NP_AUTH_ERROR_INVALID_ARGUMENT;
}
if (param->userId == 0) {
return SCE_NP_ERROR_USER_NOT_FOUND;
}
int idx = reqId % MAX_AUTH_REQUESTS;
if (!g_auth_request_alive[idx]) {
return SCE_NP_AUTH_ERROR_REQUEST_NOT_FOUND;
}
memset(authCode, 0, sizeof(SceNpAuthorizationCode));
memcpy(authCode->code, FAKE_AUTH_CODE, strlen(FAKE_AUTH_CODE));
if (issuerId) {
*issuerId = 0;
}
g_auth_request_finished[idx] = 1;
return 0;
}
static int g_common_dialog_initialized = 0;
static int g_common_dialog_busy = 0;
static SceCommonDialogStatus g_common_dialog_status = SCE_COMMON_DIALOG_STATUS_NONE;
int32_t sceNpCommerceDialogInitializeHook(void)
{
HOOK_LOG("called");
if (g_common_dialog_initialized)
return SCE_COMMON_DIALOG_ERROR_ALREADY_INITIALIZED;
g_common_dialog_initialized = 1;
g_common_dialog_status = SCE_COMMON_DIALOG_STATUS_INITIALIZED;
return SCE_OK;
}
#include <np_commerce_dialog.h>
static int g_np_commerce_initialized = 0;
static SceCommonDialogStatus g_np_commerce_status =
SCE_COMMON_DIALOG_STATUS_NONE;
int32_t sceNpCommerceDialogOpenHook(const SceNpCommerceDialogParam* param)
{
HOOK_LOG("userId=%d mode=%d", param ? param->userId : -1, param ? param->mode : -1);
if (!param) return SCE_COMMON_DIALOG_ERROR_ARG_NULL;
g_common_dialog_busy = 1;
g_np_commerce_status = SCE_COMMON_DIALOG_STATUS_RUNNING;
return SCE_OK;
}
SceCommonDialogStatus sceNpCommerceDialogUpdateStatus_hook(void) {
if (g_np_commerce_status == SCE_COMMON_DIALOG_STATUS_RUNNING) {
g_np_commerce_status = SCE_COMMON_DIALOG_STATUS_FINISHED;
g_common_dialog_busy = 0;
}
return g_np_commerce_status;
}
int32_t sceNpCommerceDialogTerminateHook()
{
if (!g_np_commerce_initialized) {
return SCE_COMMON_DIALOG_ERROR_NOT_INITIALIZED;
}
g_np_commerce_status = SCE_COMMON_DIALOG_STATUS_NONE;
g_common_dialog_busy = 0;
g_np_commerce_initialized = 0;
return SCE_OK;
}
int32_t sceNpCommerceDialogGetResultHook(SceNpCommerceDialogResult* result)
{
HOOK_LOG("called");
memset(result, 0, sizeof(*result));
result->result = SCE_COMMON_DIALOG_RESULT_OK;
result->authorized = true;
return result->result;
}
int32_t sceNpCommerceShowPsStoreIconHook(SceNpCommercePsStoreIconPos pos)
{
return SCE_OK;
}
int32_t sceNpCommerceHidePsStoreIconHook()
{
return 0;
}
#define MAX_BANDWIDTH_CONTEXTS 4
static int g_bw_next_ctx_id = 0;
static int g_bw_ctx_active[MAX_BANDWIDTH_CONTEXTS];
static int g_bw_ctx_finished[MAX_BANDWIDTH_CONTEXTS];
int sceNpBandwidthTestInitStartHook(const SceNpBandwidthTestInitParam* param)
{
if (!param) {
return SCE_NP_BANDWIDTH_TEST_ERROR_INVALID_ARGUMENT;
}
if (param->size != sizeof(SceNpBandwidthTestInitParam)) {
return SCE_NP_BANDWIDTH_TEST_ERROR_INVALID_SIZE;
}
int ctxId = g_bw_next_ctx_id % MAX_BANDWIDTH_CONTEXTS;
HOOK_LOG("ctxId=%d", ctxId);
g_bw_next_ctx_id++;
g_bw_ctx_active[ctxId] = 1;
g_bw_ctx_finished[ctxId] = 0;
return ctxId;
}
int sceNpBandwidthTestGetStatusHook(int contextId, int* status)
{
if (!status) {
return SCE_NP_BANDWIDTH_TEST_ERROR_INVALID_ARGUMENT;
}
if (contextId < 0 ||
contextId >= MAX_BANDWIDTH_CONTEXTS ||
!g_bw_ctx_active[contextId]) {
return SCE_NP_BANDWIDTH_TEST_ERROR_CONTEXT_NOT_AVAILABLE;
}
*status = SCE_NP_BANDWIDTH_TEST_STATUS_FINISHED;
g_bw_ctx_finished[contextId] = 1;
return 0;
}
int sceNpBandwidthTestShutdownHook(int contextId, SceNpBandwidthTestResult* result)
{
if (!result) {
return SCE_NP_BANDWIDTH_TEST_ERROR_INVALID_ARGUMENT;
}
if (contextId < 0 ||
contextId >= MAX_BANDWIDTH_CONTEXTS ||
!g_bw_ctx_active[contextId]) {
return SCE_NP_BANDWIDTH_TEST_ERROR_CONTEXT_NOT_AVAILABLE;
}
memset(result, 0, sizeof(SceNpBandwidthTestResult));
result->downloadBps = 100.0 * 1000 * 1000; // 100 Mbit/s
result->uploadBps = 20.0 * 1000 * 1000; // 20 Mbit/s
result->result = 0;
g_bw_ctx_active[contextId] = 0;
g_bw_ctx_finished[contextId] = 0;
HOOK_LOG("ctxId=%d DL=100Mbps UL=20Mbps", contextId);
return 0;
}
int sceNpGetParentalControlInfoHook(int reqId, SceUserServiceUserId userId, int8_t* pAge, SceNpParentalControlInfo* pInfo)
{
if (reqId <= 0 || !pAge || !pInfo) {
return SCE_NP_ERROR_INVALID_ARGUMENT;
}
*pAge = 18;
// Parental Control: alles erlaubt
memset(pInfo, 0, sizeof(SceNpParentalControlInfo));
pInfo->contentRestriction = false;
pInfo->chatRestriction = false;
pInfo->ugcRestriction = false;
return 0;
}
int sceNpCheckPlusHook(int reqId, const SceNpCheckPlusParameter* pParam, SceNpCheckPlusResult* pResult)
{
if (reqId <= 0 || !pParam || !pResult) {
return SCE_NP_ERROR_INVALID_ARGUMENT;
}
if (pParam->size != sizeof(SceNpCheckPlusParameter)) {
return SCE_NP_ERROR_INVALID_ARGUMENT;
}
memset(pResult, 0, sizeof(SceNpCheckPlusResult));
pResult->authorized = true;
return 0;
}
int sceNpSetContentRestrictionHook(const SceNpContentRestriction* pRestriction)
{
if (!pRestriction ||
pRestriction->size != sizeof(SceNpContentRestriction)) {
return SCE_NP_ERROR_INVALID_ARGUMENT;
}
return SCE_OK;
}
#include <np/np_common.h>
int sceNpGetAccountCountryHook(int32_t userId, SceNpCountryCode* countryCode)
{
countryCode->data[0] = 'd';
countryCode->data[1] = 'e';
countryCode->term = '\0';
countryCode->padding[0] = 0;
return 0;
}
int sceNpGetAccountDateOfBirthHook(SceUserServiceUserId userId, SceNpDate* pDateOfBirth)
{
if (!pDateOfBirth) {
return SCE_NP_ERROR_INVALID_ARGUMENT;
}
pDateOfBirth->year = 1990;
pDateOfBirth->month = 10;
pDateOfBirth->day = 19;
return SCE_OK;
}
static int g_next_wordfilter_ctx = 1;
int sceNpWordFilterCreateTitleCtxA_hook(SceUserServiceUserId selfId)
{
int id = g_next_wordfilter_ctx++;
HOOK_LOG("selfId=%d ctxId=%d", selfId, id);
return id;
}
static int g_next_wordfilter_req = 1;
int sceNpWordFilterCreateAsyncRequestHook(int titleCtxId, const SceNpWordFilterCreateAsyncRequestParameter* pParam)
{
if (titleCtxId <= 0) {
return SCE_NP_COMMUNITY_ERROR_INVALID_ID;
}
return g_next_wordfilter_req++;
}
#include <cstdint>
#include <cstring>
#include <cstdlib>
#include <atomic>
#include <mutex>
int64_t sceNpWordFilterSanitizeCommentHook(int reqId, char* comment, char* sanitizedComment, void* option)
{
HOOK_LOG("reqId=%d comment=\"%s\"", reqId, comment);
strncpy(sanitizedComment, comment, 1024);
sanitizedComment[1024] = '\0';
return 0;
}
int sceNpWordFilterPollAsyncHook(int reqId, int* result)
{
if (reqId <= 0) {
return SCE_NP_COMMUNITY_ERROR_INVALID_ID;
}
if (!result) {
return SCE_NP_COMMUNITY_ERROR_INVALID_ID;
}
*result = 0;
return SCE_NP_WORD_FILTER_POLL_ASYNC_RET_FINISHED;
}
//static void* g_SingletonInstance = nullptr;
//
//int sceNpWebApiRegisterServicePushEventCallbackHook(uint32_t param_1, uint32_t param_2, uint64_t param_3, uint64_t param_4) {
// if (!g_SingletonInstance) {
// g_SingletonInstance = malloc(0x168);
// memset(g_SingletonInstance, 0, 0x168);
//
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x38) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x40) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x88) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x90) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xD8) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xE0) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x128) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x130) = 8;
//
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x140), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x144), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x148), uint32_t(1));
// }
//
// return 0;
//}
//
//int sceNpWebApiUnregisterServicePushEventCallbackHook(uint32_t param_1, uint32_t param_2) {
// if (!g_SingletonInstance) {
// g_SingletonInstance = malloc(0x168);
// memset(g_SingletonInstance, 0, 0x168);
//
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x38) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x40) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x88) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x90) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xD8) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xE0) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x128) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x130) = 8;
//
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x140), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x144), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x148), uint32_t(1));
// }
//
// return 0;
//}
//
//int sceNpWebApiCreatePushEventFilterHook(uint32_t param_1, uint64_t param_2, uint64_t param_3) {
// if (!g_SingletonInstance) {
// g_SingletonInstance = malloc(0x168);
// memset(g_SingletonInstance, 0, 0x168);
//
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x38) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x40) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x88) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x90) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xD8) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xE0) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x128) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x130) = 8;
//
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x140), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x144), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x148), uint32_t(1));
// }
//
// return 0;
//}
//
//int sceNpWebApiDeletePushEventFilterHook(uint32_t param_1, uint32_t param_2) {
// if (!g_SingletonInstance) {
// g_SingletonInstance = malloc(0x168);
// memset(g_SingletonInstance, 0, 0x168);
//
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x38) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x40) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x88) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x90) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xD8) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xE0) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x128) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x130) = 8;
//
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x140), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x144), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x148), uint32_t(1));
// }
// return 0;
//}
//
//int sceNpWebApiCreateServicePushEventFilterHook(uint32_t param_1, uint32_t param_2, uint64_t param_3, uint32_t param_4, uint64_t param_5, uint64_t param_6) {
// if (!g_SingletonInstance) {
// g_SingletonInstance = malloc(0x168);
// memset(g_SingletonInstance, 0, 0x168);
//
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x38) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x40) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x88) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x90) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xD8) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xE0) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x128) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x130) = 8;
//
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x140), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x144), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x148), uint32_t(1));
// }
//
// return 2;
//}
//
//int sceNpWebApiDeleteServicePushEventFilterHook(uint32_t param_1, uint32_t param_2) {
// if (!g_SingletonInstance) {
// g_SingletonInstance = malloc(0x168);
// memset(g_SingletonInstance, 0, 0x168);
//
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x38) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x40) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x88) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x90) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xD8) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xE0) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x128) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x130) = 8;
//
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x140), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x144), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x148), uint32_t(1));
// }
//
// return 0;
//}
//
//int sceNpWebApiRegisterPushEventCallbackHook(uint32_t param_1, uint32_t param_2, uint64_t param_3, uint64_t param_4) {
// if (!g_SingletonInstance) {
// g_SingletonInstance = malloc(0x168);
// memset(g_SingletonInstance, 0, 0x168);
//
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x38) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x40) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x88) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x90) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xD8) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xE0) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x128) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x130) = 8;
//
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x140), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x144), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x148), uint32_t(1));
// }
//
// return 0;
//}
//
//#include <cstdint>
//#include <cstdlib>
//#include <cstring>
//
//static std::atomic<uint64_t> g_RequestIdCounter(1);
//
//uint64_t sceNpWebApiCreateRequestHook(uint32_t param_1, const char* param_2, const char* param_3, uint32_t param_4, uint64_t* param_5, uint64_t* param_6) {
// if (!param_6 || !param_2 || !param_3) {
// return 0xFFFFFFFFFFFFFFFF;
// }
// uint64_t requestId = g_RequestIdCounter.fetch_add(1);
//
// void* requestStruct = malloc(0x108);
// if (!requestStruct) {
// return 0xFFFFFFFFFFFFFFFF;
// }
//
// memset(requestStruct, 0, 0x108);
// *(uint64_t*)requestStruct = requestId;
// *(uint32_t*)((uintptr_t)requestStruct + 8) = param_1;
//
// strncpy((char*)((uintptr_t)requestStruct + 0x38), param_2, 0x40);
// strncpy((char*)((uintptr_t)requestStruct + 0x78), param_3, 0x40);
//
// if (!param_5) {
// strcpy((char*)((uintptr_t)requestStruct + 0xB8), "application/json");
// }
// *param_6 = requestId;
//
// return 0;
//}
//
//uint64_t sceNpWebApiDeleteRequestHook(uint64_t param_1) {
// return 0;
//}
//
//void sceNpWebApiCreateHandleHook(uint32_t param_1) {
// if (!g_SingletonInstance) {
// g_SingletonInstance = malloc(0x168);
// memset(g_SingletonInstance, 0, 0x168);
//
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x38) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x40) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x88) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x90) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xD8) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0xE0) = 8;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x128) = 7;
// *(uint64_t*)((uintptr_t)g_SingletonInstance + 0x130) = 8;
//
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x140), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x144), uint32_t(1));
// std::atomic_store((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x148), uint32_t(1));
// }
//
// std::atomic_fetch_add((std::atomic<uint32_t>*)((uintptr_t)g_SingletonInstance + 0x148), 1);
//
// return;
//}
//
//int sceNpWebApiSendRequestHook(uint64_t param_1, int64_t param_2, int64_t param_3) {
// return 0;
//}
//
//uint64_t sceNpWebApiGetHttpStatusCodeHook(uint64_t param_1, uint32_t* param_2) {
// if (param_2 != nullptr) {
// *param_2 = 200;
// return 0;
// }
//
// return 0xFFFFFFFFFFFFFFFF;
//}
//
//uint64_t sceNpWebApiReadDataHook(uint64_t param_1, void* param_2, uint64_t param_3) {
//
// if (param_2 == nullptr || param_3 == 0) {
// return 0;
// }
// memset(param_2, 0, param_3);
//
// return param_3;
//}
void memcpy_p(unsigned long Address, const void* Data, unsigned long Length)
{
if (!Address || !Length)
{
printf("No target (0x%lx) or length (%li) provided!\n", Address, Length);
return;
}
sceKernelMprotect((void*)Address, Length, 0x7);
memcpy((void*)Address, Data, Length);
}
void WriteJump(void* target, void* replacement)
{
unsigned char jump[14] = {
0xFF, 0x25, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
*(uint64_t*)(jump + 6) = (uint64_t)replacement;
memcpy_p((unsigned long)target, jump, sizeof(jump));
}
bool ApplyDirectHooks()
{
struct DirectHook {
unsigned long address;
void* hookFunction;
void** originalFunction;
const char* description;
};
DirectHook directHooks[] = {
{0x2B41240, (void*)sceNpCheckNpAvailabilityhook, (void**)&sceNpCheckNpAvailabilityOriginal, "sceNpCheckNpAvailability"},
{0x2B40ED0, (void*)sceNpGetStateHook, (void**)&sceNpGetStateOriginal, "sceNpGetState"},
{0x2B40EE0, (void*)sceNpGetOnlineIdHook, (void**)&sceNpGetOnlineIdOriginal, "sceNpGetOnlineId"},
{0x2B40ef0, (void*)sceNpGetAccountIdHook, (void**)&sceNpGetAccountIdOriginal, "sceNpGetAccountId"},
{0x2B410a0, (void*)sceNpRegisterStateCallbackHook, (void**)&sceNpRegisterStateCallbackOriginal, "sceNpRegisterStateCallback"},
{0x2B410b0, (void*)sceNpRegisterGamePresenceCallbackHook, (void**)&sceNpRegisterGamePresenceCallbackOriginal, "sceNpRegisterGamePresenceCallback"},
{0x2B410d0, (void*)sceUserServiceGetEventHook, (void**)&sceUserServiceGetEventOriginal, "sceUserServiceGetEvent"},
{0x2B41230, (void*)sceNpGetGamePresenceStatusHook, (void**)&sceNpGetGamePresenceStatusOriginal, "sceNpGetGamePresenceStatus"},
{0x2B41360, (void*)sceCommonDialogInitializeHook, (void**)&sceCommonDialogInitializeOriginal, "sceCommonDialogInitialize"},
{0x2B41640, (void*)sceNpGetNpIdHook, (void**)&sceNpGetNpIdOriginal, "sceNpGetNpId"},
//{0x2B41610, (void*)sceNpWebApiUtilityParseNpIdHook, (void**)&sceNpWebApiUtilityParseNpIdOriginal, "sceNpWebApiUtilityParseNpId"},
{0x2B41250, (void*)sceNpAuthCreateAsyncRequestHook, (void**)&sceNpAuthCreateAsyncRequestOriginal, "sceNpAuthCreateAsyncRequest"},
{0x2B41200, (void*)sceNpCreateAsyncRequestHook, (void**)&sceNpCreateAsyncRequestOriginal, "sceNpCreateAsyncRequest"},
{0x2B412B0, (void*)sceNpPollAsyncHook, (void**)&sceNpPollAsyncOriginal, "sceNpPollAsync"},
{0x2B412C0, (void*)sceNpAuthPollAsyncHook, (void**)&sceNpAuthPollAsyncOriginal, "sceNpAuthPollAsync"},
{0x2B41260, (void*)sceNpAuthGetAuthorizationCodeHook, (void**)&sceNpAuthGetAuthorizationCodeOriginal, "sceNpAuthGetAuthorizationCode"},
{0x2B41070, (void*)sceNpCommerceDialogInitializeHook, (void**)&sceNpCommerceDialogInitializeOriginal, "sceNpCommerceDialogInitialize"},
{0x2B41080, (void*)sceNpCommerceDialogOpenHook, (void**)&sceNpCommerceDialogOpenOriginal, "sceNpCommerceDialogOpen"},
{0x2B412F0, (void*)sceNpCommerceDialogUpdateStatus_hook, (void**)&sceNpCommerceDialogUpdateStatusOriginal, "sceNpCommerceDialogUpdateStatus"},
{0x2B41380, (void*)sceNpCommerceDialogTerminateHook, (void**)&sceNpCommerceDialogTerminateOriginal, "sceNpCommerceDialogTerminate"},
{0x2B41300, (void*)sceNpCommerceDialogGetResultHook, (void**)&sceNpCommerceDialogGetResultOriginal, "sceNpCommerceDialogGetResult"},
{0x2B41390, (void*)sceNpCommerceShowPsStoreIconHook, (void**)&sceNpCommerceShowPsStoreIconOriginal, "sceNpCommerceShowPsStoreIcon"},
{0x2B413A0, (void*)sceNpCommerceHidePsStoreIconHook, (void**)&sceNpCommerceHidePsStoreIconOriginal, "sceNpCommerceHidePsStoreIcon"},
{0x2B41320, (void*)sceNpBandwidthTestInitStartHook, (void**)&sceNpBandwidthTestInitStartOriginal, "sceNpBandwidthTestInitStart"},
{0x2B41310, (void*)sceNpBandwidthTestGetStatusHook, (void**)&sceNpBandwidthTestGetStatusOriginal, "sceNpBandwidthTestGetStatus"},
{0x2B40F70, (void*)sceNpBandwidthTestShutdownHook, (void**)&sceNpBandwidthTestShutdownOriginal, "sceNpBandwidthTestShutdown"},
{0x2B41210, (void*)sceNpGetParentalControlInfoHook, (void**)&sceNpGetParentalControlInfoOriginal, "sceNpGetParentalControlInfo"},
{0x2B412A0, (void*)sceNpCheckPlusHook, (void**)&sceNpCheckPlusOriginal, "sceNpCheckPlus"},
{0x2B40EB0, (void*)sceNpSetContentRestrictionHook, (void**)&sceNpSetContentRestrictionOriginal, "sceNpSetContentRestriction"},
{0x2B41280, (void*)sceNpGetAccountCountryHook, (void**)&sceNpGetAccountCountryOriginal, "sceNpGetAccountCountry"},
{0x2B41290, (void*)sceNpGetAccountDateOfBirthHook, (void**)&sceNpGetAccountDateOfBirthOriginal, "sceNpGetAccountDateOfBirth"},
{0x2B41650, (void*)sceNpWordFilterCreateTitleCtxA_hook, (void**)&sceNpWordFilterCreateTitleCtxOriginal, "sceNpWordFilterCreateTitleCtx"},
{0x2B41660, (void*)sceNpWordFilterCreateAsyncRequestHook, (void**)&sceNpWordFilterCreateAsyncRequestOriginal, "sceNpWordFilterCreateAsyncRequest"},
{0x2B41670, (void*)sceNpWordFilterSanitizeCommentHook, (void**)&sceNpWordFilterSanitizeCommentOriginal, "sceNpWordFilterSanitizeComment"},
{0x2B41680, (void*)sceNpWordFilterPollAsyncHook, (void**)&sceNpWordFilterPollAsyncOriginal, "sceNpWordFilterPollAsync"},
//{0x2B415C0, (void*)sceNpWebApiRegisterServicePushEventCallbackHook, (void**)&sceNpWebApiRegisterServicePushEventCallbackOriginal, "sceNpWebApiRegisterServicePushEventCallback"},
//{0x2B41000, (void*)sceNpWebApiUnregisterServicePushEventCallbackHook, (void**)&sceNpWebApiUnregisterServicePushEventCallbackOriginal, "sceNpWebApiUnregisterServicePushEventCallback"},
//{0x2B41560, (void*)sceNpWebApiCreatePushEventFilterHook, (void**)&sceNpWebApiCreatePushEventFilterOriginal, "sceNpWebApiCreatePushEventFilter"},
//{0x2B41010, (void*)sceNpWebApiDeletePushEventFilterHook, (void**)&sceNpWebApiDeletePushEventFilterOriginal, "sceNpWebApiDeletePushEventFilter"},
//{0x2B415B0, (void*)sceNpWebApiCreateServicePushEventFilterHook, (void**)&sceNpWebApiCreateServicePushEventFilterOriginal, "sceNpWebApiCreateServicePushEventFilter"},
//{0x2B41590, (void*)sceNpWebApiDeleteServicePushEventFilterHook, (void**)&sceNpWebApiDeleteServicePushEventFilterOriginal, "sceNpWebApiDeleteServicePushEventFilter"},
//{0x2B41570, (void*)sceNpWebApiRegisterPushEventCallbackHook, (void**)&sceNpWebApiRegisterPushEventCallbackOriginal, "sceNpWebApiRegisterPushEventCallback"},
//{0x2B41580, (void*)sceNpWebApiCreateRequestHook, (void**)&sceNpWebApiCreateRequestOriginal, "sceNpWebApiCreateRequest"},
//{0x2B415D0, (void*)sceNpWebApiDeleteRequestHook, (void**)&sceNpWebApiDeleteRequestOriginal, "sceNpWebApiDeleteRequest"},
//{0x2B415A0, (void*)sceNpWebApiCreateHandleHook, (void**)&sceNpWebApiCreateHandleOriginal, "sceNpWebApiCreateHandle"},
//{0x2B415E0, (void*)sceNpWebApiSendRequestHook, (void**)&sceNpWebApiSendRequestOriginal, "sceNpWebApiSendRequest"},
//{0x2B415F0, (void*)sceNpWebApiGetHttpStatusCodeHook, (void**)&sceNpWebApiGetHttpStatusCodeOriginal, "sceNpWebApiGetHttpStatusCode"},
//{0x2B41600, (void*)sceNpWebApiReadDataHook, (void**)&sceNpWebApiReadDataOriginal, "sceNpWebApiReadData"},
};
for (auto& hook : directHooks) {
if (hook.address != 0) {
WriteJump((void*)hook.address, hook.hookFunction);
printf("Direct hook applied to 0x%lx: %s\n", hook.address, hook.description);
}
}
return true;
}
void* main_thread(void*)
{
sceKernelUsleep(10 * 1000);
//https patches
//memcpy_p(0x2C045B4, "\x68\x74\x74\x70\x00\x00", 6);
//memcpy_p(0x2C0D09B, "\x68\x74\x74\x70\x00\x00", 6);
//memcpy_p(0x2C0D7FE, "\x68\x74\x74\x70\x3A\x2F\x2F\x00\x00", 9);
//memcpy_p(0x2C3889C, "\x68\x74\x74\x70\x3A\x2F\x2F\x00\x00", 9);
//memcpy_p(0x2C1047E, "\x68\x74\x74\x70\x3A\x2F\x2F\x25\x73\x00\x00", 11);
//memcpy_p(0x2C0EFC6, "\x68\x74\x74\x70\x3A\x2F\x2F\x25\x73\x2F\x25\x73\x00\x00", 14);
//memcpy_p(0x2C0DF11, "\x68\x74\x74\x70\x3A\x2F\x2F\x00\x00", 9);
//memcpy_p(0x2C0D7FE, "\x68\x74\x74\x70\x3A\x2F\x2F\x00\x00", 9);
//memcpy_p(0x2C0EF9B, "\x68\x74\x74\x70\x3A\x2F\x2F\x70\x72\x6F\x64\x2E\x25\x73\x2F\x25\x73\x00\x00", 19);
//memcpy_p(0x2C131F2, "\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x00\x00", 13);
////remove auth-
//memcpy_p(0x2C0F8D4, "\x25\x73\x00\x00\x00\x00\x00\x00", 8);
//memcpy_p(0x2C0FA32, "\x72\x6F\x73\x2E\x70\x61\x72\x61\x64\x69\x73\x65\x73\x70\x72\x78\x2E\x65\x73\x00\x00\x00", 22);
//memcpy_p(0x1E85A85, "\xBE\x00\x00\x00\x00", 5); //0000000001A85A85
//memcpy_p(0x19314C8, "\x41\xB8\x43\x03\x00\x00", 6); //15314C8
//memcpy_p(0x2C39CD4, "\x25\x73\x2D\x25\x73\x00\x00\x00\x00\x00\x00", 11);
//memcpy_p(0x190B8A0, "\xB0\x01\xC3", 3);
if (ApplyDirectHooks()) {
sceSysUtilSendSystemNotificationWithText(222, "hooked successfully!");
}
else {
sceSysUtilSendSystemNotificationWithText(222, "hooking failed!");
}
scePthreadExit(0);
return nullptr;
}
pthread_t threadid;
extern "C" int module_start(size_t args, const void* argp)
{
int sysutil = sceKernelLoadStartModule("libSceSysUtil.sprx", 0, NULL, 0, 0, 0);
orbis_syscall(591, sysutil, "sceSysUtilSendSystemNotificationWithText", &sceSysUtilSendSystemNotificationWithText);
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, 0);
pthread_create(&threadid, NULL, main_thread, NULL);
return SCE_OK;
}
extern "C" int module_stop(size_t args, const void* argp)
{
return SCE_OK;
}