readilen
驱动牛犊
驱动牛犊
  • 注册日期2007-03-16
  • 最后登录2012-12-18
  • 粉丝0
  • 关注0
  • 积分637分
  • 威望78点
  • 贡献值0点
  • 好评度63点
  • 原创分0分
  • 专家分0分
阅读:3143回复: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...
majiajue
驱动牛犊
驱动牛犊
  • 注册日期2007-10-25
  • 最后登录2008-06-28
  • 粉丝0
  • 关注0
  • 积分200分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-10-26 16:06
估计楼主不会按T
equationdz
驱动牛犊
驱动牛犊
  • 注册日期2007-09-18
  • 最后登录2010-02-04
  • 粉丝0
  • 关注0
  • 积分163分
  • 威望37点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-12-26 20:46
楼上的...按T有什么?
学习逆向工程ing。。。
zhoujiamurong
驱动小牛
驱动小牛
  • 注册日期2006-03-20
  • 最后登录2009-05-06
  • 粉丝4
  • 关注0
  • 积分1081分
  • 威望360点
  • 贡献值0点
  • 好评度215点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-07-21 13:17
我也不会按T,好像是数据结构吗?
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2008-07-22 08:51
不错 .
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部