知道易语言写动态汇编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);
}
}
}