@@ -16,6 +16,9 @@ public class MessageDeobfuscationTest : TestBase {
1616 " at MessageDeobfuscation.Class.NestedClass.Method(String )" ,
1717 " at MessageDeobfuscation.Program.Main()" ) ;
1818
19+ const string Password = "password" ;
20+ const string Seed = "seed" ;
21+
1922 public MessageDeobfuscationTest ( ITestOutputHelper outputHelper ) : base ( outputHelper ) { }
2023
2124 [ Theory ]
@@ -87,15 +90,53 @@ public static IEnumerable<object[]> RenameModeAndExpectedObfuscatedOutput() =>
8790 }
8891 } ,
8992 new object [ ] {
90- nameof ( RenameMode . Sequential ) ,
91- new [ ] {
93+ nameof ( RenameMode . Sequential ) , new [ ] {
9294 "Exception" ,
9395 " at _g._e._c(String )" ,
9496 " at _B._f()"
9597 }
9698 }
9799 } ;
98100
101+ [ Fact ]
102+ [ Trait ( "Category" , "Protection" ) ]
103+ public async Task CheckGeneratedPassword ( ) {
104+ string actualPassword1 = null , actualPassword2 = null ;
105+ await RunDeobfuscationWithPassword ( true , null , "_0" , Array . Empty < string > ( ) ,
106+ outputPath => {
107+ actualPassword1 = File . ReadAllText ( Path . Combine ( outputPath , CoreComponent . PasswordFileName ) ) ;
108+ Assert . True ( Guid . TryParse ( actualPassword1 , out _ ) ) ;
109+ return Task . Delay ( 0 ) ;
110+ } ) ;
111+ await RunDeobfuscationWithPassword ( true , null , "_1" , Array . Empty < string > ( ) ,
112+ outputPath => {
113+ actualPassword2 = File . ReadAllText ( Path . Combine ( outputPath , CoreComponent . PasswordFileName ) ) ;
114+ Assert . True ( Guid . TryParse ( actualPassword2 , out _ ) ) ;
115+ return Task . Delay ( 0 ) ;
116+ } ) ;
117+ Assert . NotEqual ( actualPassword1 , actualPassword2 ) ;
118+ }
119+
120+ [ Fact ]
121+ [ Trait ( "Category" , "Protection" ) ]
122+ public async Task CheckPasswordDependsOnSeed ( ) {
123+ var expectedObfuscatedOutput = new [ ] {
124+ "Exception" ,
125+ " at oZuuchQgRo99FxO43G5kj2LB6aE3b$hsLiIOVL3cn0lg.CN9UQGJKgUbt4OKGBs8_vig.FtV6w7kWA1GcUNTnc2UDptg(String )" ,
126+ " at EcGxTPKtKIEeZuP3ekjPVhrVKQsiovm5zMkq5xfZbt1V.xvkt0Ir5VfNl8phozRzOvg8()"
127+ } ;
128+ await RunDeobfuscationWithPassword ( true , Seed , "_0" , expectedObfuscatedOutput ,
129+ outputPath => {
130+ Assert . Equal ( Seed , File . ReadAllText ( Path . Combine ( outputPath , CoreComponent . PasswordFileName ) ) ) ;
131+ return Task . Delay ( 0 ) ;
132+ } ) ;
133+ await RunDeobfuscationWithPassword ( true , Seed , "_1" , expectedObfuscatedOutput ,
134+ outputPath => {
135+ Assert . Equal ( Seed , File . ReadAllText ( Path . Combine ( outputPath , CoreComponent . PasswordFileName ) ) ) ;
136+ return Task . Delay ( 0 ) ;
137+ } ) ;
138+ }
139+
99140 [ Fact ]
100141 [ Trait ( "Category" , "Protection" ) ]
101142 [ Trait ( "Protection" , "rename" ) ]
@@ -105,36 +146,41 @@ public async Task MessageDeobfuscationWithPassword() {
105146 " at oQmpV$y2k2b9P3d6GP1cxGPuRtKaNIZvZcKpZXSfKFG8.CE8t0VDPQk9$jgv1XuRwt1k.FhsPrCLqIAaPKe7abGklvY4(String )" ,
106147 " at EbUjRcrC76NnA7RJlhQffrfp$vMGHdDfqtVFtWrAOPyD.xgIw9voebB21PlxPFA_hs60()"
107148 } ;
108- string password = "password" ;
109- await Run (
110- "MessageDeobfuscation.exe" ,
111- expectedObfuscatedOutput ,
112- new SettingItem < Protection > ( "rename" ) {
113- [ "mode" ] = "reversible" ,
114- [ "password" ] = password ,
115- [ "renPdb" ] = "true"
116- } ,
117- "Password" ,
118- postProcessAction : outputPath => {
119- var deobfuscator = new MessageDeobfuscator ( password ) ;
120- var deobfuscatedMessage = deobfuscator . DeobfuscateMessage ( string . Join ( Environment . NewLine , expectedObfuscatedOutput ) ) ;
149+ await RunDeobfuscationWithPassword ( false , null , "" , expectedObfuscatedOutput , outputPath => {
150+ var deobfuscator = new MessageDeobfuscator ( Password ) ;
151+ var deobfuscatedMessage =
152+ deobfuscator . DeobfuscateMessage ( string . Join ( Environment . NewLine , expectedObfuscatedOutput ) ) ;
121153
122- void CheckName ( string expectedName , string obfuscatedName ) {
123- var name = deobfuscator . DeobfuscateSymbol ( obfuscatedName , true ) ;
124- Assert . Equal ( expectedName , name ) ;
125- }
154+ void CheckName ( string expectedName , string obfuscatedName ) {
155+ var name = deobfuscator . DeobfuscateSymbol ( obfuscatedName , true ) ;
156+ Assert . Equal ( expectedName , name ) ;
157+ }
126158
127- CheckName ( "MessageDeobfuscation.Class" , "oQmpV$y2k2b9P3d6GP1cxGPuRtKaNIZvZcKpZXSfKFG8" ) ;
128- CheckName ( "NestedClass" , "CE8t0VDPQk9$jgv1XuRwt1k" ) ;
129- CheckName ( "Method" , "jevJU4p4yNrAYGqN7GkRWaI" ) ;
130- CheckName ( "Field" , "3IS4xsnUsvDQZop6e4WmNVw" ) ;
131- CheckName ( "Property" , "917VMBMNYHd0kfnnNkgeJ10" ) ;
132- CheckName ( "Event" , "AIyINk7kgFLFc73Md8Nu8Z0" ) ;
159+ CheckName ( "MessageDeobfuscation.Class" , "oQmpV$y2k2b9P3d6GP1cxGPuRtKaNIZvZcKpZXSfKFG8" ) ;
160+ CheckName ( "NestedClass" , "CE8t0VDPQk9$jgv1XuRwt1k" ) ;
161+ CheckName ( "Method" , "jevJU4p4yNrAYGqN7GkRWaI" ) ;
162+ CheckName ( "Field" , "3IS4xsnUsvDQZop6e4WmNVw" ) ;
163+ CheckName ( "Property" , "917VMBMNYHd0kfnnNkgeJ10" ) ;
164+ CheckName ( "Event" , "AIyINk7kgFLFc73Md8Nu8Z0" ) ;
133165
134- Assert . Equal ( _expectedDeobfuscatedOutput , deobfuscatedMessage ) ;
135- return Task . Delay ( 0 ) ;
136- }
137- ) ;
166+ Assert . Equal ( _expectedDeobfuscatedOutput , deobfuscatedMessage ) ;
167+ return Task . Delay ( 0 ) ;
168+ } ) ;
138169 }
170+
171+ async Task RunDeobfuscationWithPassword ( bool generatePassword , string seed , string suffix ,
172+ string [ ] expectedObfuscatedOutput , Func < string , Task > postProcessAction ) => await Run (
173+ "MessageDeobfuscation.exe" ,
174+ expectedObfuscatedOutput ,
175+ new SettingItem < Protection > ( "rename" ) {
176+ [ "mode" ] = "reversible" ,
177+ [ "password" ] = Password ,
178+ [ "generatePassword" ] = generatePassword . ToString ( )
179+ } ,
180+ $ "Password_{ ( generatePassword ? $ "Random{ ( seed != null ? "_Seed" : "" ) } { suffix } " : $ "Hardcoded{ suffix } ") } ",
181+ checkOutput : ! generatePassword || seed != null ,
182+ seed : seed ,
183+ postProcessAction : postProcessAction
184+ ) ;
139185 }
140186}
0 commit comments