示例#1
0
 public FunctionPointer(string ModuleName, int Offset, MagicConvention CallingConvention)
     : base(ModuleName, Offset)
 {
     this.CallingConvention = CallingConvention;
 }
示例#2
0
 public FunctionPointer(ModulePointer Pointer, MagicConvention CallingConvention)
 {
     this.Pointer           = Pointer;
     this.CallingConvention = CallingConvention;
 }
示例#3
0
 public void Call(IntPtr Address, MagicConvention CallingConvention, params object[] Arguments)
 => Call <int>(Address, CallingConvention, Arguments);
示例#4
0
        public T Call <T>(IntPtr Address, MagicConvention CallingConvention, params object[] Arguments) where T : struct
        {
            using (var asm = new ManagedFasm())
            {
                asm.Clear();

                switch (CallingConvention)
                {
                case MagicConvention.Cdecl:
                {
                    asm.AddLine("push ebp");
                    for (var i = Arguments.Length - 1; i >= 0; --i)
                    {
                        asm.AddLine("push {0}", Arguments[i]);
                    }
                    asm.AddLine("mov eax, {0}", Address);
                    asm.AddLine("call eax");
                    for (var i = 0; i < Arguments.Length; ++i)
                    {
                        asm.AddLine("pop ebp");
                    }
                    asm.AddLine("pop ebp");

                    asm.AddLine("retn");
                    break;
                }

                case MagicConvention.StdCall:
                {
                    for (var i = Arguments.Length - 1; i >= 0; --i)
                    {
                        asm.AddLine("push {0}", Arguments[i]);
                    }
                    asm.AddLine("mov eax, {0}", Address);
                    asm.AddLine("call eax");
                    asm.AddLine("retn");
                    break;
                }

                case MagicConvention.FastCall:
                {
                    if (Arguments.Length > 0)
                    {
                        asm.AddLine("mov ecx, {0}", Arguments[0]);
                    }
                    if (Arguments.Length > 1)
                    {
                        asm.AddLine("mov edx, {0}", Arguments[1]);
                    }
                    for (var i = Arguments.Length - 1; i >= 2; --i)
                    {
                        asm.AddLine("push {0}", Arguments[i]);
                    }
                    asm.AddLine("mov eax, {0}", Address);
                    asm.AddLine("call eax");
                    asm.AddLine("retn");
                    break;
                }

                case MagicConvention.Register:
                {
                    if (Arguments.Length > 0)
                    {
                        asm.AddLine("mov eax, {0}", Arguments[0]);
                    }
                    if (Arguments.Length > 1)
                    {
                        asm.AddLine("mov edx, {0}", Arguments[1]);
                    }
                    if (Arguments.Length > 2)
                    {
                        asm.AddLine("mov ecx, {0}", Arguments[2]);
                    }
                    for (var i = 3; i < Arguments.Length; ++i)
                    {
                        asm.AddLine("push {0}", Arguments[i]);
                    }
                    asm.AddLine("mov ebx, {0}", Address);
                    asm.AddLine("call ebx");
                    asm.AddLine("retn");
                    break;
                }

                case MagicConvention.ThisCall:
                {
                    if (Arguments.Length > 0)
                    {
                        asm.AddLine("mov ecx, {0}", Arguments[0]);
                    }
                    for (var i = Arguments.Length - 1; i >= 1; --i)
                    {
                        asm.AddLine("push {0}", Arguments[i]);
                    }
                    asm.AddLine("mov eax, {0}", Address);
                    asm.AddLine("call eax");
                    asm.AddLine("retn");
                    break;
                }

                default:
                {
                    throw new MemoryException("Unhandled calling convention '{0}'", CallingConvention.ToString());
                }
                }

                return(ExecuteRemoteCode <T>(asm.Assemble()));
            }
        }
示例#5
0
 public void Call(ModulePointer Pointer, MagicConvention CallingConvention, params object[] Arguments)
 => Call(GetAddress(Pointer), CallingConvention, Arguments);
示例#6
0
 public T Call <T>(ModulePointer Pointer, MagicConvention CallingConvention, params object[] Arguments) where T : struct
 => Call <T>(GetAddress(Pointer), CallingConvention, Arguments);
示例#7
0
 public void Call(ModulePointer offs, MagicConvention cv, params object[] args)
 {
     Call(GetAddress(offs), cv, args);
 }
示例#8
0
 public T Call <T>(ModulePointer offs, MagicConvention cv, params object[] args) where T : struct
 {
     return(Call <T>(GetAddress(offs), cv, args));
 }
示例#9
0
 public void Call(IntPtr addr, MagicConvention cv, params object[] args)
 {
     Call <int>(addr, cv, args);
 }