Show / Hide Table of Contents

MSDN.WhiteKnight - Stack Overflow answers

Ответ на "Указатель на тело функции?"

Answer 1005505

Link

как получить указатель на первый байт тела

При наличии полных отладочных символов (компоновка с /DEBUG:FULL для VS 2017+) как-то так:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <windows.h>
#include "DbgHelp.h"
#pragma comment(lib, "Dbghelp.lib")

struct Function {
    const char* name;
    uintptr_t address;
    bool success;
};

BOOL CALLBACK EnumSymProc(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID context) {

    Function* pfstruct = (Function*)context;

    if (strcmp(pSymInfo->Name, pfstruct->name) == 0) {

        pfstruct->address = pSymInfo->Address;      
        pfstruct->success = true;
        return FALSE; //закончить поиск

    }
    return TRUE; //продолжить поиск
}

bool GetFunctionAddress(const char* fname, uintptr_t& resultvar) {

    bool ret;
    Function fstruct;
    fstruct.name = fname;
    fstruct.address = 0;
    fstruct.success = false;

    HANDLE hProcess = GetCurrentProcess(); //текущий процесс
    char Mask[] = "*!"; //искать среди всех модулей
    BOOL status;

    status = SymInitialize(hProcess, NULL, TRUE); //загрузка символов
    if (status == FALSE)
    {
        printf("SymInitialize failed. Error code: %d\n", GetLastError());
        return false;
    }

    //поиск символов
    if (SymEnumSymbols(hProcess, 0, Mask, &EnumSymProc, (void*)&fstruct))
    {
        if (fstruct.success != false) {

            resultvar = fstruct.address; 
            ret = true;
        }
        else {
            printf("Symbol [%s] not found\n", fname);
            ret = false;
        }
    }
    else
    {
        printf("SymEnumSymbols failed. Error code: %d\n", GetLastError());
        ret = false;
    }

    SymCleanup(hProcess);
    return ret;
}

//**********************************

void Func() {
    printf("Hello, World!\n");
}

int main(int argc, char **argv)
{
    uintptr_t p;
    if (GetFunctionAddress("Func", p) != false) {
        //можно привести p к нужному типу и использовать...
    }

    return 0;
}

и почему я получаю указатель на jmp вместо него

Трудно сказать. Скорее всего, вы делаете что-то не то. Обычно, когда необходимо работать с неким куском кода как с машинным кодом, целесообразно реализовать его полностью ассемблерной вставкой, как например здесь. Это гарантирует, что формат машинного кода будет наиболее близок к тому, что вы ожидаете.


Content is retrieved from StackExchange API.

Auto-generated by ruso-archive tools.

Back to top Stack Overflow answers (published from sources in GitHub repository). Copyright (c) 2020, MSDN.WhiteKnight. Content licensed under BSD 3-Clause License.
Generated by DocFX