24小时热门版块排行榜    

北京石油化工学院2026年研究生招生接收调剂公告
查看: 639  |  回复: 2

zhmindyx

新虫 (初入文坛)

[求助] 求助hook程序的注解

有一下几段HOOK程序,看不太懂,求中文注解


NTSTATUS HookExistingNDISProtocols(void)
{
UINT *ProtocolPtr;
NDIS_HANDLE hBogusProtocol = NULL;
PNDIS_OPEN_BLOCK OpenBlockPtr = NULL;
PNDIS_PROTOCOL_HOOK pNode;

hBogusProtocol = RegisterBogusNDISProtocol();
if(hBogusProtocol == NULL) return STATUS_UNSUCCESSFUL;

ProtocolPtr = (UINT*)hBogusProtocol;
ProtocolPtr = (UINT*)((PBYTE)ProtocolPtr + sizeof(REFERENCE) + 8);
ProtocolPtr = (UINT*)(*ProtocolPtr);

while(ProtocolPtr != NULL) {
OpenBlockPtr = (PNDIS_OPEN_BLOCK)(*ProtocolPtr);
if(OpenBlockPtr != NULL) {
pNode = NewNDISNode();
if(pNode != NULL) {
pNode->ProtocolBindingContext = OpenBlockPtr->ProtocolBindingContext;
pNode->MacBindingContext = OpenBlockPtr->MacBindingHandle;
pNode->OpenBlockPtr = OpenBlockPtr;
pNode->RealSendHandler = OpenBlockPtr->SendHandler;
//How about WanSendHandler?
pNode->RealPostNt31ReceiveHandler = OpenBlockPtr->PostNt31ReceiveHandler;

InsertNDISNode(pNode);

OpenBlockPtr->SendHandler = NDISSendHandler;
//How about WanSendHandler?
OpenBlockPtr->PostNt31ReceiveHandler = NDISPostNt31ReceiveHandler;
}
}

ProtocolPtr = (UINT*)((PBYTE)ProtocolPtr + sizeof(REFERENCE) + 8);
ProtocolPtr = (UINT*)(*ProtocolPtr);
}

DeregisterBogusNDISProtocol(hBogusProtocol);

return STATUS_SUCCESS;
}

NTSTATUS HookExistingNDISProtocols(void)
{
UINT *ProtocolPtr;
NDIS_HANDLE hBogusProtocol = NULL;
PNDIS_OPEN_BLOCK OpenBlockPtr = NULL;
PNDIS_PROTOCOL_HOOK pNode;

hBogusProtocol = RegisterBogusNDISProtocol();
if(hBogusProtocol == NULL) return STATUS_UNSUCCESSFUL;

ProtocolPtr = (UINT*)hBogusProtocol;
ProtocolPtr = (UINT*)((PBYTE)ProtocolPtr + sizeof(REFERENCE) + 8);
ProtocolPtr = (UINT*)(*ProtocolPtr);

while(ProtocolPtr != NULL) {
OpenBlockPtr = (PNDIS_OPEN_BLOCK)(*ProtocolPtr);
if(OpenBlockPtr != NULL) {
pNode = NewNDISNode();
if(pNode != NULL) {
pNode->ProtocolBindingContext = OpenBlockPtr->ProtocolBindingContext;
pNode->MacBindingContext = OpenBlockPtr->MacBindingHandle;
pNode->OpenBlockPtr = OpenBlockPtr;
pNode->RealSendHandler = OpenBlockPtr->SendHandler;
//How about WanSendHandler?
pNode->RealPostNt31ReceiveHandler = OpenBlockPtr->PostNt31ReceiveHandler;

InsertNDISNode(pNode);

OpenBlockPtr->SendHandler = NDISSendHandler;
//How about WanSendHandler?
OpenBlockPtr->PostNt31ReceiveHandler = NDISPostNt31ReceiveHandler;
}
}

ProtocolPtr = (UINT*)((PBYTE)ProtocolPtr + sizeof(REFERENCE) + 8);
ProtocolPtr = (UINT*)(*ProtocolPtr);
}

DeregisterBogusNDISProtocol(hBogusProtocol);

return STATUS_SUCCESS;
}


NDIS_STATUS NDISSendHandler(
IN NDIS_HANDLE MacBindingHandle,
IN PNDIS_PACKET Packet)
{
PNDIS_PROTOCOL_HOOK Node;

Node = FindNDISNode(MacBindingHandle,2);
if(Node == NULL) return NDIS_STATUS_SUCCESS;

return Node->RealSendHandler(MacBindingHandle,Packet);
}

NDIS_STATUS NDISPostNt31ReceiveHandler(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE MacReceiveContext,
IN PVOID HeaderBuffer,
IN UINT HeaderBufferSize,
IN PVOID LookAheadBuffer,
IN UINT LookAheadBufferSize,
IN UINT PacketSize)
{
PNDIS_PROTOCOL_HOOK Node;

Node = FindNDISNode(ProtocolBindingContext,1);
if(Node == NULL) return NDIS_STATUS_SUCCESS;

return Node->RealPostNt31ReceiveHandler(ProtocolBindingContext,MacReceiveContext,
HeaderBuffer,HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize,PacketSize);
}
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cmdblock

银虫 (正式写手)

【答案】应助回帖

感谢参与,应助指数 +1
这么短小的代码可以用C++自动生成流程图的软件来解决
2楼2012-03-21 10:19:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

nbjnh

木虫 (正式写手)

【答案】应助回帖

★ ★ ★ ★ ★
感谢参与,应助指数 +1
zhmindyx: 金币+5, ★★★★★最佳答案 2012-03-26 08:34:44
NTSTATUS HookExistingNDISProtocols(void)
{
UINT *ProtocolPtr;
NDIS_HANDLE hBogusProtocol = NULL;  //定义一个假协议指针
PNDIS_OPEN_BLOCK OpenBlockPtr = NULL;
PNDIS_PROTOCOL_HOOK pNode;

hBogusProtocol = RegisterBogusNDISProtocol();//注册假协议,以获得协议链表指针
if(hBogusProtocol == NULL) return STATUS_UNSUCCESSFUL;//协议注册不成功,后面的没法玩了,退出

ProtocolPtr = (UINT*)hBogusProtocol;
ProtocolPtr = (UINT*)((PBYTE)ProtocolPtr + sizeof(REFERENCE) + 8);
ProtocolPtr = (UINT*)(*ProtocolPtr);
//估计楼主可能是看不懂上面三句!要了解上面三句先要清楚NDIS_HANDLE的结构。
//第二句是算取ndisProtocolList指针位置;第三句是取该协议链表的地址
/*********************************************************************
struct PROTOCOL_HANDLE{
        LIST_ENTRY                protocolEntry;  // +sizeof(REFERENCE)
        ULONG                        UnKnown1[2];        // +8
        PLIST_ENTRY                ndisProtocolList;
        _NDIS50_PROTOCOL_CHARACTERISTICS Characteristics;
        _WORK_QUEUE_ITEM        Queue;
        KMUTEX                                Mutex;
        ULONG                                Unknown3[5];
        USHORT                                NameBuff[Characteristics->Name.Length+1];
};//本结构从NdisRegisterProtocol中直接导出,也可以认为NDIS_HANDLE结构
//其实就是NDIS_OPEN_BLOCK结构即
struct _NDIS_PROTOCOL_BLOCK
{
PNDIS_OPEN_BLOCK        OpenQueue;
REFERENCE                        Ref;
UINT                                Length;
NDIS50_PROTOCOL_CHARACTERISTICS        ProtocolCharacteristics;
struct _NDIS_PROTOCOL_BLOCK                *NextProtocol;
ULONG        MaxPatternSize;
#if defined(NDIS_WRAPPER)
        struct _NDIS_PROTOCOL_FILTER * ProtocolFilter[NdisMediumMax+1];
        WORK_QUEUE_ITEM        WorkItem;
        KMUTEX                        Mutex;
        PKEVENT                        DeregEvent;
#endif
};
//不管是哪一个结构,总之ProtocolPtr最后指向协议链表的起点。
*********************************************************************/
while(ProtocolPtr != NULL) {   //循环处理协议链表
OpenBlockPtr = (PNDIS_OPEN_BLOCK)(*ProtocolPtr);//取一个协议
if(OpenBlockPtr != NULL) {//如果协议不为空
pNode = NewNDISNode();//创建一个新结点,用于保存原始协议数据,以备恢复HOOK
if(pNode != NULL) {
pNode->ProtocolBindingContext = OpenBlockPtr->ProtocolBindingContext;
pNode->MacBindingContext = OpenBlockPtr->MacBindingHandle;
pNode->OpenBlockPtr = OpenBlockPtr;
pNode->RealSendHandler = OpenBlockPtr->SendHandler;
//How about WanSendHandler?
pNode->RealPostNt31ReceiveHandler = OpenBlockPtr->PostNt31ReceiveHandler;

InsertNDISNode(pNode);

OpenBlockPtr->SendHandler = NDISSendHandler;//修改协议发送例程入口
//How about WanSendHandler?
OpenBlockPtr->PostNt31ReceiveHandler = NDISPostNt31ReceiveHandler;//修改协议接收例程入口
/****************************************************************************************
当网卡有数据包进入时,会通过表中ReceiveHandle或ReceivePacketHandler通知协议驱动程序有一
个该协议的数据包进入,反之协议驱动程序是通过SendHandler或SendPacketsHandler函数向网卡驱动
发送数据包到网络上去的。只要能够将每一个协议程序所填写的派发函数指向自己的函数,就能成功的
对数据包进行拦截。从上面两句代码来看,所有协议收、发例程全部被重新指向到NDISSendHandler()
和NDISPostNt31ReceiveHandler()函数中,那么所有的过滤工作将在这两个函数中完成,并且完成过滤
后,再将数据包转给原来的例程进行处理。
*****************************************************************************************/
}
}
ProtocolPtr = (UINT*)((PBYTE)ProtocolPtr + sizeof(REFERENCE) + 8);
ProtocolPtr = (UINT*)(*ProtocolPtr);
//上面两句,计算下一个协议入口。
}

DeregisterBogusNDISProtocol(hBogusProtocol);

return STATUS_SUCCESS;
}

NDIS_STATUS NDISSendHandler(
IN NDIS_HANDLE MacBindingHandle,
IN PNDIS_PACKET Packet)
{
PNDIS_PROTOCOL_HOOK Node;

Node = FindNDISNode(MacBindingHandle,2);
if(Node == NULL) return NDIS_STATUS_SUCCESS;

return Node->RealSendHandler(MacBindingHandle,Packet);
//发送例程没有做任何处理,直接将数据包传给保存在Node中的原例程处理。
//当然,如果需要做过滤的话,也可以添代码。
}

NDIS_STATUS NDISPostNt31ReceiveHandler(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE MacReceiveContext,
IN PVOID HeaderBuffer,
IN UINT HeaderBufferSize,
IN PVOID LookAheadBuffer,
IN UINT LookAheadBufferSize,
IN UINT PacketSize)
{
PNDIS_PROTOCOL_HOOK Node;

Node = FindNDISNode(ProtocolBindingContext,1);
if(Node == NULL) return NDIS_STATUS_SUCCESS;

return Node->RealPostNt31ReceiveHandler(ProtocolBindingContext,MacReceiveContext,
HeaderBuffer,HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize,PacketSize);
//收到的包出没有处理,也是直接传给原例程处理的,自己加过滤代码吧。看样子应该是一个
//防火墙的框架程序。
}
不可乘喜而轻诺,不可因醉而生嗔,不可乘快而多事,不可因倦而鲜终。
3楼2012-03-22 09:15:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zhmindyx 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 316求调剂 +4 江辞666 2026-03-26 4/200 2026-03-27 00:33 by wxiongid
[考研] 341求调剂 +7 青柠檬1 2026-03-26 7/350 2026-03-27 00:19 by wxiongid
[考研] 化学308分求调剂 +5 你好明天你好 2026-03-23 5/250 2026-03-26 23:43 by 催化大白
[考研] 324求调剂 +3 hanamiko 2026-03-26 3/150 2026-03-26 21:00 by sanrepian
[考研] 081200-11408-276学硕求调剂 +3 崔wj 2026-03-26 3/150 2026-03-26 20:33 by cy128
[考研] 考研调剂 +8 小蜡新笔 2026-03-26 8/400 2026-03-26 16:18 by dick_runner
[考研] 279 分 求调剂 +3 睡个好觉_16 2026-03-24 3/150 2026-03-26 15:43 by zzll406
[考研] 296求调剂 +5 www_q 2026-03-20 5/250 2026-03-26 12:56 by 3Strings
[考研] 315分求调剂 +5 26考研上岸版26 2026-03-26 5/250 2026-03-26 12:11 by laoshidan
[考研] 085600 材料与化工 329分求调剂 +9 Mr. Z 2026-03-25 9/450 2026-03-26 10:36 by baoball
[考研] 309求调剂 +4 gajsj 2026-03-25 5/250 2026-03-26 00:27 by Dyhoer
[考研] 302求调剂 +4 锦衣卫藤椒 2026-03-25 4/200 2026-03-25 16:29 by 功夫疯狂
[考研] 调剂 +4 13853210211 2026-03-24 4/200 2026-03-24 19:44 by ms629
[考研] 306求0703调剂一志愿华中师范 +10 纸鱼ly 2026-03-21 11/550 2026-03-24 17:22 by qingfeng258
[考研] 336求调剂 +4 收到VS 2026-03-20 4/200 2026-03-23 19:02 by macy2011
[考研] 一志愿东华大学化学070300,求调剂 +7 2117205181 2026-03-21 8/400 2026-03-22 22:55 by chixmc
[考研] 293求调剂 +3 涛涛Wjt 2026-03-22 5/250 2026-03-22 22:21 by jiangpengfei
[考研] 308求调剂 +3 墨墨漠 2026-03-21 3/150 2026-03-22 16:54 by i_cooler
[考研] 275求调剂 +6 shansx 2026-03-22 8/400 2026-03-22 15:27 by barlinike
[考研] 330求调剂0854 +3 assdll 2026-03-21 3/150 2026-03-21 13:01 by 搏击518
信息提示
请填处理意见