obfuz仓库只保留obfuz,将Samples、obfuz4hybridclr和DeobfuscatedStackTrace拆分为独立的仓库
parent
1f74c8d65d
commit
39c9925cbc
|
@ -1,37 +0,0 @@
|
|||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug | 描述问题**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
** Enviroment | 环境 **
|
||||
|
||||
- Unity Version: 202x.y.z
|
||||
- com.code-philosophy.obfuz Version: 4.x.y
|
||||
- Platform: Win 64 Standalone|Android|iOS| ...
|
||||
|
||||
**To Reproduce | 复制步骤 **
|
||||
|
||||
Please provide a reproduction project. Please try to reproduce this bug on the https://github.com/focus-creative-games/obfuz/tree/main/Samples/QuickStart. | 提供复现工程,请尽量在 https://github.com/focus-creative-games/obfuz/tree/main/Samples/QuickStart 项目上复现这个bug。
|
||||
|
||||
|
||||
Steps to reproduce the behavior :
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior | 期望的结果**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots | 截图或者日志**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Additional context | 补充信息**
|
||||
Add any other context about the problem here.
|
|
@ -1,25 +0,0 @@
|
|||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
|
||||
|
||||
**/Library/
|
||||
**/Logs/
|
||||
**/Temp/
|
||||
**/Build-*/
|
||||
**/Release-*/
|
||||
**/Debug-*/
|
||||
**/HybridCLRData/
|
||||
|
||||
**/.vs/
|
||||
**/bin/
|
||||
**/obj/
|
||||
|
||||
|
||||
.vsconfig
|
||||
**/UserSettings/
|
||||
*.csproj
|
||||
*.sln
|
||||
packages-lock.json
|
||||
/Samples/WorkWithHybridCLR/Assets/Obfuz/SymbolObfus/symbol-mapping.xml
|
||||
/Samples/WorkWithHybridCLR/Assets/StreamingAssets/HotUpdate.dll.bytes
|
|
@ -1,15 +0,0 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>disable</Nullable>
|
||||
<Version>1.0.0</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CommandLineParser" Version="2.9.1" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
|
@ -1,24 +0,0 @@
|
|||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.13.35931.197
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeobfuscateStackTrace", "DeobfuscateStackTrace.csproj", "{B7192F39-1EEA-4F31-885B-B606D700FC79}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{B7192F39-1EEA-4F31-885B-B606D700FC79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B7192F39-1EEA-4F31-885B-B606D700FC79}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B7192F39-1EEA-4F31-885B-B606D700FC79}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B7192F39-1EEA-4F31-885B-B606D700FC79}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {9F39E3ED-EF31-43DE-B085-0F7BF60844E8}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -1,21 +0,0 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2025 Code Philosophy(代码哲学)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -1,57 +0,0 @@
|
|||
using CommandLine;
|
||||
|
||||
namespace DeobfuscateStackTrace
|
||||
{
|
||||
internal class Program
|
||||
{
|
||||
private class CommandOptions
|
||||
{
|
||||
|
||||
[Option('m', "mappingFile", Required = true, HelpText = "mapping xml file")]
|
||||
public string MappingFile { get; set; }
|
||||
|
||||
[Option('i', "input", Required = true, HelpText = "input obfuscated log file")]
|
||||
public string InputFile { get; set; }
|
||||
|
||||
[Option('o', "output", Required = true, HelpText = "output deobfuscated log file")]
|
||||
public string OutputFile { get; set; }
|
||||
|
||||
}
|
||||
|
||||
static void Main(string[] args)
|
||||
{
|
||||
CommandOptions opt = ParseArgs(args);
|
||||
|
||||
if (!File.Exists(opt.MappingFile))
|
||||
{
|
||||
Console.Error.WriteLine($"Mapping file {opt.MappingFile} not found");
|
||||
Environment.Exit(1);
|
||||
}
|
||||
if (!File.Exists(opt.InputFile))
|
||||
{
|
||||
Console.Error.WriteLine($"Input file {opt.InputFile} not found");
|
||||
Environment.Exit(1);
|
||||
}
|
||||
var reader = new SymbolMappingReader(opt.MappingFile);
|
||||
StackTraceDeObfuscator.Convert(reader, opt.InputFile, opt.OutputFile);
|
||||
}
|
||||
|
||||
private static CommandOptions ParseArgs(string[] args)
|
||||
{
|
||||
var helpWriter = new StringWriter();
|
||||
var parser = new Parser(settings =>
|
||||
{
|
||||
settings.AllowMultiInstance = true;
|
||||
settings.HelpWriter = helpWriter;
|
||||
});
|
||||
|
||||
var result = parser.ParseArguments<CommandOptions>(args);
|
||||
if (result.Tag == ParserResultType.NotParsed)
|
||||
{
|
||||
Console.Error.WriteLine(helpWriter.ToString());
|
||||
Environment.Exit(1);
|
||||
}
|
||||
return ((Parsed<CommandOptions>)result).Value;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
{
|
||||
"profiles": {
|
||||
"DeobfuscateStackTrace": {
|
||||
"commandName": "Project",
|
||||
"commandLineArgs": "-m ../../../mapping.xml -i ../../../obfuscated.log -o ../../../deobfuscated.log"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace DeobfuscateStackTrace
|
||||
{
|
||||
public class StackTraceDeObfuscator
|
||||
{
|
||||
public static void Convert(SymbolMappingReader reader, string oldLogFile, string newLogFile)
|
||||
{
|
||||
var obfuscatedLines = File.ReadAllLines(oldLogFile, Encoding.UTF8);
|
||||
var deObfuscatedLines = new List<string>();
|
||||
|
||||
bool logLineFound = false;
|
||||
foreach (string line in obfuscatedLines)
|
||||
{
|
||||
if (TryConvertLine(line, reader, ref logLineFound, out var newLine))
|
||||
{
|
||||
deObfuscatedLines.Add(newLine);
|
||||
}
|
||||
else
|
||||
{
|
||||
deObfuscatedLines.Add(line);
|
||||
}
|
||||
}
|
||||
File.WriteAllLines(newLogFile, deObfuscatedLines, Encoding.UTF8);
|
||||
}
|
||||
|
||||
private static bool TryConvertLine(string line, SymbolMappingReader reader, ref bool logLineFound, out string deObfuscatedStackTrace)
|
||||
{
|
||||
deObfuscatedStackTrace = line;
|
||||
if (string.IsNullOrEmpty(line))
|
||||
{
|
||||
logLineFound = false;
|
||||
return false;
|
||||
}
|
||||
if (!logLineFound)
|
||||
{
|
||||
logLineFound = line.StartsWith("UnityEngine.DebugLogHandler:Internal_Log")
|
||||
|| line.StartsWith("UnityEngine.DebugLogHandler:LogFormat")
|
||||
|| line.StartsWith("UnityEngine.Logger:Log");
|
||||
return false;
|
||||
}
|
||||
return reader.TryDeObfuscateStackTrace(line, out deObfuscatedStackTrace);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,128 +0,0 @@
|
|||
|
||||
using System.Xml;
|
||||
|
||||
namespace DeobfuscateStackTrace
|
||||
{
|
||||
|
||||
public class SymbolMappingReader
|
||||
{
|
||||
|
||||
private readonly Dictionary<string, List<string>> _fullSignatureMapper = new Dictionary<string, List<string>>();
|
||||
private readonly Dictionary<string, List<string>> _signatureWithParamsMapper = new Dictionary<string, List<string>>();
|
||||
|
||||
public SymbolMappingReader(string mappingFile)
|
||||
{
|
||||
LoadXmlMappingFile(mappingFile);
|
||||
}
|
||||
|
||||
private void LoadXmlMappingFile(string mappingFile)
|
||||
{
|
||||
var doc = new XmlDocument();
|
||||
doc.Load(mappingFile);
|
||||
var root = doc.DocumentElement;
|
||||
foreach (XmlNode node in root.ChildNodes)
|
||||
{
|
||||
if (!(node is XmlElement element))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
LoadAssemblyMapping(element);
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadAssemblyMapping(XmlElement ele)
|
||||
{
|
||||
if (ele.Name != "assembly")
|
||||
{
|
||||
throw new System.Exception($"Invalid node name: {ele.Name}. Expected 'assembly'.");
|
||||
}
|
||||
foreach (XmlNode node in ele.ChildNodes)
|
||||
{
|
||||
if (!(node is XmlElement element))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (element.Name == "type")
|
||||
{
|
||||
LoadTypeMapping(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadTypeMapping(XmlElement ele)
|
||||
{
|
||||
foreach (XmlNode node in ele.ChildNodes)
|
||||
{
|
||||
if (!(node is XmlElement c))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (node.Name == "method")
|
||||
{
|
||||
LoadMethodMapping(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private string GetMethodSignatureWithoutParams(string signature)
|
||||
{
|
||||
int index = signature.IndexOf('(');
|
||||
if (index < 0)
|
||||
{
|
||||
return signature;
|
||||
}
|
||||
return signature.Substring(0, index);
|
||||
}
|
||||
|
||||
private void LoadMethodMapping(XmlElement ele)
|
||||
{
|
||||
if (!ele.HasAttribute("oldStackTraceSignature"))
|
||||
{
|
||||
throw new System.Exception($"Invalid node name: {ele.Name}. attribute 'oldStackTraceSignature' missing.");
|
||||
}
|
||||
if (!ele.HasAttribute("newStackTraceSignature"))
|
||||
{
|
||||
throw new System.Exception($"Invalid node name: {ele.Name}. attribute 'newStackTraceSignature' missing.");
|
||||
}
|
||||
string oldStackTraceSignature = ele.Attributes["oldStackTraceSignature"].Value;
|
||||
string newStackTraceSignature = ele.Attributes["newStackTraceSignature"].Value;
|
||||
|
||||
if (!_fullSignatureMapper.TryGetValue(newStackTraceSignature, out var oldFullSignatures))
|
||||
{
|
||||
oldFullSignatures = new List<string>();
|
||||
_fullSignatureMapper[newStackTraceSignature] = oldFullSignatures;
|
||||
}
|
||||
oldFullSignatures.Add(oldStackTraceSignature);
|
||||
|
||||
string oldStackTraceSignatureWithoutParams = GetMethodSignatureWithoutParams(oldStackTraceSignature);
|
||||
string newStackTraceSignatureWithoutParams = GetMethodSignatureWithoutParams(newStackTraceSignature);
|
||||
if (!_signatureWithParamsMapper.TryGetValue(newStackTraceSignatureWithoutParams, out var oldSignaturesWithoutParams))
|
||||
{
|
||||
oldSignaturesWithoutParams = new List<string>();
|
||||
_signatureWithParamsMapper[newStackTraceSignatureWithoutParams] = oldSignaturesWithoutParams;
|
||||
}
|
||||
oldSignaturesWithoutParams.Add(oldStackTraceSignatureWithoutParams);
|
||||
}
|
||||
|
||||
|
||||
public bool TryDeObfuscateStackTrace(string obfuscatedStackTraceLog, out string deObfuscatedStackTrace)
|
||||
{
|
||||
obfuscatedStackTraceLog = obfuscatedStackTraceLog.Trim();
|
||||
if (_fullSignatureMapper.TryGetValue(obfuscatedStackTraceLog, out var oldFullSignatures))
|
||||
{
|
||||
deObfuscatedStackTrace = string.Join("|", oldFullSignatures);
|
||||
return true;
|
||||
}
|
||||
|
||||
string obfuscatedStackTraceSignatureWithoutParams = GetMethodSignatureWithoutParams(obfuscatedStackTraceLog);
|
||||
if (_signatureWithParamsMapper.TryGetValue(obfuscatedStackTraceSignatureWithoutParams, out var oldSignaturesWithoutParams))
|
||||
{
|
||||
deObfuscatedStackTrace = obfuscatedStackTraceLog.Replace(obfuscatedStackTraceSignatureWithoutParams, string.Join("|", oldSignaturesWithoutParams));
|
||||
return true;
|
||||
}
|
||||
deObfuscatedStackTrace = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
test stack trace
|
||||
UnityEngine.DebugLogHandler:Internal_Log(LogType, LogOption, String, Object)
|
||||
UnityEngine.DebugLogHandler:LogFormat(LogType, Object, String, Object[])
|
||||
UnityEngine.Logger:Log(LogType, Object)
|
||||
UnityEngine.Debug:Log(Object)
|
||||
Obfus2.TestStackTrace:Stack3()
|
||||
Obfus2.NestedClass`1:Stack2(TestStackTrace, Int32[], List`1, Banana)
|
||||
Obfus2.TestStackTrace:Stack1(Int64, UInt64, Single, Double, String, Object)
|
||||
Obfus2.TestStackTrace:Stack0(Byte, SByte, Int16, UInt16, Int32, UInt32)
|
||||
Tests.TC_StackTrace:PrintStackTrace()
|
||||
System.Reflection.RuntimeMethodInfo:InternalInvoke(Object, Object[], Exception&)
|
||||
System.Reflection.RuntimeMethodInfo:Invoke(Object, BindingFlags, Binder, Object[], CultureInfo)
|
||||
System.Reflection.MethodBase:Invoke(Object, Object[])
|
||||
SharpUnit.TestCase:Run(TestResult)
|
||||
SharpUnit.TestSuite:Run(TestResult)
|
||||
TestRunner:Run()
|
||||
Bootstrap:Start()
|
File diff suppressed because it is too large
Load Diff
|
@ -1,17 +0,0 @@
|
|||
test stack trace
|
||||
UnityEngine.DebugLogHandler:Internal_Log(LogType, LogOption, String, Object)
|
||||
UnityEngine.DebugLogHandler:LogFormat(LogType, Object, String, Object[])
|
||||
UnityEngine.Logger:Log(LogType, Object)
|
||||
UnityEngine.Debug:Log(Object)
|
||||
F.g:A()
|
||||
F.G:a(g, Int32[], List`1, Banana)
|
||||
F.g:a(Int64, UInt64, Single, Double, String, Object)
|
||||
F.g:b(Byte, SByte, Int16, UInt16, Int32, UInt32)
|
||||
Tests.TC_StackTrace:PrintStackTrace()
|
||||
System.Reflection.RuntimeMethodInfo:InternalInvoke(Object, Object[], Exception&)
|
||||
System.Reflection.RuntimeMethodInfo:Invoke(Object, BindingFlags, Binder, Object[], CultureInfo)
|
||||
System.Reflection.MethodBase:Invoke(Object, Object[])
|
||||
SharpUnit.TestCase:Run(TestResult)
|
||||
SharpUnit.TestSuite:Run(TestResult)
|
||||
TestRunner:Run()
|
||||
Bootstrap:Start()
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue