Use new virtmem API for NRO ASLR

This commit is contained in:
fincs 2020-08-06 00:47:03 +02:00
parent a13d5e7af2
commit 5ce1d33b7d
No known key found for this signature in database
GPG Key ID: 62C7609ADA219C60

View File

@ -375,34 +375,32 @@ void loadNro(void)
memcpy(&g_nroHeader, header, sizeof(g_nroHeader)); memcpy(&g_nroHeader, header, sizeof(g_nroHeader));
header = &g_nroHeader; header = &g_nroHeader;
u64 map_addr; // Map code memory to a new randomized address
virtmemLock();
do { void* map_addr = virtmemFindAslr(total_size, 0);
map_addr = randomGet64() & 0xFFFFFF000ull; rc = svcMapProcessCodeMemory(g_procHandle, (u64)map_addr, (u64)nrobuf, total_size);
rc = svcMapProcessCodeMemory(g_procHandle, map_addr, (u64)nrobuf, total_size); virtmemUnlock();
} while (rc == 0xDC01 || rc == 0xD401);
if (R_FAILED(rc)) if (R_FAILED(rc))
fatalThrow(MAKERESULT(Module_HomebrewLoader, 18)); fatalThrow(MAKERESULT(Module_HomebrewLoader, 18));
// .text // .text
rc = svcSetProcessMemoryPermission( 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)) if (R_FAILED(rc))
fatalThrow(MAKERESULT(Module_HomebrewLoader, 19)); fatalThrow(MAKERESULT(Module_HomebrewLoader, 19));
// .rodata // .rodata
rc = svcSetProcessMemoryPermission( 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)) if (R_FAILED(rc))
fatalThrow(MAKERESULT(Module_HomebrewLoader, 20)); fatalThrow(MAKERESULT(Module_HomebrewLoader, 20));
// .data + .bss // .data + .bss
rc = svcSetProcessMemoryPermission( 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)) if (R_FAILED(rc))
fatalThrow(MAKERESULT(Module_HomebrewLoader, 21)); fatalThrow(MAKERESULT(Module_HomebrewLoader, 21));
@ -462,15 +460,13 @@ void loadNro(void)
// HosVersion // HosVersion
entries[10].Value[0] = hosversionGet(); entries[10].Value[0] = hosversionGet();
u64 entrypoint = map_addr; g_nroAddr = (u64)map_addr;
g_nroAddr = map_addr;
g_nroSize = nro_size; g_nroSize = nro_size;
memset(__stack_top - STACK_SIZE, 0, STACK_SIZE); memset(__stack_top - STACK_SIZE, 0, STACK_SIZE);
extern NORETURN void nroEntrypointTrampoline(u64 entries_ptr, u64 handle, u64 entrypoint); 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) int main(int argc, char **argv)