From 5ce1d33b7de373d767ea7359f693652ba987a59d Mon Sep 17 00:00:00 2001 From: fincs Date: Thu, 6 Aug 2020 00:47:03 +0200 Subject: [PATCH] Use new virtmem API for NRO ASLR --- source/main.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/source/main.c b/source/main.c index c70b4eb..9784030 100644 --- a/source/main.c +++ b/source/main.c @@ -375,34 +375,32 @@ void loadNro(void) memcpy(&g_nroHeader, header, sizeof(g_nroHeader)); header = &g_nroHeader; - u64 map_addr; - - do { - map_addr = randomGet64() & 0xFFFFFF000ull; - rc = svcMapProcessCodeMemory(g_procHandle, map_addr, (u64)nrobuf, total_size); - - } while (rc == 0xDC01 || rc == 0xD401); + // Map code memory to a new randomized address + virtmemLock(); + void* map_addr = virtmemFindAslr(total_size, 0); + rc = svcMapProcessCodeMemory(g_procHandle, (u64)map_addr, (u64)nrobuf, total_size); + virtmemUnlock(); if (R_FAILED(rc)) fatalThrow(MAKERESULT(Module_HomebrewLoader, 18)); // .text rc = svcSetProcessMemoryPermission( - g_procHandle, map_addr + header->segments[0].file_off, header->segments[0].size, Perm_R | Perm_X); + g_procHandle, (u64)map_addr + header->segments[0].file_off, header->segments[0].size, Perm_R | Perm_X); if (R_FAILED(rc)) fatalThrow(MAKERESULT(Module_HomebrewLoader, 19)); // .rodata rc = svcSetProcessMemoryPermission( - g_procHandle, map_addr + header->segments[1].file_off, header->segments[1].size, Perm_R); + g_procHandle, (u64)map_addr + header->segments[1].file_off, header->segments[1].size, Perm_R); if (R_FAILED(rc)) fatalThrow(MAKERESULT(Module_HomebrewLoader, 20)); // .data + .bss rc = svcSetProcessMemoryPermission( - g_procHandle, map_addr + header->segments[2].file_off, rw_size, Perm_Rw); + g_procHandle, (u64)map_addr + header->segments[2].file_off, rw_size, Perm_Rw); if (R_FAILED(rc)) fatalThrow(MAKERESULT(Module_HomebrewLoader, 21)); @@ -462,15 +460,13 @@ void loadNro(void) // HosVersion entries[10].Value[0] = hosversionGet(); - u64 entrypoint = map_addr; - - g_nroAddr = map_addr; + g_nroAddr = (u64)map_addr; g_nroSize = nro_size; memset(__stack_top - STACK_SIZE, 0, STACK_SIZE); extern NORETURN void nroEntrypointTrampoline(u64 entries_ptr, u64 handle, u64 entrypoint); - nroEntrypointTrampoline((u64) entries, -1, entrypoint); + nroEntrypointTrampoline((u64) entries, -1, g_nroAddr); } int main(int argc, char **argv)