24小时热门版块排行榜    

查看: 636  |  回复: 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的回帖

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的回帖
查看全部 3 个回答

cmdblock

银虫 (正式写手)

【答案】应助回帖

感谢参与,应助指数 +1
这么短小的代码可以用C++自动生成流程图的软件来解决
2楼2012-03-21 10:19:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 一志愿北京化工大学材料与化工(085600)296求调剂 +6 稻妻小编 2026-03-26 6/300 2026-03-26 15:12 by 852137818
[考研] 一志愿厦门大学化学学硕307求调剂 +5 y7czhao 2026-03-26 5/250 2026-03-26 14:31 by 哒哒哒呱呱呱
[考研] 312求调剂 +5 上岸吧ZJY 2026-03-22 8/400 2026-03-26 13:12 by 公瑾逍遥
[考研] 297求调剂 +3 田洪有 2026-03-26 3/150 2026-03-26 09:38 by 杨杨杨紫
[考研] 一志愿上海交大生物与医药专硕324分,求调剂 +6 jiajunX 2026-03-22 6/300 2026-03-25 23:05 by licg0208
[考研] 302求调剂 +4 锦衣卫藤椒 2026-03-25 4/200 2026-03-25 16:29 by 功夫疯狂
[考研] 各位老师您好:本人初试372分 +5 jj涌77 2026-03-25 6/300 2026-03-25 14:15 by mapenggao
[考研] 081700 调剂 267分 +10 迷人的哈哈 2026-03-23 10/500 2026-03-25 12:12 by userper
[考研] 085600材料与化工调剂 +9 A-哆啦Z梦 2026-03-23 15/750 2026-03-25 11:18 by Ainin_
[考研] 289材料与化工(085600)B区求调剂 +4 这么名字咋样 2026-03-22 5/250 2026-03-25 08:20 by mx.yue
[考研] 求调剂一志愿武汉理工大学材料工程(085601) +5 WW.' 2026-03-23 7/350 2026-03-24 14:50 by sprinining
[考研] 一志愿山东大学药学学硕求调剂 +3 开开心心没烦恼 2026-03-23 4/200 2026-03-24 00:06 by 开开心心没烦恼
[考研] 一志愿重庆大学085700资源与环境,总分308求调剂 +7 墨墨漠 2026-03-23 8/400 2026-03-23 20:36 by Creta
[考研] 一志愿陕师大生物学071000,298分,求调剂 +3 SYA! 2026-03-23 3/150 2026-03-23 19:09 by macy2011
[考研] 333求调剂 +3 ALULU4408 2026-03-23 3/150 2026-03-23 19:04 by macy2011
[考研] 328求调剂 +4 LHHL66 2026-03-23 4/200 2026-03-23 14:55 by lbsjt
[考研] 352求调剂 +3 大米饭! 2026-03-22 3/150 2026-03-22 23:28 by king123!
[考研] 求调剂 +3 白QF 2026-03-21 3/150 2026-03-21 13:12 by zhukairuo
[考研] 南昌大学材料专硕311分求调剂 +6 77chaselx 2026-03-20 6/300 2026-03-21 07:24 by JourneyLucky
[考研] 一志愿 南京航空航天大学大学 ,080500材料科学与工程学硕 +5 @taotao 2026-03-20 5/250 2026-03-20 20:16 by JourneyLucky
信息提示
请填处理意见