Skip to content

Commit 1a8d37e

Browse files
authored
Merge b2d570f into 7b37382
2 parents 7b37382 + b2d570f commit 1a8d37e

File tree

6 files changed

+168
-2
lines changed

6 files changed

+168
-2
lines changed

Confuser.Renamer/NameService.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,8 @@ public string ObfuscateName(string name, RenameMode mode) {
221221
if (mode == RenameMode.Empty)
222222
return "";
223223
if (mode == RenameMode.Debug)
224-
return MakeGenericName("_" + name, count);
224+
// When flattening there are issues, in case there is a . in the name of the assembly.
225+
return MakeGenericName("_" + name.Replace('.', '_'), count);
225226
if (mode == RenameMode.Reversible) {
226227
if (reversibleRenamer == null)
227228
throw new ArgumentException("Password not provided for reversible renaming.");

Confuser2.sln

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "118_EnhancedStrongName", "T
7070
EndProject
7171
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "118_EnhancedStrongName.Test", "Tests\118_EnhancedStrongName.Test\118_EnhancedStrongName.Test.csproj", "{D8BDABF6-6A96-4B48-8C1C-B6E78CBBF50E}"
7272
EndProject
73-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "123_InheritCustomAttr", "Tests\123_InheritCustomAttr\123_InheritCustomAttr.csproj", "{3B85D7A9-6BD0-4CD8-9009-36554EF24D32}"
73+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "123_InheritCustomAttr", "Tests\123_InheritCustomAttr\123_InheritCustomAttr.csproj", "{3B85D7A9-6BD0-4CD8-9009-36554EF24D32}"
7474
EndProject
7575
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "123_InheritCustomAttr.Test", "Tests\123_InheritCustomAttr.Test\123_InheritCustomAttr.Test.csproj", "{DA7DF89C-447D-4C2D-9C75-933037BF245E}"
7676
EndProject
77+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "161_DynamicTypeRename", "Tests\161_DynamicTypeRename\161_DynamicTypeRename.csproj", "{034B1C28-96B9-486A-B238-9C651EAA32CA}"
78+
EndProject
79+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "161_DynamicTypeRename.Test", "Tests\161_DynamicTypeRename.Test\161_DynamicTypeRename.Test.csproj", "{2B914EE7-F206-4A83-B435-460D054315BB}"
80+
EndProject
7781
Global
7882
GlobalSection(SolutionConfigurationPlatforms) = preSolution
7983
Debug|Any CPU = Debug|Any CPU
@@ -192,6 +196,14 @@ Global
192196
{DA7DF89C-447D-4C2D-9C75-933037BF245E}.Debug|Any CPU.Build.0 = Debug|Any CPU
193197
{DA7DF89C-447D-4C2D-9C75-933037BF245E}.Release|Any CPU.ActiveCfg = Release|Any CPU
194198
{DA7DF89C-447D-4C2D-9C75-933037BF245E}.Release|Any CPU.Build.0 = Release|Any CPU
199+
{034B1C28-96B9-486A-B238-9C651EAA32CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
200+
{034B1C28-96B9-486A-B238-9C651EAA32CA}.Debug|Any CPU.Build.0 = Debug|Any CPU
201+
{034B1C28-96B9-486A-B238-9C651EAA32CA}.Release|Any CPU.ActiveCfg = Release|Any CPU
202+
{034B1C28-96B9-486A-B238-9C651EAA32CA}.Release|Any CPU.Build.0 = Release|Any CPU
203+
{2B914EE7-F206-4A83-B435-460D054315BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
204+
{2B914EE7-F206-4A83-B435-460D054315BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
205+
{2B914EE7-F206-4A83-B435-460D054315BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
206+
{2B914EE7-F206-4A83-B435-460D054315BB}.Release|Any CPU.Build.0 = Release|Any CPU
195207
EndGlobalSection
196208
GlobalSection(SolutionProperties) = preSolution
197209
HideSolutionNode = FALSE
@@ -216,6 +228,8 @@ Global
216228
{D8BDABF6-6A96-4B48-8C1C-B6E78CBBF50E} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB}
217229
{3B85D7A9-6BD0-4CD8-9009-36554EF24D32} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB}
218230
{DA7DF89C-447D-4C2D-9C75-933037BF245E} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB}
231+
{034B1C28-96B9-486A-B238-9C651EAA32CA} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB}
232+
{2B914EE7-F206-4A83-B435-460D054315BB} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB}
219233
EndGlobalSection
220234
GlobalSection(ExtensibilityGlobals) = postSolution
221235
SolutionGuid = {0D937D9E-E04B-4A68-B639-D4260473A388}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net461</TargetFramework>
5+
<RootNamespace>DynamicTypeRename.Test</RootNamespace>
6+
<IsPackable>false</IsPackable>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
11+
<PackageReference Include="xunit" Version="2.3.1" />
12+
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
13+
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" />
14+
</ItemGroup>
15+
16+
<ItemGroup>
17+
<ProjectReference Include="..\..\Confuser.Core\Confuser.Core.csproj" />
18+
<ProjectReference Include="..\..\Confuser.DynCipher\Confuser.DynCipher.csproj" />
19+
<ProjectReference Include="..\..\Confuser.Protections\Confuser.Protections.csproj" />
20+
<ProjectReference Include="..\..\Confuser.Renamer\Confuser.Renamer.csproj" />
21+
<ProjectReference Include="..\161_DynamicTypeRename\161_DynamicTypeRename.csproj" />
22+
<ProjectReference Include="..\Confuser.UnitTest\Confuser.UnitTest.csproj" />
23+
</ItemGroup>
24+
25+
</Project>
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Diagnostics;
4+
using System.IO;
5+
using System.Threading.Tasks;
6+
using Confuser.Core;
7+
using Confuser.Core.Project;
8+
using Confuser.Renamer;
9+
using Confuser.UnitTest;
10+
using Xunit;
11+
using Xunit.Abstractions;
12+
13+
namespace DynamicTypeRename.Test {
14+
public class RenameDynamicTypeTest {
15+
private readonly ITestOutputHelper outputHelper;
16+
17+
public RenameDynamicTypeTest(ITestOutputHelper outputHelper) =>
18+
this.outputHelper = outputHelper ?? throw new ArgumentNullException(nameof(outputHelper));
19+
20+
[Theory]
21+
[MemberData(nameof(RenameDynamicTypeData))]
22+
[Trait("Category", "Protection")]
23+
[Trait("Protection", "rename")]
24+
[Trait("Issue", "https://github.com/mkaring/ConfuserEx/issues/161")]
25+
public async Task RenameDynamicType(string renameMode, bool flatten) {
26+
var baseDir = Environment.CurrentDirectory;
27+
var outputDir = Path.Combine(baseDir, "testtmp_" + Guid.NewGuid().ToString());
28+
var inputFile = Path.Combine(baseDir, "161_DynamicTypeRename.exe");
29+
var outputFile = Path.Combine(outputDir, "161_DynamicTypeRename.exe");
30+
FileUtilities.ClearOutput(outputFile);
31+
var proj = new ConfuserProject {
32+
BaseDirectory = baseDir,
33+
OutputDirectory = outputDir
34+
};
35+
proj.Add(new ProjectModule() { Path = inputFile });
36+
proj.Rules.Add(new Rule() {
37+
new SettingItem<Protection>("rename") {
38+
{ "mode", renameMode },
39+
{ "flatten", flatten ? "True" : "False" }
40+
}
41+
});
42+
43+
var parameters = new ConfuserParameters {
44+
Project = proj,
45+
Logger = new XunitLogger(outputHelper)
46+
};
47+
48+
await ConfuserEngine.Run(parameters);
49+
50+
Assert.True(File.Exists(outputFile));
51+
Assert.NotEqual(FileUtilities.ComputeFileChecksum(inputFile), FileUtilities.ComputeFileChecksum(outputFile));
52+
53+
var info = new ProcessStartInfo(outputFile) {
54+
RedirectStandardOutput = true,
55+
UseShellExecute = false
56+
};
57+
using (var process = Process.Start(info)) {
58+
var stdout = process.StandardOutput;
59+
Assert.Equal("START", await stdout.ReadLineAsync());
60+
Assert.Equal("Type declaration done", await stdout.ReadLineAsync());
61+
Assert.Equal("Dynamic type created", await stdout.ReadLineAsync());
62+
Assert.Equal("Fields in type: 1", await stdout.ReadLineAsync());
63+
Assert.Equal("Fetching field value is okay", await stdout.ReadLineAsync());
64+
Assert.Equal("END", await stdout.ReadLineAsync());
65+
Assert.Empty(await stdout.ReadToEndAsync());
66+
Assert.True(process.HasExited);
67+
Assert.Equal(42, process.ExitCode);
68+
}
69+
70+
FileUtilities.ClearOutput(outputFile);
71+
}
72+
73+
public static IEnumerable<object[]> RenameDynamicTypeData() {
74+
foreach (var renameMode in new string[] { nameof(RenameMode.Unicode), nameof(RenameMode.ASCII), nameof(RenameMode.Letters), nameof(RenameMode.Debug) })
75+
foreach (var flatten in new bool[] { true, false })
76+
yield return new object[] { renameMode, flatten };
77+
}
78+
}
79+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net461</TargetFramework>
6+
<RootNamespace>DynamicTypeRename</RootNamespace>
7+
<StartupObject>DynamicTypeRename.Program</StartupObject>
8+
</PropertyGroup>
9+
10+
</Project>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System;
2+
using System.Reflection;
3+
using System.Reflection.Emit;
4+
5+
namespace DynamicTypeRename {
6+
public delegate void TestDelegate<T>();
7+
8+
class Program {
9+
static int Main(string[] args) {
10+
Console.WriteLine("START");
11+
var assemblyName = new AssemblyName("DynamicAssembly");
12+
var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
13+
var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".dll");
14+
15+
var typeBuilder = moduleBuilder.DefineType("DynamicType", TypeAttributes.Public | TypeAttributes.Sealed);
16+
var genericTypes = typeBuilder.DefineGenericParameters("T");
17+
18+
typeBuilder.DefineField("DynamicField", typeof(TestDelegate<>).MakeGenericType(genericTypes[0]), FieldAttributes.Public | FieldAttributes.Static);
19+
Console.WriteLine("Type declaration done");
20+
21+
var dynamicType = typeBuilder.CreateType();
22+
var genericDynamicType = dynamicType.MakeGenericType(typeof(string));
23+
Console.WriteLine("Dynamic type created");
24+
25+
var fields = genericDynamicType.GetFields();
26+
Console.WriteLine("Fields in type: " + fields.Length);
27+
28+
if (fields.Length == 1) {
29+
fields[0].GetValue(null);
30+
Console.WriteLine("Fetching field value is okay");
31+
}
32+
33+
Console.WriteLine("END");
34+
return 42;
35+
}
36+
}
37+
}

0 commit comments

Comments
 (0)