Skip to content

Repository files navigation

⚡ PALLADIUM

Android Terraria Mod Menu Framework

Android
C++
Java
NDK

🎨 Dynamic Island UI
🔒 Anti-Detection
⚡ Zero-Latency


Features

  • Memory Patching
  • Pattern Scanning
  • Library Dump
  • Signature Bypass
  • Lua 5.4 Scripting Engine
  • Script Encryption (AES-256-CBC)
  • UI Run on 60-90-120-144-165 ++
  • Patch offset with kernel level ( non root )

📱 Target Device

  • Android Version: 10.0+ (API 29)
  • Architecture: ARM64 (arm64-v8a) only

🛠️ Required Tools & Downloads



Android Studio
Ladybug+



NDK
r29



CMake
4.1.2+



JDK
17+

Installation Notes

  • Android Studio: Install via JetBrains Toolbox or official installer
  • NDK: Install through Android Studio → SDK Manager → SDK Tools
  • CMake: Usually bundled with NDK, but can install separately
  • JDK: Eclipse Temurin (Adoptium) recommended for best compatibility

🚀 Quick Start

Step 1: Clone Repository

git clone --recursive https://github.com/UnrealMultiple/TerrariaModify.git
cd TerrariaModify

Step 2: Configure SDK Paths

Create local.properties in project root:

macOS / Linux:

sdk.dir=/home/username/Android/Sdk
ndk.dir=/home/username/Android/Sdk/ndk/29.0.14033849

Windows:

sdk.dir=C:\\Users\\Username\\AppData\\Local\\Android\\Sdk
ndk.dir=C:\\Users\\Username\\AppData\\Local\\Android\\Sdk\\ndk\\29.0.14033849

Step 3: Build Project

# Make gradlew executable
chmod +x gradlew
# Build debug APK
./gradlew assembleDebug
# Or build release (requires keystore setup)
./gradlew assembleRelease

Build Outputs

VariantLocation
Debug APKapp/build/outputs/apk/debug/app-debug.apk
Release APKapp/build/outputs/apk/release/app-release.apk
Native Libraryapp/build/intermediates/cmake/release/obj/arm64-v8a/libTerrariaModify.so

📖 Documentation

🎨 Feature System (Pipe Protocol)

Features are defined as strings in palladium.cpp using the pipe-delimited format:

MenuOption{
.pages{
PageOption{
.id = 0,
.title = "玩家功能",
.icon = "icons/func1.png",
.items = {
TitleItem{
.label = "Player"
},
CheckItem{
.label = "上帝模式",
.id = 100
},
CheckItem{
.label = "无限召唤",
.id = 101
},
CheckItem{
.label = "无限范围",
.id = 102,
}
}
}
}
};

Format Specification:

TypeItemParametersReturns
PAGEPageOptionpage index, icon, titleN/A
CHECKCheckItempage, label, unique idboolean
SLIDERSlderItempage, label, min, max, idinteger
SPINNERSpinerItempage, label, options, idindex
INPUTInputTextItempage, label, idstring
BUTTONButtonItempage, label, callback nametrigger

Handling Callbacks:

JNIEXPORTvoidJNICALLJava_zig_cheat_qq_native_1bridge_StealthJNI_Callback(
JNIEnv *env, jclass clazz,
jint id, // Feature ID
jboolean check, // Toggle value
jint value, // Slider/Spinner integer
jfloat value2, // Float value (optional)
jstring value3 // String value (optional)
) {
switch (id) {
case1: config.Hackmap = (bool)check; break;
case2: config.AimbotRange = (int)value; break;
case3: config.EspStyle = (int)value; break;
case4: {
constchar* name = env->GetStringUTFChars(value3, nullptr);
strncpy(config.PlayerName, name, sizeof(config.PlayerName));
env->ReleaseStringUTFChars(value3, name);
break;
}
}
}

💾 Memory Patching Guide

Basic Setup:

#include"KittyMemory/KittyInclude.hpp"
ElfScanner g_il2cppElf;
voidmain_thread() {
// Wait for target library with retrywhile(!(g_il2cppElf = ElfScanner::findElf("libil2cpp.so")).isValid()) {
std::this_thread::sleep_for(100ms);
}
uintptr_t base = g_il2cppElf.base();
// Your patches hereapply_patches(base);
}

Patch Types:

// 1. NOP Instruction (ARM64)// Replace instruction with NOP (0xD503201F)MemoryPatch::createWithHex(base + 0x123456, "D503201F").Modify();
// 2. NOP Multiple InstructionsMemoryPatch::createWithHex(base + 0x123456, "D503201F D503201F D503201F").Modify();
// 3. Modify Float Valuefloat newDamage = 9999.0f;
KittyMemory::writeMemory(base + 0x789ABC, &newDamage, sizeof(float));
// 4. Modify Integerint32_t newAmmo = 999;
KittyMemory::writeMemory(base + 0xDEF000, &newAmmo, sizeof(int32_t));
// 5. Hook Functionvoid* orig_function = nullptr;
voidmy_hook_function() {
// Your code here// Call original
((void(*)())orig_function)();
}
DobbyHook(
(void*)(base + 0xFEDCB0),
(void*)my_hook_function,
(void**)&orig_function
);
// 6. Pattern Scanuintptr_t patternAddr = KittyMemory::findHexFirst(
"libil2cpp.so",
"00 00 00 00 ?? ?? ?? ?? FF FF", // ? = wildcard
base,
size
);

Restoring Patches:

// Store patches for restoration
std::vector<MemoryPatch> patches;
patches.push_back(MemoryPatch::createWithHex(base + 0x123456, "D503201F"));
patches[0].Modify(); // Apply// Later...
patches[0].Restore(); // Restore original

Auto-Initialization:

// This runs automatically when library loads__attribute__((constructor))
void init() {
std::thread(main_thread).detach();
}

📄 License

⚠️ This project is provided for educational and research purposes only.

By using this software, you agree to:

  • Comply with all applicable laws in your jurisdiction
  • Respect the terms of service of target applications
  • Use responsibly and ethically

The authors assume no liability for misuse of this software.


StarsForks


Built with precision. Use with responsibility.

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages