Merge remote-tracking branch 'GliniakRepo/patchingSystem' into canary_experimental

This commit is contained in:
Gliniak
2022-06-14 17:50:25 +02:00
16 changed files with 389 additions and 209 deletions

View File

@@ -400,7 +400,7 @@ void UserModule::Dump() {
// XEX header.
sb.AppendFormat("Module {}:\n", path_);
sb.AppendFormat("Module Hash: {:016X}\n", hash_);
sb.AppendFormat("Module Hash: {:016X}\n", hash_.value_or(UINT64_MAX));
sb.AppendFormat(" Module Flags: {:08X}\n", (uint32_t)header->module_flags);
@@ -802,11 +802,44 @@ void UserModule::Dump() {
}
void UserModule::CalculateHash() {
uint8_t* base_adr = memory()->TranslateVirtual(xex_module()->base_address());
const BaseHeap* module_heap =
kernel_state_->memory()->LookupHeap(xex_module()->base_address());
if (!module_heap) {
XELOGE("Invalid heap for xex module! Address: {:08X}",
xex_module()->base_address());
return;
}
const uint32_t page_size = module_heap->page_size();
auto security_info = xex_module()->xex_security_info();
auto find_code_section_page = [&security_info](bool from_bottom) {
for (uint32_t i = 0; i < security_info->page_descriptor_count; i++) {
const uint32_t page_index =
from_bottom ? i : security_info->page_descriptor_count - i;
xex2_page_descriptor page_descriptor;
page_descriptor.value =
xe::byte_swap(security_info->page_descriptors[page_index].value);
if (page_descriptor.info != XEX_SECTION_CODE) {
continue;
}
return page_index;
}
return UINT32_MAX;
};
const uint32_t start_address =
xex_module()->base_address() + (find_code_section_page(true) * page_size);
const uint32_t end_address =
xex_module()->base_address() +
((find_code_section_page(false) + 1) * page_size);
uint8_t* base_code_adr = memory()->TranslateVirtual(start_address);
XXH3_state_t hash_state;
XXH3_64bits_reset(&hash_state);
XXH3_64bits_update(&hash_state, base_adr, xex_module()->image_size());
XXH3_64bits_update(&hash_state, base_code_adr, end_address - start_address);
hash_ = XXH3_64bits_digest(&hash_state);
}
} // namespace kernel