#include "xrbx/engine/instance.h" #include "xrbx/xrbx.h" #include "xrbx/engine/scheduler.h" #include #include #include void depth_first_print(RBX::Instance inst, int depth = 0) { printf("%*s-> %s @ %llx (class %s @ %llx)\n", depth, "", inst.getName().c_str(), uintptr_t(inst.VA()), inst.getClassName().c_str(), uintptr_t(inst.getClassDescriptor().VA())); for (const auto &prop : inst.getClassDescriptor().getPropertyDescriptors()) { printf("%*s-> %s @ %llx\n", depth + 3, "", prop.getName().c_str(), uintptr_t(prop.VA())); } for (const auto &child : inst.getChildren()) { depth_first_print(child, depth + 1); } } int main() { Process rbx(L"RobloxPlayerBeta.exe"); std::cout << std::format("Image Base: {:X}", uintptr_t(rbx.imageBase())) << std::endl; RBX::Scheduler sched(rbx.read(rbx.VA(RVA_TASK_SCHEDULER)), rbx); try { RBX::Scheduler::Job heartbeat = sched.getJob("Heartbeat(Heartbeat;LuaApp)"); RBX::Instance runservice = heartbeat.getRunService(); depth_first_print(runservice.getParent().value()); } catch (std::exception &e) { std::cout << "err: " << e.what() << std::endl; } return 0; }