MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Указатель на тело функции?"
Answer 1005505
как получить указатель на первый байт тела
При наличии полных отладочных символов (компоновка с
/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.