自己实现GetProcAddress
2010-05-20 01:47
495 查看
不必多说! 自己看看PE文件格式详解就明白了。! |
FARPROC _GetProcAddress( HMODULE hModule, // handle to DLL module LPCSTR lpProcName // function name ) { DWORD mzbase , oldprotect , dwsize , i , dwFileOffset; WORD wOrdinals = 0; long delta , dwOffset ; PIMAGE_DOS_HEADER m_pDosHeader; PIMAGE_OPTIONAL_HEADER m_pOptionHeader; PIMAGE_FILE_HEADER m_pFileHeader = 0; PIMAGE_SECTION_HEADER m_pSectionHeader[64]; mzbase = (DWORD)hModule; // hModule实际就是基地址,查看hModule的内存值,就会发现熟悉的MZ PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS) ( mzbase + pDosHeader->e_lfanew ); PBYTE m_pFileBuf = (PBYTE) mzbase; m_pDosHeader = ( PIMAGE_DOS_HEADER ) mzbase; m_pFileHeader = (PIMAGE_FILE_HEADER) (m_pFileBuf + m_pDosHeader->e_lfanew+4); m_pOptionHeader = (PIMAGE_OPTIONAL_HEADER)( mzbase + m_pDosHeader->e_lfanew + 4 + sizeof( IMAGE_FILE_HEADER ) ); dwFileOffset = (DWORD)(m_pDosHeader->e_lfanew + sizeof( IMAGE_NT_HEADERS )); ZeroMemory(m_pSectionHeader, sizeof(PIMAGE_SECTION_HEADER)*m_pFileHeader->NumberOfSections); for( i=0; i < m_pFileHeader->NumberOfSections; i++ ) { m_pSectionHeader[i] = (PIMAGE_SECTION_HEADER)(m_pFileBuf + dwFileOffset); dwFileOffset += sizeof(IMAGE_SECTION_HEADER); } PIMAGE_EXPORT_DIRECTORY pExportD=NULL; pExportD = (PIMAGE_EXPORT_DIRECTORY)((DWORD) mzbase + pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); delta = pExportD->NumberOfFunctions; for ( UINT j=0 ; j < pExportD->NumberOfNames; j++) { DWORD dwAdName = pExportD>AddressOfNames + mzbase+j*4; dwAdName = *(DWORD*)dwAdName + mzbase; if ( lstrcmpi((char*)dwAdName,lpProcName)==0){ DWORD dwOffsetOrdinal = pExportD->AddressOfNameOrdinals + mzbase + (j<<1) ; WORD widx = *(WORD*)(dwOffsetOrdinal); DWORD dwFun = pExportD->AddressOfFunctions + mzbase + widx*4; dwFun = *(DWORD*)dwFun + mzbase; return (FARPROC)dwFun; } } return 0; } |
如此一来,不需要知道kernel32.dll也可以实现GetProcAddress的功能了。纯属个人娱乐。 |
相关文章推荐
- 实现GetProcAddress
- WinAPI: GetProcAddress 自实现
- GetProcAddress函数实现和分析
- CodeZap实现GetProcAddress 免杀
- 自己实现简单Web服务器,支持GET POST请求
- GetProcAddress用法
- GetProcAddress(转)
- 根据PE文件格式获取LoadLibraryA()/GetProcAddress()地址
- 【Windows API学习】GetProcAddress学习
- GetProcAddress的二分查找
- 使用函数GetProcAddress( )在纯C环境下调用动态链接库的一点心得...
- 函数说明(LoadLibrary 、GetProcAddress、FreeLibrary) 08.10.31
- [Windows编程] 使用API函数GetProcAddress的注意事项
- GetProcAddress函数用法
- dll的输出函数使用__stdcall调用约定后,客户端用GetProcAddress出现的问题!
- 动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
- C#【异常处理】调用dll。GetProcAddress 托管的 PInvoke 签名与非托管的目标签名不匹配?
- 自己动手写Redis客户端(C#实现)3 - GET请求和批量回复
- GetProcAddress来自msdn 2010-7-12 15:17
- GetProcAddress函数