int Monitor::FromTextMap(STRINGMAP &strmap) { svutil::word *pstr=NULL; pstr=strmap.find("MonitorID"); if(pstr==NULL) return false; strcpy(m_MonitorID,(*pstr).getword()); pstr=strmap.find("RunInProcess"); if(pstr!=NULL) { m_isRunInProcess=strcmp((*pstr).getword(),"true")==0; } pstr=strmap.find("TaskType"); if(pstr!=NULL) { m_TaskType=atoi((*pstr).getword()); } pstr=strmap.find("LastState"); if(pstr!=NULL) { m_LastState=atoi((*pstr).getword()); } pstr=strmap.find("beginTDTime"); time_t tm=0; if(pstr!=NULL) { tm=(time_t)_atoi64((*pstr).getword()); m_beginTDTime=svutil::TTime(tm); } pstr=strmap.find("endTDTime"); if(pstr!=NULL) { tm=(time_t)_atoi64((*pstr).getword()); m_endTDTime=svutil::TTime(tm); } pstr=strmap.find("isTempDisable"); if(pstr!=NULL) { m_isTempDisable=strcmp((*pstr).getword(),"true")==0; } pstr=strmap.find("isDisable"); if(pstr!=NULL) { m_isDisable=strcmp((*pstr).getword(),"true")==0; } pstr=strmap.find("NextRunTime"); if(pstr!=NULL) { tm=(time_t)_atoi64((*pstr).getword()); m_NextRunTime=svutil::TTime(tm); } pstr=strmap.find("MonitorType"); if(pstr!=NULL) { m_MonitorType=atoi((*pstr).getword()); } pstr=strmap.find("Library"); if(pstr==NULL) { return false; } m_Library=(*pstr).getword(); pstr=strmap.find("Process"); if(pstr==NULL) { return false; } m_Process=(*pstr).getword(); pstr=strmap.find("EntityType"); if(pstr==NULL) { return false; } strcpy(m_EntityType,(*pstr).getword()); pstr=strmap.find("Frequency"); if(pstr==NULL) { return false; } m_Frequency=atoi((*pstr).getword()); pstr=strmap.find("ErrorFreq"); if(pstr!=NULL) { m_ErrorFreq=atoi((*pstr).getword()); } pstr=strmap.find("CheckError"); if(pstr!=NULL) { m_CheckError=strcmp((*pstr).getword(),"true")==0; } pstr=strmap.find("MonitorClass"); if(pstr==NULL) { return false; } m_MonitorClass=(*pstr).getword(); pstr=strmap.find("TaskName"); if(pstr!=NULL) { m_TaskName=(*pstr).getword(); } if(m_StateConditions[0]!=NULL) delete m_StateConditions[0]; StateCondition *psc=new StateCondition(); if(psc==NULL) return false; if((pstr=strmap.find("StateCondition_Error_Type"))==NULL) { delete psc; return false; } psc->m_Type=(StateCondition::econ)atoi((*pstr).getword()); if((pstr=strmap.find("StateCondition_Error_Expression"))==NULL) { delete psc; return false; } psc->m_Expression=(*pstr).getword(); int n=0; if((pstr=strmap.find("StateCondition_Error_ItemSize"))==NULL) { delete psc; return false; } n=atoi((*pstr).getword()); int i=0; StateConditionItem *psct=NULL; char bkey[250]={0}; if(n>0) { for(i=0;i<n;i++) { psct=new StateConditionItem(); sprintf(bkey,"StateCondition_Error_Item_%d_ItemID",i); if((pstr=strmap.find(bkey))==NULL) { delete psct; delete psc; return false; } psct->m_ItemID=atoi((*pstr).getword()); sprintf(bkey,"StateCondition_Error_Item_%d_ParamName",i); if((pstr=strmap.find(bkey))==NULL) { delete psct; delete psc; return false; } psct->m_ParamName=(*pstr).getword(); sprintf(bkey,"StateCondition_Error_Item_%d_Operator",i); if((pstr=strmap.find(bkey))==NULL) { delete psct; delete psc; return false; } strcpy(psct->m_Operator,(*pstr).getword()); sprintf(bkey,"StateCondition_Error_Item_%d_ParamValue",i); if((pstr=strmap.find(bkey))==NULL) { delete psct; delete psc; return false; } psct->m_ParamValue=(*pstr).getword(); psc->m_ConditionList.push_back(psct); } } m_StateConditions[0]=psc; if(m_StateConditions[1]!=NULL) delete m_StateConditions[1]; psc=new StateCondition(); if(psc==NULL) return false; if((pstr=strmap.find("StateCondition_Warning_Type"))==NULL) { delete psc; return false; } psc->m_Type=(StateCondition::econ)atoi((*pstr).getword()); if((pstr=strmap.find("StateCondition_Warning_Expression"))==NULL) { delete psc; return false; } psc->m_Expression=(*pstr).getword(); n=0; if((pstr=strmap.find("StateCondition_Warning_ItemSize"))==NULL) { delete psc; return false; } n=atoi((*pstr).getword()); i=0; psct=NULL; memset(bkey,0,250); if(n>0) { for(i=0;i<n;i++) { psct=new StateConditionItem(); sprintf(bkey,"StateCondition_Warning_Item_%d_ItemID",i); if((pstr=strmap.find(bkey))==NULL) { delete m_StateConditions[0]; delete psct; delete psc; return false; } psct->m_ItemID=atoi((*pstr).getword()); sprintf(bkey,"StateCondition_Warning_Item_%d_ParamName",i); if((pstr=strmap.find(bkey))==NULL) { delete m_StateConditions[0]; delete psct; delete psc; return false; } psct->m_ParamName=(*pstr).getword(); sprintf(bkey,"StateCondition_Warning_Item_%d_Operator",i); if((pstr=strmap.find(bkey))==NULL) { delete m_StateConditions[0]; delete psct; delete psc; return false; } strcpy(psct->m_Operator,(*pstr).getword()); sprintf(bkey,"StateCondition_Warning_Item_%d_ParamValue",i); if((pstr=strmap.find(bkey))==NULL) { delete m_StateConditions[0]; delete psct; delete psc; return false; } psct->m_ParamValue=(*pstr).getword(); psc->m_ConditionList.push_back(psct); } } m_StateConditions[1]=psc; if(m_StateConditions[2]!=NULL) delete m_StateConditions[2]; psc=new StateCondition(); if(psc==NULL) return false; if((pstr=strmap.find("StateCondition_Normal_Type"))==NULL) { delete psc; return false; } psc->m_Type=(StateCondition::econ)atoi((*pstr).getword()); if((pstr=strmap.find("StateCondition_Normal_Expression"))==NULL) { delete psc; return false; } psc->m_Expression=(*pstr).getword(); n=0; if((pstr=strmap.find("StateCondition_Normal_ItemSize"))==NULL) { delete psc; return false; } n=atoi((*pstr).getword()); i=0; psct=NULL; memset(bkey,0,250); if(n>0) { for(i=0;i<n;i++) { psct=new StateConditionItem(); sprintf(bkey,"StateCondition_Normal_Item_%d_ItemID",i); if((pstr=strmap.find(bkey))==NULL) { delete m_StateConditions[0]; delete m_StateConditions[1]; delete psct; delete psc; return false; } psct->m_ItemID=atoi((*pstr).getword()); sprintf(bkey,"StateCondition_Normal_Item_%d_ParamName",i); if((pstr=strmap.find(bkey))==NULL) { delete m_StateConditions[0]; delete m_StateConditions[1]; delete psct; delete psc; return false; } psct->m_ParamName=(*pstr).getword(); sprintf(bkey,"StateCondition_Normal_Item_%d_Operator",i); if((pstr=strmap.find(bkey))==NULL) { delete m_StateConditions[0]; delete m_StateConditions[1]; delete psct; delete psc; return false; } strcpy(psct->m_Operator,(*pstr).getword()); sprintf(bkey,"StateCondition_Normal_Item_%d_ParamValue",i); if((pstr=strmap.find(bkey))==NULL) { delete m_StateConditions[0]; delete m_StateConditions[1]; delete psct; delete psc; return false; } psct->m_ParamValue=(*pstr).getword(); psc->m_ConditionList.push_back(psct); } } m_StateConditions[2]=psc; if((pstr=strmap.find("ReturnList_Size"))==NULL) { delete m_StateConditions[0]; delete m_StateConditions[1]; delete m_StateConditions[2]; return false; } n=atoi((*pstr).getword()); if(n<=0) { delete m_StateConditions[0]; delete m_StateConditions[1]; delete m_StateConditions[2]; return false; } ReturnData *prd=NULL; memset(bkey,0,250); for(i=0;i<n;i++) { prd=new ReturnData(); sprintf(bkey,"ReturnItem_%d_Type",i); if((pstr=strmap.find(bkey))==NULL) { delete m_StateConditions[0]; delete m_StateConditions[1]; delete m_StateConditions[2]; delete prd; return false; } strcpy(prd->m_Type,(*pstr).getword()); sprintf(bkey,"ReturnItem_%d_Unit",i); if((pstr=strmap.find(bkey))==NULL) { delete m_StateConditions[0]; delete m_StateConditions[1]; delete m_StateConditions[2]; delete prd; return false; } strcpy(prd->m_Unit,(*pstr).getword()); sprintf(bkey,"ReturnItem_%d_Name",i); if((pstr=strmap.find(bkey))==NULL) { delete m_StateConditions[0]; delete m_StateConditions[1]; delete m_StateConditions[2]; delete prd; return false; } prd->m_Name=(*pstr).getword(); sprintf(bkey,"ReturnItem_%d_Label",i); if((pstr=strmap.find(bkey))==NULL) { delete m_StateConditions[0]; delete m_StateConditions[1]; delete m_StateConditions[2]; delete prd; return false; } prd->m_Label=(*pstr).getword(); m_ReturnList.push_back(prd); } if((pstr=strmap.find("ParamList_Size"))==NULL) { delete m_StateConditions[0]; delete m_StateConditions[1]; delete m_StateConditions[2]; return false; } n=atoi((*pstr).getword()); string str=""; memset(bkey,0,250); for(i=0;i<n;i++) { sprintf(bkey,"ParamList_Item_%d",i); if((pstr=strmap.find(bkey))==NULL) { delete m_StateConditions[0]; delete m_StateConditions[1]; delete m_StateConditions[2]; return false; } m_ParamList.push_back((*pstr).getword()); } return true; }
bool Groups::FromTextMap(STRINGMAP &strmap) { svutil::word *pstr=NULL; if((pstr=strmap.find("seid"))!=NULL) { if(strlen(pstr->getword())>=10) return false; strcpy(m_SEID,pstr->getword()); } int n=0; if((pstr=strmap.find("GroupListSize"))==NULL) { return false; } n=atoi(pstr->getword()); int i=0; char bkey[256]={0}; GroupsItem *pitem=NULL; for(i=0;i<n;i++) { pitem=new GroupsItem(); if(pitem==NULL) return false; sprintf(bkey,"Groups_Item_GroupID_%d",i); if((pstr=strmap.find(bkey))==NULL) { delete pitem; return false; } pitem->SetGroupID(pstr->getword()); sprintf(bkey,"Groups_Item_ParentID_%d",i); if((pstr=strmap.find(bkey))==NULL) { delete pitem; return false; } pitem->SetParentID(pstr->getword()); sprintf(bkey,"Groups_Item_DependSon_%d",i); if((pstr=strmap.find(bkey))==NULL) { delete pitem; return false; } pitem->SetDepedSon(pstr->getword()); sprintf(bkey,"Groups_Item_DependsCondition_%d",i); if((pstr=strmap.find(bkey))==NULL) { delete pitem; return false; } pitem->SetDependsCondition(atoi(pstr->getword())); m_GroupsList.push_back(pitem); } if((pstr=strmap.find("EntityListSize"))==NULL) { return false; } n=atoi(pstr->getword()); memset(bkey,0,256); Entity *pentity=NULL; for(i=0;i<n;i++) { pentity= new Entity(); sprintf(bkey,"Entitys_Item_MonitorTypeCount_%d",i); if((pstr=strmap.find(bkey))==NULL) { delete pentity; return false; } pentity->SetMonitorTypeCount(atoi(pstr->getword())); sprintf(bkey,"Entitys_Item_EntityID_%d",i); if((pstr=strmap.find(bkey))==NULL) { delete pentity; return false; } pentity->SetEntityID(pstr->getword()); sprintf(bkey,"Entitys_Item_SystemType_%d",i); if((pstr=strmap.find(bkey))==NULL) { delete pentity; return false; } pentity->SetSystemType(pstr->getword()); sprintf(bkey,"Entitys_Item_IPAdress_%d",i); if((pstr=strmap.find(bkey))==NULL) { delete pentity; return false; } pentity->SetIPAdress(pstr->getword()); sprintf(bkey,"Entitys_Item_Depend_%d",i); if((pstr=strmap.find(bkey))==NULL) { delete pentity; return false; } pentity->SetDepend(pstr->getword()); sprintf(bkey,"Entitys_Item_DependsCondition_%d",i); if((pstr=strmap.find(bkey))==NULL) { delete pentity; return false; } pentity->SetDependsCondition(atoi(pstr->getword())); m_EntityList.push_back(pentity); } return true; }
// Process function void processFunction(func_t *f) { // Skip tiny functions if(f->size() >= 5) { // Don't add comments to API wrappers char name[MAXNAMELEN]; name[0] = name[SIZESTR(name)] = 0; if(!apiMap.empty()) { if(get_short_name(BADADDR, f->startEA, name, SIZESTR(name))) { if(apiMap.find(name) != apiMap.end()) return; } } // Iterate function body STRLIST importLstTmp; LPSTR commentPtr = NULL; char comment[MAXSTR]; comment[0] = comment[SIZESTR(comment)] = 0; UINT commentLen = 0; #define ADDNM(_str) { UINT l = strlen(_str); memcpy(comment + commentLen, _str, l); commentLen += l; _ASSERT(commentLen < MAXSTR); } func_item_iterator_t it(f); do { ea_t currentEA = it.current(); // Will be a "to" xref xrefblk_t xb; if(xb.first_from(currentEA, XREF_FAR)) { BOOL isImpFunc = FALSE; name[0] = 0; // If in import segment // ============================================================================================ ea_t refAdrEa = xb.to; if(isInImportSeg(refAdrEa)) { flags_t flags = get_flags_novalue(refAdrEa); if(has_name(flags) && hasRef(flags) && isDwrd(flags)) { if(get_short_name(BADADDR, refAdrEa, name, SIZESTR(name))) { // Nix the imp prefix if there is one if(strncmp(name, "__imp_", SIZESTR("__imp_")) == 0) memmove(name, name + SIZESTR("__imp_"), ((strlen(name) - SIZESTR("__imp_")) + 1)); isImpFunc = TRUE; } else msg(EAFORMAT" *** Failed to get import name! ***\n", refAdrEa); } } // Else, check for import wrapper // ============================================================================================ else if(!apiMap.empty()) { // Reference is a function entry? flags_t flags = get_flags_novalue(refAdrEa); if(isCode(flags) && has_name(flags) && hasRef(flags)) { if(func_t *refFuncPtr = get_func(refAdrEa)) { if(refFuncPtr->startEA == refAdrEa) { if(get_short_name(BADADDR, refAdrEa, name, SIZESTR(name))) { // Skip common unwanted types "sub_.." or "unknown_libname_.." if( // not "sub_.. /*"sub_"*/ (*((PUINT) name) != 0x5F627573) && // not "unknown_libname_.. /*"unknown_"*/ ((*((PUINT64) name) != 0x5F6E776F6E6B6E75) && (*((PUINT64) (name + 8)) != /*"libname_"*/ 0x5F656D616E62696C)) && // not nullsub_.. /*"nullsub_"*/ (*((PUINT64) name) != 0x5F6275736C6C756E) ) { // Nix the import prefixes if(strncmp(name, "__imp_", SIZESTR("__imp_")) == 0) memmove(name, name + SIZESTR("__imp_"), ((strlen(name) - SIZESTR("__imp_")) + 1)); // Assumed to be a wrapped import if it's in the list isImpFunc = (apiMap.find(name) != apiMap.end()); } } else msg(EAFORMAT" *** Failed to get function name! ***\n", refAdrEa); } } } } // Found import function to add list if(isImpFunc) { // Skip those large common STL names if(strncmp(name, "std::", SIZESTR("std::")) != 0) { // Skip if already seen in this function BOOL known = FALSE; for(STRLIST::iterator ji = importLstTmp.begin(); ji != importLstTmp.end(); ji++) { if(strcmp(ji->c_str(), name) == 0) { known = TRUE; break; } } // Not seen if(!known) { importLstTmp.push_front(name); // Append to existing comments w/line feed if(!commentLen && !commentPtr) { commentPtr = get_func_cmt(f, true); if(!commentPtr) get_func_cmt(f, false); if(commentPtr) { commentLen = strlen(commentPtr); // Bail out not enough comment space if(commentLen >= (MAXSTR - 20)) { qfree(commentPtr); return; } memcpy(comment, commentPtr, commentLen); ADDNM("\n"MYTAG); } } if(!commentLen) ADDNM(MYTAG); // Append a "..." (continuation) and bail out if name hits max comment length if((commentLen + strlen(name) + SIZESTR("()") + sizeof(", ")) >= (MAXSTR - sizeof("..."))) { ADDNM(" ..."); break; } // Append this function name else { if(importLstTmp.size() != 1) ADDNM(", "); ADDNM(name); ADDNM("()"); } } } else { //msg("%s\n", szName); } } } }while(it.next_addr()); if(!importLstTmp.empty() && commentLen) { // Add comment comment[commentLen] = 0; set_func_cmt(f, comment, true); commentCount++; } if(commentPtr) qfree(commentPtr); } }