diff --git a/XenonAnalyse/main.cpp b/XenonAnalyse/main.cpp index ed3540f..99e5dcd 100644 --- a/XenonAnalyse/main.cpp +++ b/XenonAnalyse/main.cpp @@ -26,11 +26,11 @@ void ReadTable(Image& image, SwitchTable& table) uint32_t pOffset; ppc_insn insn; auto* code = (uint32_t*)image.Find(table.base); - ppc::Disassemble(code, table.base, insn); // lis - pOffset = insn.operands[1] << 16; // Upper 16 bits + ppc::Disassemble(code, table.base, insn); // lis + pOffset = insn.operands[1] << 16; // Upper 16 bits - ppc::Disassemble(code + 2, table.base + 8, insn); // addi (skip rlwinm at +4) - pOffset += insn.operands[2]; // Lower 16 bits + ppc::Disassemble(code + 2, table.base + 8, insn); // addi (skip rlwinm at +4) + pOffset += insn.operands[2]; // Lower 16 bits if (table.type == SWITCH_ABSOLUTE) { @@ -213,53 +213,53 @@ int main(int argc, char** argv) println("# Generated by XenonAnalyse"); auto scanPattern = [&](uint32_t* pattern, size_t count, size_t type) + { + for (const auto& section : image.sections) { - for (const auto& section : image.sections) + if (!(section.flags & SectionFlags_Code)) { - if (!(section.flags & SectionFlags_Code)) - { - continue; - } - - size_t base = section.base; - uint8_t* data = section.data; - uint8_t* dataStart = section.data; - uint8_t* dataEnd = section.data + section.size; - while (data < dataEnd && data != nullptr) - { - data = (uint8_t*)SearchMask(data, pattern, count, dataEnd - data); - - if (data != nullptr) - { - SwitchTable table{}; - table.type = type; - ScanTable((uint32_t*)data, base + (data - dataStart), table); - - // fmt::println("{:X} ; jmptable - {}", base + (data - dataStart), table.labels.size()); - if (table.base != 0) - { - ReadTable(image, table); - printTable(table); - switches.emplace_back(std::move(table)); - } - - data += 4; - } - continue; - } + continue; } - }; - // adjusted for tag 2 - uint32_t absoluteSwitch[] = - { - PPC_INST_LIS, - PPC_INST_RLWINM, // (slwi alias) - PPC_INST_ADDI, - PPC_INST_LWZX, - PPC_INST_MTCTR, - PPC_INST_BCTR - }; + size_t base = section.base; + uint8_t* data = section.data; + uint8_t* dataStart = section.data; + uint8_t* dataEnd = section.data + section.size; + while (data < dataEnd && data != nullptr) + { + data = (uint8_t*)SearchMask(data, pattern, count, dataEnd - data); + + if (data != nullptr) + { + SwitchTable table{}; + table.type = type; + ScanTable((uint32_t*)data, base + (data - dataStart), table); + + // fmt::println("{:X} ; jmptable - {}", base + (data - dataStart), table.labels.size()); + if (table.base != 0) + { + ReadTable(image, table); + printTable(table); + switches.emplace_back(std::move(table)); + } + + data += 4; + } + continue; + } + } + }; + + // adjusted for tag 2 + uint32_t absoluteSwitch[] = + { + PPC_INST_LIS, + PPC_INST_RLWINM, // (slwi alias) + PPC_INST_ADDI, + PPC_INST_LWZX, + PPC_INST_MTCTR, + PPC_INST_BCTR + }; uint32_t computedSwitch[] = {