PDA

Просмотр полной версии : [C/C++] OppCode Info



qazwar
05.06.2016, 08:34
Для общего развития:

Пример получения "длинны" инструкции и собственно самой инструкции по указанному адресу.
Использовался "Length Disassembly Engine"(LDE). Гуглим, собираем Lib под свой набор инструментов, либо качаем старый билд(например отсюда (You can see links before reply)) и отключаем "Образ безопасных исключений" ( "/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]);


You can see links before reply

проверял в Interal, но тут не составит труда дописать пару строк для чтения памяти из внешнего источника)


ЗЫ: Все это конечно можно и по другому организовать(длину инструкции имею ввиду), но это пока самый мало емкий вариант)))

VDV
06.06.2016, 11:38
Не пойму, где это пригодится...
пы.сы. код для новичков сложноват, мягко сказано как, можно просто пройтись по адресу влево или право "побайтово" (BYTE*)0x123456789[0,1,2...etc], если нужно то по 4 бит (WORD*)0x123456789[0,1,2...etc] или побитово "~=" "^=" - и так же определить длину инструкции...

grees
09.06.2016, 21:46
Не пойму, где это пригодится...Например плагин для CE SignatureMaker или какие нибудь задачи для анализа кода.
По поводу сложности, не разбирался, но по моему тоже самое умеет disasm() из ADE32 (кстати, где-то тут qazwar выкладывал свою версию ADE32.h).
Но опять же, в самом начале все написано - Для общего развития