mirror of
https://github.com/shibbo/3dcomp.git
synced 2024-11-23 05:29:44 +00:00
refactor some scripts to get rid of duplicating code
This commit is contained in:
parent
7c56ef4555
commit
0f27b0cb9b
4
build.py
4
build.py
@ -8,6 +8,7 @@ import sys
|
||||
import os
|
||||
import pathlib
|
||||
from ninja_syntax import Writer
|
||||
import helpers
|
||||
|
||||
nonmatching_str = ""
|
||||
clean = False
|
||||
@ -35,7 +36,6 @@ LIBRARIES = ["Game", "ActionLibrary", "agl", "eui", "nn", "sead"]
|
||||
incdirs = " ".join([f'-I {dir}' for dir in INCLUDE_DIRS])
|
||||
|
||||
COMPILER_CMD = f"-x c++ -O3 -fno-omit-frame-pointer -mno-implicit-float -fno-cxx-exceptions -fno-strict-aliasing -std=gnu++14 -fno-common -fno-short-enums -ffunction-sections -fdata-sections -fPIC -mcpu=cortex-a57+fp+simd+crypto+crc -g -Wall {nonmatching_str} {incdirs} -c"
|
||||
COMPILER_PATH = pathlib.Path("compiler/nx/aarch64/bin/clang++.exe")
|
||||
OBJDUMP_PATH = pathlib.Path("compiler/nx/aarch64/bin/llvm-objdump.exe")
|
||||
|
||||
# if we don't have this file, create it
|
||||
@ -65,7 +65,7 @@ def genNinja(compile_tasks):
|
||||
with open('build.ninja', 'w') as ninja_file:
|
||||
ninja_writer = Writer(ninja_file)
|
||||
|
||||
cmd = f'{COMPILER_PATH} {COMPILER_CMD} $in -o $out'
|
||||
cmd = f'{helpers.COMPILER_PATH} {COMPILER_CMD} $in -o $out'
|
||||
if isNotWindows:
|
||||
cmd = f'wine {cmd}'
|
||||
ninja_writer.rule("compile", command=cmd, description='Compiling $in')
|
||||
|
58
check.py
58
check.py
@ -4,7 +4,7 @@ from capstone import *
|
||||
from capstone.arm64 import *
|
||||
from elftools.elf.elffile import ELFFile
|
||||
import time
|
||||
import hashlib
|
||||
import helpers
|
||||
|
||||
LIBRARIES = ["ActionLibrary", "agl", "eui", "nn", "sead"]
|
||||
|
||||
@ -73,37 +73,6 @@ def genProgress():
|
||||
print("Generating JSON...")
|
||||
genJSON(prog_total, "decompiled", "decompiled", "blue")
|
||||
|
||||
def getModule(map, sym):
|
||||
for root, dirs, files in os.walk(map):
|
||||
for file in files:
|
||||
if file.endswith(".map"):
|
||||
map_path = os.path.join(root, file)
|
||||
with open(map_path, "r") as f:
|
||||
lines = f.readlines()
|
||||
|
||||
for line in lines:
|
||||
fmt = line.replace("\n", "")
|
||||
if fmt == sym:
|
||||
# we found where our symbol lives!
|
||||
# we just grab the source module
|
||||
object_path = map_path.replace("map", "build", 1)
|
||||
object_path = object_path.replace(".map", ".o")
|
||||
return object_path
|
||||
return ""
|
||||
|
||||
def getFunctionData(functionAddr, functionSize):
|
||||
with open("fury.nso", "rb") as f:
|
||||
data = f.read()
|
||||
|
||||
digest = hashlib.sha256(data).hexdigest().upper()
|
||||
if digest != "80E48BC7BDF7AAA635E7B48C24F49C6A4D8AC19949FB1B9F66EADF2CFBA3BF85":
|
||||
print("fury.nso is not valid")
|
||||
sys.exit(1)
|
||||
|
||||
nso_file = nso.NSO(data)
|
||||
|
||||
return nso_file.getFunction(functionAddr, functionSize)
|
||||
|
||||
objs_to_check = []
|
||||
funcs_to_check = []
|
||||
|
||||
@ -146,11 +115,11 @@ if "-no-diff" in sys.argv:
|
||||
for sym in funcs_to_check:
|
||||
print(f"{Fore.BLUE}{sym}{Style.RESET_ALL} =================================================")
|
||||
# first let's see if our symbol even exists somewhere
|
||||
path = getModule("map", sym)
|
||||
path = helpers.getModule("map", sym)
|
||||
|
||||
if path == "":
|
||||
for lib in LIBRARIES:
|
||||
path = getModule(f"lib/{lib}/map", sym)
|
||||
path = helpers.getModule(f"lib/{lib}/map", sym)
|
||||
|
||||
if path != "":
|
||||
break
|
||||
@ -159,25 +128,8 @@ for sym in funcs_to_check:
|
||||
print("Unable to find symbol.")
|
||||
sys.exit(1)
|
||||
|
||||
functionSize = 0
|
||||
functionAddr = 0
|
||||
|
||||
with open("data/main.map", "r") as f:
|
||||
lines = f.readlines()
|
||||
|
||||
for line in lines:
|
||||
spl = line.split("=")
|
||||
name = spl[0]
|
||||
addr = spl[1]
|
||||
addr = int(addr[10:], 16)
|
||||
size = int(spl[2], 16)
|
||||
|
||||
if sym == name:
|
||||
functionSize = size
|
||||
functionAddr = addr
|
||||
break
|
||||
|
||||
funcData = getFunctionData(functionAddr, functionSize)
|
||||
functionSize, functionAddr = helpers.getFunctionSizeAndAddr(sym)
|
||||
funcData = helpers.getFunctionData(functionAddr, functionSize)
|
||||
capstone_inst = Cs(CS_ARCH_ARM64, CS_MODE_ARM + CS_MODE_LITTLE_ENDIAN)
|
||||
capstone_inst.detail = True
|
||||
capstone_inst.imm_unsigned = False
|
||||
|
60
decompme.py
60
decompme.py
@ -13,37 +13,7 @@ import urllib.request
|
||||
import urllib.parse
|
||||
from typing import Dict
|
||||
import json
|
||||
|
||||
def getModule(map, sym):
|
||||
for root, dirs, files in os.walk(map):
|
||||
for file in files:
|
||||
if file.endswith(".map"):
|
||||
map_path = os.path.join(root, file)
|
||||
with open(map_path, "r") as f:
|
||||
lines = f.readlines()
|
||||
|
||||
for line in lines:
|
||||
fmt = line.replace("\n", "")
|
||||
if fmt == sym:
|
||||
# we found where our symbol lives!
|
||||
# we just grab the source module
|
||||
object_path = map_path.replace("map", "build", 1)
|
||||
object_path = object_path.replace(".map", ".o")
|
||||
return object_path
|
||||
return ""
|
||||
|
||||
def getFunctionData(functionAddr, functionSize):
|
||||
with open("fury.nso", "rb") as f:
|
||||
data = f.read()
|
||||
|
||||
digest = hashlib.sha256(data).hexdigest().upper()
|
||||
if digest != "80E48BC7BDF7AAA635E7B48C24F49C6A4D8AC19949FB1B9F66EADF2CFBA3BF85":
|
||||
print("fury.nso is not valid")
|
||||
sys.exit(1)
|
||||
|
||||
nso_file = nso.NSO(data)
|
||||
|
||||
return nso_file.getFunction(functionAddr, functionSize)
|
||||
import helpers
|
||||
|
||||
INCLUDE_DIRS = [
|
||||
"include",
|
||||
@ -57,7 +27,6 @@ INCLUDE_DIRS = [
|
||||
LIBRARIES = ["ActionLibrary", "agl", "eui", "nn", "sead"]
|
||||
|
||||
incdirs = " ".join([f'-I {dir}' for dir in INCLUDE_DIRS])
|
||||
COMPILER_PATH = pathlib.Path("compiler/nx/aarch64/bin/clang++.exe")
|
||||
PREPROC_CMD = f"-C -E {incdirs}"
|
||||
COMPILER_CMD = f"-x c++ -O3 -fno-omit-frame-pointer -mno-implicit-float -fno-cxx-exceptions -fno-strict-aliasing -std=gnu++14 -fno-common -fno-short-enums -ffunction-sections -fdata-sections -fPIC -mcpu=cortex-a57+fp+simd+crypto+crc -g -Wall -c"
|
||||
|
||||
@ -72,11 +41,11 @@ isTest = False
|
||||
if "-test" in sys.argv:
|
||||
isTest = True
|
||||
|
||||
path = getModule("map", sym)
|
||||
path = helpers.getModule("map", sym)
|
||||
|
||||
if path == "":
|
||||
for lib in LIBRARIES:
|
||||
path = getModule(f"lib/{lib}/map", sym)
|
||||
path = helpers.getModule(f"lib/{lib}/map", sym)
|
||||
|
||||
if path != "":
|
||||
break
|
||||
@ -87,7 +56,7 @@ if path == "":
|
||||
|
||||
source_path = path.replace("build", "source")
|
||||
source_path = source_path.replace(".o", ".cpp")
|
||||
preproc_cmd = [COMPILER_PATH, "-E"] + incdirs.split() + [source_path]
|
||||
preproc_cmd = [helpers.COMPILER_PATH, "-E"] + incdirs.split() + [source_path]
|
||||
procOut = subprocess.check_output(preproc_cmd).decode("utf-8").replace("\r", "")
|
||||
|
||||
procOut_Clean = ""
|
||||
@ -98,25 +67,8 @@ for line in procOut.split("\n"):
|
||||
|
||||
procOut_Clean += f"{line}\n"
|
||||
|
||||
functionSize = 0
|
||||
functionAddr = 0
|
||||
|
||||
with open("data/main.map", "r") as f:
|
||||
lines = f.readlines()
|
||||
|
||||
for line in lines:
|
||||
spl = line.split("=")
|
||||
name = spl[0]
|
||||
addr = spl[1]
|
||||
addr = int(addr[10:], 16)
|
||||
size = int(spl[2], 16)
|
||||
|
||||
if sym == name:
|
||||
functionSize = size
|
||||
functionAddr = addr
|
||||
break
|
||||
|
||||
funcData = getFunctionData(functionAddr, functionSize)
|
||||
functionSize, functionAddr = helpers.getFunctionSizeAndAddr(sym)
|
||||
funcData = helpers.getFunctionData(functionAddr, functionSize)
|
||||
capstone_inst = Cs(CS_ARCH_ARM64, CS_MODE_ARM + CS_MODE_LITTLE_ENDIAN)
|
||||
capstone_inst.detail = True
|
||||
capstone_inst.imm_unsigned = False
|
||||
|
61
helpers.py
Normal file
61
helpers.py
Normal file
@ -0,0 +1,61 @@
|
||||
import nso
|
||||
import os
|
||||
import hashlib
|
||||
import sys
|
||||
import pathlib
|
||||
|
||||
COMPILER_PATH = pathlib.Path("compiler/nx/aarch64/bin/clang++.exe")
|
||||
|
||||
# gets the "module" (object file) that a symbol is contained in from map files
|
||||
def getModule(map, sym):
|
||||
for root, dirs, files in os.walk(map):
|
||||
for file in files:
|
||||
if file.endswith(".map"):
|
||||
map_path = os.path.join(root, file)
|
||||
with open(map_path, "r") as f:
|
||||
lines = f.readlines()
|
||||
|
||||
for line in lines:
|
||||
fmt = line.replace("\n", "")
|
||||
if fmt == sym:
|
||||
# we found where our symbol lives!
|
||||
# we just grab the source module
|
||||
object_path = map_path.replace("map", "build", 1)
|
||||
object_path = object_path.replace(".map", ".o")
|
||||
return object_path
|
||||
return ""
|
||||
|
||||
# gets bytes from a function with a defined address and size from an NSO file
|
||||
def getFunctionData(functionAddr, functionSize):
|
||||
with open("fury.nso", "rb") as f:
|
||||
data = f.read()
|
||||
|
||||
digest = hashlib.sha256(data).hexdigest().upper()
|
||||
if digest != "80E48BC7BDF7AAA635E7B48C24F49C6A4D8AC19949FB1B9F66EADF2CFBA3BF85":
|
||||
print("fury.nso is not valid")
|
||||
sys.exit(1)
|
||||
|
||||
nso_file = nso.NSO(data)
|
||||
|
||||
return nso_file.getFunction(functionAddr, functionSize)
|
||||
|
||||
def getFunctionSizeAndAddr(sym):
|
||||
functionSize = 0
|
||||
functionAddr = 0
|
||||
|
||||
with open("data/main.map", "r") as f:
|
||||
lines = f.readlines()
|
||||
|
||||
for line in lines:
|
||||
spl = line.split("=")
|
||||
name = spl[0]
|
||||
addr = spl[1]
|
||||
addr = int(addr[10:], 16)
|
||||
size = int(spl[2], 16)
|
||||
|
||||
if sym == name:
|
||||
functionSize = size
|
||||
functionAddr = addr
|
||||
break
|
||||
|
||||
return functionSize, functionAddr
|
Loading…
Reference in New Issue
Block a user