readilen
驱动牛犊
驱动牛犊
  • 注册日期2007-03-16
  • 最后登录2012-12-18
  • 粉丝0
  • 关注0
  • 积分637分
  • 威望78点
  • 贡献值0点
  • 好评度63点
  • 原创分0分
  • 专家分0分
阅读:3084回复:4

帮你快速看网络驱动asm2C

楼主#
更多 发布于:2007-09-07 14:56
在驱网注册有一段时间了,在这里吸收了很多营养,下载了很多有价值的文档,发现这真是个技术交流的

好地方,对这这里热心回答问题各位朋友说声“谢谢!”。言规正传。我描述一下如何看一个网络驱动,

一切皆是评自己微薄的经验拼凑出来,错误难免,希望大牛不要见笑,多提宝贵意见。

【工具】
静态调试 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;

最新喜欢:

LeopardLeopar...
游客

返回顶部