Re: String / Character Conversion Question
mikeb wrote:[color=blue]
> anon wrote:
>[color=green]
>> This is where I saw it. So I looked and I saw they started to change the
>> names at the system level and then I said, how did they manage to do
>> this.
>>
>> http://www.semdesigns.com/Products/O...onExample.html
>>
>>[/color]
>
> it's hard to know what they're doing in the example, but there are a
> couple of comments that I think I can make:
>
> 1) using statements (of the namespace sort) do not get compiled down to
> IL - they're used by the C# compiler to make dealing with nested
> namespace names more convenient. However, the emited IL always deals
> with the full typenames, so I'm not sure how a decompiler would generate
> using statements, except by noting which nested namespaces are used in
> the entire assembly and emitting a using statement for some or all of
> those. In this case, the using statements would not magically appear in
> the same order in the decompiled source as they were in the original
> source as they seem to do in the example.
>
> 2) More importantly, there are no types from the System.Globaliz ation
> namespace being used in the example. If no types from that namespace
> are used, then the decompiler would be free to put pretty much any
> namespace it wanted in place of "using System.Globaliz ation;". However,
> I'm at a loss as to why it would decide to do anything with
> System.Globaliz ation if no types from that namespace are used.
>
> Looking at the example some more, I notice that the following namespaces
> get renamed:
>
> antlr
> antlr.collectio ns
> System.Globaliz ation
> System.IO
>
>
> These seem to correspond to the namespaces that don't actually get used.
> That would explain why they can rename those namespaces, but it doesn't
> explain why they'd have anything at all for those namespaces in the
> decompiled code. Maybe I'm mistaken in my point #1, but I don't think so.
>
>[/color]
I see now that the obfuscator is not obfuscating compiled IL, but
obfuscating directly from the source. As noted by Jon Skeet, that's not
a particularly useful thing to do. I guess it gets you a certain level
of obfuscated names in any assembly compiled from the obfuscated source,
but the tricks they pull with using \uXXXX encoded characters won't buy
a single thing once compiled.
However, it does explain how they can rename get the using statements.
It's a simple as:
The namespaces are not used, so they can rename them however they want.
To get the obfuscated source to compile, they would need to provide a
namespace somewhere that the compiler can match up with or there's a
compiler error. There doesn't need to be anything useful in that
namespace, however.
One thing that I am still curious about is that they rename the
Hashtable class. This causes a compiler error. I believe that this is a
mistake in their obfuscation example. Hashtable should have been
included in the list of public items that should not be renamed.
....<snip>...
--
mikeb
mikeb wrote:[color=blue]
> anon wrote:
>[color=green]
>> This is where I saw it. So I looked and I saw they started to change the
>> names at the system level and then I said, how did they manage to do
>> this.
>>
>> http://www.semdesigns.com/Products/O...onExample.html
>>
>>[/color]
>
> it's hard to know what they're doing in the example, but there are a
> couple of comments that I think I can make:
>
> 1) using statements (of the namespace sort) do not get compiled down to
> IL - they're used by the C# compiler to make dealing with nested
> namespace names more convenient. However, the emited IL always deals
> with the full typenames, so I'm not sure how a decompiler would generate
> using statements, except by noting which nested namespaces are used in
> the entire assembly and emitting a using statement for some or all of
> those. In this case, the using statements would not magically appear in
> the same order in the decompiled source as they were in the original
> source as they seem to do in the example.
>
> 2) More importantly, there are no types from the System.Globaliz ation
> namespace being used in the example. If no types from that namespace
> are used, then the decompiler would be free to put pretty much any
> namespace it wanted in place of "using System.Globaliz ation;". However,
> I'm at a loss as to why it would decide to do anything with
> System.Globaliz ation if no types from that namespace are used.
>
> Looking at the example some more, I notice that the following namespaces
> get renamed:
>
> antlr
> antlr.collectio ns
> System.Globaliz ation
> System.IO
>
>
> These seem to correspond to the namespaces that don't actually get used.
> That would explain why they can rename those namespaces, but it doesn't
> explain why they'd have anything at all for those namespaces in the
> decompiled code. Maybe I'm mistaken in my point #1, but I don't think so.
>
>[/color]
I see now that the obfuscator is not obfuscating compiled IL, but
obfuscating directly from the source. As noted by Jon Skeet, that's not
a particularly useful thing to do. I guess it gets you a certain level
of obfuscated names in any assembly compiled from the obfuscated source,
but the tricks they pull with using \uXXXX encoded characters won't buy
a single thing once compiled.
However, it does explain how they can rename get the using statements.
It's a simple as:
The namespaces are not used, so they can rename them however they want.
To get the obfuscated source to compile, they would need to provide a
namespace somewhere that the compiler can match up with or there's a
compiler error. There doesn't need to be anything useful in that
namespace, however.
One thing that I am still curious about is that they rename the
Hashtable class. This causes a compiler error. I believe that this is a
mistake in their obfuscation example. Hashtable should have been
included in the list of public items that should not be renamed.
....<snip>...
--
mikeb
Comment