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);
    }
时间: 2024-08-02 04:27:30

easyHOOK socket send recv的相关文章

[转]Socket send函数和recv函数详解

1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据.客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答. 该函数的第一个参数指定发送端套接字描述符: 第二个参数指明一个存放应用程序要发送数据的缓冲区: 第三个参数指明实际要发送的数据的字节数: 第四个参数一般置0. 这里只描述同步Sock

Socket send函数和recv函数详解

Socket send函数和recv函数详解 1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags );  不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据.客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答. 该函数的第一个参数指定发送端套接字描述符: 第二个参数指明一个存放应用程序要发送数据的缓冲区: 第三个参数指明实际要发送的数据的字节数

SOCKET SEND

1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据.客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答. 该函数的第一个参数指定发送端套接字描述符: 第二个参数指明一个存放应用程序要发送数据的缓冲区: 第三个参数指明实际要发送的数据的字节数: 第四个参数一般置0. | MSG_DONTR

Socket send() method throws TypeError: a bytes-like object is required, not &#39;str&#39;

python3 socket编程,发送data数据,会遇到需要bytes类型,而不是str字符串的错误 例如: import socket mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = socket.gethostbyname("www.google.com") mysock.connect(host, 80) message = "GET / HTTP/1.1\r\n\r\n"

套接字I/O函数write/read writev/readv send/recv sendto/recvfrom sendmsg/recvmsg

函数原型 read/write系原型 1 #include <unistd.h> 2 3 ssize_t read(int fd, void *buf, size_t count); 1 #include <unistd.h> 2 3 ssize_t write(int fd, const void *buf, size_t count); 1 #include <sys/uio.h> 2 3 ssize_t readv(int fd, const struct iov

linux Socket send与recv函数详解

转自:http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags); 3 ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags)

C语言socket send()数据缓存问题

send()函数默认情况下会使用Nagle算法.Nagle算法通过将未确认的数据存入缓冲区直到积攒到一定数量一起发送的方法.来降低主机发送零碎小数据包的数目.所以假设send()函数发送数据过快的话,该算法会将一些数据打包后统一发出去.假设不了接这样的情况,接收端採会遇到看似非常奇怪的问题,比方成功recv()的次数与成功send()的次数不相等.在这中情况下,接收端能够通过recv()的返回值是否为0来推断发送端是否发送完成. 通过setsockopt()的TCP_NODELAY选项来禁用Na

Linux下tcp协议socket的recv函数返回时机分析(粘包)

http://www.vckbase.com/index.php/wv/10http://blog.csdn.net/zlzlei/article/details/7689409 文章一: 当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport control protocol,传输控制协议)是面向连接的,提供高可靠性服务.UDP(user datagram pro

cvs报错: socket exception recv failed

连接都OK的. 也可以telnet到服务器上去. 网上的各种方法都试了,没法解决. 后来一直在乱试,居然解决了. 就是这样设置的,选中第一个复选框.