mirror of
https://github.com/araxiaonline/WoWDBDefs.git
synced 2026-06-13 03:32:22 -04:00
exedumper: add 4.0.0.11792
This commit is contained in:
146
exedumper/initial_dump_from_binary-4.0.0.11792.py
Normal file
146
exedumper/initial_dump_from_binary-4.0.0.11792.py
Normal file
@@ -0,0 +1,146 @@
|
||||
from idautils import *
|
||||
from idaapi import *
|
||||
import random
|
||||
import os
|
||||
|
||||
has_extra_info = 1
|
||||
build="4.0.0.11792"
|
||||
output_dir = '......../WoWDBDefs/definitions'
|
||||
retarded_names = True
|
||||
|
||||
def definition_to_file (dbc_name, row_size, field_count, field_type, field_size, field_offsets, field_name, unknown_flag):
|
||||
if dbc_name.endswith ("Rec"):
|
||||
dbc_name = dbc_name[:-3]
|
||||
|
||||
output = open ('%s/%s.dbd' % (output_dir, dbc_name), 'w+')
|
||||
|
||||
seed = os.urandom(64)
|
||||
|
||||
random.seed (seed)
|
||||
|
||||
print >>output, "COLUMNS"
|
||||
offset=0
|
||||
for i in range (0, field_count):
|
||||
t = Dword (field_type + i * 4)
|
||||
field_offset = Dword (field_offsets + i * 4)
|
||||
if field_offset != offset:
|
||||
padding = field_offset - offset
|
||||
print >>output, ("uint padding_%i?" % random.getrandbits(32))
|
||||
offset += padding
|
||||
size = long (Dword (field_size + i * 4))
|
||||
|
||||
name = GetString (Dword (field_name + i * 4)) if field_name else ("field_%i?" % random.getrandbits(32))
|
||||
if retarded_names and name.startswith ("m_"):
|
||||
name = name[2:]
|
||||
is_lang = False
|
||||
if name.endswith ("_lang"):
|
||||
is_lang = True
|
||||
|
||||
type_name = None
|
||||
if t == 0 and size % 4 == 0:
|
||||
type_name = "uint"
|
||||
elif t == 0 and size % 2 == 0:
|
||||
type_name = "uint"
|
||||
elif (t == 0 and size == 1) or t == 4:
|
||||
type_name = "uint"
|
||||
elif t == 0 and size == 5:
|
||||
type_name = "uint"
|
||||
elif t == 1 and size % 8 == 0:
|
||||
type_name = "uint"
|
||||
elif t == 2 and is_lang:
|
||||
type_name = "locstring" if retarded_names else "langstringref"
|
||||
elif t == 2:
|
||||
type_name = "string" if retarded_names else "stringref"
|
||||
elif t == 3 and size % 4 == 0:
|
||||
type_name = "float"
|
||||
else:
|
||||
raise Exception("%s: %i: unknown type %i %i" % (dbc_name, i, t, size))
|
||||
|
||||
print >>output, (type_name + " " + name)
|
||||
offset += size
|
||||
if row_size != offset:
|
||||
print >>output, ("uint padding_%i?" % random.getrandbits(32))
|
||||
|
||||
print >>output, ""
|
||||
|
||||
random.seed (seed)
|
||||
|
||||
print >>output, "BUILD %s" % build
|
||||
if unknown_flag:
|
||||
print >>output, "COMMENT unknown_flag={}".format(unknown_flag)
|
||||
offset=0
|
||||
padd_index=0
|
||||
for i in range (0, field_count):
|
||||
t = Dword (field_type + i * 4)
|
||||
field_offset = Dword (field_offsets + i * 4)
|
||||
if field_offset != offset:
|
||||
padding = field_offset - offset
|
||||
print >>output, ("padding_%i<8>[%i]" % (random.getrandbits(32), padding))
|
||||
padd_index += 1
|
||||
offset += padding
|
||||
size = long (Dword (field_size + i * 4))
|
||||
|
||||
name = GetString (Dword (field_name + i * 4)) if field_name else ("field_%i" % random.getrandbits(32))
|
||||
if name.startswith ("m_"):
|
||||
name = name[2:]
|
||||
|
||||
bits = None
|
||||
count = 0
|
||||
|
||||
suffix = ""
|
||||
if t == 0 and size % 4 == 0:
|
||||
bits = 32
|
||||
count = size / 4
|
||||
elif t == 0 and size % 2 == 0:
|
||||
bits = 16
|
||||
count = size / 2
|
||||
elif (t == 0 and size == 1) or t == 4:
|
||||
bits = 8
|
||||
count = size
|
||||
elif t == 0 and size == 5:
|
||||
bits = 8
|
||||
count = size
|
||||
elif t == 1 and size % 8 == 0:
|
||||
bits = 64
|
||||
count = size / 8
|
||||
elif t == 2:
|
||||
count = size / 4
|
||||
elif t == 3 and size % 4 == 0:
|
||||
count = size / 4
|
||||
else:
|
||||
raise Exception("%s: %i: unknown type %i %i" % (dbc_name, i, t, size))
|
||||
|
||||
type_string = ""
|
||||
if bits:
|
||||
type_string += "<%i>" % bits
|
||||
if count > 1:
|
||||
type_string += "[%i]" % count
|
||||
|
||||
if i == 0 and name == "ID":
|
||||
name = "$id${}".format(name)
|
||||
print >>output, (name + type_string)
|
||||
offset += size
|
||||
if row_size != offset:
|
||||
print >>output, ("padding_%i<8>[%i]" % (random.getrandbits(32), (row_size - offset)))
|
||||
|
||||
output.flush()
|
||||
output.close()
|
||||
|
||||
for position, mangled_name in Names():
|
||||
if mangled_name and mangled_name.startswith ("__ZN"):
|
||||
if mangled_name.endswith ("6s_metaE"):
|
||||
dbc_name = None
|
||||
for pos in range (len ("__ZN"), len (mangled_name) - 11):
|
||||
if not mangled_name[pos:pos + 1].isdigit():
|
||||
dbc_name = mangled_name[pos:len (mangled_name) - 8]
|
||||
break
|
||||
if not mangled_name.endswith ("_ptr"):
|
||||
filename = Dword (position + 0x00)
|
||||
field_count = Dword (position + 0x04)
|
||||
row_size = Dword (position + 0x08)
|
||||
unknown_flag = Dword (position + 0x14)
|
||||
field_name = Dword (position + 0x18)
|
||||
field_offset = Dword (position + 0x1c)
|
||||
field_size = Dword (position + 0x20)
|
||||
field_type = Dword (position + 0x24)
|
||||
definition_to_file (dbc_name, row_size, field_count, field_type, field_size, field_offset, field_name, unknown_flag)
|
||||
Reference in New Issue
Block a user