static int lv2_unpatch_storage_341(void) { if(!is_patched) return -1; install_new_poke(); if (!map_lv1()) { remove_new_poke(); return -1; } //search bin "5F 6F 66 5F 70 72 6F 64 75 63 74 5F 6D 6F 64 65" to find // LV2 disable syscall storage int n; for(n = 0; n < 20; n++) { pokeq(0x80000000002CF880ULL, save_lv2_storage_patch); lv1_poke(0x16f3b8ULL, save_lv1_storage_patches[0]); lv1_poke(0x16f3dcULL, save_lv1_storage_patches[1]); lv1_poke(0x16f454ULL, save_lv1_storage_patches[2]); lv1_poke(0x16f45cULL, save_lv1_storage_patches[3]); usleep(5000); } remove_new_poke(); unmap_lv1(); return 0; }
void patch_lv2_protection() { // changes protected area of lv2 to first byte only lv1_poke(0x363a78, 0x0000000000000001ULL); lv1_poke(0x363a80, 0xe0d251b556c59f05ULL); lv1_poke(0x363a88, 0xc232fcad552c80d7ULL); lv1_poke(0x363a90, 0x65140cd200000000ULL); }
static int lv2_patch_storage_341(void) { install_new_poke(); if (!map_lv1()) { remove_new_poke(); return -1; } //search bin "5F 6F 66 5F 70 72 6F 64 75 63 74 5F 6D 6F 64 65" to find // LV2 enable syscall storage save_lv2_storage_patch= peekq(0x80000000002CF880ULL); save_lv1_storage_patches[0] = peekq(HV_BASE_341 + 0x16f3b8ULL); save_lv1_storage_patches[1] = peekq(HV_BASE_341 + 0x16f3dcULL); save_lv1_storage_patches[2] = peekq(HV_BASE_341 + 0x16f454ULL); save_lv1_storage_patches[3] = peekq(HV_BASE_341 + 0x16f45cULL); int n; for(n = 0; n < 20; n++) { pokeq32(0x80000000002CF880ULL, 0x40000000); lv1_poke(0x16f3b8ULL, 0x7f83e37860000000ULL); lv1_poke(0x16f3dcULL, 0x7f85e37838600001ULL); lv1_poke(0x16f454ULL, 0x7f84e3783be00001ULL); lv1_poke(0x16f45cULL, 0x9be1007038600000ULL); usleep(5000); } remove_new_poke(); unmap_lv1(); is_patched = 1; return 0; }
void patch_lv2_protection(void) { int n; for(n = 0; n < 20; n++) { // changes protected area of lv2 to first byte only lv1_poke(0x363a78, 0x0000000000000001ULL); lv1_poke(0x363a80, 0xe0d251b556c59f05ULL); lv1_poke(0x363a88, 0xc232fcad552c80d7ULL); lv1_poke(0x363a90, 0x65140cd200000000ULL); usleep(5000); } }
/*********************************************************************** * main ***********************************************************************/ int main(int argc, char **argv) { int result; netInitialize(); udp_printf_init(); PRINTF("%s:%d: start\n", __func__, __LINE__); result = lv1_map(); if (result) { PRINTF("%s:%d: lv1_map failed (0x%08x)\n", __func__, __LINE__, result); goto done; } PRINTF("%s:%d: patching log2 page size\n", __func__, __LINE__); lv1_poke(LOG2_PAGE_SIZE_OFFSET, LOG2_PAGE_SIZE); PRINTF("%s:%d: end\n", __func__, __LINE__); done: result = lv1_unmap(); if (result) PRINTF("%s:%d: lv1_unmap failed (0x%08x)\n", __func__, __LINE__, result); udp_printf_deinit(); netDeinitialize(); return 0; }