C# Intel x86 汇编类实现(用于编写动态汇编机器码#shellcode)

知道易语言写动态汇编shellcode的模块把,类似那种。 

namespace ASM
{
    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    public partial class Asm : IDisposable
    {
        private MemoryStream __asm;
        private BinaryWriter __emit;
        private bool __disposed = false;
        ~Asm()
        {
            Dispose(false);
        }
        public Asm()
        {
            __asm = new MemoryStream();
            __emit = new BinaryWriter(__asm);
        }
        public byte[] Context
        {
            get
            {
                return __asm != null ? __asm.ToArray() : null;
            }
            set
            {
                if (__emit != null && __asm != null)
                {
                    __asm.Dispose();
                    __emit.Dispose();
                }
                __asm = new MemoryStream();
                __emit = new BinaryWriter(__asm);
                if (value != null && value.Length > 0)
                {
                    __emit.Write(value);
                }
            }
        }
        public void Dispose()
        {
            Dispose(true);
        }
        protected virtual void Dispose(bool disposing)
        {
            if (__disposed == false && disposing)
            {
                __disposed = !__disposed;
                if (__asm != null) __asm.Dispose();
                if (__emit != null) __emit.Dispose();
            }
        }
    }
    public partial class Asm
    {
        public void pushad()
        {
            __asm.WriteByte((byte)96);
        }
        public void popad()
        {
            __asm.WriteByte((byte)97);
        }
        public void begin()
        {
            // push        ebp
            // mov         ebp,esp
            // sub         esp,0C0h
            // push        ebx
            // push        esi
            // push        edi
            // lea         edi,[ebp-0C0h]
            // mov         ecx,30h
            // mov         eax,0CCCCCCCCh
            // rep stos    dword ptr es:[edi]
            __emit.Write((byte)85);
            __emit.Write((byte)139);
            __emit.Write((byte)236);
            __emit.Write((byte)129);
            __emit.Write((byte)236);
            __emit.Write((byte)192);
            __emit.Write((byte)0);
            __emit.Write((byte)0);
            __emit.Write((byte)0);
            __emit.Write((byte)83);
            __emit.Write((byte)86);
            __emit.Write((byte)87);
            __emit.Write((byte)141);
            __emit.Write((byte)189);
            __emit.Write((byte)64);
            __emit.Write((byte)255);
            __emit.Write((byte)255);
            __emit.Write((byte)255);
            __emit.Write((byte)185);
            __emit.Write((byte)48);
            __emit.Write((byte)0);
            __emit.Write((byte)0);
            __emit.Write((byte)0);
            __emit.Write((byte)184);
            __emit.Write((byte)204);
            __emit.Write((byte)204);
            __emit.Write((byte)204);
            __emit.Write((byte)204);
            __emit.Write((byte)243);
            __emit.Write((byte)171);
        }
        public void end(bool ret = true)
        {
            // pop         edi
            // pop         esi
            // pop         ebx
            // mov         esp,ebp
            // pop         ebp
            // ret
            __emit.Write((byte)95);
            __emit.Write((byte)94);
            __emit.Write((byte)91);
            __emit.Write((byte)139);
            __emit.Write((byte)229);
            __emit.Write((byte)93);
            if (ret) __emit.Write((byte)195);
        }
    }
    public partial class Asm
    {
        public void push(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)106);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)104);
                __emit.Write(value);
            }
        }
        public void nop()
        {
            __emit.Write((byte)144);
        }
        public void ret()
        {
            __emit.Write((byte)195);
        }
        public void retn(short n)
        {
            __emit.Write((byte)0xC2);
            __emit.Write(n);
        }
        public void call(int rva)
        {
            __emit.Write((byte)232);
            __emit.Write(rva + 5);
        }
        public void leave()
        {
            __emit.Write((byte)201);
        }
        public void jmp(int rva)
        {
            // 0046433E  E9 28010000   jmp     0046446B
            // 00401023  EB 00         jmp     short 00401025
            if ((rva - 2) >= -128 && (rva - 2) <= 127)
            {
                __emit.Write((byte)235); // EB
                __emit.Write((byte)(rva - 2));
            }
            else
            {
                __emit.Write((byte)233); // E9
                __emit.Write(rva - 5);
            }
        }
        public void je(int rva)
        {
            // 0046432B  74 70         je      short 0046439
            // 00464338  0F84 F5000000 je      00464433
            if ((rva - 2) >= -128 && (rva - 2) <= 127)
            {
                __emit.Write((byte)116); // 74
                __emit.Write((byte)(rva - 2));
            }
            else
            {
                __emit.Write((byte)15); // 0F84
                __emit.Write((byte)132);
                __emit.Write((byte)(rva - 6));
            }
        }
        public void jg(int rva)
        {
            // 00464329  7F 18         jg      short 00464343
            // 00401023  0F8F FC000000 jg      00401125
            if ((rva - 2) >= -128 && (rva - 2) <= 127)
            {
                __emit.Write((byte)127); // 74
                __emit.Write((byte)(rva - 2));
            }
            else
            {
                __emit.Write((byte)15); // 0F84
                __emit.Write((byte)143);
                __emit.Write((byte)(rva - 6));
            }
        }
        public void jb(int rva)
        {
            // 00464359  0F82 8F000000 jb      004643EE
            // 0040102B  72 08         jb      short 00401035
            if ((rva - 2) >= -128 && (rva - 2) <= 127)
            {
                __emit.Write((byte)114); // 74
                __emit.Write((byte)(rva - 2));
            }
            else
            {
                __emit.Write((byte)15); // 0F84
                __emit.Write((byte)130);
                __emit.Write((byte)(rva - 6));
            }
        }
        public void jnz(int rva)
        {
            // 00464392  0F85 DC000000 jnz     00464474
            // 0040102B  75 08         jnz     short 00401035
            if ((rva - 2) >= -128 && (rva - 2) <= 127)
            {
                __emit.Write((byte)117); // 75
                __emit.Write((byte)(rva - 2));
            }
            else
            {
                __emit.Write((byte)15); // 0F85
                __emit.Write((byte)133);
                __emit.Write((byte)(rva - 6));
            }
        }
        public void intn(sbyte value)
        {
            __emit.Write((byte)205); // CD
            __emit.Write(value);
        }
        public void int3()
        {
            __emit.Write((byte)204); // CC
        }
    }
    public partial class Asm
    {
        public void pop_eax()
        {
            __emit.Write((byte)88);
        }
        public void pop_ebx()
        {
            __emit.Write((byte)91);
        }
        public void pop_ecx()
        {
            __emit.Write((byte)89);
        }
        public void pop_edx()
        {
            __emit.Write((byte)90);
        }
        public void pop_ebp()
        {
            __emit.Write((byte)93);
        }
        public void pop_edi()
        {
            __emit.Write((byte)95);
        }
        public void pop_esi()
        {
            __emit.Write((byte)94);
        }
        public void pop_esp()
        {
            __emit.Write((byte)92);
        }
    }
    public partial class Asm
    {
        public void call_eax()
        {
            __emit.Write((byte)255);
            __emit.Write((byte)208);
        }
        public void call_ebx()
        {
            __emit.Write((byte)255);
            __emit.Write((byte)211);
        }
        public void call_ecx()
        {
            __emit.Write((byte)255);
            __emit.Write((byte)209);
        }
        public void call_edx()
        {
            __emit.Write((byte)255);
            __emit.Write((byte)210);
        }
        public void call_ebp()
        {
            __emit.Write((byte)255);
            __emit.Write((byte)213);
        }
        public void call_edi()
        {
            __emit.Write((byte)255);
            __emit.Write((byte)215);
        }
        public void call_esi()
        {
            __emit.Write((byte)255);
            __emit.Write((byte)214);
        }
        public void call_esp()
        {
            __emit.Write((byte)255);
            __emit.Write((byte)212);
        }
    }
    public partial class Asm
    {
        public void push_eax()
        {
            __emit.Write((byte)80);
        }
        public void push_ebx()
        {
            __emit.Write((byte)83);
        }
        public void push_ecx()
        {
            __emit.Write((byte)81);
        }
        public void push_edx()
        {
            __emit.Write((byte)82);
        }
        public void push_esi()
        {
            __emit.Write((byte)86);
        }
        public void push_edi()
        {
            __emit.Write((byte)87);
        }
        public void push_ebp()
        {
            __emit.Write((byte)85);
        }
        public void push_esp()
        {
            __emit.Write((byte)84);
        }
        public void push_dword_ptr(int ptr)
        {
            __emit.Write((byte)255);
            __emit.Write((byte)53);
            __emit.Write(ptr);
        }
    }
    public partial class Asm
    {
        public void add_eax(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)131);
                __emit.Write((byte)192);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)5);
                __emit.Write(value);
            }
        }
        public void add_ebx(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)131);
                __emit.Write((byte)195);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)129);
                __emit.Write((byte)195);
                __emit.Write(value);
            }
        }
        public void add_ecx(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)131);
                __emit.Write((byte)193);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)129);
                __emit.Write((byte)193);
                __emit.Write(value);
            }
        }
        public void add_edx(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)131);
                __emit.Write((byte)194);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)129);
                __emit.Write((byte)194);
                __emit.Write(value);
            }
        }
        public void add_esi(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)131);
                __emit.Write((byte)198);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)129);
                __emit.Write((byte)198);
                __emit.Write(value);
            }
        }
        public void add_esp(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)131);
                __emit.Write((byte)196);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)129);
                __emit.Write((byte)196);
                __emit.Write(value);
            }
        }
        public void add_eax_ptr(int value)
        {
            __emit.Write((byte)3);
            __emit.Write((byte)5);
            __emit.Write(value);
        }
        public void add_eax_ptr_edx() // add eax,[edx]
        {
            __emit.Write((byte)3);
            __emit.Write((byte)2);
        }
        public void add_eax_edx() // add eax,edx
        {
            __emit.Write((byte)3);
            __emit.Write((byte)194);
        }
        public void add_ebx_eax() // add ebx,eax
        {
            __emit.Write((byte)3);
            __emit.Write((byte)216);
        }
    }
    public partial class Asm
    {
        public void inc_eax()
        {
            __emit.Write((byte)64);
        }
        public void inc_ebx()
        {
            __emit.Write((byte)67);
        }
        public void inc_ecx()
        {
            __emit.Write((byte)65);
        }
        public void inc_edx()
        {
            __emit.Write((byte)66);
        }
        public void inc_edi()
        {
            __emit.Write((byte)71);
        }
        public void inc_esi()
        {
            __emit.Write((byte)70);
        }
        public void inc_ptr(int ptr)
        {
            __emit.Write((byte)255);
            __emit.Write((byte)5);
            __emit.Write(ptr);
        }
        public void inc_ptr_eax()
        {
            __emit.Write((byte)255);
            __emit.Write((byte)0);
        }
        public void inc_ptr_ebx()
        {
            __emit.Write((byte)255);
            __emit.Write((byte)3);
        }
        public void inc_ptr_ecx()
        {
            __emit.Write((byte)255);
            __emit.Write((byte)1);
        }
        public void inc_ptr_edx()
        {
            __emit.Write((byte)255);
            __emit.Write((byte)2);
        }
    }
    public partial class Asm
    {
        public void test_ecx_ecx()
        {
            __emit.Write((byte)133);
            __emit.Write((byte)201);
        }
        public void test_eax_eax()
        {
            __emit.Write((byte)0x85);
            __emit.Write((byte)0xC0);
        }
        public void test_ebx_ebx()
        {
            __emit.Write((byte)0x85);
            __emit.Write((byte)0xDB);
        }
    }
    public partial class Asm
    {
        public void imul_eax(int value)
        {
            __emit.Write((byte)105); // 105
            __emit.Write((byte)192);
            __emit.Write(value);
        }
        public void imul_eax_edx()
        {
            __emit.Write((byte)15); // 0FAFC2
            __emit.Write((byte)175);
            __emit.Write((byte)194);
        }
    }
    public partial class Asm
    {
        public void idiv_eax_ecx()
        {
            __emit.Write((byte)247);
            __emit.Write((byte)249);
        }
        public void idiv_edx()
        {
            __emit.Write((byte)0xF7);
            __emit.Write((byte)0xFA);
        }
        public void idiv_ecx()
        {
            __emit.Write((byte)0xF7);
            __emit.Write((byte)0xF9);
        }
        public void idiv_ebx()
        {
            __emit.Write((byte)0xF7);
            __emit.Write((byte)0xFB);
        }
        public void idiv_eax()
        {
            __emit.Write((byte)0xF7);
            __emit.Write((byte)0xF8);
        }
    }
    public partial class Asm
    {
        public void cmp_eax(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)131);
                __emit.Write((byte)248);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)61);
                __emit.Write(value);
            }
        }
        public void cmp_ebx(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)131);
                __emit.Write((byte)251);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)129);
                __emit.Write((byte)251);
                __emit.Write(value);
            }
        }
        public void cmp_ecx(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)131);
                __emit.Write((byte)249);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)129);
                __emit.Write((byte)249);
                __emit.Write(value);
            }
        }
        public void cmp_eax_edx()
        {
            __emit.Write((byte)0x3B);
            __emit.Write((byte)0xC2);
        }
        public void cmp_eax_ptr(int ptr)
        {
            __emit.Write((byte)0x3B);
            __emit.Write((byte)0x05);
            __emit.Write(ptr);
        }
        public void cmp_ptr_eax(int ptr)
        {
            __emit.Write((byte)0x39);
            __emit.Write((byte)0x05);
            __emit.Write(ptr);
        }
    }
    public partial class Asm
    {
        public void lea_eax_dword_ptr_eax_add(int value) // lea eax,dword ptr ds:[eax+4c]
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)141);
                __emit.Write((byte)64);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)141);
                __emit.Write((byte)128);
                __emit.Write(value);
            }
        }
        public void lea_eax_dword_ptr_eax() // lea eax,dword ptr ds:[eax]
        {
            __emit.Write((byte)141);
            __emit.Write((byte)0);
        }
        public void lea_eax_dword_ptr_ecx() // lea eax,dword ptr [ecx]
        {
            __emit.Write((byte)141);
            __emit.Write((byte)1);
        }
    }
    public partial class Asm
    {
        public void dec_edx()
        {
            __emit.Write((byte)0x4A);
        }
        public void dec_ecx()
        {
            __emit.Write((byte)0x49);
        }
        public void dec_ebx()
        {
            __emit.Write((byte)0x4B);
        }
        public void dec_eax()
        {
            __emit.Write((byte)0x48);
        }
    }
    public partial class Asm
    {
        public void or_eax(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)0x83);
                __emit.Write((byte)0xC8);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)0x0D);
                __emit.Write(value);
            }
        }
        public void or_ebp(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)0x83);
                __emit.Write((byte)0xCD);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)0x81);
                __emit.Write((byte)0xCD);
                __emit.Write(value);
            }
        }
        public void or_ebx(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)0x83);
                __emit.Write((byte)0xCB);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)0x81);
                __emit.Write((byte)0xCB);
                __emit.Write(value);
            }
        }
        public void or_ecx(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)0x83);
                __emit.Write((byte)0xC9);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)0x81);
                __emit.Write((byte)0xC9);
                __emit.Write(value);
            }
        }
        public void or_edx(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)0x83);
                __emit.Write((byte)0xCA);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)0x81);
                __emit.Write((byte)0xCA);
                __emit.Write(value);
            }
        }
        public void or_edi(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)0x83);
                __emit.Write((byte)0xCF);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)0x81);
                __emit.Write((byte)0xCF);
                __emit.Write(value);
            }
        }
        public void or_esi(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)0x83);
                __emit.Write((byte)0xCE);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)0x81);
                __emit.Write((byte)0xCE);
                __emit.Write(value);
            }
        }
        public void or_esp(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)0x83);
                __emit.Write((byte)0xCC);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)0x81);
                __emit.Write((byte)0xCC);
                __emit.Write(value);
            }
        }
    }
    public partial class Asm
    {
        public void not_eax()
        {
            __emit.Write((byte)0xF7);
            __emit.Write((byte)0xD0);
        }
        public void not_ebx()
        {
            __emit.Write((byte)0xF7);
            __emit.Write((byte)0xD3);
        }
        public void not_ebp()
        {
            __emit.Write((byte)0xF7);
            __emit.Write((byte)0xD5);
        }
        public void not_ecx()
        {
            __emit.Write((byte)0xF7);
            __emit.Write((byte)0xD1);
        }
        public void not_edx()
        {
            __emit.Write((byte)0xF7);
            __emit.Write((byte)0xD2);
        }
        public void not_edi()
        {
            __emit.Write((byte)0xF7);
            __emit.Write((byte)0xD7);
        }
        public void not_esi()
        {
            __emit.Write((byte)0xF7);
            __emit.Write((byte)0xD6);
        }
        public void not_esp()
        {
            __emit.Write((byte)0xF7);
            __emit.Write((byte)0xD4);
        }
    }
    public partial class Asm
    {
        public void mov_eax(int value)
        {
            __emit.Write((byte)184);
            __emit.Write(value);
        }
        public void mov_ebx(int value)
        {
            __emit.Write((byte)187);
            __emit.Write(value);
        }
        public void mov_ecx(int value)
        {
            __emit.Write((byte)185);
            __emit.Write(value);
        }
        public void mov_edx(int value)
        {
            __emit.Write((byte)186);
            __emit.Write(value);
        }
        public void mov_esi(int value)
        {
            __emit.Write((byte)190);
            __emit.Write(value);
        }
       
        public void mov_edi(int value)
        {
            __emit.Write((byte)191);
            __emit.Write(value);
        }
        public void mov_ebp(int value)
        {
            __emit.Write((byte)189);
            __emit.Write(value);
        }
        public void mov_esp(int value)
        {
            __emit.Write((byte)188);
            __emit.Write(value);
        }
        public void mov_eax_edx()
        {
            __emit.Write((byte)139);
            __emit.Write((byte)194);
        }
        public void mov_eax_ebx()
        {
            __emit.Write((byte)139);
            __emit.Write((byte)195);
        }
        public void mov_ebx_ecx()
        {
            __emit.Write((byte)139);
            __emit.Write((byte)217);
        }
        public void mov_ecx_edi()
        {
            __emit.Write((byte)139);
            __emit.Write((byte)207);
        }
        public void mov_ebp_esp()
        {
            __emit.Write((byte)139);
            __emit.Write((byte)236);
        }
        public void mov_edx_eax()
        {
            __emit.Write((byte)139);
            __emit.Write((byte)208);
        }
        public void mov_eax_dword_ptr(int ptr)
        {
            __emit.Write((byte)161);
            __emit.Write(ptr);
        }
        public void mov_ebx_dword_ptr(int ptr)
        {
            __emit.Write((byte)139);
            __emit.Write((byte)29);
            __emit.Write(ptr);
        }
        public void mov_ecx_dword_ptr(int ptr)
        {
            __emit.Write((byte)139);
            __emit.Write((byte)13);
            __emit.Write(ptr);
        }
        public void mov_edx_dword_ptr(int ptr)
        {
            __emit.Write((byte)139);
            __emit.Write((byte)21);
            __emit.Write(ptr);
        }
        public void mov_esi_dword_ptr(int ptr)
        {
            __emit.Write((byte)139);
            __emit.Write((byte)53);
            __emit.Write(ptr);
        }
        public void mov_edi_dword_ptr(int ptr)
        {
            __emit.Write((byte)139);
            __emit.Write((byte)61);
            __emit.Write(ptr);
        }
        public void mov_ebp_dword_ptr(int ptr)
        {
            __emit.Write((byte)139);
            __emit.Write((byte)45);
            __emit.Write(ptr);
        }
        public void mov_esp_dword_ptr(int ptr)
        {
            __emit.Write((byte)139);
            __emit.Write((byte)37);
            __emit.Write(ptr);
        }
        public void mov_eax_dword_ptr_eax()
        {
            __emit.Write((byte)139);
            __emit.Write((byte)0);
        }
        public void mov_eax_dword_ptr_ecx()
        {
            __emit.Write((byte)139);
            __emit.Write((byte)1);
        }
        public void mov_ecx_dword_ptr_eax()
        {
            __emit.Write((byte)139);
            __emit.Write((byte)8);
        }
        public void mov_ecx_dword_ptr_ebx()
        {
            __emit.Write((byte)139);
            __emit.Write((byte)11);
        }
        public void mov_ecx_dword_ptr_ecx()
        {
            __emit.Write((byte)139);
            __emit.Write((byte)9);
        }
        public void mov_edx_dword_ptr_ecx()
        {
            __emit.Write((byte)139);
            __emit.Write((byte)17);
        }
        public void mov_edi_dword_ptr_edi()
        {
            __emit.Write((byte)139);
            __emit.Write((byte)48);
        }
        public void mov_esi_dword_ptr_eax()
        {
            __emit.Write((byte)139);
            __emit.Write((byte)48);
        }
        public void mov_eax_dword_ptr_eax_add(int offset)
        {
            if (offset >= -128 && offset <= 127)
            {
                // 8B40  mov eax, dword ptr [eax + 4C]
                __emit.Write((byte)139);
                __emit.Write((byte)64);
                __emit.Write((byte)offset);
            }
            else
            {
                // 8B5B  mov eax, dword ptr [eax + 23C]
                __emit.Write((byte)139);
                __emit.Write((byte)91);
                __emit.Write(offset);
            }
        }
        public void mov_ebx_dword_ptr_ebx_add(int offset)
        {
            if (offset >= -128 && offset <= 127)
            {
                __emit.Write((byte)139);
                __emit.Write((byte)91);
                __emit.Write((byte)offset);
            }
            else
            {
                __emit.Write((byte)139);
                __emit.Write((byte)155);
                __emit.Write(offset);
            }
        }
        public void mov_ecx_dword_ptr_ecx_add(int offset)
        {
            if (offset >= -128 && offset <= 127)
            {
                __emit.Write((byte)139);
                __emit.Write((byte)73);
                __emit.Write((byte)offset);
            }
            else
            {
                __emit.Write((byte)139);
                __emit.Write((byte)137);
                __emit.Write(offset);
            }
        }
        public void mov_edx_dword_ptr_edx_add(int offset)
        {
            if (offset >= -128 && offset <= 127)
            {
                __emit.Write((byte)139);
                __emit.Write((byte)82);
                __emit.Write((byte)offset);
            }
            else
            {
                __emit.Write((byte)139);
                __emit.Write((byte)146);
                __emit.Write(offset);
            }
        }
        public void mov_ecx_dword_ptr_esi_add(int offset)
        {
            if (offset >= -128 && offset <= 127)
            {
                __emit.Write((byte)139);
                __emit.Write((byte)78);
                __emit.Write((byte)offset);
            }
            else
            {
                __emit.Write((byte)139);
                __emit.Write((byte)142);
                __emit.Write(offset);
            }
        }
        public void mov_dword_ptr_eax(int ptr)
        {
            __emit.Write((byte)163);
            __emit.Write((byte)ptr);
        }
        public void mov_dword_ptr_ebx(int ptr)
        {
            __emit.Write((byte)137);
            __emit.Write((byte)29);
            __emit.Write((byte)ptr);
        }
        public void mov_dword_ptr_ecx(int ptr)
        {
            __emit.Write((byte)137);
            __emit.Write((byte)13);
            __emit.Write((byte)ptr);
        }
        public void mov_dword_ptr_edx(int ptr)
        {
            __emit.Write((byte)137);
            __emit.Write((byte)21);
            __emit.Write((byte)ptr);
        }
        public void mov_dword_ptr_esi(int ptr)
        {
            __emit.Write((byte)137);
            __emit.Write((byte)53);
            __emit.Write((byte)ptr);
        }
        public void mov_dword_ptr_edi(int ptr)
        {
            __emit.Write((byte)137);
            __emit.Write((byte)61);
            __emit.Write((byte)ptr);
        }
        public void mov_dword_ptr_ebp(int ptr)
        {
            __emit.Write((byte)137);
            __emit.Write((byte)45);
            __emit.Write((byte)ptr);
        }
        public void mov_dword_ptr_esp(int ptr)
        {
            __emit.Write((byte)137);
            __emit.Write((byte)37);
            __emit.Write((byte)ptr);
        }
        public void mov_dword_ptr_eax_eax()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)0);
        }
        public void mov_dword_ptr_eax_ebx()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)24);
        }
        public void mov_dword_ptr_eax_ecx()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)8);
        }
        public void mov_dword_ptr_eax_edx()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)16);
        }
        public void mov_dword_ptr_ebx_eax()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)3);
        }
        public void mov_dword_ptr_ebx_ebx()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)27);
        }
        public void mov_dword_ptr_ebx_ecx()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)11);
        }
        public void mov_dword_ptr_ebx_edx()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)19);
        }
        public void mov_dword_ptr_ecx_eax()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)1);
        }
        public void mov_dword_ptr_ecx_ebx()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)25);
        }
        public void mov_dword_ptr_ecx_ecx()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)9);
        }
        public void mov_dword_ptr_ecx_edx()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)17);
        }
        public void mov_dword_ptr_edx_eax()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)2);
        }
        public void mov_dword_ptr_edx_ebx()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)26);
        }
        public void mov_dword_ptr_edx_ecx()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)10);
        }
        public void mov_dword_ptr_edx_edx()
        {
            __emit.Write((byte)137);
            __emit.Write((byte)18);
        }
        public void mov_dword_ptr_ebx_c(int value)
        {
            __emit.Write((byte)199);
            __emit.Write((byte)3);
            __emit.Write(value);
        }
        public void mov_byte_ptr_ebx(int value)
        {
            __emit.Write((byte)198);
            __emit.Write((byte)3);
            __emit.Write(value);
        }
        public void mov_dword_ptr_ecx_c(int value)
        {
            __emit.Write((byte)199);
            __emit.Write((byte)1);
            __emit.Write(value);
        }
        public void mov_dword_ptr_esp_c(int value)
        {
            __emit.Write((byte)199);
            __emit.Write((byte)4);
            __emit.Write((byte)36);
            __emit.Write(value);
        }
        public void mov_dword_ptr_ecx_add_eax(int offset)
        {
            if (offset >= -128 && offset <= 127)
            {
                __emit.Write((byte)137);
                __emit.Write((byte)65);
                __emit.Write((byte)offset);
            }
            else
            {
                __emit.Write((byte)137);
                __emit.Write((byte)129);
                __emit.Write(offset);
            }
        }
        public void mov_dword_ptr_edx_add_eax(int offset)
        {
            if (offset >= -128 && offset <= 127)
            {
                __emit.Write((byte)137);
                __emit.Write((byte)66);
                __emit.Write((byte)offset);
            }
            else
            {
                __emit.Write((byte)137);
                __emit.Write((byte)130);
                __emit.Write(offset);
            }
        }
        public void mov_dword_ptr_esp_add_eax(int offset)
        {
            if (offset >= -128 && offset <= 127)
            {
                __emit.Write((byte)137);
                __emit.Write((byte)68);
                __emit.Write((byte)36);
                __emit.Write((byte)offset);
            }
            else
            {
                __emit.Write((byte)137);
                __emit.Write((byte)132);
                __emit.Write((byte)36);
                __emit.Write(offset);
            }
        }
        public void mov_dword_ptr_eax_add(int offset, int value)
        {
            if (offset >= -128 && offset <= 127)
            {
                __emit.Write((byte)199);
                __emit.Write((byte)64);
                __emit.Write((byte)offset);
                __emit.Write(value);
            }
            else
            {
                __emit.Write((byte)199);
                __emit.Write((byte)128);
                __emit.Write(offset);
                __emit.Write(value);
            }
        }
        public void mov_dword_ptr_ebx_add(int offset, int value)
        {
            if (offset >= -128 && offset <= 127)
            {
                __emit.Write((byte)199);
                __emit.Write((byte)67);
                __emit.Write((byte)offset);
                __emit.Write(value);
            }
            else
            {
                __emit.Write((byte)199);
                __emit.Write((byte)131);
                __emit.Write(offset);
                __emit.Write(value);
            }
        }
        public void mov_dword_ptr_ecx_add(int offset, int value)
        {
            if (offset >= -128 && offset <= 127)
            {
                __emit.Write((byte)199);
                __emit.Write((byte)65);
                __emit.Write((byte)offset);
                __emit.Write(value);
            }
            else
            {
                __emit.Write((byte)199);
                __emit.Write((byte)129);
                __emit.Write(offset);
                __emit.Write(value);
            }
        }
        public void mov_dword_ptr_edx_add(int offset, int value)
        {
            if (offset >= -128 && offset <= 127)
            {
                __emit.Write((byte)199);
                __emit.Write((byte)66);
                __emit.Write((byte)offset);
                __emit.Write(value);
            }
            else
            {
                __emit.Write((byte)199);
                __emit.Write((byte)130);
                __emit.Write(offset);
                __emit.Write(value);
            }
        }
        public void mov_byte_ptr_ebx_add(int offset, int value)
        {
            if (offset >= -128 && offset <= 127)
            {
                __emit.Write((byte)199);
                __emit.Write((byte)67);
                __emit.Write((byte)offset);
                __emit.Write(value);
            }
            else
            {
                __emit.Write((byte)199);
                __emit.Write((byte)131);
                __emit.Write(offset);
                __emit.Write(value);
            }
        }
    }
    public partial class Asm
    {
        public void jmp_eax()
        {
            __emit.Write((byte)255); // FFE0
            __emit.Write((byte)244);
        }
        public void in_al_dx()
        {
            __emit.Write((byte)0xEC);
        }
    }
    public partial class Asm
    {
        public void sub_ebx(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)0x83);
                __emit.Write((byte)0xEB);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)0x81);
                __emit.Write((byte)0xEB);
                __emit.Write(value);
            }
        }
        public void sub_ecx(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)0x83);
                __emit.Write((byte)0xE9);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)0x81);
                __emit.Write((byte)0xE9);
                __emit.Write(value);
            }
        }
        public void sub_edx(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)0x83);
                __emit.Write((byte)0xEA);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)0x81);
                __emit.Write((byte)0xEA);
                __emit.Write(value);
            }
        }
        public void sub_esi(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)0x83);
                __emit.Write((byte)0xEE);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)0x81);
                __emit.Write((byte)0xEE);
                __emit.Write(value);
            }
        }
        public void sub_esp(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)131);
                __emit.Write((byte)236);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)129);
                __emit.Write((byte)236);
                __emit.Write(value);
            }
        }
        public void sub_eax(int value)
        {
            __emit.Write((byte)45); // 2D
            __emit.Write(value); // 83E8
        }
        public void sub_ebp(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)0x83);
                __emit.Write((byte)0xED);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)0x81);
                __emit.Write((byte)0xED);
                __emit.Write(value);
            }
        }
        public void sub_edi(int value)
        {
            if (value >= -128 && value <= 127)
            {
                __emit.Write((byte)0x83);
                __emit.Write((byte)0xEF);
                __emit.Write((byte)value);
            }
            else
            {
                __emit.Write((byte)0x81);
                __emit.Write((byte)0xEF);
                __emit.Write(value);
            }
        }
        public void sub_eax_ebx()
        {
            __emit.Write((byte)0x2B);
            __emit.Write((byte)0xC3);
        }
        public void sub_ebx_eax()
        {
            __emit.Write((byte)0x2B);
            __emit.Write((byte)0xD8);
        }
    }
    public partial class Asm
    {
        public void xor_eax_eax()
        {
            __emit.Write((byte)0x33);
            __emit.Write((byte)0xC0);
        }
        public void xor_eax_ebp()
        {
            __emit.Write((byte)0x33);
            __emit.Write((byte)0xC5);
        }
        public void xor_eax_ebx()
        {
            __emit.Write((byte)0x33);
            __emit.Write((byte)0xC3);
        }
        public void xor_eax_ecx()
        {
            __emit.Write((byte)0x33);
            __emit.Write((byte)0xC1);
        }
        public void xor_eax_edx()
        {
            __emit.Write((byte)0x33);
            __emit.Write((byte)0xC2);
        }
        public void xor_eax_edi()
        {
            __emit.Write((byte)0x33);
            __emit.Write((byte)0xC7);
        }
        public void xor_eax_esi()
        {
            __emit.Write((byte)0x33);
            __emit.Write((byte)0xC6);
        }
        public void xor_eax_esp()
        {
            __emit.Write((byte)0x33);
            __emit.Write((byte)0xC4);
        }
        public void xor_ebp_ebp()
        {
            __emit.Write((byte)0x33);
            __emit.Write((byte)0xED);
        }
        public void xor_ebx_ebx()
        {
            __emit.Write((byte)0x33);
            __emit.Write((byte)0xDB);
        }
        public void xor_ecx_ecx()
        {
            __emit.Write((byte)0x33);
            __emit.Write((byte)0xC9);
        }
        public void xor_edi_edi()
        {
            __emit.Write((byte)51);
            __emit.Write((byte)255);
        }
        public void xor_edx_edx()
        {
            __emit.Write((byte)51);
            __emit.Write((byte)210);
        }
        public void xor_esi_esi()
        {
            __emit.Write((byte)0x33);
            __emit.Write((byte)0xF6);
        }
        public void xor_esp_esp()
        {
            __emit.Write((byte)0x33);
            __emit.Write((byte)0xF6);
        }
    }
    public partial class Asm
    {
        private unsafe abstract class Native
        {
            [DllImport("user32.dll", EntryPoint = "CallWindowProcA")]
            public static extern int CallWindowProc(int lpPrevWndFunc, int hWnd, uint Msg, int wParam, int lParam);
            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern bool VirtualProtect(int lpAddress, int dwSize, int flNewProtect, out int lpflOldProtect);
            public const int NULL = 0;
            public const int PAGE_EXECUTE_READWRITE = 64;
            public static bool VirtualProtect(int ptr, int size, int newValueProtect)
            {
                int outValueProtect;
                return VirtualProtect(ptr, size, newValueProtect, out outValueProtect);
            }
        }
        public void AddCode(byte value)
        {
            __emit.Write(value);
        }
        public void AddCode(byte[] value)
        {
            __emit.Write(value);
        }
        public void AddCode(int value)
        {
            __emit.Write(value);
        }
        public int Invoke()
        {
            return Invoke(Context);
        }
        public int Invoke(byte[] asm)
        {
            return Invoke((int)Marshal.UnsafeAddrOfPinnedArrayElement(asm, 0), asm.Length);
        }
        public int Invoke(int asm, int size)
        {
            if (Native.VirtualProtect(asm, size, Native.PAGE_EXECUTE_READWRITE) == false)
                return Native.NULL;
            return Native.CallWindowProc(asm, Native.NULL, Native.NULL, Native.NULL, Native.NULL);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值