void cmd_util::printStrings(PEFile *pe, size_t limit) { ResourcesContainer *allStrings = pe->getResourcesOfType(pe::RT_STRING); if (allStrings == NULL) return; size_t wrappersCount = allStrings->count(); if (wrappersCount == 0) { printf ("No Strings in Resources!\n"); return; } int limCount = 0; for (size_t i = 0; i < wrappersCount; i++) { ResourceStringsWrapper* wrapper = dynamic_cast<ResourceStringsWrapper*>(allStrings->getWrapperAt(i)); if (wrapper == NULL) { printf("[ERROR] Null wrapper!\n"); continue; } size_t count = wrapper->getResStringsCount(); for (int i = 0; i < count; i++) { if (limit != 0 && limCount >= limit) return; ResString *resStr = wrapper->getResStringAt(i); if (resStr != NULL) { printf("[%8llX] [%lu] %s\n", static_cast<unsigned long long>(resStr->offset), static_cast<unsigned long>(resStr->getSize()), resStr->getQString().toStdString().c_str() ); limCount++; } } } }
void cmd_util::dumpResourcesInfo(PEFile *pe, pe::resource_type type, size_t wrapperId) { ResourcesContainer* wrappers = pe->getResourcesOfType(type); if (wrappers == NULL || wrappers->count() == 0) { printf ("No such resource type\n"); return; } size_t wrappersCount = wrappers->count(); printf ("Found in Resources: %d, wrappers: %d\n", wrappers->entriesCount(), wrappersCount); int limCount = 0; std::vector<ResourceContentWrapper*>::iterator itr; if (wrapperId >= wrappersCount) return; ResourceContentWrapper* wrapper = wrappers->getWrapperAt(wrapperId); cmd_util::dumpEntryInfo(wrapper); cmd_util::dumpNodeInfo(dynamic_cast<ExeNodeWrapper*>(wrapper)); }
void ResourcesContainer::AssimilateResources(ResourcesContainer &container) { // Resistance is futile! ;-) int32 newCount = container.CountResources(); for (int32 i = 0; i < newCount; i++) { ResourceItem *item = container.ResourceAt(i); if (item->IsLoaded()) AddResource(item); else { // That should not happen. // Delete the item to have a consistent behavior. delete item; } } container.fResources.MakeEmpty(); container.SetModified(true); SetModified(true); }