Особо не вникал, но попытаюсь ответить:
1)Это указатель на функцию, смысл такой, что в си можно сделать указатель на какую-то функцию, а потом переопределить, пример здесь:
https://ru-sfera.org/threads/genera...raja-ispolnjaem-kod-na-letu.3537/#post-144284
В статье, вот переопределение:
temp_LoadLibraryA = (HMODULE (WINAPI *)(LPCSTR))parse_export_table(krnl32, 0x731faae5);
Т.е. реально будет вызываться parse_export_table(krnl32, 0x731faae5);
2)Опять-же особо не вникал, но по тексту это не-что иное, как получение базы kernel32, можно попробовать, как здесь :
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
//х64, проверено, работать будет начиная с xp x64 sp2 до последней win 8.
typedef FARPROC (WINAPI * GetProcAddress_t) (HMODULE, const char *);
struct LDR_MODULE
{
LIST_ENTRY e[3];
HMODULE base;
void *entry;
UINT size;
UNICODE_STRING dllPath;
UNICODE_STRING dllname;
};
int offset = 0x60;
int ModuleList = 0x18;
int ModuleListFlink = 0x18;
int KernelBaseAddr = 0x10;
INT_PTR peb =__readgsqword(offset);
INT_PTR mdllist=*(INT_PTR*)(peb+ ModuleList);
INT_PTR mlink =*(INT_PTR*)(mdllist+ ModuleListFlink);
INT_PTR krnbase=*(INT_PTR*)(mlink+ KernelBaseAddr);
LDR_MODULE *mdl=(LDR_MODULE*)mlink;
do
{
mdl=(LDR_MODULE*)mdl->e[0].Flink;
if(mdl->base!=NULL)
{
if(!lstrcmpiW(mdl->dllname.Buffer,L"kernel32.dll")) //сравниваем имя библиотеки в буфере с необходимым
{
break;
}
}
} while (mlink!=(INT_PTR)mdl);
kernel32base = (HMODULE)mdl->base;
ULONG_PTR base = (ULONG_PTR) kernel32base;
IMAGE_NT_HEADERS * pe = PIMAGE_NT_HEADERS(base + PIMAGE_DOS_HEADER(base)->e_lfanew);
IMAGE_EXPORT_DIRECTORY * exportDir = PIMAGE_EXPORT_DIRECTORY(base + pe->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
DWORD * namePtr = (DWORD *) (base + exportDir->AddressOfNames); // Адрес имен функций.
WORD * ordPtr = (WORD *) (base + exportDir->AddressOfNameOrdinals); //Адрес имени для функции.
for(;_stricmp((const char *) (base +*namePtr), "GetProcAddress"); ++namePtr, ++ordPtr);
DWORD funcRVA = *(DWORD *) (base + exportDir->AddressOfFunctions + *ordPtr * 4);
auto myGetProcAddress = (GetProcAddress_t) (base + funcRVA); //получили адрес GetProcAddress.
Вот ещё статья:
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
На самом деле там разбираться нужно.)))