阅读:3143回复:4
帮你快速看网络驱动asm2C
在驱网注册有一段时间了,在这里吸收了很多营养,下载了很多有价值的文档,发现这真是个技术交流的
好地方,对这这里热心回答问题各位朋友说声“谢谢!”。言规正传。我描述一下如何看一个网络驱动, 一切皆是评自己微薄的经验拼凑出来,错误难免,希望大牛不要见笑,多提宝贵意见。 【工具】 静态调试 IDA 5.0 DDK,主要时NTDDK.h 把准备看的驱动程序文件用IDA反编译了,都是Windows PE文件默认选项即可。下面开始看这个驱动程序 。 1 首先找DriverEntry 一般DriverEntry都放在INIT段中,所以很容易发现。DriverEntry一定包含大规模函数的进入点。 DriverEntry经常出现几个常用函数,IoRegisterDriverReinitialization,KeInitializeEvent等函数, 应该伴随有ExAllocatePool等函数 保存注册表信息。函数第一个输入的变量就是DriverObject,函数进入点初始化时用到这个变量。 【DriverObject+0x18 是 DriverExtension】 【DriverObject+0x38 是 MajorFunction】 不用我说对应一下NTDDK.H中的DRIVER_OBJECT和DRIVER_EXTENSION你也能找出来,但是这两个最常用。因 为DriverEntry例程中DriverExtension必须用它来找到AddDevice的进入点 由此 【DriverExtension + 4 是 AddDevice】。 用MajorFunction赋值派遣程序的进入点。正是下面要说的 【DeviceObject+0x28 是 DeviceExtension】 2 大规模函数赋值 这些赋值非常显眼。几乎是判别DriverEntry的最显著标志!而且有规律可寻。 几个IRP的功能代码是必定要出现的: 【DriverObject + 0x38 是 IRP_MJ_CREATE】 【DriverObject + 0x40 是 IRP_MJ_CLOSE】 【DriverObject + 0x70 是 IRP_MJ_DEVICE_CONTROL】 【DriverObject + 0x74 是 IRP_MJ_INTERNAL_DEVICE_CONTROL】 【DriverObject + 0x80 是 IRP_MJ_CLEANUP】 【DriverObject + 0xA4 是 IRP_MJ_PNP】 【DriverObject + 0x90 是 IRP_MJ_POWER】 【DriverObject + 0x94 是 IRP_MJ_SYSTEM_CONTROL】 一般情况这几个功能代码都是必须提供的。 【DriverObject + 0x44 是 IRP_MJ_READ】 【DriverObject + 0x48 是 IRP_MJ_WRITE】 二者必具其一。 3 关于AddDevice 毫无疑问最显著标志就是IoCreateDevice了,不过它可能嵌套在其他被AddDevice调用的函数里面了。 这个函数之后就是 IoAttackDeviceToDeviceStack。和IoRegisterDeviceInterface了。 IoCreateSymbolicLink。 一般来说找到DeviceExtension这个结构后,在这个函数中要初始化很多信息,应该把的结构弄清楚。 【DeviceObject + 0x1C 是 Flags 】 4 关于IRP_MJ_CLEANUP 一定调用IofCompleteRequest 【Irp + 0x1C 是 Status.Information】 【Irp + 0x18 是 Status.Status】 【Irp + 0x60 是 IoGetCurrentIrpStackLocation】 基本上这些函数弄清楚了,一个网络驱动轮廓就出现在你面前了。后面的问题就是你对照看每个具体的代 码了 下面是数据包结构,前面的数字是首地址的偏移 typedef struct _NDIS_PACKET { typedef struct _NDIS_PACKET_PRIVATE { 0 UINT PhysicalCount; // number of physical pages in packet. 4 UINT TotalLength; // Total amount of data in the packet. typedef struct _MDL { 0 struct _MDL *Next; 4 CSHORT Size; 6 CSHORT MdlFlags; 8 struct _EPROCESS *Process; C PVOID MappedSystemVa; 10 PVOID StartVa; 14 ULONG ByteCount; 18 ULONG ByteOffset; 8 } Head;* typedef struct _MDL { struct _MDL *Next; CSHORT Size; CSHORT MdlFlags; struct _EPROCESS *Process; PVOID MappedSystemVa; PVOID StartVa; ULONG ByteCount; ULONG ByteOffset; C } Tail;* 10 PNDIS_PACKET_POOL Pool; // so we know where to free it back to 14 UINT Count; 18 ULONG Flags; * 1C BOOLEAN ValidCounts; 1D UCHAR NdisPacketFlags; // See fPACKET_xxx bits below 1E USHORT NdisPacketOobOffset; } Private; 20 union { struct // For Connection-less miniports { UCHAR MiniportReserved[2*sizeof(PVOID)]; UCHAR WrapperReserved[2*sizeof(PVOID)]; }; struct { UCHAR MiniportReservedEx[3*sizeof(PVOID)]; UCHAR WrapperReservedEx[sizeof(PVOID)]; }; struct { UCHAR MacReserved[4*sizeof(PVOID)]; }; }; 30 ULONG_PTR Reserved[2]; 38 UCHAR ProtocolReserved[1]; 40 (PACKET+NdisPacketOobOffset) } NDIS_PACKET, *PNDIS_PACKET, **PPNDIS_PACKET; typedef struct _NDIS_PACKET_OOB_DATA { union { ULONGLONG TimeToSend; ULONGLONG TimeSent; }; ULONGLONG TimeReceived; UINT HeaderSize; 14 UINT SizeMediaSpecificInfo; 18 PVOID MediaSpecificInformation; NDIS_STATUS Status; } NDIS_PACKET_OOB_DATA, *PNDIS_PACKET_OOB_DATA; |
|
最新喜欢:Leopar... |
沙发#
发布于:2007-10-26 16:06
估计楼主不会按T
|
|
板凳#
发布于:2007-12-26 20:46
楼上的...按T有什么?
|
|
|
驱动小牛
|
地板#
发布于:2008-07-21 13:17
我也不会按T,好像是数据结构吗?
|
地下室#
发布于:2008-07-22 08:51
不错 .
|
|
|