Injustice 2 PC

Extraction and unpacking of game archives and compression, encryption, obfuscation, decoding of unknown files
george_sears
Posts: 13
Joined: Fri Jul 28, 2017 11:03 pm

Injustice 2 PC

Post by george_sears »

Game's beta is out now.
Files has strange extensions like .xxx and .tfc
Umodel fails to see through encryption probably.
Uploaded some samples, 619 MB.
I'm not sure if i have to drop .exe too

https://mega.nz/#!moJFWALB!wESFpvtcSezM9XYbrnaQ1NCCpAWa8dCbn1ps68tPC9Q

I hope that we could push through it while beta is up, client must include all dlc characters, cus i saw their files.

Here's executable...
https://mega.nz/#!m5wQyLAI!NCy5NTpiSltFllfDT39qcgBSfiRQ5FVoAI7vXyj7yL8
aluigi
Site Admin
Posts: 12984
Joined: Wed Jul 30, 2014 9:32 pm

Re: Injustice 2 PC

Post by aluigi »

That's stuff for Gildor's umodel
tyrannojones
Posts: 30
Joined: Wed Aug 03, 2016 10:01 am

Re: Injustice 2 PC

Post by tyrannojones »

It is, but we need to find someone to break through the denuvo encryption
godskin
Posts: 192
Joined: Sun Oct 04, 2015 2:27 am

Re: Injustice 2 PC

Post by godskin »

tyrannojones wrote:It is, but we need to find someone to break through the denuvo encryption


use mobile version file it same !!!
toxic72
Posts: 26
Joined: Sun Mar 20, 2016 10:25 pm

Re: Injustice 2 PC

Post by toxic72 »

It's oodle, relay this to Gildor: https://github.com/dtzxporter/Siren
UncleFestor
Posts: 33
Joined: Fri Dec 11, 2015 3:38 pm

Re: Injustice 2 PC

Post by UncleFestor »

george_sears wrote:Game's beta is out now.
Files has strange extensions like .xxx and .tfc
Umodel fails to see through encryption probably.
Uploaded some samples, 619 MB.
I'm not sure if i have to drop .exe too

https://mega.nz/#!moJFWALB!wESFpvtcSezM9XYbrnaQ1NCCpAWa8dCbn1ps68tPC9Q

I hope that we could push through it while beta is up, client must include all dlc characters, cus i saw their files.

Here's executable...
https://mega.nz/#!m5wQyLAI!NCy5NTpiSltFllfDT39qcgBSfiRQ5FVoAI7vXyj7yL8


Those are normal UE extensions. NRS uses xxx packaging for all their recent games, MK9, Injustice, MKX/L.

The xxx files will contain the Mesh, animations, tables, Textures Etc., and they're structured pretty much the same way a .upk/pak file is. .tfc are Texture File Checker files. And the MKscriptbinary files, which I think this game also uses, will have the Fight Scripts & tweakvars.

I'm not certain how much of a factor Denuvo is in the encryption of the xxx files. I can reasonably presume, based off of the previous games, that they're all compressed.
MrDude007
Posts: 2
Joined: Sat Nov 11, 2017 12:58 am

Re: Injustice 2 PC

Post by MrDude007 »

I think I figured this out. I'm not very good at explaining but...
The compressed parts of the archive are in chunks with sub-chunks in them. The amount of chunks is defined @0x64 and the true size of the header is @0x68 which is the start of a table for each chunk . The table is 0x18 long and contains the total file size until this chunk (QWord), the uncompressed size of a chunk (Word), the offset of the chunk (QWord) and the compressed size of the chunk (Word). The next 0x18 bytes are padding until the string count of what I assume is the true name of the package. Basically the real header is everything but the table.

For each chunk there is the familiar UnrealMagic (QWord), something (QWord), the size of the chunk (QWord) and the uncompressed size of the chunk (QWord). Where it gets dicey is there can be a couple of "sub-chunks" in there (math can figure out how many). Each sub-chunk has a size (QWord) and uncompressed size (QWord).

I wrote a (terrible) python script to extract these chunks and my first BMS script to un-compress them. I then reassembled HQ_MSTR.xxx manually (I don't know if I can share). I'm sure someone whos better than me can write a better BMS script to do this.

Code: Select all

import operator
import array
import string
import sys
import os
import zlib
import struct

def Main():
    dir_path = os.path.dirname(os.path.realpath(__file__))
    print(dir_path+"\_EXT")
    File = "Init"
    f = open(File + ".xxx", "rb")
    Top = f.read(100)
    BlockCount1 = f.read(4)
    BlockCount = struct.unpack('I', BlockCount1)[0]
    BlockStuff = []

   
    for X in range(0, BlockCount):
        FileSizeBegin = struct.unpack('Q', f.read(8))[0]
        BlockRealSize = struct.unpack('I', f.read(4))[0]
        BlockStart = struct.unpack('Q', f.read(8))[0]
        BlockSize = struct.unpack('I', f.read(4))[0]
        BlockStuff.append([FileSizeBegin, BlockRealSize, BlockStart, BlockSize])
    print(BlockStuff, f.tell())
    Blank = f.read(24)
    PackageChar = f.read(4)
    PacChar = struct.unpack('I', PackageChar)[0]
    PackageName = f.read(PacChar)
    PackageName1 = PackageName.decode("ASCII").rstrip("\0")
    if not os.path.exists(dir_path+"\\_EXT\\"+str(PackageName1)):
        os.makedirs(dir_path+"\\_EXT\\"+str(PackageName1))

    p = open(dir_path+"\\_EXT\\"+str(PackageName1)+"\\"+File+"_Top", "wb")
    p.write(Top)
    p.write(BlockCount1)
    p.write(Blank)
    p.write(PackageChar)
    p.write(PackageName)
    p.close()
    for T in range(0, BlockCount):
        Q = BlockStuff[T]
        f.seek(Q[2], 0)
        Block = f.read(Q[3])
        w = open(dir_path+"\\_EXT\\"+str(PackageName1)+"\\"+File+"_%03i"%T+".encBlock", "wb")
        w.write(Block)
    print("Done")
    w.close()
   
Main()


Code: Select all

comtype oodle

get EXT extension
if EXT == "encBlock"
   get NAME BASENAME
   get ZSIZE long
   get SIZE ASIZE
   math SIZE - 4
   set OFFSET 4
   clog NAME OFFSET SIZE ZSIZE
aluigi
Site Admin
Posts: 12984
Joined: Wed Jul 30, 2014 9:32 pm

Re: Injustice 2 PC

Post by aluigi »

Regarding the quickbms script I guess you mean something like the following:

Code: Select all

comtype oodle
get EXT extension
if EXT == "encBlock"
   get NAME basename
   get SIZE long
   savepos OFFSET
   get ZSIZE asize
   math ZSIZE - OFFSET
   clog NAME OFFSET ZSIZE SIZE
endif
Hope it helps
MrDude007
Posts: 2
Joined: Sat Nov 11, 2017 12:58 am

Re: Injustice 2 PC

Post by MrDude007 »

Actually I needed something like this. I tested this a few times. It will spit out a fixed header and un-compressed data so you still need to mash the 2 together. I could probably rewrite it to spit out one complete file but... This won't make the files comparable with umodel but it should help someone else who knows unreal stuff to make their own extractor.

Code: Select all

comtype oodle
get EXT extension
if EXT == "xxx"
   log MEMORY_FILE 0 0
   log MEMORY_FILE 0 0x64
   append
   getdstring TOP 0x64
   get NAME BASENAME
   string NAME + ".header"
   log MEMORY_FILE 0x64 0x04
   get COUNT long
   
   savepos RET
   set SKIP 24
   math SKIP * COUNT
   print %SKIP%
   goto SKIP 0 SEEK_CUR
   savepos TOPCUR
   log MEMORY_FILE TOPCUR 0x18
   getdstring TEMP 0x18
   savepos TOPCUR
   log MEMORY_FILE TOPCUR 0x04
   get CCOUNT long
   savepos TOPCUR
   log MEMORY_FILE TOPCUR CCOUNT
   getdstring PACKAGENAME CCOUNT
   set Temp 0x84
   math Temp + CCOUNT
   log NAME 0 Temp MEMORY_FILE
   set Temp 0x84
   
   goto RET
   append
   get NAME BASENAME
   string NAME + ".bin"
   for i = 0 < COUNT
      print %COUNT%
      print %i%
      goto RET
      get OGSIZE longlong
      get ADDSIZE long
      get OFFSET longlong
      get SIZE long
      savepos RET
      
      goto OFFSET
      getdstring TMP 0x10
      get BSIZE longlong
      get RSIZE longlong
      set TMP1 BSIZE
      set TMP2 SIZE
      math TMP2 - TMP1
      math TMP2 - 32
      savepos TMP3
      math TMP3 + TMP2
      math TMP2 / 16
      set COUNT2 TMP2
      append
      for t = 0 < COUNT2
         get ZSIZE2 longlong
         get SIZE2 longlong
         savepos ret3
         goto TMP3
         clog NAME TMP3 ZSIZE2 SIZE2
         math TMP3 + ZSIZE2
         goto ret3
         next t
      append
      
      next i
      
zaramot
Posts: 51
Joined: Mon Sep 01, 2014 7:19 pm

Re: Injustice 2 PC

Post by zaramot »

Damn, I wasted some time yesterday to get uncompressed data out. And here's your script! Thousand time I told myself check zenhax firts lol What a great forum we all have people. If anyone will make similiar script to get files out, smaller files for easier work, we are all saved:)