HenryEx icon

MH4U Save Decoding QuickBMS

HenryEx | PRO | 09/10/15 10:48:26 PM UTC | 0 ⭐ | 2350 👁️ | Never ⏰ | []
text |

2.61 KB

|

None

|

0 👍

/

0 👎

# Monster Hunter 4 Ultimate
# Script to decrypt save file data
#
# Based on information from mhef by Seth VanHeulen
# https://github.com/svanheulen/mhef
#
# Written by HenryEx
#
# script for QuickBMS http://quickbms.aluigi.org
 ################################################
# Preparations
 print "Setup..."
 # set up virtual memory file for save data
  math TMP = 0x13E00
  log MEMORY_FILE 0 0
  putvarchr MEMORY_FILE TMP 0   # improves the speed with pre-allocation
  log MEMORY_FILE 0 0           # reset the position and size of the file
  # Set up default values and keys
  get FILENAME filename 0
  get FILESIZE asize 0
  set FILESTART long 0
  set SAV_MH4U string "blowfish key iorajegqmrna4itjeangmb agmwgtobjteowhv9mope"
  set DLC_MH4U_EU string "AgK2DYheaCjyHGPB"
  set DLC_MH4U_JP string "AgK2DYheaCjyHGP8"
  set DLC_MH4U_KR string "AgK2DYheaOjyHGP8"
  set DLC_MH4U_TW string "Capcom123 "
  set KEY_MUL short 0xB0
  set KEY_MOD short 0xFF53
  set SUM long 0
  # get savedata in memory for decryption
  log MEMORY_FILE FILESTART FILESIZE 0  # MEMORY_FILE is encrypted save data
  ################################################
# Decrypt save
 print "Decrypting save"
 print "-> Blowfish Decryption..."
# decrypt via blowfish
  Encryption blowfish SAV_MH4U
  log MEMORY_FILE FILESTART FILESIZE MEMORY_FILE
  Encryption "" ""
 print "-> XORing with save key..."
# check if file looks properly decrypted & get save key
  get SIXTEEN short MEMORY_FILE
  get KEY short MEMORY_FILE
  math FILESTART + 4
  math FILESIZE - 4
   if SIXTEEN != 16
    print "[!] Save key doesn't seem to be decrypted! Blowfish decryption may have failed! Exiting..."
    CleanExit
  endif
 # advance key and XOR 16b block of the file with it
  xmath XORNUM "FILESIZE / 2"
  for i = 0 < XORNUM
    xmath POS "(i * 2) + FILESTART"  # get current file position
    if KEY == 0
      math KEY = 1
    endif
    math KEY * KEY_MUL
    math KEY % KEY_MOD
     getvarchr DATA MEMORY_FILE POS short
    math DATA u^ KEY
    putvarchr MEMORY_FILE POS DATA short
  next i
 print "-> Comparing save checksum..."
  get CSUM long MEMORY_FILE
  math FILESTART + 4
  math FILESIZE - 4
   for i = 0 < FILESIZE
    get SBYTE byte MEMORY_FILE
    math SUM + SBYTE
  next i
  math SUM u& 0xFFFFFFFF
   if CSUM != SUM
    print "[!] Checksum mismatch! Save chksum: %CSUM% - Calculated chksum: %SUM%! Exiting..."
    CleanExit
  endif
  ################################################
# Save files to disk
 print "Exporting decrypted save to %FILENAME%"
log FILENAME FILESTART FILESIZE MEMORY_FILE
 CleanExit

Comments