Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 59 additions & 4 deletions XenonAnalyse/main.cpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
#include "fmt/xchar.h"
#include "function.h"
#include <algorithm>
#include <cassert>
#include <iterator>
#include <file.h>
#include <disasm.h>
#include <file.h>
#include <image.h>
#include <xbox.h>
#include <fmt/core.h>
#include "function.h"

#define SWITCH_ABSOLUTE 0
#define SWITCH_COMPUTED 1
Expand All @@ -21,6 +21,59 @@ struct SwitchTable
uint32_t type{};
};

static const uint8_t RESTGPRLR_14[] = { 0xe9, 0xc1, 0xff, 0x68 };
static const uint8_t SAVEGPRLR_14[] = { 0xf9, 0xc1, 0xff, 0x68 };
static const uint8_t RESTFPR_14[] = { 0xc9, 0xcc, 0xff, 0x70 };
static const uint8_t SAVEFPR_14[] = { 0xd9, 0xcc, 0xff, 0x70 };
static const uint8_t RESTVMX_14[] = { 0x39, 0x60, 0xfe, 0xe0, 0x7d, 0xcb, 0x60, 0xce };
static const uint8_t SAVEVMX_14[] = { 0x39, 0x60, 0xfe, 0xe0, 0x7d, 0xcb, 0x61, 0xce };
static const uint8_t RESTVMX_64[] = { 0x39, 0x60, 0xfc, 0x00, 0x10, 0x0b, 0x60, 0xcb };
static const uint8_t SAVEVMX_64[] = { 0x39, 0x60, 0xfc, 0x00, 0x10, 0x0b, 0x61, 0xcb };

uint32_t BytePatternSearch(uint8_t* data, const uint32_t dataSize, const uint32_t baseAddress, const uint8_t pattern[], const size_t patternSize)
{
auto result = std::search(data, data + dataSize, pattern, pattern + patternSize);
if (result != data + dataSize) {
return baseAddress + std::distance(data, result);
}

return UINT32_MAX;
}

void RegisterFunctionsSearch(Image& image)
{
uint32_t baseAddress = UINT32_MAX;

for (const auto& section : image.sections) {
if (section.name == ".text") {
baseAddress = section.base;

if (baseAddress == UINT32_MAX) {
fmt::println("Could not find \".text\" section.");
return;
}

uint32_t restgprlr_14 = BytePatternSearch(section.data, section.size, baseAddress, RESTGPRLR_14, sizeof(RESTGPRLR_14));
uint32_t savegprlr_14 = BytePatternSearch(section.data, section.size, baseAddress, SAVEGPRLR_14, sizeof(SAVEGPRLR_14));
uint32_t restfpr_14 = BytePatternSearch(section.data, section.size, baseAddress, RESTFPR_14, sizeof(RESTFPR_14));
uint32_t savefpr_14 = BytePatternSearch(section.data, section.size, baseAddress, SAVEFPR_14, sizeof(SAVEFPR_14));
uint32_t restvmx_14 = BytePatternSearch(section.data, section.size, baseAddress, RESTVMX_14, sizeof(RESTVMX_14));
uint32_t savevmx_14 = BytePatternSearch(section.data, section.size, baseAddress, SAVEVMX_14, sizeof(SAVEVMX_14));
uint32_t restvmx_64 = BytePatternSearch(section.data, section.size, baseAddress, RESTVMX_64, sizeof(RESTVMX_64));
uint32_t savevmx_64 = BytePatternSearch(section.data, section.size, baseAddress, SAVEVMX_64, sizeof(SAVEVMX_64));

fmt::println("restgprlr_14_address = 0x{:X}", restgprlr_14);
fmt::println("savegprlr_14_address = 0x{:X}", savegprlr_14);
fmt::println("restfpr_14_address = 0x{:X}", restfpr_14);
fmt::println("savefpr_14_address = 0x{:X}", savefpr_14);
fmt::println("restvmx_14_address = 0x{:X}", restvmx_14);
fmt::println("savevmx_14_address = 0x{:X}", savevmx_14);
fmt::println("restvmx_64_address = 0x{:X}", restvmx_64);
fmt::println("savevmx_64_address = 0x{:X}", savevmx_64);
}
}
}

void ReadTable(Image& image, SwitchTable& table)
{
uint32_t pOffset;
Expand Down Expand Up @@ -192,6 +245,8 @@ int main(int argc, char** argv)
const auto file = LoadFile(argv[1]);
auto image = Image::ParseImage(file.data(), file.size());

RegisterFunctionsSearch(image);

auto printTable = [&](const SwitchTable& table)
{
println("[[switch]]");
Expand Down