Skip to content

Instantly share code, notes, and snippets.

@Konctantin
Last active August 14, 2016 16:37
Show Gist options
  • Select an option

  • Save Konctantin/915b4b57179a567dca1f to your computer and use it in GitHub Desktop.

Select an option

Save Konctantin/915b4b57179a567dca1f to your computer and use it in GitHub Desktop.
FrameScript_RegisterFunction = FindBinary(0, SEARCH_DOWN, "55 8B EC 56 8B 35 ? ? ? ? 6A 00 FF")
FrameScript_RegisterFunctionNamespaceWithCount = FindBinary(0, SEARCH_DOWN, "55 8B EC 56 8B 35 ? ? ? ? 57 FF 75 10")
if FrameScript_RegisterFunction == BADADDR:
quit("Could not find FrameScript_RegisterFunction.")
if FrameScript_RegisterFunctionNamespaceWithCount == BADADDR:
quit("Could not find FrameScript_RegisterFunctionNamespaceWithCount.")
def WriteNamespaceFuncs(logFile):
luaNamespaces = []
reference = RnextB(FrameScript_RegisterFunctionNamespaceWithCount, 0)
while reference != BADADDR:
luaFuncs = []
prevOperation = PrevHead(reference)
while GetMnem(prevOperation) != "push":
prevOperation = PrevHead(prevOperation)
funcArray = GetOperandValue(prevOperation, 0)
prevOperation = PrevHead(prevOperation)
funcCount = GetOperandValue(prevOperation, 0)
prevOperation = PrevHead(prevOperation)
funcNamespace = GetString(GetOperandValue(prevOperation, 0), -1, ASCSTR_C)
isRegistered = False
for i in xrange(0, len(luaNamespaces)):
if luaNamespaces[i][0] == funcNamespace:
isRegistered = True
break
if not isRegistered:
for j in xrange(0, funcCount):
arrayPtr = funcArray + (j * 8)
funcName = GetString(Dword(arrayPtr), -1, ASCSTR_C)
funcAddr = Dword(arrayPtr + 4)
luaFuncs.append([funcName, funcAddr])
luaFuncs.sort()
luaNamespaces.append([funcNamespace, luaFuncs])
reference = RnextB(FrameScript_RegisterFunctionNamespaceWithCount, reference)
luaNamespaces.sort()
for i in xrange(0, len(luaNamespaces)):
logFile.write("# %s Lua Functions #\n" % luaNamespaces[i][0])
for j in xrange(0, len(luaNamespaces[i][1])):
logFile.write("MakeNameEx(baseAddr + 0x%08X, \"Script_%s.%s\", SN_NOWARN)\n" % (luaNamespaces[i][1][j][1] - 0x00400000, luaNamespaces[i][0], luaNamespaces[i][1][j][0]))
print("%08X Script_%s.%s" % (luaNamespaces[i][1][j][1], luaNamespaces[i][0], luaNamespaces[i][1][j][0]))
MakeNameEx(luaNamespaces[i][1][j][1], "Script_%s.%s" % (luaNamespaces[i][0], luaNamespaces[i][1][j][0]), SN_NOWARN)
logFile.write("\n")
logFile.write("\n")
def WriteGlobalFuncs(logFile):
luaFuncs = []
reference = RnextB(FrameScript_RegisterFunction, 0)
while reference != BADADDR:
nextOperation = NextHead(reference)
prevOperation = PrevHead(reference)
funcCount = 1
if GetMnem(nextOperation) == "add":
# Register array of functions.
nextOperation = NextHead(nextOperation)
nextOperation = NextHead(nextOperation)
nextOperation = NextHead(nextOperation)
funcCount = GetOperandValue(nextOperation, 1) / 8
funcArray = GetOperandValue(prevOperation, 0)
for i in xrange(0, funcCount):
arrayPtr = funcArray + (i * 8)
funcName = GetString(Dword(arrayPtr), -1, ASCSTR_C)
funcAddr = Dword(arrayPtr + 4)
luaFuncs.append([funcName, funcAddr])
reference = RnextB(FrameScript_RegisterFunction, reference)
luaFuncs.sort()
logFile.write("# Global Lua Functions #\n")
for i in xrange(0, len(luaFuncs)):
logFile.write("MakeNameEx(baseAddr + 0x%08X, \"Script_%s\", SN_NOWARN)\n" % (luaFuncs[i][1] - 0x00400000, luaFuncs[i][0]))
print("%08X Script_%s" % (luaFuncs[i][1], luaFuncs[i][0]))
MakeNameEx(luaFuncs[i][1], "Script_%s" % luaFuncs[i][0], SN_NOWARN)
with open("Lua Functions.py", "w") as logFile:
logFile.write("baseAddr = FirstSeg()\n\n")
WriteNamespaceFuncs(logFile)
WriteGlobalFuncs(logFile)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment