Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 46 additions & 10 deletions genprog_decomp_ida.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@

IDA_DEFAULT_PATH=os.environ['HOME']+"/seclab_ida/ida/idat"
if os.environ['IDA_BASE_DIR']:
IDA_PATH=os.environ['IDA_BASE_DIR']+"/idat"
IDA_PATH=os.environ['IDA_BASE_DIR']+"/idat"
else:
IDA_PATH=IDA_DEFAULT_PATH
IDA_PATH=IDA_DEFAULT_PATH

# path to defs.h
DEFS_PATH=os.path.dirname(os.path.realpath(__file__))+"/refs/defs.h"
Expand Down Expand Up @@ -649,9 +649,24 @@ def get_data_declarations(self, lines):
header = header[3:] # handle commented out cases

dataType, dataName = self.getTypeAndLabel(header)
defLine = "%s *(p%s);\n" %(dataType, dataName)
dataName = dataName.split("[")[0] # handle arrays
defLine += "#define %s (*p%s)\n" % (dataName, dataName)
array_size=len(re.findall("\[\d*\]",dataName))
print("Array Size:", array_size)
defLine=""
if array_size>=2:
print("// --- WARNING! Two-dimensional array objects are not yet supported")
defLine += "%s *(p%s);\n" %(dataType, dataName)
dataName = dataName.split("[")[0] # handle arrays
defLine += "#define %s (*p%s)\n" % (dataName, dataName)
print(" // --- END OF WARNING!\n")
elif array_size==1 and "*" not in dataType:
dataName = dataName.split("[")[0] # handle arrays
defLine = "%s *(p%s);\n" %(dataType, dataName)
defLine += "#define %s (p%s)\n" % (dataName, dataName)
else:
defLine = "%s *(p%s);\n" %(dataType, dataName)
dataName = dataName.split("[")[0] # handle arrays
defLine += "#define %s (*p%s)\n" % (dataName, dataName)

if line.startswith("//"):
defLine += "//"
print(" ---->", defLine)
Expand Down Expand Up @@ -859,7 +874,7 @@ def generate_wrapper(self, target, funcs, stubMap, dataMap):
wrapperStub += " my%s,\n" % self.get_stub_name(s)
print(s)
print(" - STUBNAME: ", self.get_stub_name(s))

# note from pdr: looks like when data declarations are included, the
# function prototype and funcstubs order of symbol definitions
# are not consistent
Expand All @@ -869,7 +884,17 @@ def generate_wrapper(self, target, funcs, stubMap, dataMap):
dataDef = d.split(";")[0]
dataDef = dataDef.split("=")[0].strip()
dataType, dataName = self.getTypeAndLabel(dataDef)
wrapperStub += "\tvoid* my%s,\n" % dataName
array_size=len(re.findall("\[\d*\]",dataName))
if array_size>=2:
print("SORRY: two-dimensional array objects just aren't working right now")
print(" ==> "+dataType+" "+dataName)
wrapperStub += "// --- WARNING! Two-dimensional array objects are not yet supported"
wrapperStub += "\tvoid* my%s,\n" % dataName
elif array_size==1 and "*" not in dataType:
dataNamex = dataName.split("[")[0] # handle arrays
wrapperStub += "\tvoid* my%s,\n" % dataNamex
else:
wrapperStub += "\tvoid* my%s,\n" % dataName
print(" - DATA DECL: ", dataName)

for argTuple in args:
Expand Down Expand Up @@ -898,8 +923,16 @@ def generate_wrapper(self, target, funcs, stubMap, dataMap):
dataDef = dataDef[3:] # handle commented out cases
dataDef = dataDef.split("=")[0].strip()
dataType, dataName = self.getTypeAndLabel(dataDef)
wrapperStub += "\tp%s = (%s*) my%s;\n" % (dataName, dataType, dataName)

array_size=len(re.findall("\[\d*\]",dataName))
if array_size>=2:
print("// --- WARNING! Two-dimensional array objects are not yet supported\n")
wrapperStub += "\tp%s = (%s*) my%s;\n" % (dataName, dataType, dataName)
print(" // --- END OF WARNING!\n")
elif array_size==1 and "*" not in dataType:
dataNamex = dataName.split("[")[0] # handle arrays
wrapperStub += "\tp%s = (%s*) my%s;\n" % (dataNamex, dataType, dataNamex)
else:
wrapperStub += "\tp%s = (%s*) my%s;\n" % (dataName, dataType, dataName)

for s in stubMap.keys():
name = self.get_stub_name(s)
Expand Down Expand Up @@ -1101,7 +1134,10 @@ def run(self):


def main():

if not os.path.isfile(IDA_PATH):
print("ERROR: Environmental variable IDA_BASE_PATH is not set or '"+IDA_DEFAULT_PATH+"' does not exist")
import sys
sys.exit(-1)
parser = argparse.ArgumentParser(description='')
parser.add_argument('target_list',
help='path to the list of target binaries + paths')
Expand Down
8 changes: 7 additions & 1 deletion refs/defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,10 @@
#define LODWORD(x) (*((unsigned int*)&(x)))
#define HIWORD(x) (*((unsigned short*)&(x)+1))
#define LOWORD(x) (*((unsigned short*)&(x)))
#define COERCE_UNSIGNED_INT64(x) (*((unsigned long*)(&x)))
#define COERCE_UNSIGNED_INT64(x) (*((unsigned long*)(&x)))
#define HIBYTE(x) (*((unsigned char*)&(x)+1))


// from IDADOC support: _OWORD is an unknown type; the only known info is its size: 16 bytes
#define _OWORD (unsigned long long)