青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 298  文章 - 377  trackbacks - 0
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用鏈接

留言簿(34)

隨筆分類

隨筆檔案

文章檔案

相冊(cè)

收藏夾

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

作者:成松林

QQ:179641795

轉(zhuǎn)貼請(qǐng)不要改變作者信息!

為了簡(jiǎn)單、速度代碼在以前研究驅(qū)動(dòng)基礎(chǔ)上改寫(xiě)。

驅(qū)動(dòng)層源代碼:

;goto make
.586p
.model flat,stdcall
option casemap:none

includelib D:\masm32\LIB\w2k\ntoskrnl.lib
includelib D:\masm32\LIB\w2k\hal.lib
includelib D:\masm32\LIB\w2k\ndis.lib
;***************************************************************
;沒(méi)有INC文件,要使用的NDIS函數(shù)定義
NdisChainBufferAtFront        proto :DWORD,:DWORD
CopyPktTOLocBuf               proto :DWORD,:DWORD
NdisAllocatePacketPool        PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD
NdisAllocateBuffer            PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
NdisAllocatePacket            PROTO STDCALL :DWORD,:DWORD,:DWORD
NdisSend                      PROTO STDCALL :DWORD,:DWORD,:DWORD
MySendPacket                  proto :dword,:dword,:dword
NdisQueryBufferSafe           proto :dword,:dword,:dword,:dword
NdisInitializeEvent           proto :dword
NdisSetEvent                  proto :dword
NdisResetEvent                proto :dword
NdisFreePacketPool            proto :dword
NdisFreePacket                proto :dword
NdisFreeBuffer                proto :dword
NdisWaitEvent                 proto :dword,:dword
NdisRegisterProtocol          proto :dword,:dword,:dword,:dword
NdisDeregisterProtocol        proto :dword,:dword
IoCreateDevice                proto :dword,:dword,:dword,:dword,:dword,:dword,:dword
IoDeleteDevice                proto :dword
IoCreateSymbolicLink          proto :dword,:dword
IoDeleteSymbolicLink          proto :dword
IoCompleteRequest             proto :dword,:dword
IoCreateNotificationEvent     proto :dword,:dword
RtlCompareUnicodeString       proto :dword,:dword,:dword
ZwClose                       proto :dword
;***************************************************************
;公共數(shù)據(jù)定義區(qū)
.data
lpProtocolHandle     dd 0                 ;協(xié)議句柄的指針
lpDeviceObject       dd 0                 ;設(shè)備對(duì)象的指針
;*********************************
lpOldSend            dd 0                 ;保存TCPIP協(xié)議驅(qū)動(dòng)的OPEN_BLOCK里的SendHandler派發(fā)函數(shù)地址
lpOldRecv            dd 0                 ;保存TCPIP協(xié)議驅(qū)動(dòng)的OPEN_BLOCK里的ReceiveHandler派發(fā)函數(shù)地址
lpOldRecvP           dd 0                 ;保存TCPIP協(xié)議驅(qū)動(dòng)的OPEN_BLOCK里的ReceivePacketHandler派發(fā)函數(shù)地址
lpOldSendComplete    dd 0                 ;保存TCPIP協(xié)議驅(qū)動(dòng)的OPEN_BLOCK里的SendCompleteHandler派發(fā)函數(shù)地址
;*******************************
lpSend3Event         dd 0                 ;RING3發(fā)送事件在本驅(qū)動(dòng)的指針
hSend3Event          dd 0                 ;RING3發(fā)送事件在本驅(qū)動(dòng)的句柄
lpRecv3Event         dd 0                 ;RING3接收事件在本驅(qū)動(dòng)的指針
hRecv3Event          dd 0                 ;RING3接收事件在本驅(qū)動(dòng)的句柄
dwStatus             dd 0
dwTempVar            dd 0
obSendEvent          db 16   dup(0)       ;RING0 SEND對(duì)象
obRecvEvent          db 16   dup(0)       ;RING0 RECV對(duì)象
stProtocolChar       db 70h  dup(0)       ;NdisRegisterProtocol()要使用的NDIS_PROTOCOL_CHARACTERISTIC結(jié)構(gòu)
szSendBuffer         db 800h dup(0)       ;系統(tǒng)將要發(fā)送的數(shù)據(jù)包的副本
szRecvBuffer         db 800h dup(0)       ;系統(tǒng)將要接收的數(shù)據(jù)包的副本
szTempBuffer         db 800h dup(0)      
szMyPacketBuffer     db 800h dup(0)
szMyPacketLen        dd 0
dwSendSize           dd 0                 ;發(fā)送副本大小
dwRecvSize           dd 0                 ;接收副本大小
GateWay              db 10 dup (0)        ;網(wǎng)關(guān)IP和MAC

;常量定義區(qū)
.const
stTcpip dw 5*2,6*2
dd offset szTcpip
szTcpip dw 'T','c','p','i','p',0
stDeviceName dw 15*2,16*2
dd offset szDeviceName
szDeviceName dw '\','D','e','v','i','c','e','\','N','d','i','s','D','r','v',0
stSymbolicLinkName dw 19*2,20*2
dd offset szSymbolicLinkName
szSymbolicLinkName dw '\','D','o','s','D','e','v','i','c','e','s','\','N','D','I','S','D','R','V',0
stSend3Event dw 28*2,29*2
dd offset szSend3Event
szSend3Event dw '\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s','\','S','e','n','d','3','E','v','e','n','t',0
stRecv3Event dw 28*2,29*2
dd offset szRecv3Event
szRecv3Event dw '\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s','\','R','e','c','v','3','E','v','e','n','t',0
;**************************************************************************************
;*************************************************************************************
;驅(qū)動(dòng)主程序代碼從這里開(kāi)始
.code
start proc DriverObject,RegisterPath               ;安裝驅(qū)動(dòng)上層傳下來(lái)兩個(gè)參數(shù)
 pushad                                     ;保存堆棧
; 這里開(kāi)始是關(guān)于協(xié)議操作的代碼
 ;注冊(cè)假協(xié)議返回lpProtocolHandle指向的NDIS_PROTOCOL_BLOCK鏈表首地址
 ;NDIS_PROTOCOL_BLOCK(協(xié)議表)是NDIS維護(hù)所有系統(tǒng)中已注冊(cè)協(xié)議的單向鏈接表
 mov dword ptr stProtocolChar,5
 mov dword ptr stProtocolChar+3ch,offset PtBindAdapter
 mov dword ptr stProtocolChar+40h,offset PtUnbindAdapter
 ;以上是填充NDIS_PROTOCOL_CHARACTERISTIC結(jié)構(gòu)
 invoke NdisRegisterProtocol,offset dwStatus,offset lpProtocolHandle,offset stProtocolChar,6ch
 cmp  dwStatus,0
 jnz  _exit                                 ;注冊(cè)假協(xié)議失敗退出驅(qū)動(dòng)
 ;********************************
 mov ebx,lpProtocolHandle
 mov ebx,[ebx+10h]                          ;去掉我們注冊(cè)的假協(xié)議.
 ;我們注冊(cè)的假協(xié)議已經(jīng)沒(méi)有用了,注銷掉.
 invoke NdisDeregisterProtocol,offset dwStatus,lpProtocolHandle
 mov lpProtocolHandle,ebx                   ;保存真正的系統(tǒng)協(xié)議鏈表的首地址
 ;這個(gè)循環(huán)是在系統(tǒng)協(xié)議鏈表搜索TCPIP協(xié)議的PROTOCOL_HANDLE,ebx->NDIS_PROTOCOL_BLOCK鏈表首
 mov esi,offset stTcpip                     ;esi->Unicode格式(NTDDK中IFSDDK.INC)定義的協(xié)議名
 .repeat
     lea edi,[ebx+44h]                          ;當(dāng)前協(xié)議名(Unicode格式)
     invoke RtlCompareUnicodeString,edi,esi,1   ;進(jìn)行與我們查找的進(jìn)行比較
     .break .if eax==0                          ;查找到退出循環(huán)
     mov ebx,[ebx+10h]                          ;ebx->下一個(gè)協(xié)議
 .until ebx==0                                  ;查找到表尾
 cmp  eax,0
 jnz _exit                                      ;協(xié)議沒(méi)找到退出驅(qū)動(dòng)
 ;************************************************************************************
 ;正常的協(xié)議工作流程:1、調(diào)用NdisRegisterProtocol注冊(cè)協(xié)議,2、下層協(xié)議(或系統(tǒng)管理層協(xié)議)
 ;會(huì)調(diào)用協(xié)議鏈表里的所有協(xié)議的BindAdapterHandler派發(fā)函數(shù),這是注冊(cè)協(xié)議的回調(diào)過(guò)程.
 ;3、BindAdapterHandler派發(fā)函數(shù)里會(huì)調(diào)用NdisOpenAdapter來(lái)綁定自己到合適網(wǎng)絡(luò)設(shè)備.
 ;4、最后NdisOpenAdapter函數(shù)返回BindingHandle,BindingHandle指向NDIS_OPEN_BLOCK鏈表.
 ;勾掛NDIS_OPEN_BLOCK鏈表:1、接收數(shù)據(jù)ReceiveHandle、ReceivePacketHandler函數(shù)
 ;2、發(fā)送數(shù)據(jù)SendHandler、SendPacketsHandler函數(shù).
 mov ebx,[ebx]                              ;ebx->tcpip的NDIS_OPEN_BLOCK鏈表系統(tǒng)不同版本不同
 mov lpProtocolHandle,ebx                   ;保存TCPIP協(xié)議的OPEN_BLOCK(BINDING_HANDLE)
 mov eax,[ebx+30h]
 mov lpOldSend,eax                          ;保存TCPIP協(xié)議驅(qū)動(dòng)的OPEN_BLOCK里的SendHandler派發(fā)函數(shù)地址
 mov eax,[ebx+40h]
 mov lpOldRecv,eax                          ;保存TCPIP協(xié)議驅(qū)動(dòng)的OPEN_BLOCK里的ReceiveHandler派發(fā)函數(shù)地址
 mov eax,[ebx+50h]
 mov lpOldRecvP,eax                         ;保存TCPIP協(xié)議驅(qū)動(dòng)的OPEN_BLOCK里的ReceivePacketHandler派發(fā)函數(shù)地址
 mov eax,[ebx+38h]
 mov lpOldSendComplete,eax                  ;保存TCPIP協(xié)議驅(qū)動(dòng)的OPEN_BLOCK里的SendCompleteHandler派發(fā)函數(shù)地址
; 協(xié)議操作代碼在這里結(jié)束HOOK函數(shù)代碼在后面.
 ;*************************************************************************************
 ;*******************************************************************************************************************
; 這里開(kāi)始是建立一個(gè)可以讓?xiě)?yīng)用程序(ring3)訪問(wèn)的驅(qū)動(dòng).以事件方式建立,數(shù)據(jù)傳送方式為DIRECT_IO.
 ;建立設(shè)備以備應(yīng)用程序訪問(wèn),DeviceExtension size=18h, type= device_transfer
 invoke IoCreateDevice,DriverObject,18h,offset stDeviceName,21h,0,0,offset lpDeviceObject
 invoke IoCreateSymbolicLink,offset stSymbolicLinkName,offset stDeviceName
 mov eax,lpDeviceObject
 or dword ptr [eax+1ch],10h                 ;把device.flag設(shè)置為DO_DIRECT_IO,使驅(qū)動(dòng)程序的READ、WRITE例程直接映射用戶緩沖區(qū)到本驅(qū)動(dòng)
 mov edi,DriverObject
 add edi,38h
 mov ecx,1ch
 mov eax,offset _CommonIoControl
 rep stosd                                  ;填充共用例程,必須,否則CreateFile()不能打開(kāi)本驅(qū)動(dòng)
 ;***********************
 mov eax,DriverObject
 mov dword ptr [eax+34h],offset _Unload
 mov dword ptr [eax+44h],offset _Read
 mov dword ptr [eax+48h],offset _Write      ;注冊(cè)驅(qū)動(dòng)例程
 mov byte ptr [eax+8],2                     ;強(qiáng)行修改Driver.flag為legacy driver,否則DriverEntry返回時(shí)系統(tǒng)就會(huì)卸載本驅(qū)動(dòng)(因?yàn)楸掘?qū)動(dòng)默認(rèn)編譯為WDM drvier)
 ;建立RING0事件
 invoke NdisInitializeEvent,offset obSendEvent
 invoke NdisInitializeEvent,offset obRecvEvent
 invoke NdisResetEvent,offset obSendEvent
 invoke NdisResetEvent,offset obRecvEvent
 ;建立RING3事件,在RING3用OpenEvent()打開(kāi)
 invoke IoCreateNotificationEvent,offset stSend3Event,offset hSend3Event
 mov lpSend3Event,eax
 invoke NdisResetEvent,eax
 invoke IoCreateNotificationEvent,offset stRecv3Event,offset hRecv3Event
 mov lpRecv3Event,eax
 invoke NdisResetEvent,eax
; 建立可讓?xiě)?yīng)用程序訪問(wèn)的驅(qū)動(dòng)代碼在這里結(jié)束.
 ;***************************************************************************************
 ;***************************************************************************************
; 這里是設(shè)置HOOK TCPIP協(xié)議的函數(shù)
 mov ebx,lpProtocolHandle                               ;ebx->NDIS_OPEN_BLOCK
 mov dword ptr [ebx+30h],offset _mySend                 ;HOOK TCPIP協(xié)議的Send
 mov dword ptr [ebx+40h],offset _myRecv                 ;HOOK TCPIP協(xié)議的Recv
 mov dword ptr [ebx+50h],offset _myRecvP                ;HOOK TCPIP協(xié)議的RecvPacket
 mov dword ptr [ebx+38h],offset _mySendComplete         ;HOOK TCPIP協(xié)議的SendComplete
 ;*****************************************************************************************
_exit:
 popad
 xor eax,eax
 ret
start endp
;驅(qū)動(dòng)主程序在這里結(jié)束..
;****************************************************************************************
;*****************************************************************************************
;這里開(kāi)始是驅(qū)動(dòng)程序的分派函數(shù)
;卸載驅(qū)動(dòng)程序函數(shù)
_Unload proc DriverObject
 mov edx,lpProtocolHandle
 mov eax,lpOldSend
 mov [edx+30h],eax
 mov eax,lpOldRecv
 mov [edx+40h],eax
 mov eax,lpOldRecvP
 mov [edx+50h],eax
 mov eax,lpOldSendComplete
 mov [edx+38h],eax
 ;恢復(fù)TCPIP協(xié)議的OPEN_BLOCK里原來(lái)的派發(fā)例程
 invoke ZwClose,hSend3Event
 invoke ZwClose,hRecv3Event
 invoke NdisSetEvent,offset obSendEvent
 invoke NdisSetEvent,offset obRecvEvent
 invoke IoDeleteSymbolicLink,offset stSymbolicLinkName
 invoke IoDeleteDevice,lpDeviceObject
 xor eax,eax
 ret
_Unload endp
;******************************************************************************************
;***************************************************************************************
;驅(qū)動(dòng)程序公共控制函數(shù)
_CommonIoControl proc DeviceObject,pIrp
 mov eax,pIrp
 mov dword ptr [eax+18h],0
 mov dword ptr [eax+1ch],0
 invoke IoCompleteRequest,pIrp,0
 xor eax,eax
 ret
_CommonIoControl endp
;***************************************************************************************
;***************************************************************************************
;驅(qū)動(dòng)程序傳給應(yīng)用程序數(shù)據(jù)函數(shù).應(yīng)用程序用ReadFile()調(diào)用
_Read proc DeviceObject,pIrp
 pushad
 mov ebx,pIrp
 mov edi,[ebx+4]
 mov ecx,[edi+18h]
 mov edi,[edi+10h]
 add edi,ecx                            ;EDI=用戶緩沖區(qū)
 mov ecx,lpSend3Event
 mov edx,lpRecv3Event
 .if dword ptr [ecx+4]
     invoke NdisResetEvent,lpSend3Event ;RING3事件復(fù)位,防止再次放行
     mov esi,offset szSendBuffer
     mov ecx,dwSendSize
     mov eax,[ebx+60h]
     .if ecx>[eax+4]
         mov ecx,[eax+4]
     .endif
 .else
     invoke NdisResetEvent,lpRecv3Event
         mov esi,offset szRecvBuffer
     mov ecx,dwRecvSize
            mov eax,[ebx+60h] 
            .if ecx>[eax+4]
                mov ecx,[eax+4]
     .endif
       .endif

 mov dword ptr [ebx+18h],0
 mov dword ptr [ebx+1ch],ecx           ;設(shè)置ReadFile()的讀取字節(jié)數(shù)
 rep movsb                             ;把數(shù)據(jù)包復(fù)制到ReadFile()提供的緩沖區(qū)

 invoke IoCompleteRequest,pIrp,0
 popad
 xor eax,eax
 ret
_Read endp
;***************************************************************************************
;***************************************************************************************
;***************************************************************************************
;應(yīng)用程序傳給驅(qū)動(dòng)程序數(shù)據(jù)函數(shù).應(yīng)用程序用WriteFile()調(diào)用
_Write proc DeviceObject,pIrp
 mov eax,pIrp
 mov dword ptr [eax+18h],0
 mov dword ptr [eax+1ch],0

 mov edx,[eax+4]
 mov ecx,[eax+60h]
 mov ecx,[ecx+4]                        ;ECX=數(shù)據(jù)長(zhǎng)度
 mov eax,[edx+18h]
 mov edx,[edx+10h]
 add edx,eax                            ;EDX=用戶緩沖區(qū)

 mov szMyPacketLen,ecx                  ;我們自己構(gòu)造的包長(zhǎng)度
 mov edi,offset szMyPacketBuffer
 mov esi,edx
 rep movsb                              ;拷貝包到本驅(qū)動(dòng)
 ;發(fā)送應(yīng)用程序傳下來(lái)的數(shù)據(jù)包
 invoke MySendPacket,lpProtocolHandle,addr szMyPacketBuffer,szMyPacketLen

 invoke IoCompleteRequest,pIrp,0
 xor eax,eax
 ret
_Write endp
;驅(qū)動(dòng)程序的分派函數(shù)在這里結(jié)束
;***************************************************************************************
;***************************************************************************************
;這里開(kāi)始是我們HOOK協(xié)議的及相關(guān)要用的函數(shù)
;將發(fā)送和接收的包拷到本地緩沖區(qū)
CopyPktTOLocBuf proc uses ebx ecx edi esi _lpPacket:dword,_lpBuffer:dword
local PacketVa:dword
local PacketSize:dword
 mov ebx,_lpPacket
 mov ebx,[ebx+8]
 ;循環(huán)復(fù)制協(xié)議數(shù)據(jù)包到指定緩沖區(qū)里
 mov edi,_lpBuffer
 .repeat
     invoke NdisQueryBufferSafe,ebx,addr PacketVa,addr PacketSize,20h
     mov esi,PacketVa
     mov ecx,PacketSize
     rep movsb
     mov ebx,[ebx]
 .until ebx==0
 sub edi,_lpBuffer
 mov eax,edi
        ret
CopyPktTOLocBuf endp
;這是我們HOOK tcpip協(xié)議的發(fā)送函數(shù)
_mySend proc _lpAdapt,_lpPacket
local PacketVa:dword
local PacketSize:dword
 pushad
        invoke CopyPktTOLocBuf,_lpPacket,addr szRecvBuffer
 mov dwSendSize,eax

 invoke NdisSetEvent,lpSend3Event ;放行RING3的WaitForSingleObject(),通知RING3用ReadFile來(lái)讀數(shù)據(jù)包內(nèi)容(重要)
 popad
 leave
  jmp lpOldSend                ;轉(zhuǎn)到系統(tǒng)原來(lái)的Send例程執(zhí)行
_mySend endp
;***************************************************************************************
;***************************************************************************************
;這是我們HOOK tcpip協(xié)議的接收函數(shù)
_myRecvP proc _lpAdapt,_lpPacket
local PacketVa:dword
local PacketSize:dword
 pushad
        invoke CopyPktTOLocBuf,_lpPacket,addr szRecvBuffer
 mov dwRecvSize,eax
 invoke NdisSetEvent,lpRecv3Event ;放行RING3的WaitForSingleObject(),通知RING3用ReadFile來(lái)讀數(shù)據(jù)包內(nèi)容(重要)
;*************************************************************************************
;處理ARP包開(kāi)始.只檢測(cè)誰(shuí)在偽裝網(wǎng)關(guān).把偽裝ARP響應(yīng)包改成ARP請(qǐng)求包并填寫(xiě)正確的網(wǎng)關(guān)MAC地址.
        mov ebx,_lpPacket
        mov ebx,[ebx+8]
        invoke NdisQueryBufferSafe,ebx,addr PacketVa,addr PacketSize,20h
        mov edi,PacketVa                             ;由于ARP包小,不用獲取下一個(gè)MDL
        .if word ptr [edi+0ch]==0608h                ;收到的網(wǎng)絡(luò)包是ARP包.
            .if word ptr [edi+14h]==0200h            ;是ARP響應(yīng)包. 
                lea esi,GateWay
                mov eax,[edi+1ch]
                mov ebx,[esi+6] 
                add edi,16h
                mov ecx,10
                .if word ptr [edi+14h]==0AA55h       ;自己的特殊向網(wǎng)關(guān)請(qǐng)求的ARP包標(biāo)志.
                    xchg esi,edi
                    rep movsb                        ;保存正確的網(wǎng)關(guān)IP及MAC
                .elseif ebx==eax                     ;是來(lái)自網(wǎng)關(guān)的響應(yīng)包.
                    mov word ptr [edi-02h],0100h     ;把他改成請(qǐng)求包.
                    rep movsb
                .endif
            .endif
        .endif
;處理ARP包結(jié)束
;*************************************************************************************
 popad
 leave
      jmp lpOldRecvP                ;轉(zhuǎn)到系統(tǒng)原來(lái)的Recv例程執(zhí)行
_myRecvP endp
_myRecv proc _PBC,_MRC,_HeaderBuffer,_HBSize,_LAB,_LABSize,_PacketSize
 pushad
 mov esi,_HeaderBuffer
 mov edi,offset szRecvBuffer
 mov ecx,_PacketSize
 mov dwRecvSize,ecx
 rep movsb
 invoke NdisSetEvent,lpRecv3Event ;放行RING3的WaitForSingleObject(),通知RING3用ReadFile來(lái)讀數(shù)據(jù)包內(nèi)容(重要)
;*************************************************************************************
;處理ARP包開(kāi)始.只檢測(cè)誰(shuí)在偽裝網(wǎng)關(guān).把偽裝ARP響應(yīng)包改成ARP請(qǐng)求包并填寫(xiě)正確的網(wǎng)關(guān)MAC地址.
        mov edi,_HeaderBuffer
        .if word ptr [edi+0ch]==0608h                ;收到的網(wǎng)絡(luò)包是ARP包.
            .if word ptr [edi+14h]==0200h            ;是ARP響應(yīng)包. 
                lea esi,GateWay
                mov eax,[edi+1ch]
                mov ebx,[esi+6] 
                add edi,16h
                mov ecx,10
                .if word ptr [edi+14h]==0AA55h       ;自己的特殊向網(wǎng)關(guān)請(qǐng)求的ARP包標(biāo)志.
                    xchg esi,edi
                    rep movsb                        ;保存正確的網(wǎng)關(guān)IP及MAC
                .elseif ebx==eax                     ;是來(lái)自網(wǎng)關(guān)的響應(yīng)包.
                    mov word ptr [edi-02h],0100h     ;把他改成請(qǐng)求包.
                    rep movsb
                .endif
            .endif
        .endif
;處理ARP包結(jié)束
;*************************************************************************************
 popad
 leave
 jmp lpOldRecv                ;轉(zhuǎn)到系統(tǒng)原來(lái)的Recv例程執(zhí)行
_myRecv endp
;這是我們HOOK tcpip協(xié)議的發(fā)送完成函數(shù)
_mySendComplete proc _PBC,_Packet,_Status
 pushad

 .if szMyPacketLen                ;我們自己的構(gòu)造的包長(zhǎng)度
        invoke CopyPktTOLocBuf,_Packet,addr szTempBuffer
     mov esi,offset szTempBuffer
     mov edi,offset szMyPacketBuffer
     mov ecx,szMyPacketLen
     repz cmpsb                   ;比較包的內(nèi)容
     .if !ecx                     ;是我們的包
         mov szMyPacketLen,0      ;設(shè)置包的長(zhǎng)度
         popad
         leave
         xor eax,eax
         ret                      ;是我們的包直接返回
            .endif
 .endif
 popad                            ;不是我們的包轉(zhuǎn)到系統(tǒng)原來(lái)例程
 leave
 jmp lpOldSendComplete            ;轉(zhuǎn)到系統(tǒng)原來(lái)的SendComplete例程執(zhí)行
_mySendComplete endp
;*********************************************************************************************
;*********************************************************************************************
;MySendPacket:    發(fā)送自已構(gòu)造的數(shù)據(jù)幀(注意:包是直接交給網(wǎng)卡發(fā)送)
;入口:            BindingHandle=NDIS_PROTOCOL_BLOCK->_NDIS_OPEN_BLOCK
;                 MyPacket=數(shù)據(jù)幀緩沖首址,PacketLen=數(shù)據(jù)幀長(zhǎng)度
;出口:            dwStatus=返回狀態(tài)
MySendPacket proc BindingHandle:dword,MyPacket:dword,PacketLen:dword
local PacketPoolHandle:dword
local PacketHandle:dword
local BufferHandle:dword
       invoke   NdisAllocatePacketPool,addr dwStatus,addr PacketPoolHandle,0FFFh,10h
       invoke   NdisAllocateBuffer,addr dwStatus,addr BufferHandle,0,MyPacket,PacketLen
       invoke   NdisAllocatePacket,addr dwStatus,addr PacketHandle,PacketPoolHandle
       invoke   NdisChainBufferAtFront,PacketHandle,BufferHandle
       invoke   NdisSend,Addr dwStatus,BindingHandle,PacketHandle
       .if   eax!=103h                   ;NDIS_STATUS_PENDING=103h
             invoke   NdisFreePacketPool,PacketPoolHandle
             invoke   NdisFreePacket,PacketHandle
             invoke   NdisFreeBuffer,BufferHandle
       .endif
       ret                               ;發(fā)送完成返回dwStatus
MySendPacket endp
;*********************************************************************
;看NTDDK中的Ndis.h中有定義.
NdisChainBufferAtFront proc uses ecx Packet:dword,Buffer:dword
        mov  eax,Buffer
       .while  1
      mov ecx,[eax]
            .break  .if ecx==0
            mov eax,ecx                  ;MDL.Next
       .endw                             ;eax=Tail
        mov  ecx,Packet
       .if dword ptr [ecx+08h]==0        ;Packet->Private.Head
           mov [ecx+0ch],eax             ;Packet->Private.Tail
       .endif
       mov ecx,[ecx+08h]
       mov [eax],ecx                     ;MDL.Next
       mov eax,Packet 
       mov ecx,Buffer
       mov [eax+08h],ecx
       and byte ptr [eax+1ch],0          ;Packet->Private.ValidCounts 
       ret
NdisChainBufferAtFront endp
;***************************************************************************************************
;***************************************************************************************************
;以下空函數(shù)是為了填充NDIS_PROTOCOL_CHARACTERISTIC結(jié)構(gòu)而設(shè)置的,實(shí)際下基本不會(huì)被系統(tǒng)調(diào)用,沒(méi)有又不行。
PtBindAdapter proc Status,BindContext,DeviceName,SystemSpecific1,SystemSpecific2
xor eax,eax
ret
PtBindAdapter endp
PtUnbindAdapter proc Status,pAdapt,UnbindContext
xor eax,eax
ret
PtUnbindAdapter endp
;我們HOOK協(xié)議的及相關(guān)要用的函數(shù)在這里結(jié)束
;******************************************************************************************************
end start
:make
set drv=ndisdrv
d:\masm32\ml /c /coff /Cp  %drv%.bat
d:\masm32\link /subsystem:native /driver:wdm /release /align:16 /base:0x10000 /out:%drv%.sys %drv%.obj
;del %drv%.obj
pause

應(yīng)用層源代碼:

;goto make
.386
.model flat, stdcall
option casemap:none
include d:\masm32\include\windows.inc
include d:\masm32\include\iphlpapi.inc
include d:\masm32\include\ws2_32.inc
include d:\masm32\include\kernel32.inc
include D:\masm32\macros\Strings.mac
include D:\masm32\include\advapi32.inc
include d:\masm32\include\user32.inc
includelib d:\masm32\lib\advapi32.lib
includelib d:\masm32\lib\iphlpapi.lib
includelib d:\masm32\LIB\WS2_32.LIB
includelib d:\masm32\lib\kernel32.lib
includelib d:\masm32\lib\user32.lib

.data
buffer          db 800h dup(0)
filename        db "\\.\NdisDrv",0
sFileName       db "ndisdrv.sys",0
SeviceMe        db "Ndis ARP",0
Send3E          db "Send3Event",0
Recv3E          db "Recv3Event",0
hdrv            dd ?
hEvent          dd ?
dwTempVar       dd 1
hSCManager      dd ?
hService        dd ?
lpMemory        dd ?
dwStructSize    dd ?
acDriverPath    db 260 dup (?)
LocalMac        db 6 dup (?)
szMacLen        dd 6
ArpPacket            db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,000h,090h,027h,099h,012h,0bah,008h,006h,000h,001h
                     db 008h,000h,006h,004h,000h,001h,000h,090h,027h,099h,012h,0bah,0c0h,0a8h,001h,006h
                     db 000h,000h,000h,000h,000h,000h,0c0h,0a8h,001h,001h,055h,0aah,0ffh,0ffh,0ffh,0ffh

MsgCaption      db "ARP防火墻",0
MsgBoxText      db "作者:成松林 QQ:179641795  該版本為調(diào)試版本試用系統(tǒng)win2k/xp",0
.code
MyArpPacket proc
;********************************************************************
invoke  GetAdaptersInfo,NULL,addr dwStructSize
invoke GlobalAlloc,GPTR,dwStructSize
mov lpMemory,eax
invoke  GetAdaptersInfo,lpMemory,addr dwStructSize
mov     esi,lpMemory
lea     edi,ArpPacket
add     esi,1b0h
invoke  inet_addr,esi
mov     [edi+1ch],eax
invoke  SendARP,eax,0,addr LocalMac,addr szMacLen
add     esi,28h
invoke  inet_addr,esi
mov     [edi+26h],eax
lea     esi,LocalMac
add     edi,6
mov     ecx,6
rep     movsb
lea     edi,ArpPacket
lea     esi,LocalMac
add     edi,16h
mov     ecx,6
rep     movsb
ret
MyArpPacket endp

start:
    invoke OpenSCManager, NULL, NULL, SC_MANAGER_CREATE_SERVICE
    .if eax != NULL
        mov hSCManager, eax
        push eax
        invoke GetFullPathName, addr sFileName,sizeof acDriverPath,addr acDriverPath,esp
        pop eax
        invoke CreateService, hSCManager, addr sFileName, addr SeviceMe, \
                SERVICE_START + DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, \
                SERVICE_ERROR_IGNORE, addr acDriverPath, NULL, NULL, NULL, NULL, NULL
        .if eax != NULL
            mov hService, eax
            invoke StartService, hService, 0, NULL
            invoke DeleteService, hService
            invoke CloseServiceHandle, hService
        .else
            ;invoke MessageBox, NULL, $CTA0("Can't register driver."), NULL, MB_ICONSTOP
        .endif
        invoke CloseServiceHandle, hSCManager
    .else
        ;invoke MessageBox, NULL, $CTA0("Can't connect to Service Control Manager."),NULL, MB_ICONSTOP
    .endif
;************************************************************************************************************
invoke CreateFile,addr filename,0c0000000h,0,0,3,0,0
mov hdrv,eax
;invoke OpenEvent,100000h,0,addr Send3E
invoke OpenEvent,100000h,0,addr Recv3E
mov hEvent,eax                                            ;接收數(shù)據(jù)事件
invoke MyArpPacket                                        ;自己構(gòu)造的ARP請(qǐng)求包.
invoke WriteFile,hdrv,addr ArpPacket,64,addr dwTempVar,0  ;發(fā)送數(shù)據(jù)包
;.while 1
   invoke WaitForSingleObject,hEvent,-1
;.endw
invoke MessageBoxA, 0,addr MsgBoxText, addr MsgCaption,0
invoke ExitProcess, 0
end start
:make
set drv=ndisring3
d:\masm32\ml /c /coff  %drv%.bat
d:\masm32\link /subsystem:windows %drv%.obj
del %drv%.obj
pause

本程序在win2k上調(diào)試通過(guò)。。用的NetFuke ver1.01工具作arp雙向欺騙作實(shí)驗(yàn)..

posted on 2007-08-10 02:30 聶文龍 閱讀(2599) 評(píng)論(4)  編輯 收藏 引用

FeedBack:
# re: [轉(zhuǎn)]一個(gè)ARP防火墻源代碼奉獻(xiàn) [未登錄](méi) 2007-11-07 22:49 orange
牛人啊  回復(fù)  更多評(píng)論
  
# re: [轉(zhuǎn)]一個(gè)ARP防火墻源代碼奉獻(xiàn)  2008-04-10 15:40 hdc
# re: [轉(zhuǎn)]一個(gè)ARP防火墻源代碼奉獻(xiàn)  2008-08-07 17:30 ABC
很好,借來(lái)看看!  回復(fù)  更多評(píng)論
  
# re: [轉(zhuǎn)]一個(gè)ARP防火墻源代碼奉獻(xiàn)  2009-07-02 00:25 小說(shuō)
牛人啊,交換個(gè)鏈接http://www.cmd8.cn xiaoshuo流氓老師  回復(fù)  更多評(píng)論
  

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              欧美一区二区在线免费播放| 99视频一区二区三区| 国产最新精品精品你懂的| 亚洲视频一二| 久久精品在线| 久久综合国产精品台湾中文娱乐网| 日韩一级欧洲| 亚洲午夜免费视频| 久久都是精品| 欧美高清一区二区| 欧美日韩一区二区免费在线观看| 欧美日本国产| 国产日韩一区二区三区在线| 在线观看欧美| 在线亚洲高清视频| 欧美影院成人| 欧美激情1区| 亚洲一区国产精品| 老司机成人在线视频| 欧美日本一区二区三区| 国产精品日韩电影| 亚洲人体大胆视频| 欧美亚洲视频| 亚洲国产一区二区三区高清| 亚洲大片在线| 亚洲先锋成人| 欧美大片在线观看一区| 国产午夜精品理论片a级大结局| 在线看片日韩| 销魂美女一区二区三区视频在线| 免费一区视频| 亚洲小少妇裸体bbw| 久久婷婷国产综合国色天香| 国产精品激情电影| 亚洲国产欧美在线人成| 国产日韩精品一区二区三区| 国产亚洲制服色| 欧美在线精品免播放器视频| 亚洲人成在线观看| 亚洲精品免费看| 久久先锋资源| 亚洲无限乱码一二三四麻| 久久亚洲春色中文字幕| 国产精品视频内| 亚洲午夜精品在线| 亚洲国产精品99久久久久久久久| 欧美主播一区二区三区| 欧美视频一区二| 日韩一级欧洲| 欧美激情女人20p| 久久久久99| 国产亚洲欧洲一区高清在线观看| 亚洲天堂成人在线视频| 免费在线欧美视频| 久久精选视频| 狠狠久久亚洲欧美| 久久一日本道色综合久久| 性欧美大战久久久久久久久| 国产精品国产精品| 亚洲欧洲av一区二区| 一本久道久久综合婷婷鲸鱼| 欧美黄色片免费观看| 亚洲精品男同| 亚洲精品视频在线播放| 欧美日本中文字幕| 亚洲深夜福利| 在线亚洲国产精品网站| 国产精品久久久久久av福利软件| 亚洲香蕉在线观看| 国产精品99久久久久久宅男| 欧美日韩一区二区三区视频| 亚洲四色影视在线观看| 中文精品视频一区二区在线观看| 欧美乱妇高清无乱码| 亚洲视频欧美视频| 亚洲欧美日韩国产成人| 亚洲桃花岛网站| 一本色道久久精品| 一区二区三区国产盗摄| 国产精品免费看| 欧美综合二区| 久久婷婷亚洲| 一本色道久久综合亚洲91| 99re热这里只有精品免费视频| 欧美顶级少妇做爰| 亚洲一级黄色av| 久久丁香综合五月国产三级网站| 亚洲国产视频直播| 亚洲美女视频在线观看| 国产精品亚洲网站| 欧美大片免费久久精品三p| 久久人人爽人人爽爽久久| 亚洲精品欧美日韩专区| 欧美激情亚洲另类| 久久婷婷麻豆| 国产精品一区二区久久久| 亚洲激情视频网站| 久久黄色级2电影| 国产曰批免费观看久久久| 亚洲高清色综合| 国产麻豆视频精品| 亚洲高清资源| 国产一区视频在线看| 亚洲欧洲美洲综合色网| 国产精品视频福利| 欧美a级片网| 欧美日韩国产一区| 麻豆成人91精品二区三区| 欧美日韩免费观看一区二区三区| 香蕉久久夜色精品国产使用方法| 久久漫画官网| 欧美一区二区精品在线| 欧美黄色成人网| 欧美成人蜜桃| 国产一区二区三区黄视频| 亚洲国产精品123| 国模套图日韩精品一区二区| 999亚洲国产精| 曰本成人黄色| 亚洲欧美日韩第一区| 亚洲精品国产日韩| 久久久国产91| 欧美一区二区三区四区高清 | 最新精品在线| 香蕉久久夜色精品国产| 亚洲视频在线视频| 欧美激情综合在线| 久久综合九色综合久99| 国产精品久久久久一区二区| 亚洲日本理论电影| 亚洲国产91精品在线观看| 欧美在线高清| 久久av一区二区三区| 欧美香蕉大胸在线视频观看| 亚洲国产欧美不卡在线观看| 亚洲第一在线综合网站| 欧美在线视频a| 久久久精品2019中文字幕神马| 国产精品www994| 亚洲深夜影院| 亚洲男女自偷自拍图片另类| 欧美日韩成人在线| 亚洲日本一区二区| 一区二区三区高清在线观看| 欧美日本二区| 99国产麻豆精品| 亚洲你懂的在线视频| 国产精品热久久久久夜色精品三区| 999在线观看精品免费不卡网站| 亚洲美女免费视频| 欧美精品一区二区在线观看 | 亚洲欧美日韩精品久久亚洲区 | 欧美成人r级一区二区三区| 男男成人高潮片免费网站| 久久精品一区蜜桃臀影院| 狠狠久久综合婷婷不卡| 免费看黄裸体一级大秀欧美| 亚洲区一区二| 午夜精品国产精品大乳美女| 国产精品永久免费在线| 欧美一区二区三区男人的天堂| 久久亚洲春色中文字幕久久久| 亚洲丰满在线| 欧美午夜激情视频| 久久国产精品久久久久久久久久| 久久亚洲高清| 一区二区三区久久久| 国产女人18毛片水18精品| 久久亚洲精品一区| 91久久精品一区| 亚洲欧美日本视频在线观看| 悠悠资源网亚洲青| 欧美日韩国产精品一区| 午夜在线观看欧美| 亚洲破处大片| 久久aⅴ国产紧身牛仔裤| 亚洲精品免费观看| 国产精品一区久久久| 久热精品视频在线观看| 亚洲精品国产欧美| 久久久久久久久久看片| 一区二区日韩| 在线播放日韩欧美| 国产欧美日韩综合| 欧美日韩一区二区三区视频| 久久婷婷一区| 欧美在线观看视频一区二区三区| 亚洲第一精品福利| 欧美在线视频日韩| 亚洲一区二区免费在线| 亚洲国产精品一区在线观看不卡| 国产精品乱看| 欧美日韩精品一区二区天天拍小说| 久久成人精品| 亚洲欧美综合另类中字| 日韩亚洲欧美综合| 亚洲国产精品久久久久婷婷老年| 久久综合伊人77777麻豆| 性欧美超级视频| 亚洲午夜激情网站|