Back to offsetsdecamp.dev / tutorials
IDA reference
offset tutorials
Find each address yourself and verify where it comes from. Finished RVAs are left out because they change between Roblox builds.
Pointer tutorial
DataModel, PlayerConfigurer, TaskScheduler, VisualEngine
RTTI works for DataModel, PlayerConfigurer, and VisualEngine. TaskScheduler is easier to find from one of its own strings. This is not a method for every pointer in Roblox.
RTTI route
- Press
Shift + F12and search for the class you want:.?AVDataModel@RBX@@ .?AVPlayerConfigurer@RBX@@ .?AVVisualEngine@RBX@@
- Open the result and scroll to its TypeDescriptor. Put the cursor on it, press
X, and open the first data reference. - On the
RTTI Complete Object Locator, pressXagain. The qword below the locator pointer starts the class vtable.RTTI locator pointer class_vtable: function_1 function_2 function_3 - Press
Xon the vtable, open a code reference, and pressF5. The constructor writes the vtable to the start of the object.lea rax, class_vtable mov [object], rax
- Follow the constructor references until the new object is saved in a global qword.
object = operator_new(object_size); Class_constructor(object); qword_xxxxx = object;
TaskScheduler route
- Open Strings and search for this scheduler error:
Out of arbiter nodes: Increase the FInt::TaskSchedulerMaxNumOfArbiters value
- Open its code reference and press
F5. Look for a global qword loaded by the surrounding scheduler code.scheduler = qword_xxxxx; if (scheduler) scheduler->run_or_create_jobs(...); - Press
Xon the qword. Its other references should lead to scheduler jobs and TaskScheduler functions.
Calculate the RVA
pointer RVA = qword address - image base
Use the qword's address, not the heap address stored inside it. DataModel can have more than one candidate, so check candidates while Roblox is running.
FFlag tutorial
Find any FFlag
This example uses AdornRenderStats. The same steps work for other registered flags.
- Press
Shift + F12and search forAdornRenderStatswithout an FFlag prefix. - Press
Xon the string, open its code reference, and pressF5.__int64 sub_xxxxx() { return register_flag( "AdornRenderStats", &xmmword_7994610, 1 ); } - The global beside the flag name is its storage address. Remove the
xmmword_prefix and add the hexadecimal prefix.7994610 -> 0x7994610
- The result matches the runtime dumper entry:
inline constexpr std::uintptr_t Flag_AdornRenderStats = 0x7994610;
This IDB uses an image base of zero, so 0x7994610 is already an RVA. If your IDB has a nonzero image base, subtract it from the global address first.