vfsfitvnm / frida-il2cpp-bridge

A Frida module to dump, trace or hijack any Il2Cpp application at runtime, without needing the global-metadata.dat file.
https://github.com/vfsfitvnm/frida-il2cpp-bridge/wiki
MIT License
1.03k stars 202 forks source link

I get the error "already replaced by a thunk" but I only have 1 for each method #134

Closed thinhbuzz closed 2 years ago

thinhbuzz commented 2 years ago

I have a problem with class Niantic.Holoholo.Encounter.EncounterGuiController: Error message:

il2cpp: cannot implement method GOJDBBHJOAJ: it may be a thunk il2cpp: cannot implement method BFFHMJIEGPO: it may be a thunk il2cpp: cannot implement method BJLFNBINMKC: already replaced by a thunk << If I move BJLFNBINMKC to before OEPEBOKGBLL, the error changes to "il2cpp: cannot implement method OEPEBOKGBLL: already replaced by a thunk"

const className = "EncounterGuiController";
assemblyCsharp.class("Niantic.Holoholo.Encounter." + className).method("GOJDBBHJOAJ")
  .implementation = function () {
  try {
    console.log("EncounterGuiController.GOJDBBHJOAJ is calling");
    const result = this.method("GOJDBBHJOAJ").invoke();
    console.log("EncounterGuiController.GOJDBBHJOAJ is result", "result");
    return result;
  } catch (e) {
    console.error("EncounterGuiController.GOJDBBHJOAJ", e);
  }
};
assemblyCsharp.class("Niantic.Holoholo.Encounter." + className).method("BFFHMJIEGPO")
  .implementation = function () {
  try {
    console.log("EncounterGuiController.BFFHMJIEGPO is calling");
    const result = this.method("BFFHMJIEGPO").invoke();
    console.log("EncounterGuiController.BFFHMJIEGPO is result", "result");
    return result;
  } catch (e) {
    console.error("EncounterGuiController.BFFHMJIEGPO", e);
  }
};
assemblyCsharp.class("Niantic.Holoholo.Encounter." + className).method("OEPEBOKGBLL")
  .implementation = function () {
  try {
    console.log("EncounterGuiController.OEPEBOKGBLL is calling");
    const result = this.method("OEPEBOKGBLL").invoke();
    console.log("EncounterGuiController.OEPEBOKGBLL is result", "result");
    return result;
  } catch (e) {
    console.error("EncounterGuiController.OEPEBOKGBLL", e);
  }
};
assemblyCsharp.class("Niantic.Holoholo.Encounter." + className).method("BJLFNBINMKC")
  .implementation = function (p0: any) {
  try {
    console.log("EncounterGuiController.BJLFNBINMKC is calling", "p0");
    const result = this.method("BJLFNBINMKC").invoke(p0);
    console.log("EncounterGuiController.BJLFNBINMKC is result", "result");
    return result;
  } catch (e) {
    console.error("EncounterGuiController.BJLFNBINMKC", e);
  }
};
// Assembly-CSharp
class Niantic.Holoholo.Encounter.EncounterGuiController : Niantic.Holoholo.NUI.GuiController, BHCCEPBKJOA, BOHDDDCFIAN, IEEKDMFAANE, Niantic.Zeppelin.UI.IGuiLayerable, Niantic.Zeppelin.UI.IHideable, BGGEBIODHDO<Niantic.Holoholo.Encounter.EncounterGuiController.JGJK
BGKIMBO>
{
    static System.Int32 IIMBGJGBFNI; // 0x0
    UnityEngine.CanvasGroup uiRoot; // 0xc8
    UnityEngine.RectTransform[] hiddenUiOnFirstTimeEncounter; // 0xd0
    UnityEngine.RectTransform noBallIndicator; // 0xd8
    UnityEngine.UI.Text itemCountLabel; // 0xe0
    UnityEngine.UI.Text raidBallCountLabel; // 0xe8
    UnityEngine.UI.Image ballCountContainer; // 0xf0
    UnityEngine.UI.Image raidBallCountContainer; // 0xf8
    UnityEngine.UI.Button raidBallSelectionButton; // 0x100
    Niantic.Holoholo.Encounter.EncounterArrows arrows; // 0x108
    Niantic.Holoholo.Encounter.EncounterGuiController.ColorizedPokemonName[] colorizedPokemonNames; // 0x110
    UnityEngine.Color shinyPokemonNames; // 0x118
    Niantic.Holoholo.UI.Items.FeedItemSelectionButton pokeballSelectionButton; // 0x128
    Niantic.Holoholo.UI.Items.FeedItemSelectionButton berrySelectionButton; // 0x130
    UnityEngine.UI.Image berrySelectButtonImage; // 0x138
    UnityEngine.AudioClip failOpenItemsSfx; // 0x140
    Niantic.Holoholo.Badges.EncounterBadgeContainerGuiController badgeContainer; // 0x148
    Niantic.Holoholo.AR.EncounterToggleArButton arToggleButton; // 0x150
    UnityEngine.Animator animator; // 0x158
    Niantic.Holoholo.Encounter.EncounterNameplate.PLOMBDCBJCG HLGEHGPHGDC; // 0x160
    Niantic.Holoholo.Encounter.EncounterToast.GJJJBFJBFMO OMPLHIGNAKL; // 0x168
    NBEHJFDADKM AJJMEFNGKKC; // 0x170
    GameMasterData KGLLKDOIEKM; // 0x178
    Niantic.Holoholo.Encounter.EncounterState CHPMKDNOGFJ; // 0x180
    GBBAJJABICI BMEJHMPJAHD; // 0x188
    JJENKJGKNII EDKDLFCDFKE; // 0x190
    Niantic.Holoholo.UI.ButtonPulseFx.ECDPMCDKONE KFDNMBJIGMN; // 0x198
    KGMMNCHJDHE JOFKNFFIALL; // 0x1a0
    KFLDNPMOEDF MIBJLDDIGMA; // 0x1a8
    JFHJBMPDHFL APFDMOBOLON; // 0x1b0
    System.Collections.Generic.List<AEDLBJJPKFA> EEMBBFFLHHP; // 0x1b8
    Niantic.Holoholo.Encounter.EncounterNameplate AHPFNMHPIFJ; // 0x1c0
    EAKGHOAFHBA GOGFIGEGPCF; // 0x1c8
    EKFEJHAIIED BDICFMPCDLL; // 0x1d0
    System.Boolean NIADMFHMNCO; // 0x1d8
    Niantic.Holoholo.UI.ButtonPulseFx ICBPIAIDLMB; // 0x1e0
    System.Boolean OIDCHLFGDDC; // 0x1e8
    System.Void OpenPokeballQuickShop(); // 0x031821d8
    Niantic.Holoholo.Encounter.EncounterToast ShowMetamonCaptureSucceeded(); // 0x03182314
    System.Void GOJDBBHJOAJ(); // 0x03182460
    System.Void GFEDOEFPKBK(); // 0x03182464
    System.Void .ctor(); // 0x03182528
    System.Void FadeInBadgeContainer(); // 0x031825d0
    System.Void GKDLDNFCJPF(AEDLBJJPKFA IFIMMKPNLLP); // 0x031826ac
    System.Void ClickRunAway(); // 0x03182784
    System.Void KGPJNBDCLFM(System.Action FPFKJPJGDDL); // 0x03182858
    System.Void Initialize(Niantic.Holoholo.Encounter.EncounterGuiController.JGJKBGKIMBO KKOLMGPMNJB); // 0x03182918
    System.Void set_ActiveRaidBallSelectionButton(System.Boolean CHKLGGMOFFM); // 0x03183af4
    System.Void OHNEADPBJAP(AEDLBJJPKFA IFIMMKPNLLP); // 0x03183b14
    System.Void set_ButtonsVisible(System.Boolean CHKLGGMOFFM); // 0x03183c08
    System.Void NLLHIKKECDP(); // 0x03183d58
    System.Void ShowPokemonFlee(); // 0x03183e60
    System.Void LMDAFABIIJJ(); // 0x03184104
    System.Void ShowTargetHitMessage(ELLLKIDFFJN.JFCFMIFMBAM EFIHDBAIBNN); // 0x031841d8
    System.Void DFLHIAALJAH(); // 0x03183a40
    System.Void OpenPokeballSelector(); // 0x031843a4
    System.Void IOMBPMEACHA(System.Boolean BOBKKDLOHFE); // 0x03183670
    System.Void BAJKEGBMFPI(); // 0x03184dd0
    System.Void GNHGPJMHHEA(); // 0x03184dec
    Niantic.Holoholo.Encounter.EncounterToast FCCHGBLHDMJ(System.Int32 DHCHDGHCJAA, System.Boolean BMHALBDGHLG); // 0x03184ec0
    System.Void ShowIntro(); // 0x03185194
    System.Void RefreshItemMenus(); // 0x03185454
    Niantic.Promises.IPromise<AEDLBJJPKFA> HCLPFCMMBHP(System.String NGCCEOEKDFI, System.String CKICGCBBNCE, Niantic.Holoholo.UI.Items.ItemSelectionSliderGuiController.PPIDJPKMPIL ONAHNBLCMLB, EIOFKHPJKHA OJHEELBCBJL, System.Boolean MKPABIBKJLJ, System.Action<AEDLB
JJPKFA> CLGGNGDMNNA, System.Collections.Generic.List<AEDLBJJPKFA> EEBPMJADEKP); // 0x03184628
    System.Void BJLFNBINMKC(AEDLBJJPKFA ODOIDMDGJGO); // 0x031856d8
    System.Void KCNKLHOEANG(System.Action FPFKJPJGDDL); // 0x0318579c
    System.Void SetItemCount(AEDLBJJPKFA IFIMMKPNLLP, System.Int32 PGFHBCJGKFO); // 0x0318585c
    Niantic.Holoholo.Encounter.EncounterToast EJFCEHMIDPA(System.String BJHAAHAANIC); // 0x031823e8
    static System.Void .cctor(); // 0x03185c14
    System.Void TryFlourish(EABGOJPIIND AMMHHHJFDKP); // 0x03185c78
    System.Void AnimateShowBerryButtonPulse(); // 0x03185c94
    System.Void set_ActiveBerry(AEDLBJJPKFA CHKLGGMOFFM); // 0x03185ca0
    System.Void SelectPremierPokeball(); // 0x03185f0c
    Niantic.Promises.IPromise ShowCaptureSucceeded(System.Int32 DHCHDGHCJAA, System.Boolean BMHALBDGHLG); // 0x03185fc0
    System.Void AHNCCCBLDHO(); // 0x03186144
    System.Void BFFHMJIEGPO(); // 0x03186210
    System.Void OpenCamera(); // 0x03186214
    System.Void KEGNOEPEOEL(); // 0x03184b94
    System.Void ShowPokemonBreakout(EABGOJPIIND.CPCGPMDHFFJ.MELCBHAGPEN IGMLNDMGKHO); // 0x031862c8
    System.Void ShowOutOfBerriesWarning(); // 0x031865e8
    System.Void AnimateHideBerryButtonPulse(); // 0x031866bc
    System.Void IDOCIIDJKAI(); // 0x031866c4
    System.Void OEPEBOKGBLL(); // 0x031856dc
    System.Void OpenBerrySelector(); // 0x031866e0
}
vfsfitvnm commented 2 years ago

The error says it all, Frida cannot replace/intercept some thunk functions nor replace/intercept the same function twice

thinhbuzz commented 2 years ago

thanks, I'm not good at c so I don't quite understand the meaning of the above error. Also the 3rd error confused me, but with your link I got it clear

vfsfitvnm commented 2 years ago

Yeah, you just have to point out the "real" function (disassemblers are pretty good in this) and then you are good to go, thunks will eventually call it