直接改的tdifw,精简掉乱七八糟的代码,一共500来行搞定,写了一个简单的文档
相信大家都可以看懂,呵呵


编译:VC6 + DDK2000(D:\NTDDK)
测试:加载驱动,执行一个tcp连接,debugview会有输出,如果没有输出,有可能是机器上的杀毒软件防火墙之类干扰造成
流程简介:
一、hook_tcpip函数
首先获取\\Driver\\Tcpip驱动设备的MajorFunction分发函数并替换成TdiHookDeviceDispatch。
二、在TdiHookDeviceDispatch中处理具体的IRP
主要有IRP_MJ_CREATE->tdi_create,
在此可以监控创建的TdiTransportAddress以及connection object
如果是创建tdi地址,设置irp完成函数tdi_create_addrobj_complete,通过tdi_dispatch_complete函数处理。

tdi_dispatch_complete处理流程如下:
创建一个自定义的TDI_SKIP_CTX上下文,里面记录了新的irp完成函数的参数,并设置当前irp完成函数为tdi_skip_complete
在tdi_skip_complete中
// call new completion 
status = ctx->new_cr(ctx->new_devobj, Irp, ctx->new_context);

在tdi_create_addrobj_complete中参数Context是tdi_create时,通过TdiBuildInternalDeviceControlIrp创建的一个查询query_irp。
该IRP在tdi_create_addrobj_complete2时完成,此时已经获取到创建地址信息。由于具体的任务需要,我只需要获取tcp连接的src_port以及dst_port信息。
我们通过add_object_hash_pool将该地址信息添加到obj_hash表中,查询key为该地址obj。
add_object_hash_pool(g_hash_pool, (unsigned long)ctx->fileobj, obj_item);

接下来会创建tdi连接obj,类似地址obj,无需特殊处理

然后是TDI_ASSOCIATE_ADDRESS ->tdi_associate_address IRP,将开始创建的local地址和连接obj进行绑定。我们在hash表中,通过查询地址obj,获取先前记录的local地址信息,复制到新的obj_item中,该obj的key为连接obj地址。

最后是TDI_CONNECT ->tdi_connect处理,直接查询hash表即可获取该conn obj对应的local地址信息,并在调试输出中显示出来。

总体的流程如下:
Tdi_create->创建查询irp-> 
tdi_create_addrobj_complete->tdi_create_addrobj_complete2
->建立addr obj到local addr映射
TDI_ASSOCIATE_ADDRESS ->tdi_associate_address
->建立conn obj到local addr映射,通过addr obj为key查询hash obj_item
TDI_CONNECT ->tdi_connect
->通过conn obj为key查询hash obj_item获取地址信息并输出

上传的附件 tdi_hook_demo.rar