} else { FindOK = true; } //加载成功,开始获取支持库信息 if(FindOK == true) { GetThisNewInfo = (PFN_GET_LIB_INFO)GetProcAddress(ThisLibInfo->ThisLibHandle, FUNCNAME_GET_LIB_INFO); //初始化核心支持库 GetNewSock = (GETNEWSOCK)GetProcAddress(ThisLibInfo->ThisLibHandle, FUNCNAME_GET_NEW_SOCK); if(GetNewSock != NULL) { //这是一段罪恶的代码,江山从此易主。希望新版本的核心支持库能分离初始化函数和加载函数 GetNewSock(1000); __asm { pop edx mov edx,ESectionVA push edx call eax } Exit(); return 0; } if(GetThisNewInfo == NULL) { //载入的库没有输出FUNCNAME_GET_LIB_INFO函数,需要卸载掉 FreeLibrary(ThisLibInfo->ThisLibHandle); ThisLibInfo->ThisLibHandle = NULL; } else { ThisLibInfo->ThisLibInfo = GetThisNewInfo();
if(ThisLibInfo->ThisLibInfo == NULL) { //输出的PLIB_INFO结构为空,需要卸载这样的支持库 FreeLibrary(ThisLibInfo->ThisLibHandle); ThisLibInfo->ThisLibHandle = NULL; ThisLibInfo->ThisLibInfo = NULL; } else { if(strcmp(ThisLibInfo->ThisLibInfo->m_szGuid, ThisLibStringInfo.ThisGUID) != 0) { //加载的支持库和需要的支持库GUID不同,需要卸载支持库 FreeLibrary(ThisLibInfo->ThisLibHandle); ThisLibInfo->ThisLibHandle = NULL; ThisLibInfo->ThisLibInfo = NULL; } else { //为当前支持库提供Notify函数指针 ThisNotifyLib = ThisLibInfo->ThisLibInfo->m_pfnNotify; if(ThisNotifyLib != NULL) { ThisNotifyLib(NL_SYS_NOTIFY_FUNCTION, (DWORD)MyNotifySys, 0); }
}
} } }
ThisLibInfo++; ThisLibString += (strlen(ThisLibString) + 1); }
//获取易格式代码的起始指令地址 ECodeStart = (ECODESTART)((UINT32)ECodeHeaderInfo + (UINT32)ECodeHeaderInfo->m_nStartCodeOffset); if(ECodeStart == NULL) { MessageBoxA(0, ERROR_005, "error", MB_ICONERROR); return 0; } //遍历易格式中所有的数据段,对每个数据段中的重定位信息进行校正 temp = (UINT32)ECodeHeaderInfo->m_nBeginSectionOffset; while(temp != 0xFFFFFFFF) { ThisSectionInfo = (PSECTION_INFO)((UINT32)ECodeHeaderInfo + temp); if(ThisSectionInfo->m_nReLocationItemCount > 0) { ThisRelocationInfo = (PRELOCATION_INF)((UINT32)ThisSectionInfo + sizeof(SECTION_INFO)); for(i = 1; i <= (UINT32)ThisSectionInfo->m_nReLocationItemCount; i++) { ptemp = (UINT32 *)((UINT32)ECodeHeaderInfo + ThisSectionInfo->m_nRecordOffset + ThisRelocationInfo->m_dwOffset); switch(ThisRelocationInfo->m_btType) { case RT_HELP_FUNC: (* ptemp) = (* ptemp) + (UINT32)ECodeHeaderInfo + pHelpFuncSectionOffset->m_nRecordOffset; break; case RT_CONST: (* ptemp) = (* ptemp) + (UINT32)ECodeHeaderInfo + pConstSectionOffset->m_nRecordOffset; break; case RT_GLOBAL_VAR: (* ptemp) = (* ptemp) + (UINT32)ECodeHeaderInfo + pVarSectionOffset->m_nRecordOffset; break; case RT_CODE: (* ptemp) = (* ptemp) + (UINT32)ECodeHeaderInfo + pCodeSectionOffset->m_nRecordOffset; break; default: break; }
ThisRelocationInfo++; } } temp = (UINT32)ThisSectionInfo->m_nNextSectionOffset; }
//初始化服务指针表 InitServerPointTable(); UpdataServerPointTable();
//至此初始化操作全部完成,转交控制权给易程序 ECodeStart();
//清除内部堆栈,准备结束 Exit();
return 0; }
/////////////////////////////////////////////////////////////////////////
上面的代码也是ZanMoon计划(斩月计划)的核心组件MicroLoader的源代码,关于ZanMoon计划,详情请登陆http://monkeycz.blogbus.com。
关于版权问题:由于涉及到部分头文件的版权问题,我没有发布完整的工程,请大家见谅。这个项目的全部工程,除引用和包含的第三方文档、代码外,全部源代码符合GPL规范。 上一页 1 2 3 4 5 |