Пример получения "длинны" инструкции и собственно самой инструкции по указанному адресу.
Использовался "Length Disassembly Engine"(LDE). Гуглим, собираем Lib под свой набор инструментов, либо качаем старый билд([
Ссылки могут видеть только зарегистрированные пользователи. ]) и отключаем "Образ безопасных исключений" ( "/SAFESEH:NO").
подключаем LDE к проекту:
Код:
#ifdef _M_IX86
#pragma comment(lib, "LDE64")
extern "C" size_t __stdcall LDE(const LPVOID lpData, unsigned int size);
#else
#pragma comment(lib, "LDE64x64")
extern "C" size_t __fastcall LDE(const LPVOID lpData, unsigned int size);
#endif
Заводим структуру данных:
Код:
struct _STRUCTINFO
{
struct _INFO
{
uint64_t dwAdress;
size_t sSize;
std::vector<UCHAR> pBYTE;
}INFO;
std::vector<_INFO> vDataInfo;
};
Описываем функцию:
Код:
_STRUCTINFO GetInformation(uint64_t dwAddress)
{
_STRUCTINFO vOut;
for (UCHAR* uBase = (UCHAR*)dwAddress;;)
{
if (uBase[0] == 0xCC)
break;
size_t Size = LDE(uBase, 64);
if (Size == -1 ||
Size == 0)
break;
vOut.INFO.sSize = Size;
vOut.INFO.dwAdress = (uint64_t)uBase;
for (size_t i = 0; i < Size; i++)
vOut.INFO.pBYTE.push_back(uBase[i]);
vOut.vDataInfo.push_back(vOut.INFO);
if (uBase[0] == 0xC3 ||
uBase[0] == 0xC2 ||
uBase[0] == 0xE9)
break;
uBase += Size;
}
return vOut;
}
Применяем:
Код:
_STRUCTINFO pGetOp = GetInformation(Адресс_участка);
const int Len = pGetOp.vDataInfo.front().sSize;
Log(" Adress:: 0x%I64X\n", pGetOp.vDataInfo.front().dwAdress);
Log(" Length:: %d\n", Len);
Log(" Function:: ");
for (size_t i = 0; i < Len; i++)
Log("\\x%02X", pGetOp.vDataInfo.front().pBYTE[i]);
[
Ссылки могут видеть только зарегистрированные пользователи. ]
проверял в Interal, но тут не составит труда дописать пару строк для чтения памяти из внешнего источника)
ЗЫ: Все это конечно можно и по другому организовать(длину инструкции имею ввиду), но это пока самый мало емкий вариант)))