Click here to Skip to main content
Click here to Skip to main content
Add your own
alternative version

Building Security Awareness in .NET Assemblies : Part 2 - Learn to protect your .NET assemblies from being tampered

, 31 Oct 2004
Building Security Awareness in .NET Assemblies : Part 2 of 3
necodersarticle2_demo.zip
CrackingIL Executable pt2
CrackingIL.exe
CrackingIL.FrmSecureApp.resources
sn.key
necodersarticle2_src.zip
CrackingIL Source Code pt2
App.ico
CrackingIL.csproj.user
HackingIL.resharperoptions
sn.key
//  Microsoft (R) .NET Framework IL Disassembler.  Version 1.1.4322.573
//  Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.

.assembly extern System.Windows.Forms
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 1:0:5000:0
}
.assembly extern System
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 1:0:5000:0
}
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 1:0:5000:0
}
.assembly extern System.Drawing
{
  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )                         // .?_....:
  .ver 1:0:5000:0
}
.assembly CrackingIL
{
  .custom instance void [mscorlib]System.Reflection.AssemblyTrademarkAttribute::.ctor(string) = ( 01 00 00 00 00 ) 
  .custom instance void [mscorlib]System.Reflection.AssemblyKeyNameAttribute::.ctor(string) = ( 01 00 00 00 00 ) 
  .custom instance void [mscorlib]System.Reflection.AssemblyKeyFileAttribute::.ctor(string) = ( 01 00 0C 2E 2E 5C 2E 2E 5C 73 6E 2E 6B 65 79 00   // .....\..\sn.key.
                                                                                                00 ) 
  .custom instance void [mscorlib]System.Reflection.AssemblyDelaySignAttribute::.ctor(bool) = ( 01 00 00 00 00 ) 
  .custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = ( 01 00 00 00 00 ) 
  .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = ( 01 00 01 00 00 ) 
  .custom instance void [mscorlib]System.Reflection.AssemblyCompanyAttribute::.ctor(string) = ( 01 00 0C 4E 65 43 6F 64 65 72 73 2E 63 6F 6D 00   // ...NeCoders.com.
                                                                                                00 ) 
  .custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string) = ( 01 00 00 00 00 ) 
  .custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string) = ( 01 00 00 00 00 ) 
  .custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = ( 01 00 4B 42 75 69 6C 64 69 6E 67 20 53 65 63 75   // ..KBuilding Secu
                                                                                                    72 69 74 79 20 41 77 61 72 65 6E 65 73 73 20 69   // rity Awareness i
                                                                                                    6E 20 2E 4E 65 74 20 41 73 73 65 6D 62 6C 69 65   // n .Net Assemblie
                                                                                                    73 20 50 61 72 74 20 32 20 41 72 74 69 63 6C 65   // s Part 2 Article
                                                                                                    27 73 20 53 6F 75 72 63 65 20 43 6F 64 65 00 00 ) // 's Source Code..
  // --- The following custom attribute is added automatically, do not uncomment -------
  //  .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool,
  //                                                                                bool) = ( 01 00 01 01 00 00 ) 
  .custom instance void [mscorlib]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) = ( 01 00 00 00 00 ) 
  .custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( 01 00 0F 48 61 63 6B 69 6E 67 49 4C 20 52 6F 63   // ...HackingIL Roc
                                                                                              6B 73 00 00 )                                     // ks..
  .permissionset reqmin = (3C 00 50 00 65 00 72 00 6D 00 69 00 73 00 73 00   // <.P.e.r.m.i.s.s.
                           69 00 6F 00 6E 00 53 00 65 00 74 00 20 00 63 00   // i.o.n.S.e.t. .c.
                           6C 00 61 00 73 00 73 00 3D 00 22 00 53 00 79 00   // l.a.s.s.=.".S.y.
                           73 00 74 00 65 00 6D 00 2E 00 53 00 65 00 63 00   // s.t.e.m...S.e.c.
                           75 00 72 00 69 00 74 00 79 00 2E 00 50 00 65 00   // u.r.i.t.y...P.e.
                           72 00 6D 00 69 00 73 00 73 00 69 00 6F 00 6E 00   // r.m.i.s.s.i.o.n.
                           53 00 65 00 74 00 22 00 0D 00 0A 00 20 00 20 00   // S.e.t."..... . .
                           20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   //  . . . . . . . .
                           20 00 20 00 20 00 20 00 20 00 76 00 65 00 72 00   //  . . . . .v.e.r.
                           73 00 69 00 6F 00 6E 00 3D 00 22 00 31 00 22 00   // s.i.o.n.=.".1.".
                           3E 00 0D 00 0A 00 20 00 20 00 20 00 3C 00 49 00   // >..... . . .<.I.
                           50 00 65 00 72 00 6D 00 69 00 73 00 73 00 69 00   // P.e.r.m.i.s.s.i.
                           6F 00 6E 00 20 00 63 00 6C 00 61 00 73 00 73 00   // o.n. .c.l.a.s.s.
                           3D 00 22 00 53 00 79 00 73 00 74 00 65 00 6D 00   // =.".S.y.s.t.e.m.
                           2E 00 53 00 65 00 63 00 75 00 72 00 69 00 74 00   // ..S.e.c.u.r.i.t.
                           79 00 2E 00 50 00 65 00 72 00 6D 00 69 00 73 00   // y...P.e.r.m.i.s.
                           73 00 69 00 6F 00 6E 00 73 00 2E 00 49 00 73 00   // s.i.o.n.s...I.s.
                           6F 00 6C 00 61 00 74 00 65 00 64 00 53 00 74 00   // o.l.a.t.e.d.S.t.
                           6F 00 72 00 61 00 67 00 65 00 46 00 69 00 6C 00   // o.r.a.g.e.F.i.l.
                           65 00 50 00 65 00 72 00 6D 00 69 00 73 00 73 00   // e.P.e.r.m.i.s.s.
                           69 00 6F 00 6E 00 2C 00 20 00 6D 00 73 00 63 00   // i.o.n.,. .m.s.c.
                           6F 00 72 00 6C 00 69 00 62 00 2C 00 20 00 56 00   // o.r.l.i.b.,. .V.
                           65 00 72 00 73 00 69 00 6F 00 6E 00 3D 00 31 00   // e.r.s.i.o.n.=.1.
                           2E 00 30 00 2E 00 35 00 30 00 30 00 30 00 2E 00   // ..0...5.0.0.0...
                           30 00 2C 00 20 00 43 00 75 00 6C 00 74 00 75 00   // 0.,. .C.u.l.t.u.
                           72 00 65 00 3D 00 6E 00 65 00 75 00 74 00 72 00   // r.e.=.n.e.u.t.r.
                           61 00 6C 00 2C 00 20 00 50 00 75 00 62 00 6C 00   // a.l.,. .P.u.b.l.
                           69 00 63 00 4B 00 65 00 79 00 54 00 6F 00 6B 00   // i.c.K.e.y.T.o.k.
                           65 00 6E 00 3D 00 62 00 37 00 37 00 61 00 35 00   // e.n.=.b.7.7.a.5.
                           63 00 35 00 36 00 31 00 39 00 33 00 34 00 65 00   // c.5.6.1.9.3.4.e.
                           30 00 38 00 39 00 22 00 0D 00 0A 00 20 00 20 00   // 0.8.9."..... . .
                           20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   //  . . . . . . . .
                           20 00 20 00 20 00 20 00 20 00 20 00 76 00 65 00   //  . . . . . .v.e.
                           72 00 73 00 69 00 6F 00 6E 00 3D 00 22 00 31 00   // r.s.i.o.n.=.".1.
                           22 00 0D 00 0A 00 20 00 20 00 20 00 20 00 20 00   // "..... . . . . .
                           20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   //  . . . . . . . .
                           20 00 20 00 20 00 41 00 6C 00 6C 00 6F 00 77 00   //  . . .A.l.l.o.w.
                           65 00 64 00 3D 00 22 00 4E 00 6F 00 6E 00 65 00   // e.d.=.".N.o.n.e.
                           22 00 0D 00 0A 00 20 00 20 00 20 00 20 00 20 00   // "..... . . . . .
                           20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   //  . . . . . . . .
                           20 00 20 00 20 00 55 00 73 00 65 00 72 00 51 00   //  . . .U.s.e.r.Q.
                           75 00 6F 00 74 00 61 00 3D 00 22 00 31 00 30 00   // u.o.t.a.=.".1.0.
                           34 00 38 00 35 00 37 00 36 00 22 00 2F 00 3E 00   // 4.8.5.7.6."./.>.
                           0D 00 0A 00 3C 00 2F 00 50 00 65 00 72 00 6D 00   // ....<./.P.e.r.m.
                           69 00 73 00 73 00 69 00 6F 00 6E 00 53 00 65 00   // i.s.s.i.o.n.S.e.
                           74 00 3E 00 0D 00 0A 00 )                         // t.>.....
  .publickey = (00 24 00 00 04 80 00 00 94 00 00 00 06 02 00 00   // .$..............
                00 24 00 00 52 53 41 31 00 04 00 00 01 00 01 00   // .$..RSA1........
                57 22 3E B6 86 B1 CB D2 6E 7F 45 CE 62 99 DD CF   // W">.....n.E.b...
                76 C7 7D D9 B7 91 4A 78 E4 F4 11 DA 81 93 F4 C5   // v.}...Jx........
                3A AA 5B B8 20 3F C2 0A EE 65 27 0B F7 6C 89 35   // :.[. ?...e'..l.5
                EF 2D E1 B4 E9 1D F3 0D 52 18 ED BD 4B 28 00 29   // .-......R...K(.)
                B9 5D 97 16 BD C6 EF DD AC E3 D8 50 54 7D 2A 17   // .].........PT}*.
                D5 BE E8 E9 6E 63 67 25 AC 66 AF F7 3E 64 2B D4   // ....ncg%.f..>d+.
                FD 1B E6 33 48 97 91 46 44 FF EA 2C AC DA D8 6E   // ...3H..FD..,...n
                D1 8C 0F DA 1E 2B AA FA F6 54 F0 95 39 CB AB 9E ) // .....+...T..9...
  .hash algorithm 0x00008004
  .ver 1:0:0:0
}
.mresource public CrackingIL.FrmSecureApp.resources
{
  // WARNING: managed resource file CrackingIL.FrmSecureApp.resources created
}
.module CrackingIL.exe
// MVID: {1D73A318-8138-4A8E-AB55-5524FA100F68}
.imagebase 0x00400000
.subsystem 0x00000002
.file alignment 4096
.corflags 0x00000009
// Image base: 0x06b20000
//
// ============== CLASS STRUCTURE DECLARATION ==================
//
.namespace CrackingIL
{
  .class public auto ansi beforefieldinit FrmSecureApp
         extends [System.Windows.Forms]System.Windows.Forms.Form
  {
  } // end of class FrmSecureApp

} // end of namespace CrackingIL


// =============================================================


// =============== GLOBAL FIELDS AND METHODS ===================


// =============================================================


// =============== CLASS MEMBERS DECLARATION ===================
//   note that class flags, 'extends' and 'implements' clauses
//          are provided here for information only

.namespace CrackingIL
{
  .class public auto ansi beforefieldinit FrmSecureApp
         extends [System.Windows.Forms]System.Windows.Forms.Form
  {
    .field private class [System.Windows.Forms]System.Windows.Forms.Label lblHeader
    .field private class [System]System.ComponentModel.Container components
    .method public hidebysig specialname rtspecialname 
            instance void  .ctor() cil managed
    {
      // Code size       20 (0x14)
      .maxstack  2
      IL_0000:  ldarg.0
      IL_0001:  ldnull
      IL_0002:  stfld      class [System]System.ComponentModel.Container CrackingIL.FrmSecureApp::components
      IL_0007:  ldarg.0
      IL_0008:  call       instance void [System.Windows.Forms]System.Windows.Forms.Form::.ctor()
      IL_000d:  ldarg.0
      IL_000e:  call       instance void CrackingIL.FrmSecureApp::InitializeComponent()
      IL_0013:  ret
    } // end of method FrmSecureApp::.ctor

    .method family hidebysig virtual instance void 
            Dispose(bool disposing) cil managed
    {
      // Code size       30 (0x1e)
      .maxstack  2
      IL_0000:  ldarg.1
      IL_0001:  brfalse.s  IL_0016

      IL_0003:  ldarg.0
      IL_0004:  ldfld      class [System]System.ComponentModel.Container CrackingIL.FrmSecureApp::components
      IL_0009:  brfalse.s  IL_0016

      IL_000b:  ldarg.0
      IL_000c:  ldfld      class [System]System.ComponentModel.Container CrackingIL.FrmSecureApp::components
      IL_0011:  callvirt   instance void [System]System.ComponentModel.Container::Dispose()
      IL_0016:  ldarg.0
      IL_0017:  ldarg.1
      IL_0018:  call       instance void [System.Windows.Forms]System.Windows.Forms.Form::Dispose(bool)
      IL_001d:  ret
    } // end of method FrmSecureApp::Dispose

    .method private hidebysig instance void 
            InitializeComponent() cil managed
    {
      // Code size       236 (0xec)
      .maxstack  7
      IL_0000:  ldarg.0
      IL_0001:  newobj     instance void [System.Windows.Forms]System.Windows.Forms.Label::.ctor()
      IL_0006:  stfld      class [System.Windows.Forms]System.Windows.Forms.Label CrackingIL.FrmSecureApp::lblHeader
      IL_000b:  ldarg.0
      IL_000c:  call       instance void [System.Windows.Forms]System.Windows.Forms.Control::SuspendLayout()
      IL_0011:  ldarg.0
      IL_0012:  ldfld      class [System.Windows.Forms]System.Windows.Forms.Label CrackingIL.FrmSecureApp::lblHeader
      IL_0017:  ldstr      "Arial"
      IL_001c:  ldc.r4     15.75
      IL_0021:  ldc.i4.1
      IL_0022:  ldc.i4.3
      IL_0023:  ldc.i4.0
      IL_0024:  newobj     instance void [System.Drawing]System.Drawing.Font::.ctor(string,
                                                                                    float32,
                                                                                    valuetype [System.Drawing]System.Drawing.FontStyle,
                                                                                    valuetype [System.Drawing]System.Drawing.GraphicsUnit,
                                                                                    unsigned int8)
      IL_0029:  callvirt   instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Font(class [System.Drawing]System.Drawing.Font)
      IL_002e:  ldarg.0
      IL_002f:  ldfld      class [System.Windows.Forms]System.Windows.Forms.Label CrackingIL.FrmSecureApp::lblHeader
      IL_0034:  ldc.i4.s   24
      IL_0036:  ldc.i4.s   16
      IL_0038:  newobj     instance void [System.Drawing]System.Drawing.Point::.ctor(int32,
                                                                                     int32)
      IL_003d:  callvirt   instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Location(valuetype [System.Drawing]System.Drawing.Point)
      IL_0042:  ldarg.0
      IL_0043:  ldfld      class [System.Windows.Forms]System.Windows.Forms.Label CrackingIL.FrmSecureApp::lblHeader
      IL_0048:  ldstr      "lblHeader"
      IL_004d:  callvirt   instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Name(string)
      IL_0052:  ldarg.0
      IL_0053:  ldfld      class [System.Windows.Forms]System.Windows.Forms.Label CrackingIL.FrmSecureApp::lblHeader
      IL_0058:  ldc.i4     0xd8
      IL_005d:  ldc.i4     0x88
      IL_0062:  newobj     instance void [System.Drawing]System.Drawing.Size::.ctor(int32,
                                                                                    int32)
      IL_0067:  callvirt   instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Size(valuetype [System.Drawing]System.Drawing.Size)
      IL_006c:  ldarg.0
      IL_006d:  ldfld      class [System.Windows.Forms]System.Windows.Forms.Label CrackingIL.FrmSecureApp::lblHeader
      IL_0072:  ldc.i4.0
      IL_0073:  callvirt   instance void [System.Windows.Forms]System.Windows.Forms.Control::set_TabIndex(int32)
      IL_0078:  ldarg.0
      IL_0079:  ldfld      class [System.Windows.Forms]System.Windows.Forms.Label CrackingIL.FrmSecureApp::lblHeader
      IL_007e:  ldstr      "I can't crack you, why?"
      IL_0083:  callvirt   instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
      IL_0088:  ldarg.0
      IL_0089:  ldc.i4.5
      IL_008a:  ldc.i4.s   13
      IL_008c:  newobj     instance void [System.Drawing]System.Drawing.Size::.ctor(int32,
                                                                                    int32)
      IL_0091:  callvirt   instance void [System.Windows.Forms]System.Windows.Forms.Form::set_AutoScaleBaseSize(valuetype [System.Drawing]System.Drawing.Size)
      IL_0096:  ldarg.0
      IL_0097:  ldc.i4     0x124
      IL_009c:  ldc.i4     0xad
      IL_00a1:  newobj     instance void [System.Drawing]System.Drawing.Size::.ctor(int32,
                                                                                    int32)
      IL_00a6:  call       instance void [System.Windows.Forms]System.Windows.Forms.Form::set_ClientSize(valuetype [System.Drawing]System.Drawing.Size)
      IL_00ab:  ldarg.0
      IL_00ac:  call       instance class [System.Windows.Forms]System.Windows.Forms.Control/ControlCollection [System.Windows.Forms]System.Windows.Forms.Control::get_Controls()
      IL_00b1:  ldarg.0
      IL_00b2:  ldfld      class [System.Windows.Forms]System.Windows.Forms.Label CrackingIL.FrmSecureApp::lblHeader
      IL_00b7:  callvirt   instance void [System.Windows.Forms]System.Windows.Forms.Control/ControlCollection::Add(class [System.Windows.Forms]System.Windows.Forms.Control)
      IL_00bc:  ldarg.0
      IL_00bd:  ldstr      "FrmSecureApp"
      IL_00c2:  call       instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Name(string)
      IL_00c7:  ldarg.0
      IL_00c8:  ldstr      "Secure App v1.0"
      IL_00cd:  callvirt   instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
      IL_00d2:  ldarg.0
      IL_00d3:  ldarg.0
      IL_00d4:  ldftn      instance void CrackingIL.FrmSecureApp::FrmSecureApp_Load(object,
                                                                                    class [mscorlib]System.EventArgs)
      IL_00da:  newobj     instance void [mscorlib]System.EventHandler::.ctor(object,
                                                                              native int)
      IL_00df:  call       instance void [System.Windows.Forms]System.Windows.Forms.Form::add_Load(class [mscorlib]System.EventHandler)
      IL_00e4:  ldarg.0
      IL_00e5:  ldc.i4.0
      IL_00e6:  call       instance void [System.Windows.Forms]System.Windows.Forms.Control::ResumeLayout(bool)
      IL_00eb:  ret
    } // end of method FrmSecureApp::InitializeComponent

    .method private hidebysig static void 
            Main() cil managed
    {
      .entrypoint
      .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) 
      // Code size       11 (0xb)
      .maxstack  1
      IL_0000:  newobj     instance void CrackingIL.FrmSecureApp::.ctor()
      IL_0005:  call       void [System.Windows.Forms]System.Windows.Forms.Application::Run(class [System.Windows.Forms]System.Windows.Forms.Form)
      IL_000a:  ret
    } // end of method FrmSecureApp::Main

    .method private hidebysig instance void 
            FrmSecureApp_Load(object sender,
                              class [mscorlib]System.EventArgs e) cil managed
    {
      // Code size       123 (0x7b)
      .maxstack  2
      .locals init ([0] class [mscorlib]Microsoft.Win32.RegistryKey key,
               [1] string validSerial)
      IL_0000:  ldsfld     class [mscorlib]Microsoft.Win32.RegistryKey [mscorlib]Microsoft.Win32.Registry::LocalMachine
      IL_0005:  ldstr      "Software\\Necoders"
      IL_000a:  callvirt   instance class [mscorlib]Microsoft.Win32.RegistryKey [mscorlib]Microsoft.Win32.RegistryKey::OpenSubKey(string)
      IL_000f:  stloc.0
      IL_0010:  ldloc.0
      IL_0011:  brtrue.s   IL_0027

      IL_0013:  ldstr      "Please acquire a license to run this!"
      IL_0018:  call       valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
      IL_001d:  pop
      IL_001e:  ldarg.0
      IL_001f:  ldc.i4.1
      IL_0020:  callvirt   instance void [System]System.ComponentModel.Component::Dispose(bool)
      IL_0025:  br.s       IL_007a

      IL_0027:  ldstr      "1111-1111-1111-1111"
      IL_002c:  stloc.1
      IL_002d:  ldloc.0
      IL_002e:  ldstr      "serial"
      IL_0033:  callvirt   instance object [mscorlib]Microsoft.Win32.RegistryKey::GetValue(string)
      IL_0038:  castclass  [mscorlib]System.String
      IL_003d:  ldloc.1
      IL_003e:  call       bool [mscorlib]System.String::op_Equality(string,
                                                                     string)
      IL_0043:  brfalse.s  IL_0047

      IL_0045:  br.s       IL_007a

      IL_0047:  ldloc.0
      IL_0048:  ldstr      "serial"
      IL_004d:  callvirt   instance object [mscorlib]Microsoft.Win32.RegistryKey::GetValue(string)
      IL_0052:  brtrue.s   IL_0068

      IL_0054:  ldstr      "Please acquire a license to run this!"
      IL_0059:  call       valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
      IL_005e:  pop
      IL_005f:  ldarg.0
      IL_0060:  ldc.i4.1
      IL_0061:  callvirt   instance void [System]System.ComponentModel.Component::Dispose(bool)
      IL_0066:  br.s       IL_007a

      IL_0068:  ldstr      "Wrong serial number"
      IL_006d:  call       valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
      IL_0072:  pop
      IL_0073:  ldarg.0
      IL_0074:  ldc.i4.1
      IL_0075:  callvirt   instance void [System]System.ComponentModel.Component::Dispose(bool)
      IL_007a:  ret
    } // end of method FrmSecureApp::FrmSecureApp_Load

  } // end of class FrmSecureApp


// =============================================================

} // end of namespace CrackingIL

//*********** DISASSEMBLY COMPLETE ***********************
// WARNING: Created Win32 resource file CrackingIL.res

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Chua Wen Ching
Software Developer
Malaysia Malaysia
I am Chua Wen Ching and it is great to be part of CodeProject network Smile | :)

| Advertise | Privacy | Mobile
Web01 | 2.8.140721.1 | Last Updated 1 Nov 2004
Article Copyright 2004 by Chua Wen Ching
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid