├── GetAndAssignInstanciatedMaterial.h ├── GetComponentsInChildren.h ├── Helper.h ├── README.md ├── dumper.lua └── images ├── pic1.PNG ├── pic2.PNG └── pic3.PNG /GetAndAssignInstanciatedMaterial.h: -------------------------------------------------------------------------------- 1 | struct dynamic_array 2 | { 3 | std::uint64_t base; 4 | std::uint64_t mem_id; 5 | std::uint64_t sz; 6 | std::uint64_t cap; 7 | }; 8 | 9 | // Loop through player list to apply chams to players. 10 | for (auto entityLoop : entities) 11 | { 12 | auto skinnedMultiMesh = threads::Read(playerModel + offsets::playermodel::multi_mesh); // _multiMesh 13 | auto SkinnedRenderersList = threads::Read(skinnedMultiMesh + 0x78); // List k__BackingField; 14 | auto SkinnedList = threads::Read(SkinnedRenderersList + 0x10); 15 | int materialsCount = threads::Read(SkinnedRenderersList + 0x18); 16 | 17 | for (std::uint32_t idx{ 0 }; idx < materialsCount; idx++) { 18 | const auto renderEntry = threads::Read(SkinnedList + 0x20 + (idx * 0x8)); 19 | if (!renderEntry) 20 | continue; 21 | 22 | const auto untity_object = threads::Read(renderEntry + 0x10); 23 | if (!untity_object) 24 | continue; 25 | 26 | const auto mat_list = threads::Read(untity_object + 0x148); 27 | if (mat_list.sz < 1 || mat_list.sz > 5) 28 | continue; 29 | 30 | for (std::uint32_t idx{ 0 }; idx < mat_list.sz; idx++) { 31 | threads::Write(mat_list.base + (idx * 0x4), globals::chamMaterial); 32 | 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /GetComponentsInChildren.h: -------------------------------------------------------------------------------- 1 | void GetComponentsInChildren(uintptr_t GameObject, std::vector& renderers) { 2 | if (GameObject == 0) return; // Rebuilt by Cjweb. 3 | 4 | auto componentList = threads::Read(GameObject + 0x30); 5 | int componentSize = threads::Read(GameObject + 0x40); 6 | 7 | for (int j = 0; j < componentSize; ++j) { 8 | uintptr_t component = threads::Read(componentList + (0x10 * j + 0x8)); 9 | if (component == 0) continue; 10 | 11 | auto componentInst = threads::Read(component + 0x28); 12 | if (componentInst == 0) continue; 13 | auto componentObject = threads::Read(componentInst + 0x0); 14 | if (componentObject == 0) continue; 15 | auto componentName = threads::Read(componentObject + 0x10); 16 | if (componentName == 0) continue; 17 | std::string Name = threads::ReadASCII(componentName); 18 | 19 | log_to_file("[Component]: " + Name);// + " [" + std::to_string(componentSize) + "]"); 20 | 21 | if (Name == "SkinnedMeshRenderer") { 22 | renderers.push_back(component); 23 | } 24 | if (Name == "Transform") { 25 | uintptr_t childList = threads::Read(component + 0x70); 26 | int childSize = threads::Read(component + 0x80); 27 | 28 | for (int i = 0; i < childSize; ++i) { 29 | uint64_t childTransform = threads::Read(childList + (0x8 * i)); 30 | if (childTransform == 0) continue; 31 | 32 | auto childGameObject = threads::Read(childTransform + 0x30); 33 | if (childGameObject == 0) continue; 34 | auto childGameObjectName = threads::Read(childGameObject + 0x60); 35 | if (childGameObject == 0) continue; 36 | std::string childName = threads::ReadASCII(childGameObjectName); 37 | 38 | log_to_file("[Child]: " + childName + " [" + std::to_string(childSize) + "]"); 39 | 40 | GetComponentsInChildren(childGameObject, renderers); 41 | } 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /Helper.h: -------------------------------------------------------------------------------- 1 | // Misc code that would be used with GetComponentsInChildren showing how to properly access viewModel and apply chams. 2 | 3 | void ProcessSkinnedMeshRenderer(uintptr_t renderer) { 4 | if (renderer == 0) return; 5 | 6 | // Requires size be least 2 if its 1 it wont work. 7 | for (std::uint32_t idx{ 0 }; idx < 2; idx++) { 8 | const auto renderEntry = threads::Read(renderer + 0x20 + (idx * 0x8)); 9 | if (!renderEntry) 10 | continue; 11 | 12 | const auto untity_object = threads::Read(renderEntry + 0x10); 13 | if (!untity_object) 14 | continue; 15 | 16 | const auto mat_list = threads::Read(untity_object + 0x148); 17 | if (mat_list.sz < 1 || mat_list.sz > 5) 18 | continue; 19 | 20 | for (std::uint32_t idx{ 0 }; idx < mat_list.sz; idx++) { 21 | threads::Write(mat_list.base + (idx * 0x4), globals::handChamMaterial); 22 | } 23 | } 24 | } 25 | 26 | // Example of using GetComponentsInChildren 27 | 28 | std::vector renderers; 29 | std::vector materials; 30 | std::lock_guard lock(mtx); 31 | GetComponentsInChildren(globals::viewModel, renderers); 32 | for (auto renderer : renderers) { 33 | ProcessSkinnedMeshRenderer(renderer); 34 | } 35 | 36 | // Getting viewModel for hand/weapon chams. 37 | 38 | auto get_view_model() -> uint64_t { 39 | auto held = threads::Read(reinterpret_cast(this) + offsets::item::held_entity); // 0xB0 40 | auto viewModel = threads::Read(held + offsets::heldentity::viewModel); 41 | auto viewModelInstance = threads::Read(viewModel + 0x30); 42 | auto baseViewModel = threads::Read(viewModelInstance + 0x10); 43 | 44 | // Required if not false will cause chams to apply to world and break camera movement. 45 | threads::Write(viewModelInstance + 0x40, false); // useViewModelCamera 46 | return threads::Read(baseViewModel + 0x30); 47 | } 48 | 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rust External – Full Chams & Hand Chams 2 | 3 | This repo covers how to implement body and hand chams in Rust, yet somehow enough to trigger full-blown meltdowns from people with nothing else to offer. 4 | 5 | Enter [NuII](https://www.unknowncheats.me/forum/members/1721659.html), a walking L so desperate for relevance that he tried to DMCA this after an entire **year** of it being public. One year. It’s already mirrored, archived, shared, repasted, and recognized. This repo could disappear today and it still wouldn’t matter. It’s already done its job. GitHub is just one of a dozen places it lives now. 6 | 7 | So congrats, you achieved absolutely nothing. Except confirming to everyone that you're still pressed about being outclassed. 8 | 9 | --- 10 | 11 | ### 🖼️ Preview – Full Body Chams 12 | 13 | Thanks to **NuII** for the screenshot couldn’t be bothered launching Rust again just to grab another. 14 | Appreciate you making the visual showcase for what this repo teaches. 15 | 16 | ![Full Body Chams](https://i.imgur.com/IYRJ1qv.png) 17 | 18 | --- 19 | 20 | You can find a material scanner on github/unknowncheats. 21 | 22 | --- 23 | 24 | ## ⚙️ Getting Material Addresses 25 | 26 | 1. **Launch Rust without EAC** 27 | - Open Steam 28 | - Host a local server to disable EAC more info here https://www.unknowncheats.me/forum/2843741-post4.html 29 | - Run `RustClient.exe` directly 30 | - Host a local game to disable EAC 31 | 32 | 2. **Scan in Cheat Engine** 33 | - Open `RustClient.exe` in Cheat Engine 34 | - Check “Hex”, input `DEADBEEFDEADBEEF`, and set value type to 8 bytes 35 | 36 | ![Cheat Engine Step 1](images/pic1.PNG) 37 | 38 | - You’ll get around ~5000 addresses 39 | - Select all (Shift+Click), add them to the address table 40 | 41 | ![Cheat Engine Step 2](images/pic2.PNG) 42 | 43 | - In the menu: `Table > Show Cheat Table Lua Script` 44 | - Paste the script, change the save path for `json.txt`, then run it 45 | 46 | ![Cheat Engine Step 3](images/pic3.PNG) 47 | 48 | - TROUBLESHOOT: If your json.txt is empty/doesn’t include any addresses it’s because you didn’t add them to the address table. 49 | 50 | 3. **How to use Material Scanner** 51 | - Build the scanner in DEBUG 52 | - Put the executable in the same folder as `json.txt` 53 | - Run it to generate `material_output.txt` 54 | - Some materials may crash the game you'll need to experiment with each. 55 | 56 | --- 57 | -------------------------------------------------------------------------------- /dumper.lua: -------------------------------------------------------------------------------- 1 | local jsonFile = io.open("C:\\json.txt", "w") -- Open a file to write JSON **CHANGE LOCATION TO WHERE YOUR json.txt IS!!** 2 | 3 | if jsonFile then 4 | local list = getAddressList() -- Get the list of addresses from Cheat Engine 5 | jsonFile:write('{"CheatTable":{"CheatEntries":{"CheatEntry":[') -- Start of JSON structure 6 | 7 | for i = 0, list.Count-1 do 8 | local addressItem = list[i] -- Get the address item at index i 9 | local address = tonumber(addressItem.Address, 16) -- Convert the address to a number, assuming it's in hexadecimal 10 | if address then 11 | -- Format the address as JSON and write to file, add commas between entries 12 | jsonFile:write(string.format('{"Address":"%X"}', address)) 13 | if i < list.Count - 1 then 14 | jsonFile:write(',') 15 | end 16 | else 17 | print("Error: Unable to convert address at index " .. i .. " to a number.") 18 | end 19 | end 20 | 21 | jsonFile:write(']}}}') -- Close the JSON structure 22 | jsonFile:close() -- Close the file 23 | print("Addresses have been saved in JSON format. - Made by Cjweb") -- Confirmation message 24 | else 25 | print("Failed to open file for writing. - Made by Cjweb") -- Error message in case file opening fails 26 | end 27 | -------------------------------------------------------------------------------- /images/pic1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LabX1/rust-external-chams/57d83496715d23ade27448e5260261da49b1c2ad/images/pic1.PNG -------------------------------------------------------------------------------- /images/pic2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LabX1/rust-external-chams/57d83496715d23ade27448e5260261da49b1c2ad/images/pic2.PNG -------------------------------------------------------------------------------- /images/pic3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LabX1/rust-external-chams/57d83496715d23ade27448e5260261da49b1c2ad/images/pic3.PNG --------------------------------------------------------------------------------