Slightly modified
prj's Python code for loading a2l
It's also define constants and bitfield enums and assign adress to it.
import idc
import idaapi
def processrom(min, max):
if min > 0:
min = min - 1
curaddr = idc.FindUnexplored(min, idc.SEARCH_DOWN)
while curaddr < max:
if idc.MakeFunction(curaddr) != True:
idc.MakeCode(curaddr)
curaddr = idc.FindUnexplored(curaddr, idc.SEARCH_DOWN)
return
def a2l(filename):
lastvarname = ""
lastaddress = ""
with open(filename) as fp:
f = fp.read()
measurements = f.split("/begin MEASUREMENT")
measurements.pop(0)
print("Found: %d measurement(s)" % len(measurements))
for m in measurements:
namefound = 0
addrfound = 0
name = ""
addr = ""
is_enum = False
bit_mask = 0
for l in m.split("\n"):
l = l.strip()
if (len(l) > 0):
if (namefound == 0):
name = l
namefound = 1
elif (l.startswith("BIT_MASK")):
is_enum = True
bit_mask = int(l.split(" ")[1], 16)
elif (l.startswith("ECU_ADDRESS")):
addr = l[12:]
addrfound = 1
break
if (addrfound != 1):
print("ERROR")
elif (is_enum):
enum_name = "enum_" + addr[2:]
enum_id = idc.GetEnum(enum_name)
if (enum_id == 4294967295L):
enum_id = idc.AddEnum(-1, enum_name, 0)
idc.OpEnumEx(int(addr, 0), -1, enum_id, 0)
idc.MakeNameEx(int(addr, 0), "", 0)
if (not idc.IsBitfield(enum_id)):
idc.SetEnumBf(enum_id, 1)
idc.AddConstEx(enum_id, name, bit_mask, bit_mask)
else:
idc.MakeNameEx(int(addr, 0), name, 1)
characteristics = f.split("/begin CHARACTERISTIC")
characteristics.pop(0)
print("Found: %d characteristics(s)" % len(characteristics))
for m in characteristics:
namefound = 0
addrfound = 0
name = ""
addr = ""
is_enum = False
bit_mask = 0
for l in m.split("\n"):
l = l.strip()
if (len(l) > 0):
if (namefound == 0):
name = l
namefound = 1
elif (l.startswith("/begin IF_DATA ETK")):
addr = l.split(" ")[5]
#addr = l[28:7]
addrfound = 1
break
if (addrfound != 1):
print("ERROR", name)
else:
idc.MakeUnknown(int(addr, 0), 1, idaapi.DOUNK_SIMPLE)
idc.MakeNameEx(int(addr, 0), name, 1)
return
Hello all
I use the code from prometey1982 so far without any problems.
now i have another a2l which looks a little different.
here as an example:
/begin MEASUREMENT B_dslvh
"Bedingung Ladedrucksensor vorhanden"
UWORD
B_TRUE
1
100
0.0
255.0
/begin IF_DATA DIM_X
KP_BLOB 0xFD00 INTERN BYTE
/end IF_DATA
/begin IF_DATA MCMESS
KP_BLOB 0xFD00 INTERN
/end IF_DATA
BIT_MASK 0x8000
/end MEASUREMENT
I have rewritten the code so far and everything works except for the ENUMS entry (it does not write ENUMS as a list).
he writes eg the enum mentioned above as a single measured value
(all others under the address will be ignored)
someone an idea? thanks for any hint
#Load a2l = a2l("C:\my.a2l")
import idc
import idaapi
def processrom(min, max):
if min > 0:
min = min - 1
curaddr = idc.FindUnexplored(min, idc.SEARCH_DOWN)
while curaddr < max:
if idc.MakeFunction(curaddr) != True:
idc.MakeCode(curaddr)
curaddr = idc.FindUnexplored(curaddr, idc.SEARCH_DOWN)
return
def a2l(filename):
lastvarname = ""
lastaddress = ""
with open(filename) as fp:
f = fp.read()
measurements = f.split("/begin MEASUREMENT")
measurements.pop(0)
print("Found: %d measurement(s)" % len(measurements))
for m in measurements:
namefound = 0
addrfound = 0
name = ""
addr = ""
is_enum = False
bit_mask = 0
for l in m.split("\n"):
l = l.strip()
if (len(l) > 0):
if (namefound == 0):
name = l
namefound = 1
elif (l.startswith("BIT_MASK")):
is_enum = True
bit_mask = int(l.split(" ")[1], 16)
elif (l.startswith("KP_BLOB")):
#addr = l[12:]
#print(l)
addr = l
addr = addr.replace("EXTERN","")
addr = addr.replace("WORD","")
addr = addr.replace("BYTE","")
addr = addr.replace("LONG","")
addr = addr.replace("DP_BLOB","")
addr = addr.replace("KP_BLOB","")
addr = addr.replace("INDIRECT","")
addr = addr.replace(" ","")
addr = addr.replace("INTERN","")
addr = addr.replace("EXTERN","")
addr = addr.replace("IN","")
addr = addr.replace("DIRECT","")
#print(addr)
addrfound = 1
break
if (addrfound != 1):
print("ERROR")
elif (is_enum):
enum_name = "enum_" + addr[2:]
enum_id = idc.GetEnum(enum_name)
if (enum_id == 4294967295L):
enum_id = idc.AddEnum(-1, enum_name, 0)
idc.OpEnumEx(int(addr, 0), -1, enum_id, 0)
idc.MakeNameEx(int(addr, 0), "", 0)
if (not idc.IsBitfield(enum_id)):
idc.SetEnumBf(enum_id, 1)
idc.AddConstEx(enum_id, name, bit_mask, bit_mask)
else:
idc.MakeNameEx(int(addr, 0), name, 1)
characteristics = f.split("/begin CHARACTERISTIC")
characteristics.pop(0)
print("Found: %d characteristics(s)" % len(characteristics))
for m in characteristics:
namefound = 0
addrfound = 0
name = ""
addr = ""
is_enum = False
bit_mask = 0
for l in m.split("\n"):
l = l.strip()
if (len(l) > 0):
if (namefound == 0):
name = l
namefound = 1
elif (l.startswith("DP_BLOB DIRECT")):
addr = l
addr = addr.replace("DP_BLOB DIRECT","")
#addr = l[18:7]
addrfound = 1
break
if (addrfound != 1):
print("ERROR", name)
else:
idc.MakeUnknown(int(addr, 0), 1, idaapi.DOUNK_SIMPLE)
idc.MakeNameEx(int(addr, 0), name, 1)
return