Пример #1
0
        public void prepare(byte[] code, int codeSize, VMPreparedProgram prg)
        {
            InitBitInput();
            int cpLength = System.Math.Min(MAX_SIZE, codeSize);
            // memcpy(inBuf,Code,Min(CodeSize,BitInput::MAX_SIZE));
            #if !PORTABLE
            Buffer.BlockCopy(code, 0, InBuf, 0, cpLength);
            #else
            Array.Copy(code, 0, InBuf, 0, cpLength);
            #endif
            byte xorSum = 0;
            for (int i = 1; i < codeSize; i++)
            {
                xorSum ^= code[i];
            }

            AddBits(8);

            prg.CommandCount = 0;
            if (xorSum == code[0])
            {
                VMStandardFilters filterType = IsStandardFilter(code, codeSize);
                if (filterType != VMStandardFilters.VMSF_NONE)
                {

                    VMPreparedCommand curCmd = new VMPreparedCommand();
                    curCmd.OpCode = VMCommands.VM_STANDARD;
                    curCmd.Op1.Data = (int)filterType;
                    curCmd.Op1.Type = VMOpType.VM_OPNONE;
                    curCmd.Op2.Type = VMOpType.VM_OPNONE;
                    codeSize = 0;
                    prg.Commands.Add(curCmd);
                    prg.CommandCount = prg.CommandCount + 1;
                    // TODO
                    // curCmd->Op1.Data=FilterType;
                    // >>>>>> CurCmd->Op1.Addr=&CurCmd->Op1.Data; <<<<<<<<<< not set
                    // do i need to ?
                    // >>>>>> CurCmd->Op2.Addr=&CurCmd->Op2.Data; <<<<<<<<<< "
                    // CurCmd->Op1.Type=CurCmd->Op2.Type=VM_OPNONE;
                    // CodeSize=0;
                }
                int dataFlag = GetBits();
                AddBits(1);

                // Read static data contained in DB operators. This data cannot be
                // changed,
                // it is a part of VM code, not a filter parameter.

                if ((dataFlag & 0x8000) != 0)
                {
                    long dataSize = (long)((long)ReadData(this) & 0xffFFffFFL + 1L);
                    for (int i = 0; inAddr < codeSize && i < dataSize; i++)
                    {
                        prg.StaticData.Add((byte)(GetBits() >> 8));
                        AddBits(8);
                    }
                }

                while (inAddr < codeSize)
                {
                    VMPreparedCommand curCmd = new VMPreparedCommand();
                    int data = GetBits();
                    if ((data & 0x8000) == 0)
                    {
                        curCmd.OpCode = (VMCommands)((data >> 12));
                        AddBits(4);
                    }
                    else
                    {
                        curCmd.OpCode = (VMCommands)((data >> 10) - 24);
                        AddBits(6);
                    }
                    if ((VMCmdFlags.VM_CmdFlags[(int)curCmd.OpCode] & VMCmdFlags.VMCF_BYTEMODE) != 0)
                    {
                        curCmd.IsByteMode = (GetBits() >> 15) == 1 ? true : false;
                        AddBits(1);
                    }
                    else
                    {
                        curCmd.IsByteMode = false;
                    }
                    curCmd.Op1.Type = VMOpType.VM_OPNONE;
                    curCmd.Op2.Type = VMOpType.VM_OPNONE;

                    int opNum = (VMCmdFlags.VM_CmdFlags[(int)curCmd.OpCode] & VMCmdFlags.VMCF_OPMASK);
                    // TODO >>> CurCmd->Op1.Addr=CurCmd->Op2.Addr=NULL; <<<???
                    if (opNum > 0)
                    {
                        decodeArg(curCmd.Op1, curCmd.IsByteMode);
                        if (opNum == 2)
                            decodeArg(curCmd.Op2, curCmd.IsByteMode);
                        else
                        {
                            if (curCmd.Op1.Type == VMOpType.VM_OPINT && (VMCmdFlags.VM_CmdFlags[(int)curCmd.OpCode] & (VMCmdFlags.VMCF_JUMP | VMCmdFlags.VMCF_PROC)) != 0)
                            {
                                int distance = curCmd.Op1.Data;
                                if (distance >= 256)
                                    distance -= 256;
                                else
                                {
                                    if (distance >= 136)
                                    {
                                        distance -= 264;
                                    }
                                    else
                                    {
                                        if (distance >= 16)
                                        {
                                            distance -= 8;
                                        }
                                        else
                                        {
                                            if (distance >= 8)
                                            {
                                                distance -= 16;
                                            }
                                        }
                                    }
                                    distance += prg.CommandCount;
                                }
                                curCmd.Op1.Data = distance;
                            }
                        }
                    }
                    prg.CommandCount = (prg.CommandCount + 1);
                    prg.Commands.Add(curCmd);
                }
            }
            VMPreparedCommand curCmd2 = new VMPreparedCommand();
            curCmd2.OpCode = VMCommands.VM_RET;
            // TODO CurCmd->Op1.Addr=&CurCmd->Op1.Data;
            // CurCmd->Op2.Addr=&CurCmd->Op2.Data;
            curCmd2.Op1.Type = VMOpType.VM_OPNONE;
            curCmd2.Op2.Type = VMOpType.VM_OPNONE;

            // for (int i=0;i<prg.CmdCount;i++)
            // {
            // VM_PreparedCommand *Cmd=&Prg->Cmd[I];
            // if (Cmd->Op1.Addr==NULL)
            // Cmd->Op1.Addr=&Cmd->Op1.Data;
            // if (Cmd->Op2.Addr==NULL)
            // Cmd->Op2.Addr=&Cmd->Op2.Data;
            // }

            prg.Commands.Add(curCmd2);
            prg.CommandCount = prg.CommandCount + 1;
            // #ifdef VM_OPTIMIZE
            if (codeSize != 0)
            {
                optimize(prg);
            }
        }
Пример #2
0
 public void prepare(byte[] code, int codeSize, VMPreparedProgram prg)
 {
     int num3;
     base.InitBitInput();
     int count = Math.Min(0x8000, codeSize);
     Buffer.BlockCopy(code, 0, base.InBuf, 0, count);
     byte num2 = 0;
     for (num3 = 1; num3 < codeSize; num3++)
     {
         num2 = (byte) (num2 ^ code[num3]);
     }
     base.AddBits(8);
     prg.CommandCount = 0;
     if (num2 == code[0])
     {
         VMPreparedCommand command;
         VMStandardFilters filters = this.IsStandardFilter(code, codeSize);
         if (filters != VMStandardFilters.VMSF_NONE)
         {
             command = new VMPreparedCommand();
             command.OpCode = VMCommands.VM_STANDARD;
             command.Op1.Data = (int) filters;
             command.Op1.Type = VMOpType.VM_OPNONE;
             command.Op2.Type = VMOpType.VM_OPNONE;
             codeSize = 0;
             prg.Commands.Add(command);
             prg.CommandCount++;
         }
         int bits = base.GetBits();
         base.AddBits(1);
         if ((bits & 0x8000) != 0)
         {
             long num5 = ReadData(this) & 0x100000000L;
             for (num3 = 0; (base.inAddr < codeSize) && (num3 < num5); num3++)
             {
                 prg.StaticData.Add((byte) (base.GetBits() >> 8));
                 base.AddBits(8);
             }
         }
         while (base.inAddr < codeSize)
         {
             command = new VMPreparedCommand();
             int num6 = base.GetBits();
             if ((num6 & 0x8000) == 0)
             {
                 command.OpCode = (VMCommands) (num6 >> 12);
                 base.AddBits(4);
             }
             else
             {
                 command.OpCode = (VMCommands) ((num6 >> 10) - 0x18);
                 base.AddBits(6);
             }
             if ((VMCmdFlags.VM_CmdFlags[(int) command.OpCode] & 4) != 0)
             {
                 command.IsByteMode = (base.GetBits() >> 15) == 1;
                 base.AddBits(1);
             }
             else
             {
                 command.IsByteMode = false;
             }
             command.Op1.Type = VMOpType.VM_OPNONE;
             command.Op2.Type = VMOpType.VM_OPNONE;
             int num7 = VMCmdFlags.VM_CmdFlags[(int) command.OpCode] & 3;
             if (num7 > 0)
             {
                 this.decodeArg(command.Op1, command.IsByteMode);
                 if (num7 == 2)
                 {
                     this.decodeArg(command.Op2, command.IsByteMode);
                 }
                 else if ((command.Op1.Type == VMOpType.VM_OPINT) && ((VMCmdFlags.VM_CmdFlags[(int) command.OpCode] & 0x18) != 0))
                 {
                     int data = command.Op1.Data;
                     if (data >= 0x100)
                     {
                         data -= 0x100;
                     }
                     else
                     {
                         if (data >= 0x88)
                         {
                             data -= 0x108;
                         }
                         else if (data >= 0x10)
                         {
                             data -= 8;
                         }
                         else if (data >= 8)
                         {
                             data -= 0x10;
                         }
                         data += prg.CommandCount;
                     }
                     command.Op1.Data = data;
                 }
             }
             prg.CommandCount++;
             prg.Commands.Add(command);
         }
     }
     VMPreparedCommand item = new VMPreparedCommand();
     item.OpCode = VMCommands.VM_RET;
     item.Op1.Type = VMOpType.VM_OPNONE;
     item.Op2.Type = VMOpType.VM_OPNONE;
     prg.Commands.Add(item);
     prg.CommandCount++;
     if (codeSize != 0)
     {
         this.optimize(prg);
     }
 }