- 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 )
- Android Version: 10.0+ (API 29)
- Architecture: ARM64 (arm64-v8a) only
- 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
git clone --recursive https://github.com/UnrealMultiple/TerrariaModify.git
cd TerrariaModifyCreate local.properties in project root:
macOS / Linux:
sdk.dir=/home/username/Android/Sdk
ndk.dir=/home/username/Android/Sdk/ndk/29.0.14033849Windows:
sdk.dir=C:\\Users\\Username\\AppData\\Local\\Android\\Sdk
ndk.dir=C:\\Users\\Username\\AppData\\Local\\Android\\Sdk\\ndk\\29.0.14033849# Make gradlew executable
chmod +x gradlew
# Build debug APK
./gradlew assembleDebug
# Or build release (requires keystore setup)
./gradlew assembleRelease| 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 |
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;
}
}
}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 originalAuto-Initialization:
// This runs automatically when library loads
__attribute__((constructor))
void init() {
std::thread(main_thread).detach();
}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.
Built with precision. Use with responsibility.