1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

[Cracking Guide] Pocket Mortys: Unlimited Shmeckels and Coupons

Discussion in 'Tutorials' started by SirCracksAlot, Jan 15, 2016.

  1. SirCracksAlot

    SirCracksAlot New Member

    Joined:
    Jan 15, 2016
    Messages:
    4
    Likes Received:
    11
    Want unlimited Schmeckels and Coupons? Then here's my guide to cracking Pocket Mortys. The game is written in the Unity engine so we will need to decompile/recompile the C# .NET MSIL (bytecode) to change game behavior.

    NOTE: You will not be able to login to Google Games (cloud save/achievements will not work), just cancel out when it asks to login

    Requirements:
    Installation:
    1. Extract Android Multitool to a directory
    2. Extract ILSpy to a directory
    3. Extract Reflexil and copy Reflexil.ILSpy.Plugin.dll to ILSpy directory
    Cracking Steps

    Open Android Multitool

    Select your framework-res.apk and click the Install button. Once done the log should show "No errors."

    Under Decompiling, select com.turner.pocketmorties.apk and check "Use baksmali" and click on Decompile (may take a few minutes). Once done, the decompiled files should appear in AndroidMultitool\Decompiled_apk\com.turner.pocketmorties

    Open ILSpy

    • In ILSpy, open the file AndroidMultitool\Decompiled_apk\com.turner.pocketmorties\assets\bin\Data\Managed\Assembly-CSharp.dll and it should appear in the list on the left.
    • Expand it and then expand "{} -"
    • Expand "PlayerSaveData" and click on "GetObjectData(SerializationInfo info, StreamingContext context) : void". This function is responsible for reading local game save data.
    • The code should look like this:

    Code:
    // PlayerSaveData
    public override void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        base.GetObjectData(info, context);
        info.AddValue("TotalGameTimeKey", this.totalGameTime, typeof(float));
        info.AddValue("SessionCountKey", this.sessionCount, typeof(int));
        info.AddValue("DimensionCountKey", this.dimensionCount, typeof(int));
        info.AddValue("AssetIDKey", this.assetID, typeof(string));
        info.AddValue("StoriesSeenKey", this.storiesSeen, typeof(List<string>));
        info.AddValue("NotificationAlertIDKey", this.notificationAlertID, typeof(string));
        info.AddValue("SeenMortiesKey", this.seenMorties, typeof(List<string>));
        info.AddValue("CaughtMortiesKey", this.caughtMorties, typeof(List<string>));
        info.AddValue("PartyMortiesKey", this.partyMorties, typeof(List<MortyData>));
        info.AddValue("StorageMortiesKey", this.storageMorties, typeof(List<MortyData>));
        info.AddValue("CoinsKey", this.coins, typeof(int));
        info.AddValue("CouponsKey", this.coupons, typeof(int));
        info.AddValue("ItemsKey", this.items, typeof(Dictionary<string, int>));
        info.AddValue("BadgesKey", this.badges, typeof(List<int>));
        info.AddValue("TrainersDefeatedKey", this.trainersDefeated, typeof(int));
        info.AddValue("CouncilMembersDefeatedKey", this.councilMembersDefeated, typeof(int));
        info.AddValue("ActiveQuestsKey", this.activeQuests, typeof(List<string>));
        info.AddValue("CompleteQuestsKey", this.completedQuests, typeof(List<QuestCompleteData>));
        info.AddValue("CraftRecipesLearnedKey", this.craftRecipesLearned, typeof(List<string>));
        info.AddValue("LastGymLeaderIDsKey", this.lastGymLeaderIDs, typeof(List<string>));
        info.AddValue("LastSegmentedWorldIDsKey", this.lastSegmentedWorldIDs, typeof(List<string>));
    }
    • From the ILSpy menu click on View -> Reflexil v2.0 or click the gear icon. You should now see the opcode instructions of the method.
    Original opcodes image:
    [​IMG]
    • Modify the opcodes (right click an opcode to delete or edit it):
    Code:
    Line 079 -> Edit, set OpCode "ldc.i4", Operand type "Int32", Operand 99999999 (Dec)
    Line 080 -> Delete
    Line 086 -> Edit, set OpCode "ldc.i4", Operand type "Int32", Operand 99999999 (Dec)
    Line 087 -> Delete
    Cracked opcodes image:
    [​IMG]
    • If you right-click "GetObjectData(SerializationInfo info, StreamingContext context) : void" in the menu and select "Update ILSpy object model" the code should now appear as:
    Code:
    // PlayerSaveData
    public override void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        base.GetObjectData(info, context);
        info.AddValue("TotalGameTimeKey", this.totalGameTime, typeof(float));
        info.AddValue("SessionCountKey", this.sessionCount, typeof(int));
        info.AddValue("DimensionCountKey", this.dimensionCount, typeof(int));
        info.AddValue("AssetIDKey", this.assetID, typeof(string));
        info.AddValue("StoriesSeenKey", this.storiesSeen, typeof(List<string>));
        info.AddValue("NotificationAlertIDKey", this.notificationAlertID, typeof(string));
        info.AddValue("SeenMortiesKey", this.seenMorties, typeof(List<string>));
        info.AddValue("CaughtMortiesKey", this.caughtMorties, typeof(List<string>));
        info.AddValue("PartyMortiesKey", this.partyMorties, typeof(List<global::MortyData>));
        info.AddValue("StorageMortiesKey", this.storageMorties, typeof(List<global::MortyData>));
        info.AddValue("CoinsKey", 99999999, typeof(int));
        info.AddValue("CouponsKey", 99999999, typeof(int));
        info.AddValue("ItemsKey", this.items, typeof(Dictionary<string, int>));
        info.AddValue("BadgesKey", this.badges, typeof(List<int>));
        info.AddValue("TrainersDefeatedKey", this.trainersDefeated, typeof(int));
        info.AddValue("CouncilMembersDefeatedKey", this.councilMembersDefeated, typeof(int));
        info.AddValue("ActiveQuestsKey", this.activeQuests, typeof(List<string>));
        info.AddValue("CompleteQuestsKey", this.completedQuests, typeof(List<global::QuestCompleteData>));
        info.AddValue("CraftRecipesLearnedKey", this.craftRecipesLearned, typeof(List<string>));
        info.AddValue("LastGymLeaderIDsKey", this.lastGymLeaderIDs, typeof(List<string>));
        info.AddValue("LastSegmentedWorldIDsKey", this.lastSegmentedWorldIDs, typeof(List<string>));
    }
    • In ILSpy, now select ".ctor() : void". This function is responsible for setting the default save game values.
    • The code should look like this:
    Code:
    // PlayerSaveData
    public PlayerSaveData()
    {
        this.sessionCount = 0;
        this.dimensionCount = 0;
        this.totalGameTime = 0f;
        this.assetID = "RickDefault";
        this.storiesSeen = new List<string>();
        this.notificationAlertID = null;
        this.seenMorties = new List<string>();
        this.caughtMorties = new List<string>();
        this.partyMorties = new List<MortyData>();
        this.storageMorties = new List<MortyData>();
        this.items = new Dictionary<string, int>();
        this.badges = new List<int>();
        this.activeQuests = new List<string>();
        this.completedQuests = new List<QuestCompleteData>();
        this.craftRecipesLearned = new List<string>();
        this.lastGymLeaderIDs = new List<string>();
        this.lastSegmentedWorldIDs = new List<string>();
        this.coins = 0;
        MortyData newMortyData = MortyDefs.GetNewMortyData("MortyDefault", 5, false, false);
        this.partyMorties.Add(newMortyData);
        this.seenMorties.Add(newMortyData.id);
        this.caughtMorties.Add(newMortyData.id);
    }
    Original opcodes image:
    [​IMG]

    • Modify the opcodes (right click an opcode to delete or edit it):
    Code:
    Line 054 -> Edit, set OpCode "ldc.i4", Operand type "Int32", Operand 99999999 (Dec)
    Line 055 -> Create New, set OpCode "ldarg.0", Operand type "[None]" and click "Insert after selection"
    Line 056 -> Create New, set OpCode "ldc.i4", Operand type "Int32", Operand 99999999 (Dec) and click "Insert after selection"
    Line 057 -> Create New, set OpCode "stfld", Operand type "-> Field reference", Operand navigate to PlayerSaveData and select "coupons : System.Int32" click OK, and click "Insert after selection"
    The selection for field reference should look like this:
    [​IMG]

    Cracked opcodes image:
    [​IMG]

    • Refresh the ILSpy object model and the code should now appear as:
    Code:
    // PlayerSaveData
    public PlayerSaveData()
    {
        this.sessionCount = 0;
        this.dimensionCount = 0;
        this.totalGameTime = 0f;
        this.assetID = "RickDefault";
        this.storiesSeen = new List<string>();
        this.notificationAlertID = null;
        this.seenMorties = new List<string>();
        this.caughtMorties = new List<string>();
        this.partyMorties = new List<global::MortyData>();
        this.storageMorties = new List<global::MortyData>();
        this.items = new Dictionary<string, int>();
        this.badges = new List<int>();
        this.activeQuests = new List<string>();
        this.completedQuests = new List<global::QuestCompleteData>();
        this.craftRecipesLearned = new List<string>();
        this.lastGymLeaderIDs = new List<string>();
        this.lastSegmentedWorldIDs = new List<string>();
        this.coins = 99999999;
        this.coupons = 99999999;
        global::MortyData newMortyData = global::MortyDefs.GetNewMortyData("MortyDefault", 5, false, false);
        this.partyMorties.Add(newMortyData);
        this.seenMorties.Add(newMortyData.id);
        this.caughtMorties.Add(newMortyData.id);
    }
    • Now, in ILSpy collapse "PlayerSaveData" and find and expand "PlayerDefs" and click on "RemoveCoin(int) : void"
    • The code should look like this:
    Code:
    // PlayerDefs
    public static void RemoveCoin(int amount)
    {
        App.saveData.player.coins = Mathf.Max(0, App.saveData.player.coins - amount);
    }
    Original opcodes image:
    [​IMG]

    • Modify the opcodes (right click an opcode to delete or edit it):
    Code:
    Line 007 -> Delete
    Line 006 -> Delete
    Cracked opcodes image:
    [​IMG]

    • Refresh the ILSpy object model and the code should now appear as:
    Code:
    // PlayerDefs
    public static void RemoveCoin(int amount)
    {
        global::App.saveData.player.coins = Mathf.Max(0, global::App.saveData.player.coins);
    }
    • Still under "PlayerDefs", click on "RemoveCoupon(int) : void"
    • The code should look like this:
    Code:
    public static void RemoveCoupon(int amount)
    {
        App.saveData.player.coupons = Mathf.Max(0, App.saveData.player.coupons - amount);
        if (PlayerDefs.CouponCountChangedEvent != null)
        {
            PlayerDefs.CouponCountChangedEvent(App.saveData.player.coupons);
        }
    }
    Original opcodes image:
    [​IMG]

    • Modify the opcodes (right click an opcode to delete or edit it):
    Code:
    Line 007 -> Delete
    Line 006 -> Delete
    Cracked opcodes image:
    [​IMG]

    • Refresh the ILSpy object model and the code should now appear as:
    Code:
    // PlayerDefs
    public static void RemoveCoupon(int amount)
    {
        global::App.saveData.player.coupons = Mathf.Max(0, global::App.saveData.player.coupons);
        if (global::PlayerDefs.CouponCountChangedEvent != null)
        {
            global::PlayerDefs.CouponCountChangedEvent(global::App.saveData.player.coupons);
        }
    }
    With our patches applied, in the ILSpy menu scroll up and right click "Assembly-CSharp (0.0.0.0)" and click "Save as..." and overwrite the original dll file.

    Now go back to the Android Multitool, and under Compiling select the folder containing the decompiled APK (should be AndroidMultitool\Decompiled_apk\com.turner.pocketmorties). Make sure "apk" is selected and "insert AndroidManifest.xml" is checked and click Compile. This should take a few minutes and the compiled APK will be located in AndroidMultitool\Compiled_apk\com.turner.pocketmorties\.

    In order to run the APK, you need to sign it. Under Signing select AndroidMultitool\Compiled_apk\com.turner.pocketmorties\com.turner.pocketmorties.apk and click Sign. The signed APK will be located in AndroidMultitool\Signed_apk and can be copied over to your device and installed. Enjoy your unlimited Schmeckels and Coupons, wub a dub a dub dub!!!

    The already cracked APK can be downloaded here or here
     
    #1 SirCracksAlot, Jan 15, 2016
    Last edited: Jan 15, 2016
  2. frogonfloor

    frogonfloor Member

    Joined:
    Aug 24, 2015
    Messages:
    5
    Likes Received:
    1
    Thankyou very much
     
  • About Us

    Android Republic - Android Game Hacks - Offering only the most advanced and exclusive android hacks, protections like Xigncode are easily bypassed by our team.

    Exclusive Android hacks, android protections cracked, only the best available games, here you will find only the best games such as Kritika, Summoners War, Raven, Dragon Striker, Avabel, Evil Bane, 7knights and seven knights, Darkness Reborn, Soul Seeker all fully hacked and waiting for you! easy xigncode and dxshield bypass too!, way better than alpha gamers or alphagamers no need for booster or root, simple the best android cheat apk available.