PDA

View Full Version : [JX] Full source code VBNet - Unpack pak, Cần ae phát triển thêm



GameDev24
13-06-24, 03:51 PM
Như tiêu đề code
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>


'<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
Imports System
Imports System.Collections
Imports System.IO
Imports System.IO.Compression
Imports System.Linq.Expressions
Imports System.Runtime
Imports System.Text
Imports System.Text.RegularExpressions
Imports UclCompression

Module Program

Public br As BinaryReader
Public input As String

<Obsolete>
Sub Main(args As String())
If args.Count = 0 Then
Console.WriteLine("Tool UnPack - 2CongLC.vn :: 2024")
Else
input = args(0)
End If
Dim p As String = Nothing
If IO.File.Exists(input) Then

br = New BinaryReader(File.OpenRead(input))
Dim signature As String = New String(br.ReadChars(4)) ' Offset = 0, Length = 4
Dim count As Int32 = br.ReadInt32 ' Offset = 4, Length = 4
Dim index As Int32 = br.ReadInt32 ' Offset = 8, Length = 4
Dim data As Int32 = br.ReadInt32 ' Offset = 12, Length = 4
Dim crc32 As Int32 = br.ReadInt32 ' Offset = 16, Length = 4
Dim reserved As Byte() = br.ReadBytes(12) 'Offset = 20, Length = 12

Console.WriteLine("sig : {0}", signature)
Console.WriteLine("count : {0}", count)
Console.WriteLine("index : {0}", index)
Console.WriteLine("data : {0}", data)
Console.WriteLine("crc32 : {0}", crc32)

br.BaseStream.Seek(index, SeekOrigin.Begin)
Dim subfiles As New List(Of FileData)()
For i As Int32 = 0 To count - 1
subfiles.Add(New FileData)
Next

p = Path.GetDirectoryName(input) & "\" & Path.GetFileNameWithoutExtension(input)
Directory.CreateDirectory(p)

For Each fd As FileData In subfiles

Console.WriteLine("File ID : {0} - File Offset : {1} - File Size : {2} - IsCompress : {3}", fd.id, fd.offset, fd.size, fd.isCompressType)

br.BaseStream.Seek(fd.offset, SeekOrigin.Begin)
Dim buffer As Byte() = br.ReadBytes(fd.size)
Dim temp As Byte() = Nothing

' If fd.iscompressType = 1 Or fd.iscompressType = 32 Then
' Console.WriteLine("UnCompress Size : {0}", fd.compressSize)
' temp = Ucl.NRV2B_Decompress_8(buffer, fd.compressSize)
' Else
temp = buffer
' End If


Dim ext As String = GetExtension(buffer)

Using bw As New BinaryWriter(File.Create(p & "//" & fd.id & ext))
bw.Write(buffer)
End Using


Next

Console.WriteLine("unpack done!!!")
End If
Console.ReadLine()
End Sub

Class FileData
Public id As Int32 'Length = 4
Public offset As Int32 'Length = 4
Public size As Int32 'Length = 4
Public compressSize As Int32 'Length = 3
Public iscompressType As Byte 'Length = 1

Public Sub New()
id = br.ReadInt32
offset = br.ReadInt32
size = br.ReadInt32
Dim len As UInt32 = 0
len = len Or CUInt(br.ReadByte)
len = len Or CUInt(br.ReadByte) << 8
len = len Or CUInt(br.ReadByte) << 16
compressSize = len
iscompressType = br.ReadByte
End Sub
End Class


Public Function Hash(ByVal fileName As String) As UInt32
Dim id As UInt32 = 0
Dim index As Int32 = 0
For Each c As Char In fileName
If (AscW(c) >= AscW("A")) AndAlso (AscW(c) <= AscW("Z")) Then
id= (id + (++index) * (AscW(c) + AscW("a") - AscW("A"))) Mod &H8000000BUI * &HFFFFFFEF
Else
id = (id + (++index) * AscW(c)) Mod &H8000000BUI * &HFFFFFFEF
End If
Next
Return (id Xor &H12345678)
End Function

End Module


Đã có thư viện ucl compression, nhưng ko tìm ra được đoạn uncompress size . Mong các cao nhân hoàn thiện giúp .

SaoThaiBinh72
13-06-24, 11:17 PM
cái đoạn ' If fd.iscompressType = 1 Or fd.iscompressType = 32 Then ' Console.WriteLine("UnCompress Size : {0}", fd.compressSize) ' temp = Ucl.NRV2B_Decompress_8(buffer, fd.compressSize) ' Else temp = buffer ' End Iflà bạn tự thêm ' vào hay chủ source họ thêm vào thế?

GameDev24
14-06-24, 03:12 PM
cái đoạn ' If fd.iscompressType = 1 Or fd.iscompressType = 32 Then ' Console.WriteLine("UnCompress Size : {0}", fd.compressSize) ' temp = Ucl.NRV2B_Decompress_8(buffer, fd.compressSize) ' Else temp = buffer ' End Iflà bạn tự thêm ' vào hay chủ source họ thêm vào thế?

Mình đọc trên source và code như vậy.
Cái khó là ko tìm ra unzize cho ucl bên ko giải nén được

SaoThaiBinh72
15-06-24, 10:55 AM
Thử sửa thành đoạn này xem If fd.isCompressType = 1 Or fd.isCompressType = 32 Then Dim uncompressSize As Integer = fd.size Console.WriteLine("UnCompress Size : {0}", uncompressSize) temp = Ucl.NRV2B_Decompress_8(buffer, uncompressSize) Else temp = buffer End If

--- Chế độ gộp bài viết ---

Cái thằng clb giờ sao nó ngu vậy không biết, cái khung trả lời mất hết bbcode, viết xuống dòng thì cứ dính vào với nhau. Cải lùi thật.

dragonwall
22-06-24, 03:37 PM
8-> 8-> 8-> 8-> 8-> 8->

nhatminh3110
22-06-24, 04:00 PM
Unpack source C++


{
if (path.length() < 5)
{
printf("Unpack file pak");
return -1;
}
if (path.substr(path.length() - 4, 4) != ".pak")
{
printf("Unpack file pak");
return -1;
}
FILE* _pBinFile = fopen(path.c_str(), "rb");
if (!_pBinFile) {
return -1;
}
string _FileListBuff;
RWFile::LoadFile("list.txt", _FileListBuff);

char currentDir[MAX_PATH];
GetCurrentDirectory(MAX_PATH, currentDir);
string unpackDir = string(currentDir) + "\\unpack\\";

::MakeSureDirectoryPathExists(unpackDir.c_str());
fseek(_pBinFile, 0, SEEK_END);
UINT _FileSize = ftell(_pBinFile);
fseek(_pBinFile, 0, SEEK_SET);
if (_FileSize < sizeof(XPackFileHeader)) {
fclose(_pBinFile);
return -1;
}
XPackFileHeader Header;
if (fread((void*)&Header, sizeof(Header), 1, _pBinFile) != 1) {
fclose(_pBinFile);
return -1;
}
if (*(int*)(&Header.cSignature) != XPACKFILE_SIGNATURE_FLAG ||
Header.uCount == 0 ||
Header.uIndexTableOffset < sizeof(XPackFileHeader) ||
Header.uIndexTableOffset >= _FileSize ||
Header.uDataOffset < sizeof(XPackFileHeader) ||
Header.uDataOffset >= _FileSize)
{
fclose(_pBinFile);
return -1;
}
vector<XPackIndexInfo> kIndexs(Header.uCount);
fseek(_pBinFile, Header.uIndexTableOffset, SEEK_SET);
if (ftell(_pBinFile) != Header.uIndexTableOffset) {
fclose(_pBinFile);
return -1;
}
if (fread((void*)&kIndexs[0], sizeof(XPackIndexInfo)*Header.uCount, 1, _pBinFile) != 1) {
fclose(_pBinFile);
return -1;
}

int count = (int)Header.uCount;
long lCompressType = TYPE_UCL;
unsigned int uSize = 0;
unsigned int uDestLength;
string _Buff;
string _RawBuff;
char fileName[MAX_PATH];
if (!_FileListBuff.empty())
{
int lineIdx = 1;
string line;
char* p = (char*)_FileListBuff.c_str();

}

GameDev24
25-06-24, 01:42 PM
Unpack source C++


{
if (path.length() < 5)
{
printf("Unpack file pak");
return -1;
}
if (path.substr(path.length() - 4, 4) != ".pak")
{
printf("Unpack file pak");
return -1;
}
FILE* _pBinFile = fopen(path.c_str(), "rb");
if (!_pBinFile) {
return -1;
}
string _FileListBuff;
RWFile::LoadFile("list.txt", _FileListBuff);

char currentDir[MAX_PATH];
GetCurrentDirectory(MAX_PATH, currentDir);
string unpackDir = string(currentDir) + "\\unpack\\";

::MakeSureDirectoryPathExists(unpackDir.c_str());
fseek(_pBinFile, 0, SEEK_END);
UINT _FileSize = ftell(_pBinFile);
fseek(_pBinFile, 0, SEEK_SET);
if (_FileSize < sizeof(XPackFileHeader)) {
fclose(_pBinFile);
return -1;
}
XPackFileHeader Header;
if (fread((void*)&Header, sizeof(Header), 1, _pBinFile) != 1) {
fclose(_pBinFile);
return -1;
}
if (*(int*)(&Header.cSignature) != XPACKFILE_SIGNATURE_FLAG ||
Header.uCount == 0 ||
Header.uIndexTableOffset < sizeof(XPackFileHeader) ||
Header.uIndexTableOffset >= _FileSize ||
Header.uDataOffset < sizeof(XPackFileHeader) ||
Header.uDataOffset >= _FileSize)
{
fclose(_pBinFile);
return -1;
}
vector<XPackIndexInfo> kIndexs(Header.uCount);
fseek(_pBinFile, Header.uIndexTableOffset, SEEK_SET);
if (ftell(_pBinFile) != Header.uIndexTableOffset) {
fclose(_pBinFile);
return -1;
}
if (fread((void*)&kIndexs[0], sizeof(XPackIndexInfo)*Header.uCount, 1, _pBinFile) != 1) {
fclose(_pBinFile);
return -1;
}

int count = (int)Header.uCount;
long lCompressType = TYPE_UCL;
unsigned int uSize = 0;
unsigned int uDestLength;
string _Buff;
string _RawBuff;
char fileName[MAX_PATH];
if (!_FileListBuff.empty())
{
int lineIdx = 1;
string line;
char* p = (char*)_FileListBuff.c_str();

}

Đoạn code vbnet xuất được danh sách file ra rồi. Cái id nó dùng hash để mã hóa tên với đường dẫn tệp tin.
Đang mắc ở đoạn lấy size để giải nén cho kiểu ucl compress.
Xem ở code cũ thì giải nén được ucl nó bảo lỗi ko giải nén được.
Đoạn c++ bạn gửi đầy đủ chứ kia là mấy dòng kiểm tra điều kiện chứ có phải code chính đâu