31 lines
1.2 KiB
C++
31 lines
1.2 KiB
C++
#include "xrbx/engine/instance.h"
|
|
#include "xrbx/xrbx.h"
|
|
#include "xrbx/engine/scheduler.h"
|
|
#include <cstdio>
|
|
#include <format>
|
|
#include <iostream>
|
|
|
|
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<BYTE *>(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;
|
|
}
|