📄 peloader.c
字号:
pageOffset = baseReloc->PageRVA - hMod->textBase; numFixups = (baseReloc->BlockSize - sizeof(BASE_RELOCATION)) / sizeof(ushort); fixup = (ushort*)(baseReloc + 1); for (i = 0; i < numFixups; i++) { relocType = *fixup >> 12; if (relocType) { offset = pageOffset + (*fixup & 0x0FFF); *(ulong*)(hMod->text + offset) += delta; } fixup++; } /* Move to next relocation block */ baseReloc = (BASE_RELOCATION*)((ulong)baseReloc + baseReloc->BlockSize); } /* Initialise the C runtime library for the loaded DLL */ result = PE_unableToInitLibC; if ((InitLibC = (InitLibC_t)PE_getProcAddress(hMod,"_InitLibC")) == NULL) goto Error; if (!InitLibC(&___imports,PM_getOSType())) goto Error; /* Clean up, close the file and return the loaded module handle */ PM_free(reloc); result = PE_ok; return hMod;Error: if (shared) PM_freeShared(hMod); else PM_free(hMod); PM_free(reloc); return NULL;}/****************************************************************************DESCRIPTION:Loads a Portable Binary DLL into memoryHEADER:peloader.hPARAMETERS:szDLLName - Name of the PE DLL library to loadshared - True to load module into shared memoryRETURNS:Handle to loaded PE DLL, or NULL on failure.REMARKS:This function loads a Portable Binary DLL library from disk, relocatesthe code and returns a handle to the loaded library. This functionwill only work on DLL's that do not have any imports, since we don'tresolve import dependencies in this function.SEE ALSO:PE_getProcAddress, PE_freeLibrary****************************************************************************/PE_MODULE * PEAPI PE_loadLibrary( const char *szDLLName, ibool shared){ PE_MODULE *hMod;#if (defined(__WINDOWS32__) || defined(__DRIVER__)) && defined(CHECKED) if (!shared) { PM_MODULE hInst; InitLibC_t InitLibC; /* For Win32 if are building checked libraries for debugging, we use * the real Win32 DLL functions so that we can debug the resulting DLL * files with the Win32 debuggers. Note that we can't do this if * we need to load the files into a shared memory context. */ if ((hInst = PM_loadLibrary(szDLLName)) == NULL) { result = PE_fileNotFound; return NULL; } /* Initialise the C runtime library for the loaded DLL */ result = PE_unableToInitLibC; if ((InitLibC = (void*)PM_getProcAddress(hInst,"_InitLibC")) == NULL) return NULL; if (!InitLibC(&___imports,PM_getOSType())) return NULL; /* Allocate the PE_MODULE structure */ if ((hMod = PM_malloc(sizeof(*hMod))) == NULL) return NULL; hMod->text = (void*)hInst; hMod->shared = -1; /* DLL loaded successfully so return module handle */ result = PE_ok; return hMod; } else#endif { FILE *f; ulong size; /* Attempt to open the file on disk */ if (shared < 0) shared = 0; if ((f = fopen(szDLLName,"rb")) == NULL) { result = PE_fileNotFound; return NULL; } hMod = PE_loadLibraryExt(f,0,&size,shared); fclose(f); return hMod; }}/****************************************************************************DESCRIPTION:Loads a Portable Binary DLL into memoryHEADER:peloader.hPARAMETERS:szDLLName - Name of the PE DLL library to loadshared - True to load module into shared memoryRETURNS:Handle to loaded PE DLL, or NULL on failure.REMARKS:This function is the same as the regular PE_loadLibrary function, exceptthat it looks for the drivers in the MGL_ROOT/drivers directory or a/drivers directory relative to the current directory.SEE ALSO:PE_loadLibraryMGL, PE_getProcAddress, PE_freeLibrary****************************************************************************/PE_MODULE * PEAPI PE_loadLibraryMGL( const char *szDLLName, ibool shared){#if !defined(__WIN32_VXD__) && !defined(__NT_DRIVER__) PE_MODULE *hMod;#endif char path[256] = ""; /* We look in the 'drivers' directory, optionally under the MGL_ROOT * environment variable directory. */#if !defined(__WIN32_VXD__) && !defined(__NT_DRIVER__) if (getenv("MGL_ROOT")) { strcpy(path,getenv("MGL_ROOT")); PM_backslash(path); } strcat(path,"drivers"); PM_backslash(path); strcat(path,szDLLName); if ((hMod = PE_loadLibrary(path,shared)) != NULL) return hMod;#endif strcpy(path,"drivers"); PM_backslash(path); strcat(path,szDLLName); return PE_loadLibrary(path,shared);}/****************************************************************************DESCRIPTION:Gets a function address from a Portable Binary DLLHEADER:peloader.hPARAMETERS:hModule - Handle to a loaded PE DLL libraryszProcName - Name of the function to get the address ofRETURNS:Pointer to the function, or NULL on failure.REMARKS:This function searches for the named, exported function in a loaded PEDLL library, and returns the address of the function. If the function isnot found in the library, this function return NULL.SEE ALSO:PE_loadLibrary, PE_freeLibrary****************************************************************************/void * PEAPI PE_getProcAddress( PE_MODULE *hModule, const char *szProcName){#if (defined(__WINDOWS32__) || defined(__DRIVER__)) && defined(CHECKED) if (hModule->shared == -1) return (void*)PM_getProcAddress(hModule->text,szProcName); else#endif { uint i; EXPORT_DIRECTORY *exports; ulong funcOffset; ulong *AddressTable; ulong *NameTable; ushort *OrdinalTable; char *name; /* Find the address of the export tables from the export section */ if (!hModule) return NULL; exports = (EXPORT_DIRECTORY*)(hModule->export + hModule->exportDir); AddressTable = (ulong*)(hModule->export + exports->AddressTableRVA - hModule->exportBase); NameTable = (ulong*)(hModule->export + exports->NameTableRVA - hModule->exportBase); OrdinalTable = (ushort*)(hModule->export + exports->OrdinalTableRVA - hModule->exportBase); /* Search the export name table to find the function name */ for (i = 0; i < exports->NumberOfNamePointers; i++) { name = (char*)(hModule->export + NameTable[i] - hModule->exportBase); if (strcmp(name,szProcName) == 0) break; } if (i == exports->NumberOfNamePointers) return NULL; funcOffset = AddressTable[OrdinalTable[i]]; if (!funcOffset) return NULL; return (void*)(hModule->text + funcOffset - hModule->textBase); }}/****************************************************************************DESCRIPTION:Frees a loaded Portable Binary DLLHEADER:peloader.hPARAMETERS:hModule - Handle to a loaded PE DLL library to freeREMARKS:This function frees a loaded PE DLL library from memory.SEE ALSO:PE_getProcAddress, PE_loadLibrary****************************************************************************/void PEAPI PE_freeLibrary( PE_MODULE *hModule){ TerminateLibC_t TerminateLibC;#if (defined(__WINDOWS32__) || defined(__DRIVER__)) && defined(CHECKED) if (hModule->shared == -1) { /* Run the C runtime library exit code on module unload */ if ((TerminateLibC = (TerminateLibC_t)PM_getProcAddress(hModule->text,"_TerminateLibC")) != NULL) TerminateLibC(); PM_freeLibrary(hModule->text); PM_free(hModule); } else#endif { if (hModule) { /* Run the C runtime library exit code on module unload */ if ((TerminateLibC = (TerminateLibC_t)PE_getProcAddress(hModule,"_TerminateLibC")) != NULL) TerminateLibC(); if (hModule->shared) PM_freeShared(hModule); else PM_free(hModule); } }}/****************************************************************************DESCRIPTION:Returns the error code for the last operationHEADER:peloader.hRETURNS:Error code for the last operation.SEE ALSO:PE_getProcAddress, PE_loadLibrary****************************************************************************/int PEAPI PE_getError(void){ return result;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -