Skip to content

Commit

Permalink
Additional hash-based script match to IDkmSymbolDocumentCollectionQue…
Browse files Browse the repository at this point in the history
…ry.FindDocuments
  • Loading branch information
WheretIB committed May 31, 2020
1 parent 725e224 commit 146ed2c
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 15 deletions.
13 changes: 13 additions & 0 deletions LuaDkmDebuggerComponent/DebugHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,19 @@ internal static int GetPointerSize(DkmProcess process)
return ReadUlongVariable(process, address);
}

internal static byte[] ReadRawStringVariable(DkmProcess process, ulong address, int limit)
{
try
{
return process.ReadMemoryString(address, DkmReadMemoryFlags.AllowPartialRead, 1, limit);
}
catch (DkmException)
{
}

return null;
}

internal static string ReadStringVariable(DkmProcess process, ulong address, int limit)
{
try
Expand Down
59 changes: 47 additions & 12 deletions LuaDkmDebuggerComponent/LocalComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Web.Script.Serialization;

Expand Down Expand Up @@ -1411,6 +1412,7 @@ DkmResolvedDocument[] IDkmSymbolDocumentCollectionQuery.FindDocuments(DkmModule
{
foreach (var source in state.Value.knownSources)
{
// Resolve script path if it's not resolved yet
if (source.Value.resolvedFileName == null)
{
var scriptSource = processData.symbolStore.FetchScriptSource(source.Key);
Expand All @@ -1433,7 +1435,7 @@ DkmResolvedDocument[] IDkmSymbolDocumentCollectionQuery.FindDocuments(DkmModule
source = source.Value
};

log.Debug($"IDkmSymbolQuery.FindDocuments success");
log.Debug($"IDkmSymbolQuery.FindDocuments success (known source)");

return new DkmResolvedDocument[1] { DkmResolvedDocument.Create(module, sourceFileId.DocumentName, null, DkmDocumentMatchStrength.FullPath, DkmResolvedDocumentWarning.None, false, dataItem) };
}
Expand All @@ -1444,12 +1446,33 @@ DkmResolvedDocument[] IDkmSymbolDocumentCollectionQuery.FindDocuments(DkmModule
{
foreach (var script in state.Value.knownScripts)
{
// Resolve script path if it's not resolved yet
if (script.Value.resolvedFileName == null)
{
script.Value.resolvedFileName = TryFindSourcePath(process.Path, processData, script.Key, script.Value.scriptContent);
// Check match based on hash
if (sourceFileId.SHA1HashPart != null && script.Value.sha1Hash != null)
{
int value0 = (int)(((uint)script.Value.sha1Hash[3] << 24) | ((uint)script.Value.sha1Hash[2] << 16) | ((uint)script.Value.sha1Hash[1] << 8) | (uint)script.Value.sha1Hash[0]);
int value1 = (int)(((uint)script.Value.sha1Hash[7] << 24) | ((uint)script.Value.sha1Hash[6] << 16) | ((uint)script.Value.sha1Hash[5] << 8) | (uint)script.Value.sha1Hash[4]);
int value2 = (int)(((uint)script.Value.sha1Hash[11] << 24) | ((uint)script.Value.sha1Hash[10] << 16) | ((uint)script.Value.sha1Hash[9] << 8) | (uint)script.Value.sha1Hash[8]);
int value3 = (int)(((uint)script.Value.sha1Hash[15] << 24) | ((uint)script.Value.sha1Hash[14] << 16) | ((uint)script.Value.sha1Hash[13] << 8) | (uint)script.Value.sha1Hash[12]);
int value4 = (int)(((uint)script.Value.sha1Hash[19] << 24) | ((uint)script.Value.sha1Hash[18] << 16) | ((uint)script.Value.sha1Hash[17] << 8) | (uint)script.Value.sha1Hash[16]);

if (sourceFileId.SHA1HashPart.Value.Value0 == value0 && sourceFileId.SHA1HashPart.Value.Value1 == value1 && sourceFileId.SHA1HashPart.Value.Value2 == value2 && sourceFileId.SHA1HashPart.Value.Value3 == value3 && sourceFileId.SHA1HashPart.Value.Value4 == value4)
{
log.Debug($"IDkmSymbolQuery.FindDocuments Resolved {script.Value.sourceFileName} to {script.Value.resolvedFileName} based on SHA-1 hash");

script.Value.resolvedFileName = sourceFileId.DocumentName;
}
}

if (script.Value.resolvedFileName == null)
{
script.Value.resolvedFileName = TryFindSourcePath(process.Path, processData, script.Key, script.Value.scriptContent);

if (script.Value.resolvedFileName != null)
log.Debug($"IDkmSymbolQuery.FindDocuments Resolved {script.Value.sourceFileName} to {script.Value.resolvedFileName}");
if (script.Value.resolvedFileName != null)
log.Debug($"IDkmSymbolQuery.FindDocuments Resolved {script.Value.sourceFileName} to {script.Value.resolvedFileName}");
}
}

var fileName = script.Value.resolvedFileName;
Expand All @@ -1461,7 +1484,7 @@ DkmResolvedDocument[] IDkmSymbolDocumentCollectionQuery.FindDocuments(DkmModule
script = script.Value
};

log.Debug($"IDkmSymbolQuery.FindDocuments success");
log.Debug($"IDkmSymbolQuery.FindDocuments success (known script)");

return new DkmResolvedDocument[1] { DkmResolvedDocument.Create(module, sourceFileId.DocumentName, null, DkmDocumentMatchStrength.FullPath, DkmResolvedDocumentWarning.None, false, dataItem) };
}
Expand Down Expand Up @@ -2061,7 +2084,7 @@ DkmCustomMessage IDkmCustomMessageCallbackReceiver.SendHigher(DkmCustomMessage c
{
scriptName = "@" + scriptName;

processData.symbolStore.FetchOrCreate(stateAddress.Value).AddScriptSource(scriptName, scriptContent);
processData.symbolStore.FetchOrCreate(stateAddress.Value).AddScriptSource(scriptName, scriptContent, null);

log.Debug($"Adding script {scriptName} to symbol store of Lua state {stateAddress.Value} (without content)");
}
Expand Down Expand Up @@ -2089,18 +2112,30 @@ DkmCustomMessage IDkmCustomMessageCallbackReceiver.SendHigher(DkmCustomMessage c

if (scriptBufferAddress.HasValue && scriptSize.HasValue && scriptNameAddress.HasValue)
{
string scriptContent = DebugHelpers.ReadStringVariable(process, scriptBufferAddress.Value, (int)scriptSize.Value);
string scriptName = DebugHelpers.ReadStringVariable(process, scriptNameAddress.Value, 1024);
byte[] rawScriptContent = DebugHelpers.ReadRawStringVariable(process, scriptBufferAddress.Value, (int)scriptSize.Value);

if (scriptName != null)
if (rawScriptContent != null)
{
processData.symbolStore.FetchOrCreate(stateAddress.Value).AddScriptSource(scriptName, scriptContent);
string scriptContent = Encoding.UTF8.GetString(rawScriptContent, 0, rawScriptContent.Length);

string scriptName = DebugHelpers.ReadStringVariable(process, scriptNameAddress.Value, 1024);

if (scriptName != null)
{
var sha1Hash = new SHA1Managed().ComputeHash(rawScriptContent);

processData.symbolStore.FetchOrCreate(stateAddress.Value).AddScriptSource(scriptName, scriptContent, sha1Hash);

log.Debug($"Adding script {scriptName} to symbol store of Lua state {stateAddress.Value} (with content)");
log.Debug($"Adding script {scriptName} to symbol store of Lua state {stateAddress.Value} (with content)");
}
else
{
log.Error("Failed to load script name from process");
}
}
else
{
log.Error("Failed to load script name from process");
log.Error("Failed to load script content from process");
}
}
else
Expand Down
8 changes: 5 additions & 3 deletions LuaDkmDebuggerComponent/LuaSymbolStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ public class LuaScriptSymbols
{
public string sourceFileName = null;
public string scriptContent = null;
public byte[] sha1Hash = null;

public string resolvedFileName = null;
}

Expand Down Expand Up @@ -79,12 +81,12 @@ public string FetchFunctionName(ulong address)
return null;
}

public void AddScriptSource(string scriptName, string scriptContent)
public void AddScriptSource(string scriptName, string scriptContent, byte[] sha1Hash)
{
if (!knownScripts.ContainsKey(scriptName))
knownScripts.Add(scriptName, new LuaScriptSymbols { sourceFileName = scriptName, scriptContent = scriptContent });
knownScripts.Add(scriptName, new LuaScriptSymbols { sourceFileName = scriptName, scriptContent = scriptContent, sha1Hash = sha1Hash });
else
knownScripts[scriptName] = new LuaScriptSymbols { sourceFileName = scriptName, scriptContent = scriptContent };
knownScripts[scriptName] = new LuaScriptSymbols { sourceFileName = scriptName, scriptContent = scriptContent, sha1Hash = sha1Hash };
}

public LuaScriptSymbols FetchScriptSource(string sourceFileName)
Expand Down

0 comments on commit 146ed2c

Please sign in to comment.