Terraria的人物存档文件plr并不是直接可读的纯文本格式,它经过了AES加密。想手动修改里面的物品数据,核心步骤是先解密、再解析二进制结构、最后重新打包回去。
**第一步:定位存档与加密机制**
存档文件位于系统用户目录下的Documents\MyGames\Terraria\Players文件夹中,里面以角色名命名的.plr文件就是目标。
这个文件的加密方式并不复杂。经过逆向分析,它使用了AES-128-CBC算法进行加密,而解密所需的密钥是一个固定的字符串:h3y_gUyZ。这个密钥在游戏的早期版本中就被发现,并沿用至今。
**第二步:手动解密操作(C#代码实现)**
由于是手动操作,需要借助外部程序或自己编写一段简单的代码来执行解密。以下是一段基于C#的解密核心代码片段,它读取加密的plr文件,并使用固定密钥进行解密,输出一个未加密的二进制文件。
```csharp
staticvoiddecryptFile(stringinputFilestringoutputFile)
{
stringkey="h3y_gUyZ";
UnicodeEncodingunicodeEncoding=newUnicodeEncoding();
byte[]bytes=unicodeEncoding.GetBytes(key);
FileStreaminputFileStream=newFileStream(inputFileFileMode.Open);
RijndaelManagedrijndaelManaged=newRijndaelManaged();
CryptoStreamcryptoStream=newCryptoStream(inputFileStream
rijndaelManaged.CreateDecryptor(bytesbytes)CryptoStreamMode.Read);
FileStreamoutputFileStream=newFileStream(outputFileFileMode.Create);
intnum;
while((num=cryptoStream.ReadByte())!=-1)
{
outputFileStream.WriteByte((byte)num);
}
outputFileStream.Close();
cryptoStream.Close();
inputFileStream.Close();
}
```
执行完这段代码,会得到一个解密后的明文文件,之后就可以用十六进制编辑器(如010Editor、HxD)打开并分析了。
**第三步:解析明文二进制结构**
解密后的二进制文件采用兴序存储数据。文件头部包含了角色的基础信息,例如玩家名称、生命值(HP)和魔力值(MP)等。这些字段可以通过对比修改前后的文件差异来准确定位。
背包数据的起始位置在文件偏移量0x0105处。从该位置开始,每个物品占用10个字节的数据块。这10个字节的结构解析如下:
|字节偏移|长度|说明|
|:---|:---|:---|
|0-1(2字节)|2|物品ID,以兴序存储,代表具体的物品种类|
|2-3(2字节)|2|无意义数据或固定值|
|4-5(2字节)|2|物品数量,以兴序存储|
|6-7(2字节)|2|无意义数据或固定值|
|8(1字节)|1|物品修饰语(前缀),对应游戏内的“传奇”、“神级”等|
|9(1字节)|1|固定值,标识物品处于背包中|
举个例子,如果在一个物品槽位看到连续的字节序列:`8D130000010000005301`,那么它表示的含义是:物品ID为0x138D(即泰拉棱镜),数量为1,拥有“神话”前缀,并且固定在背包中。
**第四步:物品ID与修饰语对照**
修改时,最关键的一步是获取正确的物品ID和修饰语代码。物品ID是一个完整的列表,可以通过TerrariaWiki等官方资料站查询。常用的如“泰拉棱镜”是0x138D(十进制5005),“天顶剑”是0x2B3D(十进制11069)。
修饰语(前缀)的代码同样有对应关系,例如“传奇”对应数字53,“神级”对应数字52,“虚幻”对应数字50。在修改第8个字节时填入对应的数字即可。
**第一步:定位存档与加密机制**
存档文件位于系统用户目录下的Documents\MyGames\Terraria\Players文件夹中,里面以角色名命名的.plr文件就是目标。
这个文件的加密方式并不复杂。经过逆向分析,它使用了AES-128-CBC算法进行加密,而解密所需的密钥是一个固定的字符串:h3y_gUyZ。这个密钥在游戏的早期版本中就被发现,并沿用至今。
**第二步:手动解密操作(C#代码实现)**
由于是手动操作,需要借助外部程序或自己编写一段简单的代码来执行解密。以下是一段基于C#的解密核心代码片段,它读取加密的plr文件,并使用固定密钥进行解密,输出一个未加密的二进制文件。
```csharp
staticvoiddecryptFile(stringinputFilestringoutputFile)
{
stringkey="h3y_gUyZ";
UnicodeEncodingunicodeEncoding=newUnicodeEncoding();
byte[]bytes=unicodeEncoding.GetBytes(key);
FileStreaminputFileStream=newFileStream(inputFileFileMode.Open);
RijndaelManagedrijndaelManaged=newRijndaelManaged();
CryptoStreamcryptoStream=newCryptoStream(inputFileStream
rijndaelManaged.CreateDecryptor(bytesbytes)CryptoStreamMode.Read);
FileStreamoutputFileStream=newFileStream(outputFileFileMode.Create);
intnum;
while((num=cryptoStream.ReadByte())!=-1)
{
outputFileStream.WriteByte((byte)num);
}
outputFileStream.Close();
cryptoStream.Close();
inputFileStream.Close();
}
```
执行完这段代码,会得到一个解密后的明文文件,之后就可以用十六进制编辑器(如010Editor、HxD)打开并分析了。
**第三步:解析明文二进制结构**
解密后的二进制文件采用兴序存储数据。文件头部包含了角色的基础信息,例如玩家名称、生命值(HP)和魔力值(MP)等。这些字段可以通过对比修改前后的文件差异来准确定位。
背包数据的起始位置在文件偏移量0x0105处。从该位置开始,每个物品占用10个字节的数据块。这10个字节的结构解析如下:
|字节偏移|长度|说明|
|:---|:---|:---|
|0-1(2字节)|2|物品ID,以兴序存储,代表具体的物品种类|
|2-3(2字节)|2|无意义数据或固定值|
|4-5(2字节)|2|物品数量,以兴序存储|
|6-7(2字节)|2|无意义数据或固定值|
|8(1字节)|1|物品修饰语(前缀),对应游戏内的“传奇”、“神级”等|
|9(1字节)|1|固定值,标识物品处于背包中|
举个例子,如果在一个物品槽位看到连续的字节序列:`8D130000010000005301`,那么它表示的含义是:物品ID为0x138D(即泰拉棱镜),数量为1,拥有“神话”前缀,并且固定在背包中。
**第四步:物品ID与修饰语对照**
修改时,最关键的一步是获取正确的物品ID和修饰语代码。物品ID是一个完整的列表,可以通过TerrariaWiki等官方资料站查询。常用的如“泰拉棱镜”是0x138D(十进制5005),“天顶剑”是0x2B3D(十进制11069)。
修饰语(前缀)的代码同样有对应关系,例如“传奇”对应数字53,“神级”对应数字52,“虚幻”对应数字50。在修改第8个字节时填入对应的数字即可。

