Skip to content

Latest commit

 

History

History
340 lines (257 loc) · 8.73 KB

README.md

File metadata and controls

340 lines (257 loc) · 8.73 KB

⚡ 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

Variant Location
Debug APK app/build/outputs/apk/debug/app-debug.apk
Release APK app/build/outputs/apk/release/app-release.apk
Native Library app/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:

Type Item Parameters Returns
PAGE PageOption page index, icon, title N/A
CHECK CheckItem page, label, unique id boolean
SLIDER SlderItem page, label, min, max, id integer
SPINNER SpinerItem page, label, options, id index
INPUT InputTextItem page, label, id string
BUTTON ButtonItem page, label, callback name trigger

Handling Callbacks:

JNIEXPORT void JNICALL
Java_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) {
        case 1: config.Hackmap = (bool)check; break;
        case 2: config.AimbotRange = (int)value; break;
        case 3: config.EspStyle = (int)value; break;
        case 4: {
            const char* 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;

void main_thread() {
    // Wait for target library with retry
    while(!(g_il2cppElf = ElfScanner::findElf("libil2cpp.so")).isValid()) {
        std::this_thread::sleep_for(100ms);
    }
    
    uintptr_t base = g_il2cppElf.base();
    
    // Your patches here
    apply_patches(base);
}

Patch Types:

// 1. NOP Instruction (ARM64)
// Replace instruction with NOP (0xD503201F)
MemoryPatch::createWithHex(base + 0x123456, "D503201F").Modify();

// 2. NOP Multiple Instructions
MemoryPatch::createWithHex(base + 0x123456, "D503201F D503201F D503201F").Modify();

// 3. Modify Float Value
float newDamage = 9999.0f;
KittyMemory::writeMemory(base + 0x789ABC, &newDamage, sizeof(float));

// 4. Modify Integer
int32_t newAmmo = 999;
KittyMemory::writeMemory(base + 0xDEF000, &newAmmo, sizeof(int32_t));

// 5. Hook Function
void* orig_function = nullptr;

void my_hook_function() {
    // Your code here
    
    // Call original
    ((void(*)())orig_function)();
}

DobbyHook(
    (void*)(base + 0xFEDCB0),
    (void*)my_hook_function,
    (void**)&orig_function
);

// 6. Pattern Scan
uintptr_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.


Stars Forks


Built with precision. Use with responsibility.