吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5432|回复: 6
收起左侧

[Android 求助] [逆向工程日记] 元气骑士开局导师

  [复制链接]
凌七 发表于 2021-3-22 13:04
本帖最后由 凌七 于 2021-3-23 09:01 编辑

纯小白,第一次接触逆向工程,很多理解可能都是错的,欢迎各位大佬指正。


在元气骑士中,导师是很强的NPC,尤其是三技能的死灵法师,有没有导师给予的技能就是两种游戏体验,但是在地牢里遇到导师的概率很低很低。


image.png


    有一天,我和往常一样,在花园的魔法井中获取这个垃圾天赋的时候,突然想到,如果将这个魔法井获得的这个天赋,替换成导师给予的天赋,这样不就实现了开局导师天赋嘛。


image.png




    甚至和朋友四排 "吊炸天-试炼之地-双boss" 的时候,可以尝试四死灵法师复活八个boss,12V2的公平对决。


然后就确定了核心思路:将魔法井获得的技能替换成导师获得的技能。


结果:2.7.0版本的元气骑士libil2cpp.so文件没有加密,修改成功。
3.0.4版本的元气骑士libil2cpp.so文件加密了,修改失败。




过程:


首先,我啥也不懂,看了俩教程


(Unity3D反编译)如何在元气骑士里无敌(  https://www.bilibili.com/video/av51404159/ )
元气骑士so修改小白教程(  https://www.52pojie.cn/thread-941865-1-1.html )


感觉也不是很难嘛,然后开始上手(不知死活)了
image.png




首先,我在2.7.0版本的元气骑士中进行尝试。


首先将元气骑士的安装包.apk文件改成.zip文件,解压缩之后找到目标文件,
1、lib/(指令集名称)/libil2cpp.so
2、assets/bin/Data/Managed/Metadata/global-metadata.dat




使用Il2CppDumper-v6.5.0反编译libil2cpp.so文件和global-metadata.dat文件,得到一系列文件,




image.png




编辑dump.cs文件,可以查找相关函数。通过观察dump.cs文件,找到“MagicWell”类,这个类下有“AddBuff”函数,说明这就是魔法井类,
“addbuff”函数就是获得魔法井天赋的函数。
找到“ObjectSkillUpdate”类,这个类下有“AddBuff”函数,根据经验,“skill update”指的就是导师,很明显,这个addbuff就是获得导师天赋的函数,


[Asm] 纯文本查看 复制代码
// Namespace:
public class ObjectMagicWell : RGItem // TypeDefIndex: 7947
{
    // RVA: 0xD3660C Offset: 0xD3660C VA: 0xD3660C
    public void AddBuff(RGController controller) { }

// Namespace:
public class ObjectSkillUpdate : RGItem // TypeDefIndex: 7967
{
    // RVA: 0xD40EFC Offset: 0xD40EFC VA: 0xD40EFC
    private void AddBuff(RGController controller) { }






    现在要做的就是,用“SkillUpdate”类下的“AddBuff”函数替换“MagicWell”类下的“AddBuff”函数,就可以实现我们想实现的功能了。


    随后启动IDAPro工具,


image.png

对libil2cpp.so进行分析,然后可以得到内容,甚至可以反编译函数。
通过地址“0xD3660C”找到“ObjectMagicWell”类的“AddBuff”函数的数据:


image.png


通过地址“0xD40EFC”找到“ObjectSkillUpdate”类的“AddBuff”函数:
image.png



image.png


对这两个函数进行反编译并进行对比:
image.png
猜测这里的“1001”代表着魔法井天赋,“1002”代表着导师天赋。


image.png


根据进制转换,10进制的1001为3E9,1002为3EA。要做的工作就行将某处的3E9更改成3EA就行。


然后就开始找了。
在“ObjectMagicWell”类的“AddBuff”函数下找到一条命令为“E9 13 00 E3”,
在“ObjectSkillUpdate”类的“AddBuff”函数下找到一条命令为“EA 13 00 E3”,


将“ObjectMagicWell”类的“AddBuff”函数下的“E9 13 00 E3”更改成“EA 13 00 E3”,按下F5进行反编译,
发现原本的“  sub_8AAF28(v4, 1001, 1, 0);”已经变成了“  sub_8AAF28(v4, 1002, 1, 0);”。


image.png


将修改加载到libil2cpp.so中,并覆盖到手机/模拟器的data/app/com.ChillyRoom.DungeonShooter-1/lib/arm目录下,
image.png


启动游戏,到魔法井获得垃圾天赋,暂停查看,发现天赋已经被取代成功了!
image.png


2.7.0版本的元气骑士的libil2cpp.so文件没有加密,所以成功了。

但是2.7.0版本的死灵法师并没有三技能,我们真正需要修改的是libil2cpp.so文件被加密的3.0.4版本的元气骑士。
当我开始尝试修改3.0.4版本的元气骑士时,发现该版本的元气骑士的libil2cpp.so文件已经被加密了,无法使用Il2CppDumper工具和IDA PRO工具进行分析。


image.png


在Il2CppDumper工具的github的说明中,得知可以使用GameGuardian从游戏内存中dump libil2cpp.so,然后再进行分析。


image.png


但是菜如狗的我并不会,然后又看了两个B站视频,
以明日方舟为例-Il2CppDumper逆向实例(  https://www.bilibili.com/video/av542959588/ )
如何提取【gcg2】的文本字符串(  https://www.bilibili.com/video/av331378182/ )


然后照葫芦画瓢提取出了文件,但是文件并不能正常使用。


image.png




然后咨询了大佬,使用010editor查看了原本的libil2cpp.so文件和从内存当中dump出来的bin文件,
image.png
image.png


发现bin文件的开头并没有so文件的文件头 ".ELF",
image.png


然后将bin文件的前两行修改成so文件应该有的格式,就可以使用Il2CppDumper工具进行分析了。
发现addbuff函数虽然略有不同,但是修改的核心思路应该是没有变的,就是将此处的1001,更改为1002。
image.png


但是,修改的是bin文件,并不是libil2cpp.so文件,直接将bin文件放进游戏安装目录下游戏启动时会出错。


然后我再次咨询大佬,大佬的建议是需要找到加密文件里的解密函数。


菜如狗的我,还在尝试解密。。。




感谢B站大佬 kjkjkAIStudio 对我的指导和帮助,收获良多。


如果有大佬可以对我接下来应该干点啥给点指导,感激不尽。
image.png
image.png
image.png

免费评分

参与人数 3吾爱币 +4 热心值 +3 收起 理由
hellow0rld + 1 谢谢@Thanks!
lspghs9.10plus + 1 热心回复!
涛之雨 + 4 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

涛之雨 发表于 2021-3-23 11:38
啊啊啊啊!编辑了半天,一不小心关掉页面了。刚才输的字全没了。T_T
(我想想我刚才说的啥。)
提供两个思路:
一个是根据他加密的方式把代码重新加密回去。
另一个是把所有的so都给dump出来,修改逻辑,跳过解密直接加载修改后的so
 楼主| 凌七 发表于 2021-3-23 16:08
涛之雨 发表于 2021-3-23 11:38
啊啊啊啊!编辑了半天,一不小心关掉页面了。刚才输的字全没了。T_T
(我想想我刚才说的啥。)
提供两个 ...

谢谢您的指导!有一种茅塞顿开、拨云见雾的感觉。

请问so文件的加密解密工作是在so文件内部,还是在其他文件加载so文件的时候进行的呢?

还有就是,一般而言,so文件都是在哪里加载的呢?

点评

一般来说so在dex直接调用。 dex里调用so就是直接system的loadlibrary 但是加密的so一般都是在so里解密的(因为这样复杂) 360加固的so就是so动态拆解的,文件头、参数表和代码部分拆分成三个部分动态解密后直接  详情 回复 发表于 2021-3-23 16:40
涛之雨 发表于 2021-3-23 16:40
凌七 发表于 2021-3-23 16:08
谢谢您的指导!有一种茅塞顿开、拨云见雾的感觉。

请问so文件的加密解密工作是在so文件内部,还是 ...

一般来说so在dex直接调用。
dex里调用so就是直接system的loadlibrary

但是加密的so一般都是在so里解密的(因为这样复杂)
360加固的so就是so动态拆解的,文件头、参数表和代码部分拆分成三个部分动态解密后直接执行,因为不是内存拼接,所以dump不出来完整的so。
既然能完整dump出so,那应该就是so解密后直接内存里运行的。

ps:免费的加固,做的最好的看来就是360了(指抽取oncreate)
 楼主| 凌七 发表于 2021-3-23 16:50
涛之雨 发表于 2021-3-23 16:40
一般来说so在dex直接调用。
dex里调用so就是直接system的loadlibrary

谢谢您的指导!
我尝试一下
DDFer 发表于 2021-3-30 20:32
大佬能说下新版签名验证的思路吗
查到libnative-lib.so后思路就断了
自我意识障碍 发表于 2021-4-14 16:56
膜拜大佬 这个导师刷新真的很迷 没想到真有人愿意做这个的逆向 强
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 21:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表