HenryEx icon

MH4U Save Encoding QuickBMS

HenryEx | PRO | 09/10/15 10:51:31 PM UTC | 0 ⭐ | 1338 👁️ | Never ⏰ | []
text |

2.65 KB

|

None

|

0 👍

/

0 👎

# Monster Hunter 4 Ultimate
# Script to re-encrypt 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 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
 # set up savedata in memory for encryption
  put 16 short MEMORY_FILE
  put 0 short MEMORY_FILE  # space for xor key
  put 0 long MEMORY_FILE  # space for checksum
  append  # Append ON
  log MEMORY_FILE FILESTART FILESIZE 0  # MEMORY_FILE = decrypted save data
  append  # Append OFF
  math FILESTART = 8
  ################################################
# Encrypt save
 print "Encrypting save"
 print "-> Calculating save checksum..."
  for i = 0 < FILESIZE
    get SBYTE byte 0
    math SUM + SBYTE
  next i
  math SUM u& 0xFFFFFFFF
  print "Calculated checksum: %SUM%"
   putvarchr MEMORY_FILE 4 SUM long
  math FILESIZE + 4
  math FILESTART - 4
 print "-> XORing with random key..."  # Well, not REALLY random...
# make pseudo-random KEY
  xmath KEY "SUM & 0xFFFF"
  xmath KEY "((KEY < 7) & 0xFFFF) | (KEY > 9)"  # 16bit rotated left 7x
  math KEY ^ 0x484D  # xor with "MH"
   putvarchr MEMORY_FILE 2 KEY short
 # 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
   math FILESIZE + 4
  math FILESTART - 4
 print "-> Blowfish Encryption..."
# encrypt via blowfish
  Encryption blowfish SAV_MH4U "" 1
  log MEMORY_FILE FILESTART FILESIZE MEMORY_FILE
  Encryption "" ""
  ################################################
# Save files to disk
 print "Exporting encrypted save to %FILENAME%"
log FILENAME FILESTART FILESIZE MEMORY_FILE
 CleanExit

Comments