I'm trying to add a dynamic import segment in the IDA database which contains functions names, and I'm applying type information to it, so that I can obtain argument locations by using apply_callee_tinfo
when I found a call to this dynamic imported function.
While I'm testing I found that for some of the declarations, the argument or return type is not able to identify. The IDA is giving a numeric type.
The code used is
def add_from_declaration(declarations):
dyn_imp_seg_loc = 0x10000
dyn_imp_seg_loc_end = 0x10000 + len(declarations.keys()) * 4
idaapi.add_segm(0, dyn_imp_seg_loc, dyn_imp_seg_loc_end, "DYN_IMP", "XTRN")
t_loc = dyn_imp_seg_loc
not_applied = []
for proc_name in declarations:
decl = str(declarations[proc_name])
print(decl)
try:
name, types, fields = idc.ParseType(decl, 0)
success = idc.MakeName(t_loc, str(proc_name))
t = idaapi.tinfo_t()
til = idaapi.til_t()
t.deserialize(til, types, fields)
if success:
idc.MakeDword(t_loc)
success = idaapi.apply_tinfo(t_loc, t, 1)
if not success:
not_applied.append(proc_name)
except Exception:
continue
finally:
t_loc = t_loc + 4
return not_applied
declarations
is a dict with key as the function name and value as the declaration.
What am I doing wrong in this?
Edit: My approach is based on the answers provided in this thread, In IDA, is there a way to add a reference to a dynamically imported function into the Imports tab?. My problem is not with adding import segment or creating cross references. But I'm unable to add type information to a name.
As you can see from the image, I'm trying to apply declaration BOOL __stdcall ReleaseMutex(HANDLE a0);
at location 0x10000 which is named ReleaseMutex
, but IDA is not able to identify BOOL
and HANDLE
structures even after parsing the declaration successfully.