SCRIPT_EXPORT bool Script::Module::GetList(ListInfo* listInfo) { std::vector<MODINFO> modList; ModGetList(modList); std::vector<ModuleInfo> modScriptList(modList.size()); for (const auto & mod : modList) { ModuleInfo scriptMod; scriptMod.base = mod.base; scriptMod.size = mod.size; scriptMod.entry = mod.entry; scriptMod.sectionCount = int(mod.sections.size()); strcpy_s(scriptMod.name, mod.name); strcat_s(scriptMod.name, mod.extension); strcpy_s(scriptMod.path, mod.path); modScriptList.push_back(scriptMod); } return List<ModuleInfo>::CopyData(listInfo, modScriptList); }
int RefFind(duint Address, duint Size, CBREF Callback, void* UserData, bool Silent, const char* Name, REFFINDTYPE type) { char fullName[deflen]; char moduleName[MAX_MODULE_SIZE]; duint scanStart, scanSize; REFINFO refInfo; if(type == CURRENT_REGION) // Search in current Region { duint regionSize = 0; duint regionBase = MemFindBaseAddr(Address, ®ionSize, true); // If the memory page wasn't found, fail if(!regionBase || !regionSize) { if(!Silent) dprintf("Invalid memory page 0x%p\n", Address); return 0; } // Assume the entire range is used scanStart = regionBase; scanSize = regionSize; // Otherwise use custom boundaries if size was supplied if(Size) { duint maxsize = Size - (Address - regionBase); // Make sure the size fits in one page scanStart = Address; scanSize = min(Size, maxsize); } // Determine the full module name if(ModNameFromAddr(scanStart, moduleName, true)) sprintf_s(fullName, "%s (Region %s)", Name, moduleName); else sprintf_s(fullName, "%s (Region %p)", Name, scanStart); // Initialize disassembler Capstone cp; // Allow an "initialization" notice refInfo.refcount = 0; refInfo.userinfo = UserData; refInfo.name = fullName; RefFindInRange(scanStart, scanSize, Callback, UserData, Silent, refInfo, cp, true, [](int percent) { GuiReferenceSetCurrentTaskProgress(percent, "Region Search"); GuiReferenceSetProgress(percent); }); } else if(type == CURRENT_MODULE) // Search in current Module { SHARED_ACQUIRE(LockModules); auto modInfo = ModInfoFromAddr(Address); if(!modInfo) { if(!Silent) dprintf("Couldn't locate module for 0x%p\n", Address); return 0; } duint modBase = modInfo->base; duint modSize = modInfo->size; SHARED_RELEASE(); scanStart = modBase; scanSize = modSize; // Determine the full module name if(ModNameFromAddr(scanStart, moduleName, true)) sprintf_s(fullName, "%s (%s)", Name, moduleName); else sprintf_s(fullName, "%s (%p)", Name, scanStart); // Initialize disassembler Capstone cp; // Allow an "initialization" notice refInfo.refcount = 0; refInfo.userinfo = UserData; refInfo.name = fullName; RefFindInRange(scanStart, scanSize, Callback, UserData, Silent, refInfo, cp, true, [](int percent) { GuiReferenceSetCurrentTaskProgress(percent, "Module Search"); GuiReferenceSetProgress(percent); }); } else if(type == ALL_MODULES) // Search in all Modules { bool initCallBack = true; std::vector<MODINFO> modList; ModGetList(modList); if(!modList.size()) { if(!Silent) dprintf("Couldn't get module list"); return 0; } // Initialize disassembler Capstone cp; // Determine the full module sprintf_s(fullName, "All Modules (%s)", Name); // Allow an "initialization" notice refInfo.refcount = 0; refInfo.userinfo = UserData; refInfo.name = fullName; for(duint i = 0; i < modList.size(); i++) { scanStart = modList[i].base; scanSize = modList[i].size; if(i != 0) initCallBack = false; RefFindInRange(scanStart, scanSize, Callback, UserData, Silent, refInfo, cp, initCallBack, [&i, &modList](int percent) { float fPercent = (float)percent / 100.f; float fTotalPercent = ((float)i + fPercent) / (float)modList.size(); int totalPercent = (int)floor(fTotalPercent * 100.f); char tst[256]; strcpy_s(tst, modList[i].name); GuiReferenceSetCurrentTaskProgress(percent, modList[i].name); GuiReferenceSetProgress(totalPercent); }); } } GuiReferenceSetProgress(100); GuiReferenceReloadData(); return refInfo.refcount; }