因为《轩辕剑柒》是虚幻4开发的,网上现在UE4解包工具一大堆,所以可以直接用现成的工具:UnrealPakTool
《轩辕剑柒》的解包KEY为:oaddprYiOBCna/6pjaTOXNgCauDe7s3M7xrHF0Dy/FA
将解包KEY写到Crypto.json中即可用UnrealPakTool进行解包了。
解包出来的uasset模型可以用UE Viewer进行查看,也可参照这篇文章将模型导入UE4进行编辑,轩七的UE4版本号为4.24.3,查看和编辑时注意选择。
因为《轩辕剑柒》是虚幻4开发的,网上现在UE4解包工具一大堆,所以可以直接用现成的工具:UnrealPakTool
《轩辕剑柒》的解包KEY为:oaddprYiOBCna/6pjaTOXNgCauDe7s3M7xrHF0Dy/FA
将解包KEY写到Crypto.json中即可用UnrealPakTool进行解包了。
解包出来的uasset模型可以用UE Viewer进行查看,也可参照这篇文章将模型导入UE4进行编辑,轩七的UE4版本号为4.24.3,查看和编辑时注意选择。
忙了一年项目,好久没更新博客了
仙剑6的DLC幻字灰色补丁上次被误删了,趁这次机会把原理写下来
补丁原理就是librivet.dll里面有个导出函数Rivet_DlcVerification,DLC进不去、幻字灰色都是因为这个函数返回0导致的,解决办法很简单,把函数入口代码改成:
mov eax, 1
retn
首先将仙剑5前传手游APK解压,在assets\bin\Data\Managed中找到Assembly-CSharp.dll,16进制查看发现其已经加密,其他文件(UnityEngine等)未加密,故考虑游戏应是通过libmono中mono_image_open_from_data_with_name的函数来解密Assembly-CSharp.dll
IDA打开libmono.so(位于lib\x86\libmono.so,x86较arm方便分析),找到mono_image_open_from_data_with_name函数,注意这里有一个GetKey函数
F5分析代码,程序将GetKey函数返回的结果作为src然后memcpy,再新建一个image结构体并将dest赋值到image.raw_data,最后调用do_mono_image_load,根据这个逻辑GetKey返回的应是解密后的Assembly,跟进GetKey函数后发现该函数调用了一个名为EnDeCrypt的函数,从字面意思理解其应为解密函数,IDA已经给出了注释:
.mytext:00282CC8 mov [esp+8], edx ; s .mytext:00282CCC mov [esp+4], eax ; size .mytext:00282CD0 mov eax, [ebp+arg_0] .mytext:00282CD3 mov [esp], eax ; int .mytext:00282CD6 call EnDeCrypt
其中s为字符串mrd2cyou147852369,由于GetKey返回是解密后的Assembly数据,故这里推测int应是加密原始数据的指针,size则是原始加密数据的大小
基于上面,下面开始编写解密程序,由于so用的是x86版本,因此可直接将代码拷贝出来并进行调用;EnDecrypt函数共有4个CALL调用:_x86_get_pc_thunk_bx、strlen、malloc、swapints,其中swapints代码位置刚紧跟EnDecrypt,因此无需处理(因为相对地址不变),_x86_get_pc_thunk_bx直接nop去掉,strlen、malloc用相应函数链接(必须为cdecl)即可
以下是Delphi核心解密代码:
var DecCode: array[0..585] of byte = ( $55, $89, $E5, $53, $8D, $A4, $24, $CC, $F7, $FF, $FF, $E8, $69, $38, $D9, $FF, $81, $C3, $58, $81, $10, $00, $C7, $45, $EC, $00, $00, $00, $00, $C7, $45, $E8, $00, $00, $00, $00, $8B, $45, $10, $89, $04, $24, $E8, $F9, $28, $D9, $FF, $89, $45, $E4, $C7, $45, $F4, $00, $00, $00, $00, $EB, $36, $8B, $45, $F4, $89, $C2, $C1, $FA, $1F, $F7, $7D, $E4, $89, $D0, $89, $C2, $8B, $45, $10, $8D, $04, $02, $0F, $B6, $00, $0F, $BE, $D0, $8B, $45, $F4, $89, $94, $85, $DC, $F7, $FF, $FF, $8B, $45, $F4, $8B, $55, $F4, $89, $94, $85, $DC, $FB, $FF, $FF, $83, $45, $F4, $01, $81, $7D, $F4, $FF, $00, $00, $00, $7E, $C1, $C7, $45, $F4, $00, $00, $00, $00, $C7, $45, $F0, $00, $00, $00, $00, $EB, $4F, $8B, $45, $F4, $8B, $94, $85, $DC, $FB, $FF, $FF, $8B, $45, $F0, $01, $C2, $8B, $45, $F4, $8B, $84, $85, $DC, $F7, $FF, $FF, $01, $C2, $89, $D0, $C1, $F8, $1F, $C1, $E8, $18, $01, $C2, $0F, $B6, $D2, $29, $C2, $89, $D0, $89, $45, $F0, $8B, $45, $F0, $89, $44, $24, $08, $8B, $45, $F4, $89, $44, $24, $04, $8D, $85, $DC, $FB, $FF, $FF, $89, $04, $24, $E8, $EB, $00, $00, $00, $83, $45, $F4, $01, $81, $7D, $F4, $FF, $00, $00, $00, $7E, $A8, $8B, $45, $0C, $89, $04, $24, $E8, $6B, $29, $D9, $FF, $89, $45, $E0, $C7, $45, $F4, $00, $00, $00, $00, $E9, $AB, $00, $00, $00, $8B, $45, $EC, $89, $C2, $83, $C2, $01, $89, $D0, $C1, $F8, $1F, $C1, $E8, $18, $01, $C2, $0F, $B6, $D2, $29, $C2, $89, $D0, $89, $45, $EC, $8B, $45, $EC, $8B, $94, $85, $DC, $FB, $FF, $FF, $8B, $45, $E8, $01, $C2, $89, $D0, $C1, $F8, $1F, $C1, $E8, $18, $01, $C2, $0F, $B6, $D2, $29, $C2, $89, $D0, $89, $45, $E8, $8B, $45, $E8, $89, $44, $24, $08, $8B, $45, $EC, $89, $44, $24, $04, $8D, $85, $DC, $FB, $FF, $FF, $89, $04, $24, $E8, $69, $00, $00, $00, $8B, $45, $EC, $8B, $94, $85, $DC, $FB, $FF, $FF, $8B, $45, $E8, $8B, $84, $85, $DC, $FB, $FF, $FF, $01, $C2, $89, $D0, $C1, $F8, $1F, $C1, $E8, $18, $01, $C2, $0F, $B6, $D2, $29, $C2, $8D, $02, $8B, $84, $85, $DC, $FB, $FF, $FF, $89, $45, $DC, $8B, $55, $F4, $8B, $45, $E0, $01, $C2, $8B, $4D, $F4, $8B, $45, $08, $8D, $04, $01, $0F, $B6, $08, $8B, $45, $DC, $31, $C8, $88, $02, $83, $45, $F4, $01, $8B, $45, $F4, $3B, $45, $0C, $0F, $8C, $49, $FF, $FF, $FF, $8B, $45, $E0, $8D, $A4, $24, $34, $08, $00, $00, $5B, $5D, $C3, $55, $8D, $2C, $24, $8D, $64, $24, $F0, $8B, $45, $0C, $89, $C2, $C1, $E2, $02, $8B, $45, $08, $8D, $04, $02, $8B, $00, $89, $45, $FC, $8B, $45, $0C, $89, $C2, $C1, $E2, $02, $8B, $45, $08, $01, $C2, $8B, $45, $10, $89, $C1, $C1, $E1, $02, $8B, $45, $08, $8D, $04, $01, $8B, $00, $89, $02, $8B, $45, $10, $89, $C2, $C1, $E2, $02, $8B, $45, $08, $01, $C2, $8B, $45, $FC, $89, $02, $C9, $C3, $55, $89, $E5, $53, $8D, $64, $24, $DC, $E8, $5E, $36, $D9, $FF, $81, $C3, $4D, $7F, $10, $00, $8D, $83, $54, $F7, $F3, $FF, $89, $45, $F4, $8B, $45, $0C, $8B, $55, $F4, $89, $54, $24, $08, $89, $44, $24, $04, $8B, $45, $08, $89, $04, $24, $E8, $BD, $FD, $FF, $FF, $8D, $64, $24, $24, $5B, $5D, $C3 ); function myStrLen(szData: PChar): DWORD; cdecl; begin result := StrLen(szData); end; function myMalloc(dwSize: DWORD): DWORD; cdecl; begin result := DWORD(VirtualAlloc(nil, dwSize, MEM_COMMIT, PAGE_READWRITE)); end; var pData, decData : Pointer; fsStream : TFileStream; pCode : Pointer; dwLen : DWORD; decFunc : function(pData: Pointer; dwSize: DWORD; szKey: PChar): Pointer; cdecl; begin pCode := VirtualAlloc(nil, $1C0, MEM_COMMIT, PAGE_EXECUTE_READWRITE); FillChar((@DecCode[$B])^, 5, $90); DWORD((@DecCode[$2B])^) := DWORD(@myStrLen) - (DWORD(pCode) + $2F); DWORD((@DecCode[$E9])^) := DWORD(@myMalloc) - (DWORD(pCode) + $ED); CopyMemory(pCode, @DecCode[0], $24A); @decFunc := pCode; fsStream := TFileStream.Create('H:\Assembly-CSharp.dll', fmOpenRead); dwLen := fsStream.Size; GetMem(pData, dwLen); fsStream.ReadBuffer(pData^, dwLen); fsStream.Free; decData := decFunc(pData, dwLen, 'mrd2cyou147852369'); fsStream := TFileStream.Create('H:\Assembly-CSharp.decrypt.dll', fmCreate); fsStream.WriteBuffer(decData^, dwLen); fsStream.Free; end;
用Reflector反编译《仙剑奇侠传6》的Assembly-CSharp.dll可以看到有一个类:SoftStar.Pal6.Console,即仙剑6的控制台,这个控制台功能强大,可以做非常非常多的事,可以算是官方作弊器了
控制台是否开启由一个被写死的变量showConsole决定,默认为关闭状态(见图)
如需开启控制台,就必须将showConsole设为true,由于目前手里游戏版本不太齐全,因此就没有单独做工具,这里单独发一下开启仙剑6控制台的方法:
1、用WinHEX打开Pal6_Data\Managed\Assembly-CSharp.dll
2、打开16进制搜索(搜索->查找16进制数值),通配符填写FF,搜索1680FFFFFFFF1F0F
3、将16改为17,然后保存即可生效;如果需关闭控制台,则将17改回16即可(关闭控制台在第二步搜索也需要相应的搜索1780FFFFFFFF1F0F)
【简介】应求制作,该工具支持将一个文件夹打包为《仙剑5》《仙剑5前传》支持的PKG文件。
【下载地址】点此下载
【注意事项】
1、封包文件压缩与否是由游戏程序决定,不是由PKG决定,因此请务必保持压缩选项与原PKG包一致(是否压缩可以用PKGExtractor查看)
2、除了UI.pkg的文件类型为6,其余PKG文件类型均为1
3、游戏脚本script.pkg中文件只能为DFA加密文件,放入未加密文件则无法读取,另PKGExtractor2.5.2以前版本有解压BUG,解压后重新封包也无法读取,2.5.3版已修复此问题
【简介】《仙剑奇侠传6》内Pal6_Data下部分文件(如Property文件夹内文件)被Sony DFA保护加密,这里提供其中一部分解密后的文件(可用于MOD开发) PS:我就搞不懂这个DFA加密有什么鸟用,侠客风云传还加密一大堆,事实上解密这些文件只需要几秒钟,就算要破解游戏也不需要破解这个DFA加密
【下载地址】
V1.03全部文件(点击下载)
V1.04更新文件(点击下载)
V1.06更新文件(点击下载)
V1.08更新文件(点击下载)
V1.10更新文件(点击下载)
【文件列表】
V1.10更新文件:
Pal6_Data\Data\Mission Pal6_Data\Data\Property\Character.dat Pal6_Data\Data\Property\Fight.dat.0 Pal6_Data\Data\Property\Fight.dat.1 Pal6_Data\Data\Property\HPMPDP.dat.0 Pal6_Data\Data\Property\HPMPDP.dat.1 Pal6_Data\Data\Property\Monster.dat Pal6_Data\Data\Property\monsterGroupData.txt Pal6_Data\Data\Property\RanFangContainer.dat Pal6_Data\Data\Property\skillData.txt 最近较忙更新晚了,不好意思~
V1.08更新文件:
Pal6_Data\Data\Mission Pal6_Data\Data\Property\Character.dat Pal6_Data\Data\Property\Fight.dat.0 Pal6_Data\Data\Property\Fight.dat.1 Pal6_Data\Data\Property\Fight.dat.2 Pal6_Data\Data\Property\HPMPDP.dat.0 Pal6_Data\Data\Property\HPMPDP.dat.1 Pal6_Data\Data\Property\HPMPDP.dat.2 Pal6_Data\Data\Property\Mission Pal6_Data\Data\Property\Monster.dat Pal6_Data\Data\Property\monsterGroupData.txt Pal6_Data\Data\Property\skillData.txt Pal6_Data\Data\Property\SocialNPC.dat 注:V1.08新版battlefield.txt文件编码由Unicode转为ASCII,内容无变化
【简介】《侠客风云传》数据文件读取机制与仙剑5系列相同,即实体文件存在时优先读取实体文件而不读取封包里的文件,因此将提取出来的实体文件放入相应位置即可实现MOD效果
【注意事项】
1、千万不能转换文件编码,否则将导致游戏黑屏!
2、请在游戏根目录进行解压,解压后应该会在wuxia_Data\Config\Textfiles\释放684个txt文件,没有则说明解压位置不正确,修改这些txt文件就可以实现MOD效果
3、自1.0.2.2版开始Mod目录更换为:”Mods/”+GameGlobal.m_strVersion+”/Config/TextFiles/”+fileName+”.txt”
【下载地址】
点击下载(1.0.2.2版)
点击下载(1.0.2.1版)
点击下载(1.0.1.7版)
点击下载(1.0.1.4版)
点击下载(1.0.1.3版)
点击下载(1.0.1.7版解密后的pk文件-TextFiles_chs.pk、EffectText.pk)
【效果截图】
【简介】本工具支持《仙剑奇侠传6》剧情对白文字查看与修改。
注意事项:
1、《仙剑奇侠传6》剧情对白数据文件位于Pal6_Data\Data\Langue\0文件夹中(简体版)
2、若程序无法运行,请安装.NET Framework 4.0(下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=17718)
【下载地址】点击下载
【简介】DBFS是《轩辕剑陆》以及《穹之扉》用于存储对话文本、物品数据、战斗数据等信息的文件,存放于游戏目录下DBF文件夹中。本工具支持打开和编辑修改这些DBFS文件。
【下载地址】点此下载
V1.4.0更新:更新支持《穹之扉》V1.01版本之后的新版DBFS文件;
V1.3.0更新:U码转换优化;
V1.2.0更新:修复处理字符串数组的BUG;修复搜索字符串时可能假死的BUG;
V1.1.0更新:修复一处可能导致游戏出错的BUG;添加文件拖入打开功能;