-
-
[旧帖] [讨论][讨论]关于 另类挂钩-RING3数据包监视 如何修改数据发送的问题 0.00雪花
-
发表于: 2012-7-20 14:50 995
-
看了 qihoocom 另类挂钩-RING3数据包监视,确实很高深,
就想来试试把截获的数据包进行修改,但是在数据拷贝的时候经常挂掉,
在网查也没有找到相关解释,看到有人说是得先修改数据,再调用原函数,
我也试过但还是没有成功,这里好像收包的时候有点问题把,下面贴出我的源码
#define LONG_BUFFER 5120
NTSTATUS __stdcall NewNtDeviceIoControlFile(
HANDLE FileHandle,
HANDLE Event OPTIONAL,
PVOID ApcRoutine OPTIONAL,
PVOID ApcContext OPTIONAL,
PVOID IoStatusBlock,
ULONG IoControlCode,
PVOID InputBuffer OPTIONAL,
ULONG InputBufferLength,
PVOID OutputBuffer OPTIONAL,
ULONG OutputBufferLength
)
{
//先调用原始函数
LONG stat = 0;
//如果原始函数失败了(例如RECV无数据)
//检查是否为TCP收发指令
if (IoControlCode != AFD_SEND && IoControlCode != AFD_RECV)
{
// 如果不是TCP包调用原函数发送
__asm
{
push OutputBufferLength
push OutputBuffer
push InputBufferLength
push InputBuffer
push IoControlCode
push IoStatusBlock
push ApcContext
push ApcRoutine
push Event
push FileHandle
call pNtDeviceIoControl
mov stat,eax
}
if (!NT_SUCCESS(stat))
{
return stat;
}
return stat;
}
//访问AFD INFO结构,获得SEND或RECV的BUFFER信息
//这里可能是有问题的BUFFER,因此我们要加TRY EXCEPT
__try
{
//从InputBuffer得到Buffer和Len
PAFD_INFO AfdInfo = (PAFD_INFO)InputBuffer;
PVOID Buffer = AfdInfo->BufferArray->buf;
ULONG Len = AfdInfo->BufferArray->len;
if (IoControlCode == AFD_SEND)
{
if (LookupSendPacket(Buffer , Len))
{
//输出包内容
//这里输出调试信息,可以用DbgView查看,如果有UI可以做成SendMessage形式~
OutputDebugStringA("SendPacket!\n");
OutputDebugStringA((char*)Buffer);
// 比如要将baidu 替换成google
TCHAR szErrorUNC[100] = {_T("baidu")};
TCHAR szRightUNC[100] = {_T("google")};
char szBuf[LONG_BUFFER] = {0};
strcpy_s(szBuf, sizeof(szBuf), (char*)Buffer);
// 查找是否存在错误字段
char* p_unc = strstr(szBuf, szErrorUNC);
if (p_unc != NULL)
{
// 修改数据包, 字符串替换
StrReplace(szBuf, sizeof(szBuf), szRightUNC, szErrorUNC);
int iSize = _tcslen(szBuf);
AfdInfo->BufferArray->len = _tcslen(szBuf);
// 现在这里就是要修改数据包,然后调用原函数发送数据,但是拷贝的时候会挂掉
//memcpy(AfdInfo->BufferArray->buf, szBuf, iSize);
//memcpy(InputBuffer, AfdInfo, sizeof(AfdInfo));
// 修改完调用原函数
__asm
{
push OutputBufferLength
push OutputBuffer
push InputBufferLength
push InputBuffer
push IoControlCode
push IoStatusBlock
push ApcContext
push ApcRoutine
push Event
push FileHandle
call pNtDeviceIoControl
mov stat,eax
}
}
}
}
else
{
// 如果改成发送后调用原函数,就收不到数据包了
if (LookupRecvPacket(Buffer , Len))
{
OutputDebugStringA("RecvPacket!\n");
OutputDebugStringA((char*)Buffer);
}
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return stat;
}
return stat;
}
不知道大家有没有这样去试过,帮帮忙看有什么办法能解决,先谢谢各位了
就想来试试把截获的数据包进行修改,但是在数据拷贝的时候经常挂掉,
在网查也没有找到相关解释,看到有人说是得先修改数据,再调用原函数,
我也试过但还是没有成功,这里好像收包的时候有点问题把,下面贴出我的源码
#define LONG_BUFFER 5120
NTSTATUS __stdcall NewNtDeviceIoControlFile(
HANDLE FileHandle,
HANDLE Event OPTIONAL,
PVOID ApcRoutine OPTIONAL,
PVOID ApcContext OPTIONAL,
PVOID IoStatusBlock,
ULONG IoControlCode,
PVOID InputBuffer OPTIONAL,
ULONG InputBufferLength,
PVOID OutputBuffer OPTIONAL,
ULONG OutputBufferLength
)
{
//先调用原始函数
LONG stat = 0;
//如果原始函数失败了(例如RECV无数据)
//检查是否为TCP收发指令
if (IoControlCode != AFD_SEND && IoControlCode != AFD_RECV)
{
// 如果不是TCP包调用原函数发送
__asm
{
push OutputBufferLength
push OutputBuffer
push InputBufferLength
push InputBuffer
push IoControlCode
push IoStatusBlock
push ApcContext
push ApcRoutine
push Event
push FileHandle
call pNtDeviceIoControl
mov stat,eax
}
if (!NT_SUCCESS(stat))
{
return stat;
}
return stat;
}
//访问AFD INFO结构,获得SEND或RECV的BUFFER信息
//这里可能是有问题的BUFFER,因此我们要加TRY EXCEPT
__try
{
//从InputBuffer得到Buffer和Len
PAFD_INFO AfdInfo = (PAFD_INFO)InputBuffer;
PVOID Buffer = AfdInfo->BufferArray->buf;
ULONG Len = AfdInfo->BufferArray->len;
if (IoControlCode == AFD_SEND)
{
if (LookupSendPacket(Buffer , Len))
{
//输出包内容
//这里输出调试信息,可以用DbgView查看,如果有UI可以做成SendMessage形式~
OutputDebugStringA("SendPacket!\n");
OutputDebugStringA((char*)Buffer);
// 比如要将baidu 替换成google
TCHAR szErrorUNC[100] = {_T("baidu")};
TCHAR szRightUNC[100] = {_T("google")};
char szBuf[LONG_BUFFER] = {0};
strcpy_s(szBuf, sizeof(szBuf), (char*)Buffer);
// 查找是否存在错误字段
char* p_unc = strstr(szBuf, szErrorUNC);
if (p_unc != NULL)
{
// 修改数据包, 字符串替换
StrReplace(szBuf, sizeof(szBuf), szRightUNC, szErrorUNC);
int iSize = _tcslen(szBuf);
AfdInfo->BufferArray->len = _tcslen(szBuf);
// 现在这里就是要修改数据包,然后调用原函数发送数据,但是拷贝的时候会挂掉
//memcpy(AfdInfo->BufferArray->buf, szBuf, iSize);
//memcpy(InputBuffer, AfdInfo, sizeof(AfdInfo));
// 修改完调用原函数
__asm
{
push OutputBufferLength
push OutputBuffer
push InputBufferLength
push InputBuffer
push IoControlCode
push IoStatusBlock
push ApcContext
push ApcRoutine
push Event
push FileHandle
call pNtDeviceIoControl
mov stat,eax
}
}
}
}
else
{
// 如果改成发送后调用原函数,就收不到数据包了
if (LookupRecvPacket(Buffer , Len))
{
OutputDebugStringA("RecvPacket!\n");
OutputDebugStringA((char*)Buffer);
}
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return stat;
}
return stat;
}
不知道大家有没有这样去试过,帮帮忙看有什么办法能解决,先谢谢各位了
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
看原图
赞赏
雪币:
留言: