A9VG电玩部落论坛

 找回密码
 注册
搜索
查看: 12876|回复: 2

老头环pc版使用别人存档教程

[复制链接]
该用户已被禁言

精华
0
帖子
2837
威望
0 点
积分
3194 点
种子
457 点
注册时间
2019-4-5
最后登录
2024-11-17
 楼主| 发表于 2022-2-27 08:25  ·  黑龙江 | 显示全部楼层 |阅读模式
本帖最后由 Zestiva 于 2022-2-28 05:27 编辑

以下以正版存档转换到学习版为例,学习版存档目录C:\Users\用户名\AppData\Roaming\EldenRing\随机id

1 首先备份你的存档,备份完后删除所有存档新开始游戏,进游戏新建两个人物,退出游戏
2 用winhex打开你新建的ER0000.sl2存档,按alt+g输入19003b4回车,记下从0x19003b4开始的8个16进制数据,这就是你的账号,学习版是6606000001001001,关闭winhex
3 用winhex打开你下载的别人的ER0000.sl2存档,按alt+g输入19003b4回车,记下从0x19003b4开始的8个16进制数据,这是别人的账号,关闭winhex
4 进游戏选加载存档,在选择人物画面不要动,回到桌面,把下载的别人的存档覆盖进去替换
5 替换完后回到游戏,加载第一个人物,这时游戏会提示存档无法使用,不用管,删除你自己新建的第二个人物后返回到标题退出游戏,一定别删错了
6 用winhex重新打开打开你自己的ER0000.sl2存档,按ctrl+alt+x搜索步骤3记下的这8个16进制数据,把第一个找到的结果改成步骤2记下的你自己账号的8个16进制数据,学习版是6606000001001001,当然有人需要学习版存档转正版存档,原理一样,输入步骤2记下的自己的正版存档账号即可
7 按alt+g输入310回车,按alt+1,再按alt+g输入28030f回车,按alt+2,可以看到这两个地址之间的背景已经变蓝了
8 按ctrl+f2,选md5(128bit)回车,按clrl+c复制计算出的16个16进制数据
9 按alt+g输入300回车,按ctrl+b,选最后一项ascii hex,可以看到这行已经被替换成刚才计算出的16个16进制数据,按ctrl+s保存存档
10 ok,进游戏开玩吧

这游戏一共12个存档位,以上是1号位存档的改法,如果用来替换的存档是2号位,步骤5替换后删你自己存档第一个人,然后步骤6搜索出来的要改成你的账号的地址需要确定是在0x280310和0x50130f之间再改,步骤789里310改成280310,28030f改成50130f,300改280300计算,3号位以后的存档同理,总之就是先保存出和要替换的存档同样人数的新建存档,替换后删到只剩要替换的那个存档位再改账号计算校验,每个存档位相差0x28000
该用户已被禁言

精华
0
帖子
2837
威望
0 点
积分
3194 点
种子
457 点
注册时间
2019-4-5
最后登录
2024-11-17
 楼主| 发表于 2022-2-27 08:25  ·  黑龙江 | 显示全部楼层
破解版存档之间应该是可以不用计算校验直接用,我没试过,有条件的可以试试
该用户已被禁言

精华
0
帖子
2837
威望
0 点
积分
3194 点
种子
457 点
注册时间
2019-4-5
最后登录
2024-11-17
 楼主| 发表于 2022-2-27 11:16  ·  黑龙江 | 显示全部楼层
import hashlib
import os.path as path
import shutil

CHECKSUM_SIZE = 0x10  # bytes
RECORD_SIZE = 0x280000  # bytes
CHECKSUM_BASE = 0x00000300  # slot 0
RECORD_BASE = 0x00000310  # slot 0


def get_range(slot_index: int):
    """Calculate checksum and record ranges for certain slot.
    Args:
        slot_index (int): Index of slot. 0-based.
    Returns:
        tuple: (checksum_left, checksum_right, block_left, block_right). Left closed, right closed.
    """
    checksum_left = CHECKSUM_BASE + (CHECKSUM_SIZE + RECORD_SIZE) * slot_index
    checksum_right = checksum_left + CHECKSUM_SIZE - 1
    block_left = checksum_right + 1
    block_right = block_left + RECORD_SIZE - 1

    # [ for debug ]
    # print(
    #     list(map(hex,
    #              (checksum_left, checksum_right, block_left, block_right))))

    return (checksum_left, checksum_right, block_left, block_right)


def backup(sl2_path: str):
    """Backup sl2 file to the directory of sl2_path.
    Args:
        sl2_path (str): Path of ER sl2 save file.
    """
    backup_filename = path.basename(sl2_path) + '.fixbackup'
    backup_savepath = path.join(path.dirname(sl2_path), './', backup_filename)
    shutil.copyfile(sl2_path, backup_savepath)


def fix(sl2_path: str, slot_index: int):
    """Fix the corrupt save by re-calculating the checksum.
    Args:
        sl2_path (str): Path of ER sl2 save file.
        slot_index (int): Index of slot. 0-based.
    """

    (checksum_left, checksum_right, block_left,
     block_right) = get_range(slot_index)

    new_content = b''

    with open(sl2_path, 'rb+') as fp:
        # read range [start] -> [checksum]
        new_content = fp.read(checksum_left)

        # calculate new checksum
        fp.seek(block_left, 0)
        game_record = fp.read(block_right - block_left + 1)
        assert len(game_record) == RECORD_SIZE, 'Bad game save file. No enough game record.'
        new_checksum = hashlib.md5(game_record).digest()

        # concat new checksum
        new_content += new_checksum

        # concat the rest
        fp.seek(block_left, 0)
        new_content += fp.read()

        # overwrite the save
        fp.seek(0)
        fp.write(new_content)


def main(sl2_path: str, slot_index: int):
    # check input format
    assert len(sl2_path) > 0, 'Save file path not specified.'
    assert path.basename(sl2_path) == 'ER0000.sl2', 'Selected file is not ER0000.sl2.'
    assert slot_index >= 0, 'Invalid slot index.'
    assert slot_index <= 9, 'Invalid slot index.'

    # backup the save
    backup(sl2_path)
    print('The corrupt save has been backup with external name .fixbackup.')

    # fix the save
    print('Start fixing {} @ slot {}.'.format(sl2_path, slot_index))
    fix(sl2_path, slot_index)
    print('Fixing done successfully!')
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|A9VG电玩部落 川公网安备 51019002005286号

GMT+8, 2024-11-28 21:34 , Processed in 0.156707 second(s), 10 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部