Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 152 стр.

UptoLike

Приложение Б.
Исходный код программы CilCodec
Исходный код программы CilCodec, выполняющей кодирование/де-
кодирование потока инструкций языка CIL, располагается в файле
CilCodec.cs:
using System;
using System.Collections;
using System.Reflection;
using System.Reflection.Emit;
public class Instruction
{
public Instruction(OpCode code, int offset)
{
this.code = code;
this.offset = offset;
this.operand = null;
}
public OpCode Code { get { return code; } }
public int Offset { get { return offset; } }
public object Operand
{
get { return operand; }
set { operand = value; }
}
public override string ToString()
{
return String.Format(“ IL_{0:X8}: “,Offset) +
Code.ToString().PadRight(10) + “ “ + formatOperand();
}
#region Private members
private OpCode code;
Исходный код программы CilCodec
291
0x00, 0x00, 0x00, 0x00
};
// CIL CODE
extern unsigned char cilcode[] = {
0x56, 0x72, 0x01, 0x00, 0x00, 0x70, 0x28, 0x02,
0x00, 0x00, 0x0A, 0x28, 0x01, 0x00, 0x00, 0x0A,
0x28, 0x02, 0x00, 0x00, 0x0A, 0x2A
};
int main()
{
FILE *f;
struct INPUT_PARAMETERS params;
params.FileAlignment = 0x1000;
params.SizeOfMetadata = sizeof(metadata);
params.SizeOfCilCode = sizeof(cilcode);
params.ImageBase = 0x400000;
params.EntryPointToken = 0x06000001;
params.Type = EXE_TYPE;
params.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI;
params.metadata = metadata;
params.cilcode = cilcode;
if(params.Type == EXE_TYPE){
printf(“File: hello.exe generated\n”);
f = fopen(“hello.exe”,”wb”);
}
else{
printf(“File: hello.dll generated\n”);
f = fopen(“hello.dll”,”wb”);
}
make_file(f, &params);
fclose(f);
return 0;
}
290
CIL и системное программирование в Microsoft .NET
290                            CIL и системное программирование в Microsoft .NET   Исходный код программы CilCodec                                     291


           0x00, 0x00, 0x00, 0x00
      };                                                                           Приложение Б.
      // CIL CODE                                                                  Исходный код программы CilCodec
      extern unsigned char cilcode[] = {
         0x56, 0x72, 0x01, 0x00, 0x00, 0x70, 0x28, 0x02,                                Исходный код программы CilCodec, выполняющей кодирование/де-
         0x00, 0x00, 0x0A, 0x28, 0x01, 0x00, 0x00, 0x0A,                           кодирование потока инструкций языка CIL, располагается в файле
         0x28, 0x02, 0x00, 0x00, 0x0A, 0x2A                                        CilCodec.cs:
      };
                                                                                        using   System;
      int main()                                                                        using   System.Collections;
      {                                                                                 using   System.Reflection;
        FILE *f;                                                                        using   System.Reflection.Emit;

           struct INPUT_PARAMETERS params;                                              public class Instruction
                                                                                        {
           params.FileAlignment = 0x1000;                                                 public Instruction(OpCode code, int offset)
           params.SizeOfMetadata = sizeof(metadata);                                      {
           params.SizeOfCilCode = sizeof(cilcode);                                           this.code = code;
           params.ImageBase = 0x400000;                                                      this.offset = offset;
           params.EntryPointToken = 0x06000001;                                              this.operand = null;
           params.Type = EXE_TYPE;                                                        }
           params.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI;
           params.metadata = metadata;                                                   public OpCode Code { get { return code; } }
           params.cilcode = cilcode;
                                                                                         public int Offset { get { return offset; } }
           if(params.Type == EXE_TYPE){
             printf(“File: hello.exe generated\n”);                                      public object Operand
             f = fopen(“hello.exe”,”wb”);                                                {
           }                                                                                get { return operand; }
           else{                                                                            set { operand = value; }
             printf(“File: hello.dll generated\n”);                                      }
             f = fopen(“hello.dll”,”wb”);
           }                                                                             public override string ToString()
                                                                                         {
           make_file(f, ¶ms);                                                          return String.Format(“ IL_{0:X8}: “,Offset) +
                                                                                               Code.ToString().PadRight(10) + “ “ + formatOperand();
           fclose(f);                                                                    }
           return 0;
      }                                                                                  #region Private members

                                                                                         private OpCode code;