4
0
mirror of https://github.com/QuasarApp/LIEF.git synced 2025-05-13 03:39:34 +00:00
This commit is contained in:
Romain Thomas 2019-01-09 07:57:57 +01:00
parent 13ad81e743
commit 9e04d0b118

@ -343,7 +343,20 @@ std::string ResourcesManager::manifest(void) const {
[] (const ResourceNode& node) {
return static_cast<RESOURCE_TYPES>(node.id()) == RESOURCE_TYPES::MANIFEST;
});
const ResourceData* manifest_node = dynamic_cast<ResourceData*>(&((*it_manifest).childs()[0].childs()[0]));
// First level of child nodes
it_childs childs_l1 = it_manifest->childs();
if (childs_l1.size() < 1) {
throw not_found("Manifest corrupted");
}
it_childs childs_l2 = childs_l1[0].childs();
if (childs_l2.size() < 1) {
throw not_found("Manifest corrupted");
}
const ResourceData* manifest_node = dynamic_cast<ResourceData*>(&childs_l2[0]);
const std::vector<uint8_t>& content = manifest_node->content();
return std::string{std::begin(content), std::end(content)};
}
@ -396,7 +409,19 @@ ResourceVersion ResourcesManager::version(void) const {
return static_cast<RESOURCE_TYPES>(node.id()) == RESOURCE_TYPES::VERSION;
});
const ResourceData* version_node = dynamic_cast<ResourceData*>(&((*it_version).childs()[0].childs()[0]));
// First level of child nodes
it_childs childs_l1 = it_version->childs();
if (childs_l1.size() < 1) {
throw not_found("Resource version corrupted");
}
it_childs childs_l2 = childs_l1[0].childs();
if (childs_l2.size() < 1) {
throw not_found("Resource version corrupted");
}
const ResourceData* version_node = dynamic_cast<ResourceData*>(&childs_l2[0]);
const std::vector<uint8_t>& content = version_node->content();
VectorStream stream{content};
ResourceVersion version;
@ -772,8 +797,12 @@ std::vector<ResourceIcon> ResourcesManager::icons(void) const {
LOG(ERROR) << "Unable to find the icon associated with id: " << std::to_string(id);
continue;
}
// TODO: add checks
const std::vector<uint8_t>& pixels = dynamic_cast<const ResourceData*>(&(it_icon_dir->childs()[0]))->content();
it_childs icons_childs = it_icon_dir->childs();
if (icons_childs.size() < 1) {
LOG(ERROR) << "Resources nodes loooks corrupted";
continue;
}
const std::vector<uint8_t>& pixels = dynamic_cast<const ResourceData*>(&icons_childs[0])->content();
icon.pixels_ = pixels;
icons.push_back(icon);
@ -816,7 +845,20 @@ void ResourcesManager::add_icon(const ResourceIcon& icon) {
}
// Add to the GROUP
ResourceData* icon_group_node = dynamic_cast<ResourceData*>(&((*it_grp_icon).childs()[0].childs()[0]));
// First level of child nodes
it_childs childs_l1 = it_icon->childs();
if (childs_l1.size() < 1) {
throw not_found("Icon corrupted");
}
it_childs childs_l2 = childs_l1[0].childs();
if (childs_l2.size() < 1) {
throw not_found("Icon version corrupted");
}
ResourceData* icon_group_node = dynamic_cast<ResourceData*>(&childs_l2[0]);
std::vector<uint8_t> icon_group_content = icon_group_node->content();
pe_resource_icon_dir* group_icon_header = reinterpret_cast<pe_resource_icon_dir*>(icon_group_content.data());