mirror of
https://github.com/Whispergate/JanusLoader
synced 2026-07-22 11:23:12 +00:00
60 lines
1.4 KiB
C++
60 lines
1.4 KiB
C++
#pragma once
|
|
typedef unsigned long long uintptr_t;
|
|
typedef unsigned long long uint64_t;
|
|
|
|
// Inline wrappers for Janus ECALLs from payload code.
|
|
// These must stay header-only so the payload has no external deps.
|
|
|
|
static inline void* janus_get_peb() {
|
|
void* r;
|
|
asm volatile (
|
|
"li a7, 0\n"
|
|
"ecall\n"
|
|
"mv %0, a0\n"
|
|
: "=r"(r) :: "a7", "a0", "memory"
|
|
);
|
|
return r;
|
|
}
|
|
|
|
// fn: function pointer obtained via janus_resolve
|
|
// args: array of uintptr_t on the stack, argc: element count
|
|
static inline uintptr_t janus_host_call(void* fn, uintptr_t* args, int argc) {
|
|
uintptr_t r;
|
|
asm volatile (
|
|
"li a7, 1\n"
|
|
"mv a0, %1\n"
|
|
"mv a1, %2\n"
|
|
"mv a2, %3\n"
|
|
"ecall\n"
|
|
"mv %0, a0\n"
|
|
: "=r"(r)
|
|
: "r"(fn), "r"(args), "r"((uintptr_t)argc)
|
|
: "a7", "a0", "a1", "a2", "memory"
|
|
);
|
|
return r;
|
|
}
|
|
|
|
static inline void* janus_resolve(const char* mod, const char* sym) {
|
|
void* r;
|
|
asm volatile (
|
|
"li a7, 2\n"
|
|
"mv a0, %1\n"
|
|
"mv a1, %2\n"
|
|
"ecall\n"
|
|
"mv %0, a0\n"
|
|
: "=r"(r)
|
|
: "r"(mod), "r"(sym)
|
|
: "a7", "a0", "a1", "memory"
|
|
);
|
|
return r;
|
|
}
|
|
|
|
static inline void janus_exit(int code) {
|
|
asm volatile (
|
|
"li a7, 3\n"
|
|
"mv a0, %0\n"
|
|
"ecall\n"
|
|
:: "r"((uintptr_t)code) : "a7", "a0", "memory"
|
|
);
|
|
}
|