mirror of
https://gitlab.com/Theopse/fbi-i18n-zh.git
synced 2025-04-30 13:26:37 +08:00
Remove patcher.
This commit is contained in:
parent
0844cc6932
commit
e6cf9caf12
@ -7,7 +7,6 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "libkhax/khax.h"
|
#include "libkhax/khax.h"
|
||||||
#include "mch2t/mch2t.h"
|
#include "mch2t/mch2t.h"
|
||||||
#include "patcher/patcher.h"
|
|
||||||
#include "ui/mainmenu.h"
|
#include "ui/mainmenu.h"
|
||||||
#include "ui/section/action/clipboard.h"
|
#include "ui/section/action/clipboard.h"
|
||||||
#include "ui/section/task/task.h"
|
#include "ui/section/task/task.h"
|
||||||
@ -45,8 +44,6 @@ int main(int argc, const char* argv[]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
apply_patches();
|
|
||||||
|
|
||||||
aptOpenSession();
|
aptOpenSession();
|
||||||
Result setCpuTimeRes = APT_SetAppCpuTimeLimit(30);
|
Result setCpuTimeRes = APT_SetAppCpuTimeLimit(30);
|
||||||
aptCloseSession();
|
aptCloseSession();
|
||||||
|
@ -241,6 +241,28 @@ static void allocate_work(void) {
|
|||||||
svcExitThread();
|
svcExitThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 kprocess_ptr = 0;
|
||||||
|
u32 kprocess_pid_offset = 0;
|
||||||
|
|
||||||
|
u32 old_pid = 0;
|
||||||
|
|
||||||
|
s32 kernel_patch_pid_zero() {
|
||||||
|
u32* pidPtr = (u32*) (*(u32*) kprocess_ptr + kprocess_pid_offset);
|
||||||
|
|
||||||
|
old_pid = *pidPtr;
|
||||||
|
*pidPtr = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
s32 kernel_patch_pid_reset() {
|
||||||
|
u32* pidPtr = (u32*) (*(u32*) kprocess_ptr + kprocess_pid_offset);
|
||||||
|
|
||||||
|
*pidPtr = old_pid;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#define VTABLE_ENTRIES 64
|
#define VTABLE_ENTRIES 64
|
||||||
#define MAX_HANDLES 32
|
#define MAX_HANDLES 32
|
||||||
#define DUMMY_STACK_U32S 0x80
|
#define DUMMY_STACK_U32S 0x80
|
||||||
@ -643,10 +665,32 @@ Result mch2t(void) {
|
|||||||
STEP_PRINT_VA(8, "free memory before exploit: %lld", start_free);
|
STEP_PRINT_VA(8, "free memory before exploit: %lld", start_free);
|
||||||
STEP_PRINT_VA(8, "free memory now: %lld", osGetMemRegionFree(MEMREGION_APPLICATION));
|
STEP_PRINT_VA(8, "free memory now: %lld", osGetMemRegionFree(MEMREGION_APPLICATION));
|
||||||
|
|
||||||
|
kprocess_ptr = 0xFFFF9004;
|
||||||
|
|
||||||
|
if(osGetKernelVersion() < 0x022C0600) {
|
||||||
|
kprocess_pid_offset = 0xAC;
|
||||||
|
} else {
|
||||||
|
bool n3ds = false;
|
||||||
|
APT_CheckNew3DS((u8*) &n3ds);
|
||||||
|
|
||||||
|
if(n3ds) {
|
||||||
|
kprocess_pid_offset = 0xBC;
|
||||||
|
} else {
|
||||||
|
kprocess_pid_offset = 0xB4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(osGetKernelVersion() > 0x022E0000) {
|
||||||
|
svcBackdoor(kernel_patch_pid_zero);
|
||||||
|
srvExit();
|
||||||
|
srvInit();
|
||||||
|
svcBackdoor(kernel_patch_pid_reset);
|
||||||
|
}
|
||||||
|
|
||||||
STEP_PRINT(9, "success!");
|
STEP_PRINT(9, "success!");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
exploit_failed:
|
exploit_failed:
|
||||||
DEBUG_PRINT("Exploit failed irrecoverably; please long-press power and reboot");
|
DEBUG_PRINT("Exploit failed irrecoverably; please long-press power and reboot");
|
||||||
while (true) {
|
while (true) {
|
||||||
svcSleepThread(10000000000ULL);
|
svcSleepThread(10000000000ULL);
|
||||||
|
@ -1,139 +0,0 @@
|
|||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <3ds.h>
|
|
||||||
|
|
||||||
#include "patcher.h"
|
|
||||||
|
|
||||||
#pragma pack(1)
|
|
||||||
typedef struct KBlockInfo {
|
|
||||||
u32 section_start;
|
|
||||||
u32 page_count;
|
|
||||||
} KBlockInfo;
|
|
||||||
|
|
||||||
typedef struct KLinkedListNode {
|
|
||||||
struct KLinkedListNode* next;
|
|
||||||
struct KLinkedListNode* prev;
|
|
||||||
void* data;
|
|
||||||
} KLinkedListNode;
|
|
||||||
|
|
||||||
typedef struct MemSectionInfo {
|
|
||||||
u8 padding[0x0C - 0x00];
|
|
||||||
KLinkedListNode* first_node;
|
|
||||||
KLinkedListNode* last_node;
|
|
||||||
} MemSectionInfo;
|
|
||||||
|
|
||||||
typedef struct KCodeSet {
|
|
||||||
u8 padding0[0x08 - 0x00];
|
|
||||||
MemSectionInfo text_info;
|
|
||||||
u8 padding1[0x64 - 0x1C];
|
|
||||||
} KCodeSet;
|
|
||||||
#pragma pack(0)
|
|
||||||
|
|
||||||
u32 kprocess_ptr = 0;
|
|
||||||
u32 kprocess_size = 0;
|
|
||||||
u32 kprocess_code_set_offset = 0;
|
|
||||||
u32 kprocess_pid_offset = 0;
|
|
||||||
|
|
||||||
s32 kernel_patch_fs() {
|
|
||||||
asm volatile("cpsid aif");
|
|
||||||
|
|
||||||
u32 currProcessPtr = *(u32*) kprocess_ptr;
|
|
||||||
u32 vtablePtr = *(u32*) currProcessPtr;
|
|
||||||
|
|
||||||
for(u32 processPtr = currProcessPtr; *(u32*) processPtr == vtablePtr; processPtr -= kprocess_size) {
|
|
||||||
if(*(u32*) (processPtr + kprocess_pid_offset) == 0) {
|
|
||||||
KCodeSet* codeSet = *(KCodeSet**) (processPtr + kprocess_code_set_offset);
|
|
||||||
if(codeSet != NULL) {
|
|
||||||
// Patches out an archive access check.
|
|
||||||
u8 original[] = {0x0C, 0x05, 0x0C, 0x33, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x28, 0x01, 0xD0, 0x00, 0x20, 0xF8};
|
|
||||||
u8 patched[] = {0x0C, 0x05, 0x0C, 0x33, 0x46, 0x01, 0x20, 0x00, 0x00, 0x00, 0x28, 0x01, 0xD0, 0x00, 0x20, 0xF8};
|
|
||||||
|
|
||||||
for(KLinkedListNode* node = codeSet->text_info.first_node; node != NULL; node = node->next) {
|
|
||||||
KBlockInfo* blockInfo = (KBlockInfo*) node->data;
|
|
||||||
u32 blockSize = blockInfo->page_count * 0x1000;
|
|
||||||
|
|
||||||
bool done = false;
|
|
||||||
for(u32 i = 0; i <= blockSize - sizeof(original); i++) {
|
|
||||||
u8* dst = (u8*) (blockInfo->section_start + i);
|
|
||||||
|
|
||||||
bool equal = true;
|
|
||||||
for(u32 b = 0; b < sizeof(original); b++) {
|
|
||||||
if(original[b] != 0xFF && dst[b] != original[b]) {
|
|
||||||
equal = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(equal) {
|
|
||||||
for(u32 b = 0; b < sizeof(patched); b++) {
|
|
||||||
dst[b] = patched[b];
|
|
||||||
}
|
|
||||||
|
|
||||||
done = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(done || node == codeSet->text_info.last_node) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 old_pid = 0;
|
|
||||||
|
|
||||||
s32 kernel_patch_pid_zero() {
|
|
||||||
u32* pidPtr = (u32*) (*(u32*) kprocess_ptr + kprocess_pid_offset);
|
|
||||||
|
|
||||||
old_pid = *pidPtr;
|
|
||||||
*pidPtr = 0;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
s32 kernel_patch_pid_reset() {
|
|
||||||
u32* pidPtr = (u32*) (*(u32*) kprocess_ptr + kprocess_pid_offset);
|
|
||||||
|
|
||||||
*pidPtr = old_pid;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void apply_patches() {
|
|
||||||
kprocess_ptr = 0xFFFF9004;
|
|
||||||
|
|
||||||
if(osGetKernelVersion() < 0x022C0600) {
|
|
||||||
kprocess_size = 0x260;
|
|
||||||
kprocess_code_set_offset = 0xA8;
|
|
||||||
kprocess_pid_offset = 0xAC;
|
|
||||||
} else {
|
|
||||||
bool n3ds = false;
|
|
||||||
APT_CheckNew3DS((u8*) &n3ds);
|
|
||||||
|
|
||||||
if(n3ds) {
|
|
||||||
kprocess_size = 0x270;
|
|
||||||
kprocess_code_set_offset = 0xB8;
|
|
||||||
kprocess_pid_offset = 0xBC;
|
|
||||||
} else {
|
|
||||||
kprocess_size = 0x268;
|
|
||||||
kprocess_code_set_offset = 0xB0;
|
|
||||||
kprocess_pid_offset = 0xB4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(osGetKernelVersion() > 0x022E0000) {
|
|
||||||
svcBackdoor(kernel_patch_pid_zero);
|
|
||||||
srvExit();
|
|
||||||
srvInit();
|
|
||||||
svcBackdoor(kernel_patch_pid_reset);
|
|
||||||
}
|
|
||||||
|
|
||||||
svcBackdoor(kernel_patch_fs);
|
|
||||||
}
|
|
@ -1,4 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
void apply_patches();
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user