DWORD MyGetProAddress( HMODULE phModule,char* pProcName ) { if (!phModule) return 0; PIMAGE_DOS_HEADER pimDH = (PIMAGE_DOS_HEADER)phModule; PIMAGE_NT_HEADERS pimNH = (PIMAGE_NT_HEADERS)((char*)phModule+pimDH->e_lfanew); PIMAGE_EXPORT_DIRECTORY pimED = (PIMAGE_EXPORT_DIRECTORY)((DWORD)phModule+pimNH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); DWORD pExportSize = pimNH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size; DWORD pResult = 0; if ((DWORD)pProcName < 0x10000) { if ((DWORD)pProcName >= pimED->NumberOfFunctions+pimED->Base || (DWORD)pProcName < pimED->Base) return 0; pResult = (DWORD)phModule+((DWORD*)((DWORD)phModule+pimED->AddressOfFunctions))[(DWORD)pProcName-pimED->Base]; } else { DWORD* pAddressOfNames = (DWORD*)((DWORD)phModule+pimED->AddressOfNames); for (unsigned long i=0;i < pimED->NumberOfNames ; i++) { char* pExportName = (char*)(pAddressOfNames[i]+(DWORD)phModule); //if (pExportName[0]=='L') { if (Mystrcmp(pProcName,pExportName) == 0) { WORD* pAddressOfNameOrdinals = (WORD*)((DWORD)phModule+pimED->AddressOfNameOrdinals); pResult = (DWORD)phModule+((DWORD*)((DWORD)phModule+pimED->AddressOfFunctions))[pAddressOfNameOrdinals[i]]; break; } } } } if (pResult != 0 && pResult >= (DWORD)pimED && pResult < (DWORD)pimED+pExportSize) { char* pDirectStr = (char*)pResult; BOOL pstrok = FALSE; while (*pDirectStr) { if (*pDirectStr == '.') { pstrok = TRUE; break; } pDirectStr++; } if (!pstrok) return 0; char pdllname[MAX_PATH]; int pnamelen = pDirectStr - (char*)pResult; if (pnamelen <= 0) return 0; memcpy(pdllname,(char*)pResult,pnamelen); pdllname[pnamelen] = 0; HMODULE phexmodule = GetModuleHandle(pdllname); pResult = MyGetProAddress(phexmodule,pDirectStr+1); } return pResult; }
int main() { char szText[64] = "Hello world!"; char szText2[64] = {0}; printf("%d\r\n", Mystrlen(szText)); Mystrcpy(szText2, szText); printf("%s\r\n", szText2); Mystcat(szText2, "1234"); printf("%s\r\n", szText2); printf("%d\r\n", Mystrcmp("abc", "aBc")); return 0; }