使用IDebugControl :: Disassemble查看子例程的指令

时间:2015-07-28 20:13:37

标签: c++ windows debugging winapi disassembly

所以我试图使用Windows API(DbgEng.h /.lib)'反汇编'用于查看模块中某个功能(我知道是导出的)的指令。但是......它返回了一个意想不到的错误。

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");
}

这是我正在使用的当前代码,这就是它输出的内容:

  

[04:09:56] IDebugControl进程反汇编失败:0x8000FFFF

     

疑难解答信息

     

[04:09:56] | bc函数指针| 0x640FE750

     

[04:09:56] | bc函数字节| 55 8b ec 83 e4 f8 83 ec

任何人都知道我错过了什么导致它抛出该错误? 0x8000FFFF相当于E​​_UNEXPECTED枚举。函数指针有效,字节似乎很好,我丢失了。

提前致谢。

2 个答案:

答案 0 :(得分:0)

我遇到了完全相同的问题。为我修复它的原因只是加载了一个IDebugSymbols接口。 E.g:

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);
    }

我做过那次拆卸工作正常。 (我也使用你正在使用的完全相同的标志进行进程内附加,因为它的价值。)

不知道为什么在MSDN上没有记录这个小小的问题。我只想根据本文中引用的一些伪代码尝试它:https://www.gamedev.net/blog/909/entry-2254516-leveraging-windows-built-in-disassembler/

答案 1 :(得分:0)