求类似wpe抓包工具.拦截winsock的send和recv的封装好的类库或源码.

名字太长会怎么样 2011-05-17 09:48:01
如题,
任何语言写的都可以,只要C#能调用,
实现功能:->
能够间接或者直接的捕获本机的某个端口收发数据,
或者能够拦截winsock的send,和recv函数,
或者 捕获本机的所有通信数据,
总之 只要能够间接或者直接的实现wpe的修改封包,用被占用的端口发送数据,捕获被占用的端口的数据就行


如果真的没办法做这个,那有没有 抓包工具 支持代码控制来完成修改封包等一系列操作,

我在网站找了一个,而且仅此一个,貌似是捕获本进程ws2_32.dll的调用,但有错误,

namespace api_hook_封包学习
{
public partial class Form1 : Form
{
[DllImport("ws2_32.dll")]
static extern int send(int s, byte[] buf, int len, int flag);

[DllImport("ws2_32.dll")]
static extern int recv(int s, byte[] buf, int len, int flag);

APIHOOK send_Hook = new APIHOOK();
delegate int sendCallback(int s, IntPtr buf, int len, int flag);
delegate int recvCallback(int s, IntPtr buf, int len, int flag);
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
//关键代码在这里,如果我用这句拦截发送的包完全正确
send_Hook.Install("ws2_32.dll", "send", Marshal.GetFunctionPointerForDelegate(new sendCallback(sendProc)));


//但我用同样的方法拦截接收的包也收到包,但时打开网页就乱码,请高人指点
send_Hook.Install("ws2_32.dll", "recv", Marshal.GetFunctionPointerForDelegate(new recvCallback(toProc)));
}

int sendProc(int s, IntPtr buf, int len, int flag)
{
byte[] buffer = new byte[len];
Marshal.Copy(buf, buffer, 0, len); //读封包数据,读取后可进行条件修改,拦截,转发等,记得处理后调用发送

//todo 后加的
//string str_read = Encoding.UTF8.GetString(buffer);
//MessageBox.Show(str_read);


//todo 结束

send_Hook.Suspend(); //暂停拦截,转交系统调用
int ret = send(s, buffer, len, flag); //发送数据,此处可进行拦截
send_Hook.Continue(); //恢复HOOK
return ret;
}
int toProc(int s, IntPtr buf, int len, int flag)
{
byte[] buffer = new byte[len];
Marshal.Copy(buf, buffer, 0, len); //读封包数据
//encod
//todo 后加的
//string str_read = Encoding.UTF8.GetString(buffer);
//MessageBox.Show(str_read);


//todo 结束


send_Hook.Suspend(); //暂停拦截,转交系统调用
int ret = recv(s, buffer, len, flag); //发送数据,此处可对包进行处理操作
send_Hook.Continue(); //恢复HOOK
return ret;
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{

}

private void button1_Click_1(object sender, EventArgs e)
{

webBrowser1.Navigate("http://www.baidu.com");//按下时加载网页进行测试数据

}
}
//APIHOOK关键代码类
public class APIHOOK
{
#region Api声明
[DllImport("Kernel32.dll", EntryPoint = "GetModuleHandleA", CharSet = CharSet.Ansi)]
static extern IntPtr GetModuleHandle(
string lpModuleName
);
[DllImport("Kernel32.dll")]
static extern bool VirtualProtect(
IntPtr lpAddress,
int dwSize,
int flNewProtect,
ref int lpflOldProtect
);
[DllImport("Kernel32.dll", EntryPoint = "lstrcpynA", CharSet = CharSet.Ansi)]
static extern IntPtr lstrcpyn(
byte[] lpString1,
byte[] lpString2,
int iMaxLength
);
[DllImport("Kernel32.dll")]
static extern IntPtr GetProcAddress(
IntPtr hModule,
string lpProcName
);
[DllImport("Kernel32.dll")]
static extern bool FreeLibrary(
IntPtr hModule
);
#endregion
#region 常量定义表
const int PAGE_EXECUTE_READWRITE = 0x40;
#endregion
#region 变量表
IntPtr ProcAddress;
int lpflOldProtect = 0;
byte[] OldEntry = new byte[5];
byte[] NewEntry = new byte[5];
IntPtr OldAddress;
#endregion
public APIHOOK() { }
public APIHOOK(string ModuleName, string ProcName, IntPtr lpAddress)
{
Install(ModuleName, ProcName, lpAddress);
}
public bool Install(string ModuleName, string ProcName, IntPtr lpAddress)
{
IntPtr hModule = GetModuleHandle(ModuleName); //取模块句柄
if (hModule == IntPtr.Zero) return false;
ProcAddress = GetProcAddress(hModule, ProcName); //取入口地址
if (ProcAddress == IntPtr.Zero) return false;
if (!VirtualProtect(ProcAddress, 5, PAGE_EXECUTE_READWRITE, ref lpflOldProtect)) return

false; //修改内存属性
Marshal.Copy(ProcAddress, OldEntry, 0, 5); //读取前5字节
NewEntry = AddBytes(new byte[1] { 233 }, BitConverter.GetBytes((Int32)((Int32)lpAddress -

(Int32)ProcAddress - 5))); //计算新入口跳转
Marshal.Copy(NewEntry, 0, ProcAddress, 5); //写入前5字节
OldEntry = AddBytes(OldEntry, new byte[5] { 233, 0, 0, 0, 0 });
OldAddress = lstrcpyn(OldEntry, OldEntry, 0); //取变量指针
Marshal.Copy(BitConverter.GetBytes((double)((Int32)ProcAddress - (Int32)OldAddress - 5)),

0, (IntPtr)(OldAddress.ToInt32() + 6), 4); //保存JMP
FreeLibrary(hModule); //释放模块句柄
return true;
}
public void Suspend()
{
Marshal.Copy(OldEntry, 0, ProcAddress, 5);
}
public void Continue()
{
Marshal.Copy(NewEntry, 0, ProcAddress, 5);
}
public bool Uninstall()
{
if (ProcAddress == IntPtr.Zero) return false;
Marshal.Copy(OldEntry, 0, ProcAddress, 5);
ProcAddress = IntPtr.Zero;
return true;
}
static byte[] AddBytes(byte[] a, byte[] b)
{
ArrayList retArray = new ArrayList();
for (int i = 0; i < a.Length; i++)
{
retArray.Add(a[i]);
}
for (int i = 0; i < b.Length; i++)
{
retArray.Add(b[i]);
}
return (byte[])retArray.ToArray(typeof(byte));
}
}
}



写游戏辅助要用到,

高手帮帮忙,,谢谢了

...全文
1116 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
huodeming 2011-08-22
  • 打赏
  • 举报
回复
告诉你 你用的这个完全没有错 我在一年前已用上开发赛尔号辅助外挂的修改包操作模块了 不错 赚了几万
估计是你调用时没把代码写好
  • 打赏
  • 举报
回复
怎么没人的?、
  • 打赏
  • 举报
回复
求解,求例子,
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 q191201771 的回复:]
google WINSOCK SPI
或者远程注入DLL HOOK上去, windows核心编程上有说
[/Quote]
怎么远程注入dll hook上去,,以前我也百度了很多下,但是没找到,能不能贴下你以前写过的代码例子,或者有没有现成的封装好的类库,
就想叫yoko 2011-05-17
  • 打赏
  • 举报
回复
google WINSOCK SPI
或者远程注入DLL HOOK上去, windows核心编程上有说
  • 打赏
  • 举报
回复
不知道wpe怎么捕获到数据。和用指定端口发送数据包的。
  • 打赏
  • 举报
回复
在线等,,会的帮帮忙,谢谢
  • 打赏
  • 举报
回复
我已经把所有积分压上去了,,最后一击了,,希望高手能帮帮忙,谢谢

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧