Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Как создать IL программу


Автор: DenWPF 21.4.2011, 12:20
Я пишу код на C#. exe-шник содержит C# код, или уже IL ?

вообщем нужно сделать так что бы по exe-шнику нельзя было определить на каком языке написан. 

Автор: likegift 21.4.2011, 12:30
 тогда пиши сразу на ассемблере

Автор: SKrivosein 21.4.2011, 12:43
Вобщем непонятно зачем это надо, в .NET Reflector можно открыть твой ехешник в любом языке .NET
А сам ехешник  помоему в бинарной форме IL описаной метаданными, в которых я лично ненашел на каком языке написан.
Хотя могу ошибатся. smile 

Автор: Sartorius 21.4.2011, 12:50
DenWPF, .NET сборка содержит конечно MS IL код. Но AFAIK в сборке нет метаинформации о исходном языке. Может быть по особенностям компиляции констркций языка в IL это можно понять. В любом случае сборку можно пропустить через обфускатор 
http://preemptive.com/products/dotfuscator/overview

Автор: SKrivosein 21.4.2011, 12:52
Например напиши коротенькую .exe, открой её как файл в студии и увидиш метаданные. Открой в рефлекторе...
Потом переименуй на неизвестный тип файла, допустим .kiuz  smile и опять открой как файл в студии.

Автор: DenWPF 21.4.2011, 15:24
Цитата

.NET Reflector можно открыть твой ехешник в любом языке .NET


понял. спасибо

Автор: gambit 21.4.2011, 15:57
Вообще это большой и давний вопрос, что ms при компиляции пишут в exe файл. Ходят легенды что exe можно определить лицензионность твоей винды и студии.

Автор: Rohoss 22.4.2011, 12:18
Цитата(gambit @  21.4.2011,  15:57 Найти цитируемый пост)
Ходят легенды что exe можно определить лицензионность твоей винды и студии. 

Ко мне не приходили  smile 

Вообще если хочешь писать на IL то есть http://nida.se/ilide/

А по исходному IL-коду иногда можно догадываться на каком ЯП написано, потому как используются такие пространства имён как FSharp, VisualBasic и другие... Однако гарантий нет, иногда люди используют эти пространства имён из других языков...

Автор: diadiavova 22.4.2011, 13:25
Цитата(Rohoss @  22.4.2011,  13:18 Найти цитируемый пост)
А по исходному IL-коду иногда можно догадываться на каком ЯП написано, потому как используются такие пространства имён как FSharp, VisualBasic и другие...

Ну вообще-то не только. Как написал Sartorius, некоторые вещи можно определить по особенностям компиляции. Приведу простой пример: создаем цикл на шарпее и на бейсике
Код

            for (int i = 0; i <= 10; i++)
            {
                Console.WriteLine("blablabla");
            }


Код

        For i As Integer = 0 To 10 Step 1
            Console.WriteLine("blablabla")
        Next


Вроде ожидается, что должен быть сгенерирован один IL, однако что мы видим:
Для шарпа
Код

    IL_0000: ldc.i4.0
    IL_0001: stloc.0
    IL_0002: br.s IL_0012
    // loop start (head: IL_0012)
        IL_0004: ldstr "blablabla"
        IL_0009: call void [mscorlib]System.Console::WriteLine(string)
        IL_000e: ldloc.0
        IL_000f: ldc.i4.1
        IL_0010: add
        IL_0011: stloc.0
        IL_0012: ldloc.0
        IL_0013: ldc.i4.s 10
        IL_0015: ble.s IL_0004
    // end loop
    IL_0017: ret

А для бейсика
Код

    IL_0000: ldc.i4.0
    IL_0001: stloc.0
    // loop start (head: IL_0002)
        IL_0002: ldstr "blablabla"
        IL_0007: call void [mscorlib]System.Console::WriteLine(string)
        IL_000c: ldloc.0
        IL_000d: ldc.i4.1
        IL_000e: add.ovf
        IL_000f: stloc.0
        IL_0010: ldloc.0
        IL_0011: ldc.i4.s 10
        IL_0013: ble.s IL_0002
    // end loop
    IL_0015: ret


То есть различия очевидны. Можно конечно для шарпа написать так
Код

            int i = 0;
            while (true)
            {
                Console.WriteLine("blablabla");
                i++;
                if (i > 10)
                {
                    break;
                }
            }

Тогда получим такой IL
Код

    IL_0000: ldc.i4.0
    IL_0001: stloc.0
    // loop start (head: IL_0002)
        IL_0002: ldstr "blablabla"
        IL_0007: call void [mscorlib]System.Console::WriteLine(string)
        IL_000c: ldloc.0
        IL_000d: ldc.i4.1
        IL_000e: add
        IL_000f: stloc.0
        IL_0010: ldloc.0
        IL_0011: ldc.i4.s 10
        IL_0013: ble.s IL_0002
    // end loop
    IL_0015: ret

В данном случае различия в том, как выполняется инкремент счетчика: в шарпе используется инструкция add, а в бейсике add.ovf ( с проверкой переполнения). На шарпе тоже можно выполнить проверку переполнения значений
Код

            int i = 0;
            while (true)
            {
                Console.WriteLine("blablabla");
                checked
                {
                    i++;
                }
                if (i > 10)
                {
                    break;
                }
            }
и получить код, идентичный тому, что генерируется для бейсика, вопрос только в том, кто будет этим заниматься. А подобные нюансы существуют для многих конструкций.

Автор: A5uKa 22.4.2011, 14:36
Nemerle
Код

using System.Console;

module Program
{
  Main() : void
  {
    for (mutable i = 0; i <= 10; i++)
    {
        WriteLine("blablabla");
    }
  }
}


Код

.method private hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 2
    .locals init (
        [0] int32 num)
    L_0000: ldc.i4.0 
    L_0001: stloc.0 
    L_0002: ldc.i4.0 
    L_0003: stloc.0 
    L_0004: ldloc.0 
    L_0005: ldc.i4.s 10
    L_0007: cgt 
    L_0009: ldc.i4.0 
    L_000a: ceq 
    L_000c: brfalse L_0024
    L_0011: ldstr "blablabla"
    L_0016: call void [mscorlib]System.Console::WriteLine(string)
    L_001b: ldloc.0 
    L_001c: ldc.i4.1 
    L_001d: add.ovf 
    L_001e: stloc.0 
    L_001f: br L_0004
    L_0024: ret 
}

Автор: Rohoss 22.4.2011, 14:47
Все уже поняли, что A5uKa знает Nemerle  smile 

Автор: A5uKa 22.4.2011, 14:49
Цитата(Rohoss @ 22.4.2011,  14:47)
Все уже поняли, что A5uKa знает Nemerle  smile

 smile 

Автор: DenWPF 22.4.2011, 14:58
diadiavova, спасибо, очень интересно.


Автор: gambit 22.4.2011, 16:49
Цитата(Rohoss @  22.4.2011,  12:18 Найти цитируемый пост)
Цитата(gambit @  21.4.2011,  15:57 Найти цитируемый пост)
Ходят легенды что exe можно определить лицензионность твоей винды и студии. 
Ко мне не приходили  smile 

Ну я же написал что это легенды))) Хотя кто знает, че пишут компиляторы.

Автор: diadiavova 22.4.2011, 17:10
Цитата(gambit @  22.4.2011,  17:49 Найти цитируемый пост)
Хотя кто знает, че пишут компиляторы.

Ну в принципе спецификация PE-файла общедоступна, так что кто мешает это проверить? smile 
http://msdn.microsoft.com/en-us/windows/hardware/gg463119.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)