2015-07-28 3 views
2

Итак, я пытаюсь использовать функцию API для Windows API (DbgEng.h /.lib) «дизассемблировать» для просмотра инструкций определенной функции (которую я знаю экспортируется) в модуль. Однако ... Это возвращает непредвиденную ошибку.Использование IDebugControl :: Disassemble для просмотра инструкций подпрограммы

IDebugClient* clt; 
IDebugControl* ctrl; 

void InitializeInterfaces(void) 
{ 
    HRESULT status; 

    if ((status = DebugCreate(__uuidof(IDebugClient), (void**)&clt)) != S_OK) { 
     Utils::add_log("IDebugClient DebugCreate failed: 0x%X\n", status); 
    } 

    clt->AttachProcess(NULL, GetProcessId(GetCurrentProcess()), DEBUG_ATTACH_NONINVASIVE | DEBUG_ATTACH_NONINVASIVE_NO_SUSPEND); 

    if ((status = clt->QueryInterface(__uuidof(IDebugControl), (void**)&ctrl)) != S_OK) { 
     Utils::add_log("IDebugControl QueryInterface failed: 0x%X\n", status); 
    } 
} 

void print_bytes(const void *object, size_t size, const char* funcname) 
{ 
    size_t i; 
    Utils::add_log("|%s function bytes| ", funcname); 

    for (i = 0; i < size; i++) 
    { 
     Utils::add_log_raw("%02x ", ((const unsigned char *)object)[i] & 0xff); 
    } 

    Utils::add_log_raw("\n"); 
} 

void main() 
{ 
    InitializeInterfaces(); 

    ULONG64 bc = (ULONG64)GetProcAddress(GetModuleHandleA("lua_shared.dll"), "luaL_loadbufferx"); 

    PSTR buff; 
    HRESULT size = ctrl->Disassemble(bc, DEBUG_DISASM_EFFECTIVE_ADDRESS, (PSTR)&buff, 16, NULL, NULL); 

    //error catching incase the disassemble fails (which it does fuck -___-) 
    if (size == S_OK) { 
     Utils::add_log("%s", buff); 
    } 
    else if (size == S_FALSE) { 
     Utils::add_log("[error] buffer too small to recieve proccess instructions"); 
    } 
    else { 
     Utils::add_log("IDebugControl process disassemble failed: 0x%X\n", size); 
    } 

    //troubleshooting 
    Utils::add_log_raw("\nTROUBLESHOOTING INFO\n"); 
    Utils::add_log("|bc function pointer| 0x%p\n", bc); 
    print_bytes((const void*)bc, sizeof bc, "bc"); 
} 

Это текущий код, я использую, и это то, что он выводит:

[4:09:56] IDebugControl процесс разборки не удалось: 0x8000FFFF

НЕИСПРАВНОСТЕЙ INFO

[04:09:56] | указатель функции bc | 0x640FE750

[04:09:56] | bc function bytes | 55 8b ec 83 e4 f8 83 ec

Кто-нибудь знает, чего мне не хватает, чтобы заставить его выбросить эту ошибку? 0x8000FFFF эквивалентно перечислению E_UNEXPECTED. Указатель функции действителен, байты кажутся точными, я потерян.

Заранее спасибо.

+0

Вы передаете NULL для последнего аргумента (EndOffset), но документы не говорят, что это необязательно. –

+0

Я добавил аргумент для последнего параметра - «\t HRESULT size = ctrl-> Disassemble (bc, DEBUG_DISASM_EFFECTIVE_ADDRESS, (PSTR) & buff, 16, NULL, (PULONG64) & endOffset);", он все еще, кажется, терпит неудачу. –

+0

Попробуйте установить флаги в 0 вместо DEBUG_DISASM_EFFECTIVE_ADDRESS (похоже, что это используется только при фактической отладке процесса). –

ответ

0

Я столкнулся с тем же вопросом. Для меня это было просто загрузка интерфейса IDebugSymbols. Например:

IDebugClient* clt; 
IDebugControl* ctrl; 
IDebugSymbols* symbols; 

void InitializeInterfaces(void) 
{ 
    HRESULT status; 

    if ((status = DebugCreate(__uuidof(IDebugClient), (void**)&clt)) != S_OK) { 
     Utils::add_log("IDebugClient DebugCreate failed: 0x%X\n", status); 
    } 

    clt->AttachProcess(NULL, GetProcessId(GetCurrentProcess()), DEBUG_ATTACH_NONINVASIVE | DEBUG_ATTACH_NONINVASIVE_NO_SUSPEND); 

    if ((status = clt->QueryInterface(__uuidof(IDebugControl), (void**)&ctrl)) != S_OK) { 
     Utils::add_log("IDebugControl QueryInterface failed: 0x%X\n", status); 
    } 

    if ((status = clt->QueryInterface(__uuidof(IDebugSymbols), (void**)&symbols)) != S_OK) { 
     Utils::add_log("IDebugSymbols QueryInterface failed: 0x%X\n", status); 
    } 

Как только я сделал эту разборку, все было в порядке. (Я также делал прикрепление в proc с теми же флагами, которые вы использовали, для чего это стоит.)

Не знаю, почему этот маленький лакомый кусочек не документирован на MSDN. Я только думал попробовать его на основе некоторого псевдокода, на который ссылается в этой статье: https://www.gamedev.net/blog/909/entry-2254516-leveraging-windows-built-in-disassembler/

 Смежные вопросы

  • Нет связанных вопросов^_^