代码比较简单,就不做注释了。  包含一个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 = ; 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 != ) {
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>)
{
byte[] RecvBuffer = new byte[bytesCount];
Marshal.Copy(buffer, RecvBuffer, , RecvBuffer.Length);
Interface.OnRecv(RecvBuffer, , );
}
return bytesCount;
}
int MySend(IntPtr socket, IntPtr buffer, int length, int flags)
{
int bytesCount = send(socket, buffer, length, flags);
if (bytesCount > )
{
byte[] RecvBuffer = new byte[bytesCount];
Marshal.Copy(buffer, RecvBuffer, , RecvBuffer.Length);
Interface.OnSend(RecvBuffer, , );
}
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[] { });
RecvHook.ThreadACL.SetExclusiveACL(new Int32[] { }); Interface.IsInstalled(RemoteHooking.GetCurrentProcessId());
dwProHwnd = OpenProcess(PROCESS_ALL_ACCESS, , RemoteHooking.GetCurrentProcessId());
//EasyHook.RemoteHooking.WakeUpProcess();
while (true) { Thread.Sleep(); } } [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 = ;
[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);
}

easyHOOK socket send recv的更多相关文章

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

    1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP ...

  2. Socket send函数和recv函数详解

    1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP ...

  3. linux socket下send()&recv()调用

    1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP ...

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

    函数原型 read/write系原型 #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); #include ...

  5. linux Socket send与recv函数详解

    转自:http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html linux send与recv函数详解   1 #include ...

  6. linux socket send和recv、write和read

    1 recv和read ssize_t recv(int sockfd, void *buf, size_t len, int flags); ssize_t read(int fd, void *b ...

  7. send+recv注意事项

    [TOC] send 函数原型 ssize_t send( SOCKET s, const char *buf, size_t len, int flags ) 注意事项 待发送数据长度data_le ...

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

    http://www.vckbase.com/index.php/wv/10http://blog.csdn.net/zlzlei/article/details/7689409 文章一: 当前在网络 ...

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

    send()函数默认情况下会使用Nagle算法.Nagle算法通过将未确认的数据存入缓冲区直到积攒到一定数量一起发送的方法.来降低主机发送零碎小数据包的数目.所以假设send()函数发送数据过快的话, ...

随机推荐

  1. 巧用CAS解决数据一致性问题

    缘起:在高并发的分布式环境下,对于数据的查询与修改容易引发一致性问题,本文将分享一种非常简单但有效的优化方法. 一.业务场景 业务场景为,购买商品的过程要对余额进行查询与修改,大致的业务流程如下: ( ...

  2. Asp.net MVC 生成zip并下载

    前面有生成Excel或Word的示例,所以就不再重新写了. 这里只提供将指定文件以ZIP的方式下载. 创建一个 Zip工具类 public class ZIPCompressUtil { public ...

  3. Asp.net mvc 知多少(五)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...

  4. springboot命令启动

    gradle打jar包命令 jar { doFirst { def jarFiles = ''; configurations.compile.collect { jarFiles += it.nam ...

  5. 【java设计模式】【创建模式Creational Pattern】建造模式Builder Pattern

    package com.tn.pattern; public class Client { public static void main(String[] args) { Director dire ...

  6. 【java】对象序列化Serializable、transient

    package 对象序列化; import java.io.Serializable; @SuppressWarnings("serial") class A implements ...

  7. xamarin android制作圆角边框

    xamarin android制作圆角边框 效果图如下: 关键代码: drawable文件夹新建shape_corner_down.xml <?xml version="1.0&quo ...

  8. BZOJ 4819 新生舞会

    第一句话:算出3.363636的孩子啊,你跑错流种了. 貌似上一篇我讲SDOI出原题?嘿还真是! 半个月前有一个叫WG的男人给我们搞过一场考试... ... 里面有一道题叫做保密... ...SDOI ...

  9. bzoj 1855: [Scoi2010]股票交易

    Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价 ...

  10. (一)DOM 常用操作 —— “查找”节点

    在 DOM 树中,如果想要操作一个节点,那么首先要"查找"到这个节点.查找节点的方法由 Document 接口定义,而该接口由 JavaScript 中的 document 对象实 ...