IL2CPP: Dramatically speed up image scanning

This commit is contained in:
Katy Coe
2020-12-14 02:49:13 +01:00
parent 05ba1678c5
commit 14f4e034b0

View File

@@ -1,44 +1,42 @@
using System;
using System.Collections;
/*
Copyright 2020 Katy Coe - http://www.djkaty.com - https://github.com/djkaty
All rights reserved.
*/
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using NoisyCowStudios.Bin2Object;
namespace Il2CppInspector
{
partial class Il2CppBinary
{
// Find a sequence of bytes
private int FindBytes(byte[] blob, byte[] signature, int step = 1, int startOffset = 0) {
int sigMatch = 0;
int foundOffset = -1;
// Adapted from https://stackoverflow.com/a/332667
private int FindBytes(byte[] blob, byte[] signature, int requiredAlignment = 1, int startOffset = 0) {
var firstMatchByte = Array.IndexOf(blob, signature[0], startOffset);
var test = new byte[signature.Length];
for (int p = startOffset; p < blob.Length - signature.Length && foundOffset == -1; p += sigMatch == 0? step : 1) {
sigMatch = blob[p] != signature[sigMatch] ? 0 : ++sigMatch;
while (firstMatchByte >= 0 && firstMatchByte <= blob.Length - signature.Length) {
Buffer.BlockCopy(blob, firstMatchByte, test, 0, signature.Length);
if (test.SequenceEqual(signature) && firstMatchByte % requiredAlignment == 0)
return firstMatchByte;
if (sigMatch == 0)
p = p - p % step + step;
if (sigMatch == 0 && blob[p] == signature[0])
sigMatch++;
if (sigMatch == signature.Length)
foundOffset = p + 1 - signature.Length;
firstMatchByte = Array.IndexOf(blob, signature[0], firstMatchByte + 1);
}
return foundOffset;
return -1;
}
// Find all occurrences of a sequence of bytes
private IEnumerable<uint> FindAllBytes(byte[] blob, byte[] signature, int step = 0) {
var ptrs = new List<uint>();
// Find all occurrences of a sequence of bytes, using word alignment by default
private IEnumerable<uint> FindAllBytes(byte[] blob, byte[] signature, int alignment = 0) {
var offset = 0;
while (offset != -1) {
offset = FindBytes(blob, signature, step != 0 ? step : Image.Bits / 4, offset);
offset = FindBytes(blob, signature, alignment != 0 ? alignment : Image.Bits / 8, offset);
if (offset != -1) {
yield return (uint) offset;
offset += Image.Bits / 4;
offset += Image.Bits / 8;
}
}
}