对《神都夜行录》的解包研究学习

道锋潜鳞
2020-11-08 / 1 评论 / 199 阅读 / 正在检测是否收录...

《神都夜行录》是由网易游戏制作发行的一款国风妖怪收集RPG手游。游戏的整体故事发生在大唐年间,神都盛世天下生平、魑魅魍魉百妖横行,玩家扮演的降妖师会历经各种冒险,学习降妖之术,解决各类神秘可疑的妖怪作乱事件

一、软件准备

1.PC端游戏客户端
2.quickbms
3.RMAViewer
4.IqeBrowser
5.Noesis
6.3dsmax

网盘下载:https://pan.baidu.com/s/1jLoyZBfGlDnxGxTHJFdX7g
7mnf

流程:

*.npk -quickbms-> *.dat -RMAViewer-> *.iqe -IqeBrowser-> *.iqm -Noesis-> *.fbx -3dmax-> *.pmd -PmxEditor-> *.pmx

二、资源定位

163家的游戏,安装包都是npk封装、更新包嘛,,,搞不懂。

真够大的。。。

6个资源文件在 *\Netease\yxl 下,目标就是...

够多的。。。

三、准备解包

先把几个资源文件复制一份单独操作。。。

还是上winhex看看目标压缩制式

NXPK? 不是EXPK就好(没研究EXPK)

用quickbms和官方脚本 nxpk.bms

# NXPK npk (script 0.3.8)
#   Demon Seals HD and others
# script for QuickBMS http://quickbms.aluigi.org

get EXT extension

math NAMES = -1
math EXISTS = 0

math NAMES_METHOD = 0

/*
# this format is totally useless because it's only a sequence of integers
    string TMP p "%s_hash" EXT
    open FDDE TMP 1 EXISTS
if EXISTS == 0
    string TMP p "%s.hash" EXT
    open FDDE TMP 1 EXISTS
endif
*/
if EXISTS == 0
    open FDDE "hash" 1 EXISTS
endif
if EXISTS == 0
    string TMP p "%s.info" EXT
    open FDDE TMP 1 EXISTS
endif

if EXISTS != 0

    comtype zlib_noerror
    get TMP1 byte 1
    get TMP2 byte 1
    if TMP1 == 0x1f && TMP2 == 0x8b
        comtype gzip
    endif

    get SIZE asize 1
    clog MEMORY_FILE 0 SIZE SIZE 1
    get SIZE asize MEMORY_FILE
    for i = 0
        savepos TMP MEMORY_FILE
        if TMP >= SIZE
            break
        endif
        get TMP line MEMORY_FILE
        getvarchr TMP0 TMP 0
        if NAMES >= 0
            if TMP0 == 0x53 || TMP0 == 0x73 # "S" and "sS"
                if TMP0 == 0x53     # "S'"
                    string TMP << 2
                else
                    string TMP << 3
                endif
                string TMP - 1
                if i & 1
                    strlen TMPSZ TMP
                    if TMPSZ != 32 || TMP & \
                        string TMP x TMP
                        string TMP b TMP
                        putvarchr TMP 32 0
                    endif
                    string TMP u TMP
                    string TMP p "_%s" TMP  # LAME BUGFIX FOR QUICKBMS!!!
                    putarray 10 NAMES TMP
                    math NAMES + 1
                else
                    putarray 11 NAMES TMP
                endif
                math i + 1
            endif
        else
            if TMP0 == 'a'
                math NAMES = 0  # skip the first string
            endif
        endif
    next

else

    string TMP p "%s.map" EXT
    open FDDE TMP 1 EXISTS
    if EXISTS != 0
        math NAMES_METHOD = 1
        get MAP_SIZE asize 1
        for OFFSET = 0 != MAP_SIZE
            get TMP line 1
            string ELEMENTS S TMP NAME NAME_CRC ZSIZE ZCRC SIZE CRC OFFSET
            putarray 10 NAMES NAME_CRC
            putarray 11 NAMES NAME
            math NAMES + 1
            savepos OFFSET 1
        next
    endif

endif

/*
# debug
for x = 0 < NAMES
    getarray HASH 10 x
    getarray NAME 11 x
    print "%HASH% %NAME%"
next x
*/

set KEY string ""
for x = 0 < 0x100
    xmath TMP "x - 2"
    putvarchr KEY x TMP
next x

idstring "NXPK"
get FILES long
get VER1 long
get VER2 long
get VER3 long
math MODE = 0
if VER1 >= 1 && VER3 > 1
    math MODE = 1
endif
math INFO_SIZE = 0x1c
if MODE != 0
    math INFO_SIZE = 0x28
endif
get OFFSET long

# if I used this work-around it means it was necessary in a sample, don't know what sample...
get NXPK_SIZE asize
if OFFSET u> NXPK_SIZE
    xmath OFFSET "NXPK_SIZE - (FILES * INFO_SIZE)"
endif

goto OFFSET
for i = 0 < FILES
    get NAME_CRC long
    get OFFSET long
    get ZSIZE long
    get SIZE long
    get ZCRC long
    get CRC long
    if MODE != 0
        get DUMMY long
        get DUMMY long
        get FLAGS long
        get DUMMY long
    else
        get FLAGS long
    endif
    xmath ZFLAGS "FLAGS & 0xffff"
    xmath FLAGS  "FLAGS >> 16"
    if ZFLAGS == 2
        comtype lz4
    else    # 0
        comtype zlib
    endif

    set NAME string ""
    if NAMES > 0
        if NAMES_METHOD == 0
            encryption md5 ""
            log MEMORY_FILE OFFSET ZSIZE
            encryption "" ""
            string QUICKBMS_HEXHASH p "_%s" QUICKBMS_HEXHASH  # LAME BUGFIX FOR QUICKBMS!!!
        else
            math QUICKBMS_HEXHASH = NAME_CRC
        endif
        for x = 0 < NAMES
            getarray TMP 10 x
            if TMP == QUICKBMS_HEXHASH
                getarray NAME 11 x
                putarray 10 x ""
                math x = NAMES # break
            endif
        next x
    endif

    math FILENUM = 0
    if FLAGS & 1
        math TMP = 0x80
        if TMP > ZSIZE
            math TMP = ZSIZE
        endif
        encryption xor KEY "" 0 TMP
        log MEMORY_FILE OFFSET TMP
        encryption "" ""
        math OFFSET + TMP
        xmath TMP "ZSIZE - TMP"
        append
        log MEMORY_FILE OFFSET TMP
        append
        math OFFSET = 0
        math FILENUM = -1
    endif
    if SIZE == ZSIZE
        log NAME OFFSET SIZE FILENUM
    else
        clog NAME OFFSET ZSIZE SIZE FILENUM
    endif

next i    

启动quickbms.exe 然后选择nxpk.bms作为payload,然后再选择要解的文件和保存目录

然后自动就开始解了

除去头部偏移字节,解包进度到99%,解包已经完成,获得12661个文件

因为数据量比较大,这里仅对res1.npk拆解讲解。

四、文件说明

解包出来的文件有好几种类型,主要有如下几种

既然主要还是研究模型,那么打开RMAViewer File》Open Folder 载入我们的res1文件夹

选择列表内的文件可以进行浏览,上下键控制选择焦点,滚轮或QE控制远近,WSAD键控制视角,左键按住旋转模型

比如。。。

这里以茨木为例

选择Save IQE导出有骨骼的模型,然后在res1文件夹中筛选出iqe后缀

当然Save OBJ也是可以的。只不过就只有模型了。比如:

如果导出的iqe有问题或为了保险,可通过IQEFix.exe进行一次修复操作,直接将文件拉进exe即可

五、格式转换

iqe:以文本格式 存储的可带骨骼带贴图模型文件 
iqm:以二进制 存储的可带骨骼带贴图模型文件 
区别:二进制比文本格式更为通用,能被大多数模型软件读取,且压缩率更高体积更小。

启动IqeBrowser,吧我们的模型导入

切记目录必须为纯英文,否则文件可能打不开

选中要转换的模型 Ctrl+S保存 选择【*.iqm】

启动Noesis将刚刚转换的iqm导入,转换为fbx文件

贴图和模型UV方向一致,则可以直接贴材质,不一致贴上会错乱。

六、查找贴图

启动3dsmax 导入fbx

查找对应的dds技巧是将res1与res2中的所有.dds整合到新建的文件夹

选择浏览视图为详细信息,以文件大小排序,剪切所有文件大小为1366KB的高清贴图

在3dmax中展UV图形,以此为根据,寻找目标dds文件

导入

七、总结

该文,该教材仅仅用作个人学习研究使用,请勿利用教材内容,进行有损目标软件公司利益的事情(包括但不限于版权纠纷,非法入侵纠纷)。本教程慨不负责

bilibili同步连接 https://www.bilibili.com/read/cv8274072

0

评论 (1)

取消
  1. 头像
    御坂美琴7758
    Windows 10 · Google Chrome

    网易gis动画方面有头绪吗

    回复