新手一个问题求教,THEOS or IDA怎么Hook/Patch double值

新手学习调试某单机小游戏,IDA + ill2cppdumper的攻击力方法getter和setter:
IDA中:

il2cpp:000000010216C684 ; =============== S U B R O U T I N E =======================================
il2cpp:000000010216C684
il2cpp:000000010216C684
il2cpp:000000010216C684 HeroConfig$$get_attack ; CODE XREF: ChapterPassAttributeNode$$reloadHeroData+170↑p
il2cpp:000000010216C684 ; ChapterPassAttributeNode$$reloadChapterData+170↑p …
il2cpp:000000010216C684 LDR D0, [X0,#0x28]
il2cpp:000000010216C688 RET
il2cpp:000000010216C688 ; End of function HeroConfig$$get_attack
il2cpp:000000010216C688
il2cpp:000000010216C68C
il2cpp:000000010216C68C ; =============== S U B R O U T I N E =======================================
il2cpp:000000010216C68C
il2cpp:000000010216C68C
il2cpp:000000010216C68C HeroConfig$$set_attack ; DATA XREF: __const:0000000103AAE778↓o
il2cpp:000000010216C68C STR D0, [X0,#0x28]
il2cpp:000000010216C690 RET
il2cpp:000000010216C690 ; End of function HeroConfig$$set_attackil2cpp:000000010216C684 ; =============== S U B R O U T I N E =======================================
il2cpp:000000010216C684
il2cpp:000000010216C684
il2cpp:000000010216C684 HeroConfig$$get_attack ; CODE XREF: ChapterPassAttributeNode$$reloadHeroData+170↑p
il2cpp:000000010216C684 ; ChapterPassAttributeNode$$reloadChapterData+170↑p …
il2cpp:000000010216C684 LDR D0, [X0,#0x28]
il2cpp:000000010216C688 RET
il2cpp:000000010216C688 ; End of function HeroConfig$$get_attack
il2cpp:000000010216C688
il2cpp:000000010216C68C
il2cpp:000000010216C68C ; =============== S U B R O U T I N E =======================================
il2cpp:000000010216C68C
il2cpp:000000010216C68C
il2cpp:000000010216C68C HeroConfig$$set_attack ; DATA XREF: __const:0000000103AAE778↓o
il2cpp:000000010216C68C STR D0, [X0,#0x28]
il2cpp:000000010216C690 RET
il2cpp:000000010216C690 ; End of function HeroConfig$$set_attack

ill2cppdumper中的Class HeroConfig

// Namespace:
public class HeroConfig : NSConfigObject // TypeDefIndex: 7645
{
// Fields
private double <attack>k__BackingField; // 0x28
// Properties
public double attack { get; set; }
// Methods
[CompilerGeneratedAttribute] // RVA: 0x145190 Offset: 0x145190 VA: 0x100145190
// RVA: 0x216C684 Offset: 0x216C684 VA: 0x10216C684
public double get_attack() { }
[CompilerGeneratedAttribute] // RVA: 0x1451A0 Offset: 0x1451A0 VA: 0x1001451A0
// RVA: 0x216C68C Offset: 0x216C68C VA: 0x10216C68C
private void set_attack(double value) { }
}

double值64位的好像很难Hex Patch……然后我想用THEOS方式,请问Tweak怎么写。百度/google了几天,茶饭不思,求教。

还是说我直接普通hook就行了,不用像修改二进制那样吧,考虑各种栈问题?

Tweak.xm中为如下代码,安装执行后无效,里面开始放了一个alert,进游戏后没有弹出任何提示,似乎没调用?

%hook HeroConfig
- (double)get_attack{
return 999999999;
}
%end

你这样写的xm其实是对OC方法下手,Unity脚本经过il2cpp已经转成C/C++,所以你需要

long long HeroConfig__get_attack = _dyld_get_image_vmaddr_slide(0) + 0x000000010216C684;
    MSHookFunction(HeroConfig__get_attack, new_HeroConfig__get_attack, &old_HeroConfig__get_attack);

最后盲猜wogongfuteniu

厉害了哥们,这游戏名都直接猜出来了。不过用这个方法也不奏效,不知道是不是我写错了。Tweak.xm如下,手机安装后没效,求指导

#include <mach/mach.h>
#include <mach-o/dyld.h>
#import <substrate.h>

long long HeroConfig__get_attack = _dyld_get_image_vmaddr_slide(0) + 0x000000010216C684;

double (*old_HeroConfig__get_attack);

double new_HeroConfig__get_attack()
{
return 99999999;
}

%ctor{
MSHookFunction((void *)HeroConfig__get_attack, (void *)new_HeroConfig__get_attack, (void **)&old_HeroConfig__get_attack);
}
1 个赞

是的紫薯布丁

没看懂 …… 哈哈,请教一下怎么写。现在搭建的环境还不全,没办法动态调试追踪下断点……

应该是HOOK成功了,应该在dylibMain中

谢谢你哥们,让我学到了很多。我已经成功HOOK到生命、攻击、防御函数,并且已修改并生成DEB安装在玩。这是我第三次写Tweak,没想到如此顺利,没有动态调试的情况下,从OC改写C/C++,一次性成功修改。此贴终结。 :kissing_smiling_eyes:

2 个赞

大老 能整理一下教教我们吗~