void exampleScreen() { // 버튼을 추가하기 위해 init, setupPositions, buttonClicked 세개를 Hook 합니다. // You should hook these functions to create button in the start menu: init(), setupPositions(), buttonClicked(). mcpelauncher_hook((void *) &Touch::StartMenuScreen::init, (void *) &Touch::StartMenuScreen::init_hook, (void **) &Touch::StartMenuScreen::init_real); mcpelauncher_hook((void *) &Touch::StartMenuScreen::setupPositions, (void *) &Touch::StartMenuScreen::setupPositions_hook, (void **) &Touch::StartMenuScreen::setupPositions_real); mcpelauncher_hook((void *) &Touch::StartMenuScreen::buttonClicked, (void *) &Touch::StartMenuScreen::buttonClicked_hook, (void **) &Touch::StartMenuScreen::buttonClicked_real); }
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { //this gets called after the library's happily loaded and the Dalvik VM is ready __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "starting\n"); void* inputTick = dlsym(RTLD_DEFAULT, "_ZN16TouchscreenInput4tickEP6Player"); mcpelauncher_hook(inputTick, &zhuoweisprint_tickHook, &zhuoweisprint_TouchScreenInput_tick_real); void* walkingSpeed = dlsym(RTLD_DEFAULT, "_ZN6Player23getWalkingSpeedModifierEv"); mcpelauncher_hook(walkingSpeed, &zhuoweisprint_getWalkingSpeedModifierHook, &zhuoweisprint_Player_getWalkingSpeedModifier_real); return JNI_VERSION_1_2; }
void mod_init() { mcpelauncher_hook((void*) &MinecraftClient::init, (void*) &MinecraftClient$init, (void**) &_MinecraftClient$init); mcpelauncher_hook((void*) &Block::initBlocks, (void*) &Block$initBlocks, (void**) &_Block$initBlocks); //mcpelauncher_hook((void*) &BlockEntity::initBlockEntities, (void*) &BlockEntity$initBlockEntities, (void**) &_BlockEntity$initBlockEntities); mcpelauncher_hook((void*) &Item::initItems, (void*) &Item$initItems, (void**) &_Item$initItems); mcpelauncher_hook((void*) &Item::initCreativeItems, (void*) &Item$initCreativeItems, (void**) &_Item$initCreativeItems); //mcpelauncher_hook((void*) &Recipies::initRecipies, (void*) &Recipies$initRecipies, (void**) &_Recipies$initRecipies); //mcpelauncher_hook((void*) &I18n::get, (void*) &I18n$get, (void**) &_I18n$get); //mcpelauncher_hook((void*) &BlockEntityFactory::createBlockEntity, (void*) &BlockEntityFactory$createBlockEntity, (void**) &_BlockEntityFactory$createBlockEntity); }
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { // hook the methods we need for this // since we're porting a mod, they already specified which methods to hook. // hmmmmmmmmmmmmmmmmmm void* mcpelibhandle = dlopen("libminecraftpe.so", RTLD_LAZY); // clear any errors from the dynamic linker dlerror(); // ask the linker to give us a handle to the lib. // these are all standard unix methods: Google is your friend Entity_remove = dlsym(mcpelibhandle, "_ZN6Entity6removeEv"); // I've replayed Final Countdown a few times now as motivational music // :D // 500ise Can't Copy and Paste: the Movie Level_explode = dlsym(mcpelibhandle, "_ZN5Level7explodeEP6Entityffff"); void* arrowTick = dlsym(mcpelibhandle, "_ZN5Arrow10normalTickEv"); // replace the arrow::tick method with a call to our own Arrow_tick_hook method // store a pointer to a copy of the original method in Arrow_tick_real so we can // call it in our hook mcpelauncher_hook(arrowTick, &Arrow_normalTick_hook, (void**) &Arrow_normalTick_real); void* levelPlaySound = dlsym(mcpelibhandle, "_ZN5Level9playSoundEP6EntityRKSsff"); // aren't you bored yet? mcpelauncher_hook(levelPlaySound, &Level_playSound_hook, (void**) &Level_playSound_real); __android_log_print(ANDROID_LOG_INFO, TAG, "playsound %x %x", (int) levelPlaySound, (int) Level_playSound_real); // now we need to grab those method names // and to write the hooked methods // :( sigh. * starts playing intense focus music // you know how to get an unmangled objdump symbols output, right? // if not, YouTube/Google/manpages is your friend const char* error = dlerror(); // is there an error? if (error) { __android_log_print(ANDROID_LOG_INFO, TAG, "dlerror: %s", error); // print the error to the log } return JNI_VERSION_1_2; }
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { //this gets called after the library's happily loaded and the Dalvik VM is ready __android_log_print(ANDROID_LOG_INFO, "zhuoweixray", "starting\n"); void* shouldRenderFace = dlsym(RTLD_DEFAULT, "_ZN4Tile16shouldRenderFaceEP11LevelSourceiiii"); mcpelauncher_hook(shouldRenderFace, &zhuoweixray_shouldRenderFaceXray, &zhuoweixray_Tile_shouldRenderFace_real); void* getBrightness = dlsym(RTLD_DEFAULT, "_ZN4Tile13getBrightnessEP11LevelSourceiii"); mcpelauncher_hook(getBrightness, &zhuoweixray_getBrightnessXray, &zhuoweixray_Tile_getBrightness_real); soinfo2* mcpelibhandle = (soinfo2*) dlopen("libminecraftpe.so", RTLD_LAZY); __android_log_print(ANDROID_LOG_INFO, "zhuoweixray", "base%x\n", mcpelibhandle->base); void* swordUseFn = (void*) (mcpelibhandle->base + 0x1301be + 1); //mcpelauncher_hook(swordUseFn, &zhuoweixray_swordBreakBlock, &zhuoweixray_WeaponItem_mineBlock_real); //int* coalUseFn = (int*) (mcpelibhandle->base + 0x1c9ca0 + 14); //(*coalUseFn) = &zhuoweixray_coalItemUse; for (int i = 0; i < 0x100; i++) { zhuoweixray_renderInXrayMode[i] = 0; } zhuoweixray_renderInXrayMode[14] = zhuoweixray_renderInXrayMode[15] = zhuoweixray_renderInXrayMode[16] = 1; zhuoweixray_renderInXrayMode[54] = zhuoweixray_renderInXrayMode[56] = zhuoweixray_renderInXrayMode[73] = 1; zhuoweixray_renderInXrayMode[21] = 1; return JNI_VERSION_1_2; }
void bl_renderManager_init(void* mcpelibhandle) { bl_EntityRenderDispatcher_getRenderer = (EntityRenderer* (*) (void*, int)) dlsym(mcpelibhandle, "_ZN22EntityRenderDispatcher11getRendererE16EntityRendererId"); bl_EntityRenderDispatcher_getInstance = (void* (*)()) dlsym(mcpelibhandle, "_ZN22EntityRenderDispatcher11getInstanceEv"); bl_MeshBuffer_reset = (void (*)(void*)) dlsym(mcpelibhandle, "_ZN10MeshBuffer5resetEv"); bl_EntityRenderDispatcher_assign = (void (*)(void*, int, EntityRenderer*)) dlsym(mcpelibhandle, "_ZN22EntityRenderDispatcher6assignE16EntityRendererIdP14EntityRenderer"); bl_HumanoidModel_HumanoidModel = (void (*)(HumanoidModel*, float, float)) dlsym(mcpelibhandle, "_ZN13HumanoidModelC1Eff"); bl_HumanoidMobRenderer_HumanoidMobRenderer = (void (*)(MobRenderer*, HumanoidModel*, float)) dlsym(mcpelibhandle, "_ZN19HumanoidMobRendererC1EP13HumanoidModelf"); void* getRenderer = dlsym(mcpelibhandle, "_ZN22EntityRenderDispatcher11getRendererEP6Entity"); mcpelauncher_hook(getRenderer, (void*) bl_EntityRenderDispatcher_getRenderer_hook, (void**) &bl_EntityRenderDispatcher_getRenderer_real); }
JNIEXPORT void JNICALL Java_net_zhuoweizhang_mcpelauncher_ScriptManager_nativeSetupHooks (JNIEnv *env, jclass clazz, jint versionCode) { if (bl_hasinit_script) return; //edit the vtables of the GameMode implementations bl_GameMode_useItemOn_real = dlsym(RTLD_DEFAULT, "_ZN8GameMode9useItemOnEP6PlayerP5LevelP12ItemInstanceiiiiRK4Vec3"); int *creativeVtable = (int*) dlsym(RTLD_DEFAULT, "_ZTV12CreativeMode"); creativeVtable[GAMEMODE_VTABLE_OFFSET_USE_ITEM_ON] = (int) &bl_GameMode_useItemOn_hook; int *survivalVtable = (int*) dlsym(RTLD_DEFAULT, "_ZTV12SurvivalMode"); survivalVtable[GAMEMODE_VTABLE_OFFSET_USE_ITEM_ON] = (int) &bl_GameMode_useItemOn_hook; bl_GameMode_attack_real = dlsym(RTLD_DEFAULT, "_ZN8GameMode6attackEP6PlayerP6Entity"); creativeVtable[GAMEMODE_VTABLE_OFFSET_ATTACK] = (int) &bl_GameMode_attack_hook; survivalVtable[GAMEMODE_VTABLE_OFFSET_ATTACK] = (int) &bl_GameMode_attack_hook; bl_GameMode_tick_real = dlsym(RTLD_DEFAULT, "_ZN8GameMode4tickEv"); creativeVtable[GAMEMODE_VTABLE_OFFSET_TICK] = (int) &bl_GameMode_tick_hook; survivalVtable[GAMEMODE_VTABLE_OFFSET_TICK] = (int) &bl_GameMode_tick_hook; bl_GameMode_initPlayer_real = dlsym(RTLD_DEFAULT, "_ZN8GameMode10initPlayerEP6Player"); creativeVtable[GAMEMODE_VTABLE_OFFSET_INIT_PLAYER] = (int) &bl_GameMode_initPlayer_hook; survivalVtable[GAMEMODE_VTABLE_OFFSET_INIT_PLAYER] = (int) &bl_GameMode_initPlayer_hook; //edit the vtable of NinecraftApp to get a callback when levels are switched bl_Minecraft_setLevel_real = dlsym(RTLD_DEFAULT, "_ZN9Minecraft8setLevelEP5LevelRKSsP11LocalPlayer"); int *minecraftVtable = (int*) dlsym(RTLD_DEFAULT, "_ZTV12NinecraftApp"); minecraftVtable[21] = (int) &bl_Minecraft_setLevel_hook; void* selectLevel = dlsym(RTLD_DEFAULT, "_ZN9Minecraft11selectLevelERKSsS1_RK13LevelSettings"); mcpelauncher_hook(selectLevel, &bl_Minecraft_selectLevel_hook, (void**) &bl_Minecraft_selectLevel_real); void* destroyBlock = dlsym(RTLD_DEFAULT, "_ZN8GameMode12destroyBlockEiiii"); mcpelauncher_hook(destroyBlock, &bl_GameMode_destroyBlock_hook, (void**) &bl_GameMode_destroyBlock_real); void* mobDie = dlsym(RTLD_DEFAULT, "_ZN3Mob3dieEP6Entity"); mcpelauncher_hook(mobDie, &bl_Mob_die_hook, (void**) &bl_Mob_die_real); //get a callback when the level is exited void* leaveGame = dlsym(RTLD_DEFAULT, "_ZN9Minecraft9leaveGameEb"); mcpelauncher_hook(leaveGame, &bl_Minecraft_leaveGame_hook, (void**) &bl_Minecraft_leaveGame_real); void* getFov = dlsym(RTLD_DEFAULT, "_ZN12GameRenderer6getFovEfb"); //mcpelauncher_hook(getFov, &bl_GameRenderer_getFov_hook, (void**) &bl_GameRenderer_getFov_real); //get the level set block method. In future versions this might link against libminecraftpe itself bl_Level_setTileAndData = dlsym(RTLD_DEFAULT, "_ZN5Level14setTileAndDataEiiiiii"); if (bl_Level_setTileAndData == NULL) { __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "Failed to get setTileAndData: %s\n", dlerror()); } bl_Level_getData = dlsym(RTLD_DEFAULT, "_ZN5Level7getDataEiii"); bl_Player_getCarriedItem = dlsym(RTLD_DEFAULT, "_ZN6Player14getCarriedItemEv"); bl_Player_ride = dlsym(RTLD_DEFAULT, "_ZN6Player4rideEP6Entity"); bl_Entity_setPos = dlsym(RTLD_DEFAULT, "_ZN6Entity6setPosEfff"); bl_Level_explode = dlsym(RTLD_DEFAULT, "_ZN5Level7explodeEP6Entityffffb"); bl_Inventory_add = dlsym(RTLD_DEFAULT, "_ZN9Inventory3addEP12ItemInstance"); //bl_MobFactory_getStaticTestMob = dlsym(RTLD_DEFAULT, "_ZN10MobFactory16getStaticTestMobEiP5Level"); bl_Level_addEntity = dlsym(RTLD_DEFAULT, "_ZN5Level9addEntityEP6Entity"); bl_Level_getTile = dlsym(RTLD_DEFAULT, "_ZN5Level7getTileEiii"); bl_Level_setNightMode = dlsym(RTLD_DEFAULT, "_ZN5Level12setNightModeEb"); bl_Entity_setRot = dlsym(RTLD_DEFAULT, "_ZN6Entity6setRotEff"); bl_Level_getEntity = dlsym(RTLD_DEFAULT, "_ZN5Level9getEntityEi"); bl_NinecraftApp_onGraphicsReset = dlsym(RTLD_DEFAULT, "_ZN12NinecraftApp15onGraphicsResetEv"); bl_Mob_getTexture = dlsym(RTLD_DEFAULT, "_ZN3Mob10getTextureEv"); bl_LocalPlayer_hurtTo = dlsym(RTLD_DEFAULT, "_ZN11LocalPlayer6hurtToEi"); bl_Level_removeEntity = dlsym(RTLD_DEFAULT, "_ZN5Level12removeEntityEP6Entity"); bl_EntityFactory_CreateEntity = dlsym(RTLD_DEFAULT, "_ZN13EntityFactory12CreateEntityEiP5Level"); bl_Entity_spawnAtLocation = dlsym(RTLD_DEFAULT, "_ZN6Entity15spawnAtLocationEP12ItemInstancef"); bl_Level_setTime = dlsym(RTLD_DEFAULT, "_ZN5Level7setTimeEl"); bl_Level_getTime = dlsym(RTLD_DEFAULT, "_ZN5Level7getTimeEv"); bl_Level_getLevelData = dlsym(RTLD_DEFAULT, "_ZN5Level12getLevelDataEv"); bl_LevelData_setSpawn = dlsym(RTLD_DEFAULT, "_ZN9LevelData8setSpawnEiii"); bl_LevelData_setGameType = dlsym(RTLD_DEFAULT, "_ZN9LevelData11setGameTypeEi"); bl_LevelData_getGameType = dlsym(RTLD_DEFAULT, "_ZNK9LevelData11getGameTypeEv"); bl_Level_getTileEntity = dlsym(RTLD_DEFAULT, "_ZN5Level13getTileEntityEiii"); bl_ChestTileEntity_setItem = dlsym(RTLD_DEFAULT, "_ZN15ChestTileEntity7setItemEiP12ItemInstance"); bl_ChestTileEntity_getItem = dlsym(RTLD_DEFAULT, "_ZN15ChestTileEntity7getItemEi"); bl_Entity_setOnFire = dlsym(RTLD_DEFAULT, "_ZN6Entity9setOnFireEi"); bl_FillingContainer_clearSlot = dlsym(RTLD_DEFAULT, "_ZN16FillingContainer9clearSlotEi"); bl_FillingContainer_getItem = dlsym(RTLD_DEFAULT, "_ZN16FillingContainer7getItemEi"); bl_Level_ExtinguishFire = dlsym(RTLD_DEFAULT, "_ZN5Level14extinguishFireEiiii"); bl_Player_getArmor = dlsym(RTLD_DEFAULT, "_ZN6Player8getArmorEi"); bl_Player_setArmor = dlsym(RTLD_DEFAULT, "_ZN6Player8setArmorEiPK12ItemInstance"); //replace the getTexture method for zombie pigmen int *pigZombieVtable = (int*) dlsym(RTLD_DEFAULT, "_ZTV9PigZombie"); pigZombieVtable[MOB_VTABLE_OFFSET_GET_TEXTURE] = (int) bl_Mob_getTexture; bl_AgebleMob_setAge = dlsym(RTLD_DEFAULT, "_ZN9AgableMob6setAgeEi"); bl_Minecraft_setIsCreativeMode = dlsym(RTLD_DEFAULT, "_ZN9Minecraft17setIsCreativeModeEb"); bl_Inventory_clearInventoryWithDefault = dlsym(RTLD_DEFAULT, "_ZN9Inventory25clearInventoryWithDefaultEv"); bl_Inventory_Inventory = dlsym(RTLD_DEFAULT, "_ZN9InventoryC2EP6Playerb"); bl_Inventory_delete1_Inventory = dlsym(RTLD_DEFAULT, "_ZN9InventoryD1Ev"); bl_ItemInstance_setId = dlsym(RTLD_DEFAULT, "_ZN12ItemInstance8_setItemEi"); //note the name change: consistent naming bl_ItemInstance_getId = dlsym(RTLD_DEFAULT, "_ZNK12ItemInstance5getIdEv"); //replace the update method in Minecraft with our own minecraftVtable[MINECRAFT_VTABLE_OFFSET_UPDATE] = (int) &bl_NinecraftApp_update_hook; bl_NinecraftApp_update_real = dlsym(RTLD_DEFAULT, "_ZN12NinecraftApp6updateEv"); soinfo2* mcpelibhandle = (soinfo2*) dlopen("libminecraftpe.so", RTLD_LAZY); int createMobOffset = 0xe7af4; if (versionCode == 50007050 || versionCode == 30007050) { createMobOffset = 0xe8130; } else if (versionCode == 40007050) { createMobOffset = 0xe80f8; } else if (versionCode == 30007030 || versionCode == 40007030) { createMobOffset = 0xe3fe4; } else if (versionCode == 30007010) { createMobOffset = 0xe130a; } else if (versionCode == 40007010) { createMobOffset = 0xe1322; } else if (versionCode == 30007020) { createMobOffset = 0xee6e6; } else if (versionCode == 0xaaaa) { //amazon createMobOffset = 0xe80f8; } bl_MobFactory_createMob = (Entity* (*)(int, Level*)) (mcpelibhandle->base + createMobOffset + 1); jclass clz = (*env)->FindClass(env, "net/zhuoweizhang/mcpelauncher/ScriptManager"); bl_scriptmanager_class = (*env)->NewGlobalRef(env, clz); bl_setuphooks_cppside(); bl_hasinit_script = 1; }
void mod_init() { std::cout << "init test mod\n"; mcpelauncher_hook((void*) &Common::getGameVersionString, (void*) &Common::$$getGameVersionString, (void**) &Common::$getGameVersionString); }