easyHOOK socket send recv

代码比较简单,就不做注释了。  包含一个sockethookinject.DLL 和sockethook.exe

有一点不清楚,

SetExclusiveACL可以添加当前线程的hook,  但是easyhook如何 detach dll 并且释放hook呢?  知道的大神麻烦告知一下。
    public class SocketInterFace : MarshalByRefObject
    {

        public delegate void LogArgsHander(BufferStruct argsbuffer);
        public static event LogArgsHander logEvent;

        public void IsInstalled(Int32 InClientPID)
        {
            Console.WriteLine("FileMon has been installed in target {0}.\r\n", InClientPID);
        }

        public void OnRecv(byte[] RecvBuffer, int LoginIndex, int LoginIndexEx)
        {
            BufferStruct BufferArgs = new BufferStruct();
            BufferArgs.Buffer = RecvBuffer;
            BufferArgs.BufferSize = RecvBuffer.Length;
            BufferArgs.ObjectType = "recv";
            OnLog(BufferArgs);
        }

        public void OnSend(byte[] RecvBuffer, int LoginIndex, int LoginIndexEx)
        {
            BufferStruct BufferArgs = new BufferStruct();
            BufferArgs.Buffer = RecvBuffer;
            BufferArgs.BufferSize = RecvBuffer.Length;
            BufferArgs.ObjectType = "send";
            OnLog(BufferArgs);
        }

        public void OnLog(string BufferArgs) { Console.WriteLine(BufferArgs); }

        public void OnLog(BufferStruct buf)
        {
            if (logEvent!=null)
            {
                logEvent(buf);
            }
        }

        public struct BufferStruct
        {
            /// <summary>
            /// Socket指针
            /// </summary>
            public IntPtr sockHander;
            /// <summary>
            /// 封包数据
            /// </summary>
            public byte[] Buffer;
            /// <summary>
            /// 封包大小
            /// </summary>
            public int BufferSize;
            /// <summary>
            /// 封包动态序列
            /// </summary>
            public int[] LoginIdent;
            /// <summary>
            /// send recv
            /// </summary>
            public string ObjectType;
        }
    }
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SocketInterFace.logEvent += new SocketInterFace.LogArgsHander(MainSend);
            if (!EasyHook.RemoteHooking.IsAdministrator)
                MessageBox.Show("请用管理员方式启动");
        }

        public void MainSend(socketHook.SocketInterFace.BufferStruct buff)
        {
            Console.WriteLine(string.Format("长度:{0} 类型:{2}\r\n 内容:{1}", buff.BufferSize, byteToHexStr(buff.Buffer, buff.BufferSize),buff.ObjectType));
        }

        public static string byteToHexStr(byte[] bytes, int byteLen)
        {
            string returnStr = "";
            if (bytes != null)
            {
                for (int i = 0; i < byteLen; i++)
                {
                    returnStr += bytes[i].ToString("X2");
                }
            }
            return returnStr;
        }
        string ChannelName = null;
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                EasyHook.Config.Register(".net远程注入组建", "socketHook.exe", "sockethookinject.dll");
            }
            catch (Exception ex)
            {
            }
            int id=Process.GetProcessesByName("SupARC").First().Id;
            if (id != 0) { 
            EasyHook.RemoteHooking.IpcCreateServer<SocketInterFace>(ref ChannelName, System.Runtime.Remoting.WellKnownObjectMode.SingleCall);
            EasyHook.RemoteHooking.Inject(id, "sockethookinject.dll", "sockethookinject.dll", ChannelName);
            }
            else
            {
                MessageBox.Show("ARC没有启动");
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            
        }
    }
public class Main : IEntryPoint
    {
        SocketInterFace Interface;
        Stack<String> Queue = new Stack<String>();

        public Main(RemoteHooking.IContext InContext,string InChannelName)
        {
            Interface = RemoteHooking.IpcConnectClient<SocketInterFace>(InChannelName);
            Interface.OnLog("初始化HOOK成功");
        }
        LocalHook RecvHook;
        LocalHook SendHook;


       int MyRecv(IntPtr socket, IntPtr buffer, int length, int flags)
        {
            int bytesCount = recv(socket, buffer, length, flags);
            if (bytesCount>0)
            {
                byte[] RecvBuffer = new byte[bytesCount];
                Marshal.Copy(buffer, RecvBuffer, 0, RecvBuffer.Length);
                Interface.OnRecv(RecvBuffer, 0, 0);
            }
            return bytesCount;
        }
       int MySend(IntPtr socket, IntPtr buffer, int length, int flags)
       {
           int bytesCount = send(socket, buffer, length, flags);
           if (bytesCount > 0)
           {
               byte[] RecvBuffer = new byte[bytesCount];
               Marshal.Copy(buffer, RecvBuffer, 0, RecvBuffer.Length);
               Interface.OnSend(RecvBuffer, 0, 0);
           }
           return bytesCount;
       }
        public void Run(RemoteHooking.IContext InContext,string InChannelName)
        {
            RecvHook = LocalHook.Create(LocalHook.GetProcAddress("WS2_32.dll", "recv"), new DRecv(MyRecv), this);
            SendHook = LocalHook.Create(LocalHook.GetProcAddress("WS2_32.dll", "send"), new DSend(MySend), this);
            
            SendHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
            RecvHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });

            Interface.IsInstalled(RemoteHooking.GetCurrentProcessId());
            dwProHwnd = OpenProcess(PROCESS_ALL_ACCESS, 0, RemoteHooking.GetCurrentProcessId());
            //EasyHook.RemoteHooking.WakeUpProcess();
            while (true) { Thread.Sleep(500); }

        }





        [DllImport("kernel32.dll", EntryPoint = "OpenProcess")]
        public static extern uint OpenProcess(uint dwDesiredAccess, int bInheritHandle, int dwProcessId);
        public const uint PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF);
        public const uint SYNCHRONIZE = 0x00100000;
        public const uint STANDARD_RIGHTS_REQUIRED = 0x000F0000;
        public uint dwProHwnd = 0;
        [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
        delegate int DRecv(IntPtr socket, IntPtr buffer, int length, int flags);

        [DllImport("WS2_32.dll", CharSet = CharSet.Unicode, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
        static extern int recv(IntPtr socket, IntPtr buffer, int length, int flags);

        [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
        delegate int DSend(IntPtr socket, IntPtr buffer, int length, int flags);

        [DllImport("WS2_32.dll", CharSet = CharSet.Unicode, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
        static extern int send(IntPtr socket, IntPtr buffer, int length, int flags);
    }

 

posted @ 2016-05-05 11:00  Red Cat  阅读(4269)  评论(4编辑  收藏  举报

Copyright © 2022 LyShark Powered by .NET 6 on Kubernetes
Theme - LyTheme 1.0