System API (CPU & Disassembly)
The System API provides low-level functionality for CPU information, performance timing, and x64 instruction disassembly using Zydis. All functions listed here are available globally inside Lua scripts.
📌 Available Functions
CPU Information
cpu_vendor()
string
CPU vendor (e.g. "AuthenticAMD" or "GenuineIntel").
cpu_brand()
string
Human-readable CPU model string.
Timing Functions
rdtsc()
uint64
Raw timestamp counter from the CPU. Fast but CPU-frequency dependent.
perf_time()
int64
High-resolution performance counter ticks from Windows.
perf_frequency()
int64
Number of performance counter ticks per second.
Useful for accurate microbenchmarking:
seconds = (perf_time_end - perf_time_start) / perf_frequency()Disassembly (Zydis)
zydis_disasm(bytes_table, [runtime_rip])
table (array of instructions)
Disassembles multiple x64 instructions and returns detailed structured output.
Instruction Structure
zydis_disasm returns an array of disasm_instruction_t.
Each instruction contains:
{
runtime_address = 0x140000000, -- uint64
length = 5, -- bytes
mnemonic = "mov", -- "push", "call", etc.
text = "mov rbp, rsp", -- full Intel syntax
operand_count = 3, -- total (explicit + hidden)
operand_count_visible = 2, -- explicit operands only
operands = { operand_t, operand_t, ... }
}Operand Structure
Each operand is an operand_t table with a consistent schema:
{
id = 0,
visibility = "explicit", -- "explicit" | "implicit" | "hidden"
type = "reg", -- "reg" | "mem" | "imm" | "ptr" | "unused"
size = 64, -- bits
-- Register operand
reg = {
name = "rbp"
},
-- Memory operand
mem = {
segment = "ss",
base = "rsp",
index = nil,
scale = 1,
has_displacement = true,
displacement = -0x20,
},
-- Immediate operand
imm = {
is_signed = true,
is_relative = false,
value = 48,
absolute_address = nil, -- if relative & resolvable
},
-- Pointer operand
ptr = {
segment = 0x1234,
offset = 0xABCDEF,
}
}🚀 Usage Examples
1. CPU Information
function main()
log("CPU Vendor: " .. cpu_vendor())
log("CPU Brand : " .. cpu_brand())
end2. High-Resolution Timing
function main()
local freq = perf_frequency()
local t0 = perf_time()
-- workload
for i = 1, 1000000 do end
local t1 = perf_time()
local dt = (t1 - t0) / freq
log("Elapsed seconds: " .. dt)
end3. Disassemble Raw Bytes
You can disassemble any byte array:
function main()
local bytes = {
0x55, -- push rbp
0x48, 0x89, 0xE5, -- mov rbp, rsp
0x48, 0x83, 0xEC, 0x30 -- sub rsp, 0x30
}
local ins = zydis_disasm(bytes, 0x140000000)
for i, inst in ipairs(ins) do
log(string.format("0x%X: %s", inst.runtime_address, inst.text))
end
end4. Disassemble Memory From a Process
Works perfectly with your proc:rvm():
function main()
local p = ref_process("notepad.exe")
if not p then return end
local base = p:base_address()
local bytes = p:rvm(base, 32)
local ins = zydis_disasm(bytes, base)
for _, inst in ipairs(ins) do
log(inst.runtime_address .. ": " .. inst.text)
end
deref_process(p)
end🛠 Example Output
0x140000000: push rbp
mnemonic = push, length = 1, operands = 1/3
op1: id=0 type=reg vis=explicit size=64
reg: rbp
op2: id=1 type=reg vis=hidden size=64
reg: rsp
op3: id=2 type=mem vis=hidden size=64
mem: seg=ss base=rsp index=nil scale=0 has_disp=false disp=nil
0x140000001: mov rbp, rsp
mnemonic = mov, length = 3, operands = 2/2
0x140000004: sub rsp, 0x30
mnemonic = sub, length = 4, operands = 2/3📅 Date & Time API
get_datetime()
get_datetime()Returns a table describing the local date and time.
local dt = get_datetime()
-- dt = {
-- year = 2025,
-- month = 11,
-- day = 27,
-- hour = 14, -- 24h clock
-- minute = 5,
-- second = 33,
-- msec = 120,
--
-- day_name = "Thursday",
-- month_name = "November",
--
-- hour12 = 2, -- 12h clock
-- ampm = "PM"
-- }get_timestamp()
get_timestamp()Returns a Unix timestamp (UTC) — seconds since 1970-01-01.
local ts = get_timestamp()
-- example: 1732734005Example
function main()
local dt = get_datetime()
log(string.format(
"Today is %s, %s %d, %d",
dt.day_name, dt.month_name, dt.day, dt.year
))
log(string.format(
"Local Time: %d:%02d %s",
dt.hour12, dt.minute, dt.ampm
))
local ts = get_timestamp()
log("Unix Timestamp: " .. ts)
endLast updated