Esempio n. 1
0
        /* Build Shellcode */

        private void BuildGetProcAddress86()
        {
            // GetProcAddress(long hModule, char* lpProcName)
            // lpParameter: Address of first struct member.
            // Using stdcall calling convention.
            long   getProcAddressAddress = Kernel32Handle + _getProcAddressOffset;
            IntPtr getProcAddressPtr     = _privateBuffer.Add(ref getProcAddressAddress);

            long dummy = 0;

            _getProcAddressReturnValuePtr = (long)_privateBuffer.Add(ref dummy);

            string[] getProcAddress =
            {
                $"use32",
                "mov eax, dword [esp + 4]", // CreateRemoteThread lpParameter
                "push dword [eax + 8]",     // lpProcName
                "push dword [eax + 0]",     // hModule
                $"call dword [dword 0x{getProcAddressPtr.ToString("X")}]",
                $"mov dword [dword 0x{_getProcAddressReturnValuePtr.ToString("X")}], eax",
                "ret 4"                     // Restore stack ptr. (Callee cleanup)
            };


            byte[] bytes = _assembler.Assemble(getProcAddress);
            _getProcAddressShellPtr = (long)_privateBuffer.Add(bytes);
        }
Esempio n. 2
0
        /* Building Functions */

        public void BuildReturnFive()
        {
            string[] returnFiveFunction = new string[]
            {
                $"{_use32}",
                $"mov {_eax}, {Five}",
                $"ret"
            };

            // Note: We are deliberately creating in 32bit range because later down the road we'll be patching push + ret.
            var result = _assembler.Assemble(returnFiveFunction);
            var buffer = Utilities.FindOrCreateBufferInRange(result.Length);

            ReturnFive = buffer.Add(result);
        }
Esempio n. 3
0
        private IntPtr CreateAsmFunction(string[] function)
        {
            var result  = _assembler.Assemble(function);
            var address = _memory.Allocate(result.Length);

            _memory.WriteRaw(address, result);
            return(address);
        }
        /* Build Jump methods for Patching */
        private void BuildRelativeJmp()
        {
            var minMax = Utilities.GetRelativeJumpMinMax((long)_dummyFunctions.ReturnFive);
            var buffer = Utilities.FindOrCreateBufferInRange(32, minMax.min, minMax.max);

            long jmpSource = (long)buffer.Properties.WritePointer;
            long jmpTarget = (long)_dummyFunctions.ReturnFive;

            var relativeJmp = new string[]
            {
                $"{_use32}",
                $"jmp {jmpTarget - jmpSource}"
            };

            var asm = _assembler.Assemble(relativeJmp);

            _relativeJmpLength = asm.Length;
            _relativeJmpPtr    = buffer.Add(asm);
        }
        /* Building functions to hook. */

        private void BuildAdd()
        {
            string[] addFunction = new string[]
            {
                $"{_use32}",
                $"push {_ebp}",
                $"mov {_ebp}, {_esp}",

                $"mov {_eax}, {_edx}", // Right Parameter
                $"add {_eax}, {_ecx}", // Left Parameter

                $"pop {_ebp}",
                $"ret"
            };

            var result = _assembler.Assemble(addFunction);

            Add = _memory.Allocate(result.Length);
            _memory.WriteRaw(Add, result);
        }
Esempio n. 6
0
        /* Building functions to hook. */

        private void BuildAdd(IMemoryAllocator alloc)
        {
            int wordSize = IntPtr.Size;

            string[] addFunction = new string[]
            {
                $"{_use32}",
                $"push {_ebp}",
                $"mov {_ebp}, {_esp}",

                $"mov {_eax}, [{_ebp} + {wordSize * 2}]", // Left Parameter
                $"mov {_ecx}, [{_ebp} + {wordSize * 3}]", // Right Parameter
                $"add {_eax}, {_ecx}",

                $"pop {_ebp}",
                $"ret"
            };

            var result = _assembler.Assemble(addFunction);

            Add = alloc.Allocate(result.Length);
            _memory.WriteRaw(Add, result);
        }
Esempio n. 7
0
        private void BuildAdd()
        {
            string[] addFunction = new string[]
            {
                $"use64",
                $"lea eax, [rcx+rdx]",
                $"ret",
            };

            var result = _assembler.Assemble(addFunction);

            Add = _memory.Allocate(result.Length);
            _memory.WriteRaw(Add, result);
        }
        private void BuildAdd()
        {
            string[] addFunction = new string[]
            {
                $"use32",
                $"mov eax, [esp+8]", // Right Parameter
                $"add eax, [esp+4]", // Left Parameter
                $"ret 8",
            };

            var result = _assembler.Assemble(addFunction);

            Add = _memory.Allocate(result.Length);
            _memory.WriteRaw(Add, result);
        }
Esempio n. 9
0
        private void BuildNativeFunction()
        {
            int wordSize = IntPtr.Size;

            string[] addFunction = new string[]
            {
                $"{_use32}",
                $"push {_ebp}",
                $"mov {_ebp}, {_esp}",

                $"mov {_eax}, [{_ebp} + {wordSize * 2}]", // Left Parameter
                $"mov {_ecx}, [{_ebp} + {wordSize * 3}]", // Right Parameter
                $"add {_eax}, {_ecx}",

                $"pop {_ebp}",
                $"ret"
            };

            var result = _assembler.Assemble(addFunction);
            var func   = _memory.Allocate(result.Length);

            _memory.WriteRaw(func, result);
            _nativeFunctions.Add(func);
        }