驱动程序开发网技术社区 » 黑客反汇编之 asm2c » 帮你快速看网络驱动asm2C (转到动态网页)
本页主题: 帮你快速看网络驱动asm2C 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

readilen
靠着大树成长
级别: 驱动牛犊


精华: 0
发帖: 65
威望: 66 点
积分: 633 分
贡献值: 0 点
好评度: 63 点
原创分: 0 分
注册时间:2007-03-16
最后登录:2008-08-01

 帮你快速看网络驱动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;
顶端 Posted: 2007-09-07 14:56 | Unknown [楼 主]
majiajue
级别: 驱动牛犊


精华: 0
发帖: 21
威望: 22 点
积分: 200 分
贡献值: 0 点
好评度: 21 点
原创分: 0 分
注册时间:2007-10-25
最后登录:1970-01-01

 

估计楼主不会按T
顶端 Posted: 2007-10-26 16:06 | 北京市网通ADSL 1 楼
equationdz
特殊贡献奖
级别: 驱动牛犊


精华: 0
发帖: 23
威望: 24 点
积分: 158 分
贡献值: 0 点
好评度: 15 点
原创分: 0 分
注册时间:2007-09-18
最后登录:1970-01-01

 

楼上的...按T有什么?
顶端 Posted: 2007-12-26 20:46 | 湖南省 2 楼
zhoujiamurong
熟读唐诗三百首,不会__诗也会__
级别: 驱动小牛


精华: 0
发帖: 264
威望: 265 点
积分: 1055 分
贡献值: 0 点
好评度: 215 点
原创分: 0 分
注册时间:2006-03-20
最后登录:1970-01-01

 

我也不会按T,好像是数据结构吗?
顶端 Posted: 2008-07-21 13:17 | 上海市 3 楼
wowocock
特殊贡献奖
级别: 驱动老牛


精华: 0
发帖: 4885
威望: 1298 点
积分: 472 分
贡献值: 1 点
好评度: 1227 点
原创分: 1 分
注册时间:2002-04-08
最后登录:1970-01-01

 

不错 .
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
顶端 Posted: 2008-07-22 08:51 | Unknown 4 楼
驱动程序开发网技术社区 » 黑客反汇编之 asm2c
快速发帖 顶端
内容
HTML 代码不可用

使用签名
Wind Code自动转换

字数检查 恢复数据
按 Ctrl+Enter 直接提交
表情 [更多]

Powered by PHPWind v6.3.2 Code © 2003-08 PHPWind
This is html template view this page faster