Ejemplo n.º 1
0
void make_vtbl_entry(ea_t ea)
{
  ea_t ref;
  do_unknown_range(ea, sizeof(ea), false);
#ifdef __EA64__
  doQwrd(ea, sizeof(ea));
  ref = get_long(ea);
#else
  doDwrd(ea, sizeof(ea));
  ref = get_qword(ea);
#endif /* __EA64__ */
  do_dref(ea, ref);
}
Ejemplo n.º 2
0
//--------------------------------------------------------------------------
bool doPtr(ea_t ea)
{
  bool ok = ptrSz == 4 ? doDwrd(ea, 4) : doQwrd(ea, 8);
  return ok && set_offset(ea, 0, 0);
}
Ejemplo n.º 3
0
BOOL get_vtbl_info(ea_t ea_address, VTBL_info_t &vtbl_info)
{
	flags_t flags = getFlags(ea_address);
	if (!(hasRef(flags) || has_any_name(flags) && (isDwrd(flags) || isUnknown(flags))))
		return(FALSE);
	else
	{
		BOOL is_move_xref = FALSE;
		ea_t ea_code_ref = get_first_dref_to(ea_address);
		if (ea_code_ref && (ea_code_ref != BADADDR))
		{
			do
			{
				if (isCode(getFlags(ea_code_ref)))
				{
					LPCTSTR disasm_line = get_text_disasm(ea_code_ref);
#ifndef __EA64__
					if ((*((PUINT)disasm_line) == 0x20766F6D /*"mov "*/) && (strstr(disasm_line + 4, " offset ") != NULL))
#else
					if ((*((PUINT)disasm_line) == 0x2061656c /*"lea "*/) && (strstr(disasm_line + 4, "rcx") != NULL) && (strstr(disasm_line + 4, "const") != NULL))
#endif
					{
						is_move_xref = TRUE;
						break;
					}
				}

				ea_code_ref = get_next_dref_to(ea_address, ea_code_ref);

			} while (ea_code_ref && (ea_code_ref != BADADDR));
		}
		if (!is_move_xref)
			return(FALSE);

		ZeroMemory(&vtbl_info, sizeof(VTBL_info_t));

		// get_name(BADADDR, ea_address, vtbl_info.vtbl_name, (MAXSTR - 1));
		f_get_ea_name(&vtbl_info.vtbl_name, ea_address);
		ea_t ea_start = vtbl_info.ea_begin = ea_address;
		while (TRUE)
		{
			flags_t index_flags = getFlags(ea_address);
#ifndef __EA64__
			if (!(hasValue(index_flags) && (isDwrd(index_flags) || isUnknown(index_flags))))
#else
			if (!(hasValue(index_flags) && (isQwrd(index_flags) || isUnknown(index_flags)))) 
#endif
				break;
#ifndef __EA64__
			ea_t ea_index_value = get_32bit(ea_address);
#else
			ea_t ea_index_value = get_64bit(ea_address);
#endif

			if (!(ea_index_value && (ea_index_value != BADADDR)))
				break;

			if (ea_address != ea_start)
				if (hasRef(index_flags))
					break;

			flags_t value_flags = getFlags(ea_index_value);
			if (!isCode(value_flags))
				break;
			else
				if (isUnknown(index_flags))
#ifndef __EA64__
					doDwrd(ea_address, sizeof(DWORD));
			ea_address += sizeof(UINT);
#else
					doQwrd(ea_address, sizeof(UINT64));
			ea_address += sizeof(UINT64);
#endif
		};
#ifndef __EA64__
		if ((vtbl_info.methods = ((ea_address - ea_start) / sizeof(UINT))) > 0)
#else
		if((vtbl_info.methods = ((ea_address - ea_start) / sizeof(UINT64))) > 0)
#endif
		{
			vtbl_info.ea_end = ea_address;
			return(TRUE);
		}
		else
			return(FALSE);
	}
}