mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-21 16:09:19 +01:00
Rework static address scanning.
This commit is contained in:
parent
229fb78ecf
commit
05b03c3d5f
1 changed files with 19 additions and 12 deletions
|
|
@ -176,23 +176,30 @@ public class SigScanner : IDisposable, IServiceType
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="signature">The signature of the function using the data.</param>
|
/// <param name="signature">The signature of the function using the data.</param>
|
||||||
/// <param name="offset">The offset from function start of the instruction using the data.</param>
|
/// <param name="offset">The offset from function start of the instruction using the data.</param>
|
||||||
/// <returns>An IntPtr to the static memory location.</returns>
|
/// <returns>An IntPtr to the static memory location or IntPtr.Zero if no valid offset could be found.</returns>
|
||||||
public IntPtr GetStaticAddressFromSig(string signature, int offset = 0)
|
public unsafe IntPtr GetStaticAddressFromSig(string signature, int offset = 0)
|
||||||
{
|
{
|
||||||
var instrAddr = this.ScanText(signature);
|
var instructionAddress = (byte*)this.ScanText(signature);
|
||||||
instrAddr = IntPtr.Add(instrAddr, offset);
|
instructionAddress += offset;
|
||||||
var bAddr = (long)this.Module.BaseAddress;
|
var baseAddress = (long)this.Module.BaseAddress;
|
||||||
long num;
|
var data = this.DataSectionOffset + baseAddress;
|
||||||
|
var dataEnd = data + this.DataSectionSize;
|
||||||
|
var rData = this.RDataSectionOffset + baseAddress;
|
||||||
|
var rDataEnd = rData + this.RDataSectionSize;
|
||||||
|
|
||||||
do
|
for (var end = instructionAddress + signature.Length + 4; instructionAddress < end; ++instructionAddress)
|
||||||
{
|
{
|
||||||
instrAddr = IntPtr.Add(instrAddr, 1);
|
var byte1 = instructionAddress[0];
|
||||||
num = Marshal.ReadInt32(instrAddr) + (long)instrAddr + 4 - bAddr;
|
var byte2 = instructionAddress[1];
|
||||||
|
if (byte1 is >= 0x40 and <= 0x4F && byte2 is 0x89 or 0x8B or 0x8D)
|
||||||
|
{
|
||||||
|
var ret = *(int*)(instructionAddress + 3) + (long)instructionAddress + 7;
|
||||||
|
if ((ret >= data && ret <= dataEnd) || (ret >= rData && ret <= rDataEnd))
|
||||||
|
return (IntPtr)ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
while (!(num >= this.DataSectionOffset && num <= this.DataSectionOffset + this.DataSectionSize)
|
|
||||||
&& !(num >= this.RDataSectionOffset && num <= this.RDataSectionOffset + this.RDataSectionSize));
|
|
||||||
|
|
||||||
return IntPtr.Add(instrAddr, Marshal.ReadInt32(instrAddr) + 4);
|
return IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue