从0开始的小小怪 发表于 2020-9-10 18:29

火影战记md5密值逆向

本帖最后由 从0开始的小小怪 于 2020-9-10 20:06 编辑

最近玩了一个同人手游叫火影战记,最后的一个版本是1.22版,1.22版以前的版本中修改版很多,但因为之前的版本买不了装备所以打算自己动手看看。打开安装包可以发现火影战记中的英雄属性都是明文存放的xml文件,但是修改过后点击开始游戏会闪退。起初以为是安装包签名进行校验了,将安装包重新签名而不修改任何数据则不会出现闪退的情况。而且在游戏的资源目录下可以看到有一个md5的xml文件,初步判断应该是存在对属性资源的校验。

该游戏是用cocos2d制作的,游戏的逻辑都在native层,用ida反编译so文件搜索md5可以看到有几个相关的函数,稍微甄别后估计主要的逻辑在checkMD5函数当中。

可以看到在该函数中存在两次字符串的比较,目测第一次应该是文件名称,第二次则是md5值的比较。在这里因此图方便就不对算法进行分析了,考虑直接hook在libc.so里面的strcmp函数,把正确的md5值打印出来,之后再替换md5值从而过游戏的检测。
随意修改一个英雄的属性后,使用frida编写脚本进行hook,在参数传递的地方注意不能读到不可读的内存区域,否则容易报错。
```
import frida, sys, os, io

package_id = 'net.zakume.game'

dev = frida.get_usb_device(timeout=1)
process = dev.attach(package_id)

src = '''
function IsNumOrAlphabet(c){
    if(c >= '0' || c <= '9')return true;
    else if(c >= 'a' || c <= 'z')return true;
    return false;
}
var addr = Module.findExportByName(
"libc.so",
"strcmp"
);

Interceptor.attach(addr, {
    onEnter: function(args) {
      var flag = false;
      var str1 = Memory.readCString(ptr(args),3);
      var str2 = Memory.readCString(ptr(args),3);
      if(IsNumOrAlphabet(str1)){
            str1 = Memory.readCString(ptr(args),32);
            flag = true;
      }
      if(IsNumOrAlphabet(str2)){
            str2 = Memory.readCString(ptr(args),32);
            flag = true;
      }
      if(flag){
            var obj = {};
            obj.str1 = str1;
            obj.str2 = str2;
            send(obj);
      }
    }
} )
'''

script = process.create_script(src)def on_message(message, data):
    str1 = message['payload']['str1']
    str2 = message['payload']['str2']
    with open('str.txt','a',encoding = 'utf-8') as f:
      if str1.isalnum() and str2.isalnum():
            f.write(str1 + ' ' + str2 + '\n')

script.on('message', on_message)
script.load()
sys.stdin.read()
```

运行脚本之后成功得到了一些字符串,直接拉到最底下可以发现这里存在着两个不匹配的字符串,其中一个是原来文件的md5的值,另一个则是修改过后的文件的md5值。到这里md5的检测已经成功通过了。

将md5的值进行替换后重新进入游戏发现已经不再闪退,但是选好人物之后游戏的资源却加载不出来了{:301_999:}
估计游戏应该还存在另外的检测,由于得准备考试,时间的原因研究到这里我便停止了{:301_971:}
感兴趣的可以接着试试之后的检测在哪。

OceanJ4Nnn 发表于 2020-9-12 01:32

我还记得作者网名叫 小岛多惠

从0开始的小小怪 发表于 2020-9-10 20:09

七度空间 发表于 2020-9-10 19:01
这游戏以前挺喜欢玩的 不错的单机手游 后来腾讯出了一款火影手游 画质奥义 都非常不错 加上这个游戏换手机 ...

作者用爱发电,美化版修改版太多他就没继续更新下去的欲望了,后来服务器还被人入侵,就顺势彻底放弃了更新。挺可惜的,这游戏我感觉还挺有意思的,要是作者懂些安全防护的手段,对资源文件都加密,结果也不至于这样。

爱飞的猫 发表于 2020-9-10 18:48

如果直接把 md5.xml 的对应条目清空,是会拒绝加载还是不验证签名?

从0开始的小小怪 发表于 2020-9-10 18:55

jixun66 发表于 2020-9-10 18:48
如果直接把 md5.xml 的对应条目清空,是会拒绝加载还是不验证签名?

一样的,直接闪退,1.22版本之前好像他们做的修改版就是清空md5.xml文件,1.22就不行了。

七度空间 发表于 2020-9-10 19:01

这游戏以前挺喜欢玩的 不错的单机手游 后来腾讯出了一款火影手游 画质奥义 都非常不错 加上这个游戏换手机后存档都消失了 干脆就放弃这游戏了

xy0225 发表于 2020-9-10 19:52

厉害,支持一个

daxin09 发表于 2020-9-10 20:40

赞赞赞,不错,谢谢楼主。

Edwin_9527 发表于 2020-9-10 20:51

厉害厉害赞{:301_1009:}

斩风 发表于 2020-9-10 21:09

以前玩过,感觉不错,在下载纪念下

woyaoshangshiqi 发表于 2020-9-10 21:55

只能可惜作者了
页: [1] 2 3 4 5
查看完整版本: 火影战记md5密值逆向