ywledoc 发表于 2011-7-5 16:46:37

NdisRegisterProtocol---code

本帖最后由 ywledoc 于 2011-7-5 16:49 编辑

突然发现自己潜水+灌水好久了~土木男真是悲剧~配筋算啊算,桥梁受力算啊算~考了一个星期,算了三个星期~
NdisRegisterProtocol的内部代码。以前放过一份别人逆的,后来自己动手发现不准确,略加修改。
代码如下:#include <ndis.h>
#include <windef.h>
#include <wdm.h>
#include "global.h"
#include "regprotocol.h"

LONG KeInsertQueue(
        PVOID Queue,
        PLIST_ENTRY Entry
);

typedef struct{
        PVOID                        OpenQueue;      //: Ptr32 _NDIS_OPEN_BLOCK 0X00
        REFERENCE                Ref;            //: _REFERENCE 0X04
        PKEVENT                        DeregEvent;       //: Ptr32 _KEVENT 0X0C
        PNDIS_PROTOCOL_BLOCK        NextProtocol;   //: Ptr32 _NDIS_PROTOCOL_BLOCK 0X10
        NDIS50_PROTOCOL_CHARACTERISTICS        ProtocolCharacteristics; //: _NDIS50_PROTOCOL_CHARACTERISTICS 0X14
        WORK_QUEUE_ITEM                WorkItem;         //: _WORK_QUEUE_ITEM 0X80
        KMUTANT                        Mutex;            //: _KMUTANT 0X90
        ULONG                        MutexOwner;       //: Uint4B 0XB0
        PUNICODE_STRING                BindDeviceName;   //: Ptr32 _UNICODE_STRING 0XB4
        PUNICODE_STRING                RootDeviceName;   //: Ptr32 _UNICODE_STRING 0XB8
        PUNICODE_STRING                AssociatedMiniDriver; //: Ptr32 _NDIS_M_DRIVER_BLOCK 0XBC
        PVOID                        BindingAdapter;   //: Ptr32 _NDIS_MINIPORT_BLOCK 0XC0
//        USHORT                        NameBuff; //0XC4
} MY_NDIS_PROTOCOL_BLOCK, *PMY_NDIS_PROTOCOL_BLOCK;


VOID
fake_NdisRegisterProtocol(
      OUT PNDIS_HANDLE NdisProtocolHandle,
      IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteris,
      IN UINT CharacteristicsLength
      )
{
        KIRQL                        OldIrql;
        PMY_NDIS_PROTOCOL_BLOCK        p_protocol;
        ULONG                        size;
       
       
        //加一引用计数
        MmLockPagableSectionByHandle((PVOID)(g_pkg+0x2c));
        MmLockPagableSectionByHandle((PVOID)(g_pkg+0xc));
       
        //主体功能代码
        size = 0x6c;
        p_protocol = (PMY_NDIS_PROTOCOL_BLOCK)ExAllocatePoolWithTag(NonPagedPool,
                                                ProtocolCharacteris->Name.Length + 0xC6,
                                                'bpDN');
        RtlZeroMemory(&p_protocol->ProtocolCharacteristics,
                        ProtocolCharacteris->Name.Length + size);       
        RtlCopyMemory(&(p_protocol->ProtocolCharacteristics),
                        ProtocolCharacteris,
                        size);
       
        //Upcase协议名
        p_protocol->ProtocolCharacteristics.Name.Buffer = (PVOID)((ULONG)p_protocol+0xc4);
        RtlUpcaseUnicodeString(&p_protocol->ProtocolCharacteristics.Name,
                                        &ProtocolCharacteris->Name,
                                        FALSE);
       
        /*
        *开始设置p_protocol结构中的内容
        */
        p_protocol->OpenQueue = NULL;
       
        //ndisInitializeRef的实现
        p_protocol->Ref.Closing = 0;
        p_protocol->Ref.ReferenceCount = 1;
        KeInitializeSpinLock(&p_protocol->Ref.SpinLock);
       
        //
        KeInitializeMutex(&p_protocol->Mutex, 0xFFFF);
       
       
        //继续设置,接入WorkQueue链表中
        p_protocol->WorkItem.WorkerRoutine = g_ndisCheckProtocolBindings;
        p_protocol->WorkItem.Parameter = p_protocol;
        p_protocol->WorkItem.List.Flink = NULL;
        KeInsertQueue(g_ndisWorkerQueue, &(p_protocol->WorkItem));
       
        //插入protocol链表中

        KeAcquireSpinLock(g_ndisProtocolListLock, &OldIrql);
       
        p_protocol->NextProtocol = *(ULONG*)g_ndisProtocolList;
        *(ULONG*)g_ndisProtocolList = p_protocol;
                  
        KeReleaseSpinLock(g_ndisProtocolListLock, OldIrql);
        ObReferenceObject(g_ndisDriverObject);
        //ndisReferenceRef的实现
        KeAcquireSpinLock(p_protocol->Ref.SpinLock, &OldIrql);
        if (p_protocol->Ref.Closing != 0) {
                //NOTHING
        } else {
                p_protocol->Ref.ReferenceCount++;
                if ( p_protocol->Ref.ReferenceCount == 0 ) {
                        p_protocol->Ref.ReferenceCount = p_protocol->Ref.ReferenceCount || 0xffff;
                }
        }
        KeReleaseSpinLock(p_protocol->Ref.SpinLock, OldIrql);
        //实现完毕
       
        //返回句柄
        NdisProtocolHandle = p_protocol;
       
        //对引用计数减一
        MmUnlockPagableImageSection((PVOID)(g_pkg+0x2c));
       
        return;
}XPSP3下的逆向代码。

马大哈 发表于 2011-7-5 22:27:21

土木系的啊?汗.

造桥造房子.........编程还这么牛,哈哈.

专门编程系的估计又是别的技术牛了{:soso_e113:}

ywledoc 发表于 2011-7-6 01:05:20

本帖最后由 ywledoc 于 2011-7-6 01:05 编辑

马大哈 发表于 2011-7-5 22:27 static/image/common/back.gif
土木系的啊?汗.

造桥造房子.........编程还这么牛,哈哈.


土木极矬~~~
如果我是计算机系的,估计。。。计算机极矬~

马大哈 发表于 2011-7-6 01:32:58

{:soso__11495643595581228373_1:}.........我是学电算化会计专业的.....

ywledoc 发表于 2011-7-6 01:45:15

马大哈 发表于 2011-7-6 01:32 static/image/common/back.gif
.........我是学电算化会计专业的.....

会计美女多!!!

Tesla.Angela 发表于 2011-7-6 08:29:41

网络的东西不懂啊,要恶补。。。
下学期有计算机网络的课程。。。
另外这么多非计算机系的都学编程了,强烈感觉你们怎么都跟学编程的抢饭碗!!!

ywledoc 发表于 2011-7-6 12:11:54

Tesla.Angela 发表于 2011-7-6 08:29 static/image/common/back.gif
网络的东西不懂啊,要恶补。。。
下学期有计算机网络的课程。。。
另外这么多非计算机系的都学编程了,强 ...

其实吧,感觉,计算机系的,没几个想干计算机的。。。。

ywledoc 发表于 2011-7-7 11:22:30

naylon 发表于 2011-7-6 23:54 static/image/common/back.gif
不是说不学计算机系很多计算机相关的职业不能干么?

的确好多招人都有这个限制-_-

马大哈 发表于 2011-7-14 16:37:48

所以好多公司要求学历,在中国那是傻的........除非那学历是硕士及以上.

Tesla.Angela 发表于 2011-7-14 17:10:07

naylon 发表于 2011-7-6 23:54 static/image/common/back.gif
不是说不学计算机系很多计算机相关的职业不能干么?

这就要看招聘者的眼光了。

ywledoc 发表于 2011-7-14 20:57:56

马大哈 发表于 2011-7-14 16:37 static/image/common/back.gif
所以好多公司要求学历,在中国那是傻的........除非那学历是硕士及以上.

这话说的,让我有点想考硕士。

乔丹二世 发表于 2011-7-14 21:23:15

有什么用的?

ywledoc 发表于 2011-7-14 23:01:48

乔丹二世 发表于 2011-7-14 21:23 static/image/common/back.gif
有什么用的?

看到二世的回复,我为什么觉得有点虚啊。
用处不大。逆出来看看内部操作的。

ywledoc 发表于 2011-7-14 23:02:21

Tesla.Angela 发表于 2011-7-14 17:10 static/image/common/back.gif
这就要看招聘者的眼光了。

除非能力非常出众,不然首要考虑学位。
页: [1]
查看完整版本: NdisRegisterProtocol---code