Friday, July 22, 2011

А тем временем на фронте дизассемблирования

Новости проекта Diana-Dasm:
1) на текущий момент поддерживается 438 команд (734 опкода): всяческие i386, amd64, fpu, sse, mmx и прочая, прочая, прочая;
2) доступна альфа версия виртуального процессора для i386. Вот этот кусок кода выводит 100 раз фразу hello, world:
#include "test_win32_common.h"

static char g_stack[1024*1024];
static void * g_oldESP = 0;

void __cdecl test_function()
{
for(int i = 0; i< 100; ++i)
std::cout<<"hello, world!";
}

void test_processor2()
{
// create processor
DianaWin32Processor proc;

TEST_ASSERT(DianaWin32Processor_Init(&proc)==DI_SUCCESS);

// load current thread context to the virtual processor
DianaProcessor * pCallContext = &proc.m_processor;
DianaProcessor_LoadLiveContext32(pCallContext);

// set new EIP
DI_JUMP_TO_RIP((OPERAND_SIZE)(void*)test_function);

// and new stack
SET_REG_RSP((OPERAND_SIZE)g_stack + sizeof(g_stack));

// push return code
OPERAND_SIZE exitOp = 0x87654321;
diana_internal_push(pCallContext, &exitOp);

// execute function!
for(int i = 0; ; ++i)
{
OPERAND_SIZE rip = GET_REG_RIP;
if (rip == exitOp)
break;

TEST_ASSERT(DianaProcessor_ExecOnce(pCallContext) == DI_SUCCESS);
}
}
_Winnie C++ Colorizer

Я страшно доволен
3) первоначальные принипы проекта все соблюдаются: только pure C, никаких требований к рантайму, все на стримах, все легко использовать в ядре, лицензия BSD

2 comments:

redp said...

а вот эта твоя штука умеет например такое:
есть некий хук в kernel mode (32 & 64 бит), который делает jmp в non-paged память
где могут быть всякие разные инструкции, но в результате они все равно должны передать управление куда-то еще
нужно найти адрес этого "еще"
?

ligen said...

да, можно это сделать причем разными способами. в текущем примере "виртуальный процессор" модифицирует память так же как и настоящий, иначе API функцию из user-mode не вызвать. А в ядре ничто не мешает и память полностью виртуализировать