Новости проекта
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:
а вот эта твоя штука умеет например такое:
есть некий хук в kernel mode (32 & 64 бит), который делает jmp в non-paged память
где могут быть всякие разные инструкции, но в результате они все равно должны передать управление куда-то еще
нужно найти адрес этого "еще"
?
да, можно это сделать причем разными способами. в текущем примере "виртуальный процессор" модифицирует память так же как и настоящий, иначе API функцию из user-mode не вызвать. А в ядре ничто не мешает и память полностью виртуализировать
Post a Comment