Итак, я пытаюсь использовать функцию 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. Указатель функции действителен, байты кажутся точными, я потерян.
Заранее спасибо.
Вы передаете NULL для последнего аргумента (EndOffset), но документы не говорят, что это необязательно. –
Я добавил аргумент для последнего параметра - «\t HRESULT size = ctrl-> Disassemble (bc, DEBUG_DISASM_EFFECTIVE_ADDRESS, (PSTR) & buff, 16, NULL, (PULONG64) & endOffset);", он все еще, кажется, терпит неудачу. –
Попробуйте установить флаги в 0 вместо DEBUG_DISASM_EFFECTIVE_ADDRESS (похоже, что это используется только при фактической отладке процесса). –