安全中国首页 > 文章中心 > 逆向工程技术
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:download.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

易语言核心runtime的loader和部分services的逆向工程

更新时间:2007-12-20 1:03:56
责任编辑:流火
热 点:


    }
    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 

 
相关文章
一日一文章
 
一日一软件
一日一动画