mirror of
https://github.com/switchbrew/nx-hbloader.git
synced 2025-06-21 05:22:40 +02:00
Use new virtmem API for NRO ASLR
This commit is contained in:
parent
a13d5e7af2
commit
5ce1d33b7d
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user