You've already forked Microtransactions64
mirror of
https://github.com/Print-and-Panic/Microtransactions64.git
synced 2026-01-21 10:17:19 -08:00
refresh 6
This commit is contained in:
58
tools/patch_libmalloc.py
Normal file
58
tools/patch_libmalloc.py
Normal file
@@ -0,0 +1,58 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Patches the malloc() function in libmalloc.so to allocate more than the
|
||||
# specified number of bytes. This is needed to work around issues with the
|
||||
# compiler occasionally crashing.
|
||||
#
|
||||
# This script replaces the "move a1, a0" (00 80 28 25) instruction with
|
||||
# "addiu a1, a0, n" (24 85 nn nn), which causes the malloc function to add n to
|
||||
# the size parameter that was passed in.
|
||||
|
||||
import hashlib
|
||||
import os.path
|
||||
import sys
|
||||
|
||||
# file to patch
|
||||
filename = 'tools/ido5.3_compiler/lib/libmalloc.so'
|
||||
# Expected (unpatched) hash of file
|
||||
filehash = 'adde672b5d79b52ca3cce9a47c7cb648'
|
||||
# location in file to patch
|
||||
address = 0xAB4
|
||||
|
||||
# Get parameter
|
||||
if len(sys.argv) != 2:
|
||||
print('Usage: ' + sys.argv[0] + ' n\n where n is the number of extra bytes to allocate in malloc()')
|
||||
exit(1)
|
||||
n = int(sys.argv[1])
|
||||
|
||||
# Original instruction "move a1, a0"
|
||||
oldinsn = bytearray([0x00, 0x80, 0x28, 0x25])
|
||||
|
||||
# New instruction "addiu a1, a0, n"
|
||||
newinsn = bytearray([0x24, 0x85, (n >> 8) & 0xFF, (n & 0xFF)])
|
||||
|
||||
# Patch the file
|
||||
try:
|
||||
with open(filename, 'rb+') as f:
|
||||
# Read file contents
|
||||
contents = bytearray(f.read())
|
||||
|
||||
# Unpatch the file by restoring original instruction
|
||||
contents[address:address+4] = oldinsn
|
||||
|
||||
# Verify the (unpatched) hash of the file
|
||||
md5 = hashlib.md5()
|
||||
md5.update(contents)
|
||||
if md5.hexdigest() != filehash:
|
||||
print('Error: ' + filename + ' does not appear to be the correct version.')
|
||||
exit(1)
|
||||
|
||||
# Patch the file
|
||||
if n != 0:
|
||||
contents[address:address+4] = newinsn
|
||||
|
||||
# Write file
|
||||
f.seek(0, os.SEEK_SET)
|
||||
f.write(contents)
|
||||
except IOError as e:
|
||||
print('Error: Could not open library file for writing: ' + str(e))
|
||||
Reference in New Issue
Block a user