首页 > 其他分享 >[YURIS引擎] 寻找脚本密钥

[YURIS引擎] 寻找脚本密钥

时间:2022-11-19 21:36:23浏览次数:73  
标签:文件 xor 游戏 解密 引擎 密钥 ybn YURIS

[YURIS引擎] 寻找脚本密钥

0x00 背景

在寻找密钥之前来了解一下yuris的脚本

yuris的脚本一般放在一个叫bn.ypf or ysbin.ypf 的封包里。有兴趣了解结构的可以看看这个链接 GarBro 说白了,里面就是一堆zlib压缩的文件,可以搜到zlib压缩的文件头特征。

这个封包里其实都是一些编译后的文件,相当于你写的C++程序编译成了exe,并不是明文,里面也有几种文件格式(看文件头),有兴趣的看这个链接 Notes.txt

游戏的文本一般在ystXXXXX.ybn文件里,除了一些魔改过的,比如Whirlpool社新版本的yuris,它的文本是在一个sc.ypf的封包,文本全是明文,后缀是.txt,注意这只是文本,脚本其实还是在ybn里编译过的。(一般右键属性-详细里,版本号大于0,477的属于比较不一样的新版本,不过除了文件格式有一些差别,其实汉化的方法是差不多的,除了那些魔改过的版本 比如:比如Whirlpool社新版本的yuris)。

在yst_list.ybn文件里还能看到一些编译之前的 .txt .yst之类的文件名,这些文件其实没编译之前是明文的,可以去yuris的官网下一个来看看。

游戏的标题一般在 yscfg.ybn 这个文件里,当然这里面还有很多有意思的东西,不限于此。

0x01 加密明辨

了解完了,上面这些,我们就来看看怎么解这个文本,你可以找一些现成的工具,当然也可以自己按照文件结构解包。不管怎么样,首先得了解的是,正常如果你自己按照文件结构来解包,用zlib解压后可以得到原始的ybn文件,当然ybn只是一个后缀,里面有多种文件头的文件,假设你是自己解出来的,这时候你可以看到文件头,但是文件的内容如果你自己翻翻,其实是加密过的,不像是明文,但是可以看到一堆像是大段文本的东西。

当然这样的才是游戏正常读进去的文件,也就是说,你把你自己解出来的文件,放到ysbin文件里,游戏是可以正常读取的。

当然大多数时候,我们可能用的都是三方的工具,比如Garbro,这些工具,有些会套用默认的密钥尝试在解包后继续对文件进行解密,有些时候成功,有些时候失败,这就导致解包出来的文件出现了,有些是完全解密的,有些原始文件的情况。游戏引擎只会机械的读取文件,进来后解密,所有如果你的解包工具帮你解密的文件,那么再放入ysbin的时候游戏就会把已经解密的文件当成没解密的文件进行解密,然后就boooooom,崩溃了!!!!

怎么判断有没解密文件,很简单,解包后按文件大小筛选,找到最大的文件,用winhex调到sjis编码,随便翻翻看看,能看到大段的游戏文本说明解密了,或者能看到一些英文单词啥的,当然你也能看到一些游戏菜单或人物名的字符串。如果都看不到,那就说明没帮你解密,当然最简单的是直接放到游戏目录下跑一下就知道了。

0x02 找密钥前传

早前我在某论坛发过一篇找破解某收费汉化组游戏的帖子,那个游戏恰好就是yuris的,而且那游戏已经打不开了,因为汉化组被绳之以法,想破解还真没那么简单,这东西就像是7z压缩包加密码了,除非硬算,或能进一次游戏,不然基本很难破解了。

当然由于一些加密工具的漏洞,我得到了游戏的ybn文件,但是ybn文件是加密的,就像是上面那样,看不到明文。但是你也进不去游戏,因为汉化组被绳之以法,加上汉化组还特意改了游戏的解密密钥,所以和日文版是不一样的。

那最后我是怎么解决的呢?其实很简单,我看了下网上yuris的ybn的加密方法,无非就是xor,它有一个长度固定的密钥,比如 0x99609960 好了,然后用这个密钥对ybn文件跳过文件头xor即可。如果它刚好对一段0x00000000进行了xor,那么它的密钥就写在脸上。所以我找到了日文版的游戏,找到里面ybn文件有大块00的地方(其实基本ybn文件开头都有大块00的地方,没有的话就四处拼接一下),直接读出了密钥。

这个故事也告诉我们,ybn的解密密钥是可以直接读出来的。

当然,由于我们是可以正常打开游戏的,所以就没必要这样了,等下找到密钥了,可以自己去读一个试试

0x03 开找!

这引擎找密钥就很套路了

第一步

搜索字符串

ysbin\yst%05d.ybn

必然有这个,我还没见过没有的。这个看着就是一种格式化字符串的写法(sprintf)。

来到对应位置下断点

看下面红色箭头指向的地方,有个jl往回跳了,这其实是一个循环,还可以看到里面有个很明显的xor字眼。

0043690C  | 33D2                  | xor edx,edx
0043690E  | 83C1 01               | add ecx,1
00436911  | 8BFA                  | mov edi,edx
00436913  | 83E7 03               | and edi,3
00436916  | 0FB687 2C876B00       | movzx eax,byte ptr ds:[edi+6B872C]
0043691D  | 83C2 01               | add edx,1
00436920  | 3041 FF               | xor byte ptr ds:[ecx-1],al
00436923  | A1 78886B00           | mov eax,dword ptr ds:[6B8878]
00436928  | 8B04A8                | mov eax,dword ptr ds:[eax+ebp*4]
0043692B  | 3B10                  | cmp edx,dword ptr ds:[eax]
0043692D  | 7C DF                 | jl magustale.43690E

这一句 movzx eax,byte ptr ds:[edi+6B872C] ,这个6B872C其实就是密钥的地址,跳到这个地址就可以读出密钥了,当然你实在不会就按f8跑,让他循环几下,然后你观察各个寄存器,eax ebx啥的,可以发现有一个寄存器是在四个数之间循环读取的。

当然这其实还不是密钥的产生地点,也就是说,这里的密钥是复制过来的,如果你关掉游戏,再次来到这个地址,发现这个地方是空的。

那么如何定位密钥的产生地点呢?其实很简单,先关掉游戏,来到入口点,对这个地址下一个硬件访问断点、

DWORD或BYTE都行啦,然后跑一下,会来到这个位置

可以看到它把EAX的值,一个个搬过去了,其实这个EAX的值就是密钥啦。如果你再对上面那个call下一个断点,你会发现,这个Yu-ris传进去计算出了一个密钥放到eax里。其实这个密钥也是最经典的yuris脚本的密钥。如果你把Yu-ris改掉,密钥也自然就不一样了。

这里也就可以做一下手脚了,如果你把这些搬运密钥的操作都nop掉,最后密钥就变成了0x00000000,对0 xor还是原来的数,那么这个时候你把解密的文件放到ysbin游戏目录下就可以正常跑了,当然,原来加密的就寄了。适合有些时候不想xor回去的情况。

以下是新版本的,大同小异,当然新版本就不能直接读取ysbin目录了,得稍微改一下,以后再说。


标签:文件,xor,游戏,解密,引擎,密钥,ybn,YURIS
From: https://www.cnblogs.com/Dir-A/p/16907255.html

相关文章

  • zblogphp如何使用模板引擎Template类如何使用
    Template类的构造函数没有任何参数,所有的功能都是通过调用其成员函数实现的。$template=newTemplate();//设置模板标签.zblog内置的模板变量和sidebar都在该函数绑定......
  • Node.js通过密钥计算验证码,无需存数据库
    Node.js通过密钥计算验证码,无需存数据库constCRC32=require('crc-32');functionXixiOtp(sKey,iKeeptime=600){constoPri={};oPri.sKey=sKey;......
  • Applied Cryptography——密钥分发(Key Distribution)
    密钥分发(KeyDistribution)密钥分发(KeyDistribution)Solution#0PairwiseSharedKeysSolution#0BUseaTrustedThirdPartySolution#1Merkle’sPuzzleDiffie-He......
  • 提升mysql服务器性能(存储引擎与配置参数设置)
    服务层实现了与引擎无关的性能 frm用于记录结构 使用表锁 使用共享所和读锁支持全文索引 前缀索引  如果不对表进行操作尽可以进行压缩; myisamchk 命令行工具需......
  • GOM/GEE引擎 假人登陆速度修改教程
    打开引擎M2-选项-功能设置-假人系统这个是登陆速度总控制假如你脚本设置的登陆速度是1秒一个,你觉得快了可以在引擎上面控制速度但是如果你脚本设置的是30秒登陆一个,你在引擎......
  • 2022-11-17 mysql列存储引擎-聚合中间缓存结果-分析
    摘要:mysql列存储引擎-聚合中间缓存结果-分析DML:TPCH表使用Q16selectp_brand,p_type,p_size,count(distinctps_suppkey)assupplier_cntfrompartsupp,partwh......
  • 配置实现+工作流引擎-OA办公系统开发利器
    OA办公项目的开发离不开工作流程的处理,有工作流处理引擎开发工作就会更加便利,外加利用xml配置实现任务的处理,这样一般的流程就可以实现零编程实现了。建立一个基础的系统架......
  • 虚幻引擎 5.1 正式发布
    虚幻引擎5.1正式发布来源:OSCHINA编辑: Alias_Travis2022-11-1707:11:18 2EpicGames近日正式发布了虚幻引擎5.1版本,该版本在5.0的基础上带来了......
  • activiti流程引擎-流程部署
    这是对于activiti如何部署流程的一篇博客,希望可以帮助到刚学习activiti的小伙伴。定义:将流程设计器的流程部署到activiti数据库表中即是流程的部署如何去做这件事情呢......
  • 「JVS低代码开发平台」关于逻辑引擎的触发讲解
    JVS逻辑引擎是代码开发套件中的业务瓶装的核心,用于去实现各种场景下的逻辑功能,可以把他理解为一个程序配置器与程序的执行器。逻辑引擎是可以被多种配置器调用的触发的,从而......