;处理ARP包开始.只检测谁在伪装网关.把伪装ARP响应包改成ARP请求包并填写正确的网关MAC地址.
        mov ebx,_lpPacket
        mov ebx,[ebx+8]
        invoke NdisQueryBufferSafe,ebx,addr PacketVa,addr PacketSize,20h
        mov edi,PacketVa                             ;由于ARP包小,不用获取下一个MDL
        .if word ptr [edi+0ch]==0608h                ;收到的网络包是ARP包.
            .if word ptr [edi+14h]==0200h            ;是ARP响应包.  
                lea esi,GateWay
                mov eax,[edi+1ch]
                mov ebx,[esi+6]  
                add edi,16h
                mov ecx,10
                .if word ptr [edi+14h]==0AA55h       ;自己的特殊向网关请求的ARP包标志.
                    xchg esi,edi
                    rep movsb                        ;保存正确的网关IP及MAC
                .elseif ebx==eax                     ;是来自网关的响应包.
                    mov word ptr [edi-02h],0100h     ;把他改成请求包.
                    rep movsb
                .endif
            .endif
        .endif
;处理ARP包结束
;*************************************************************************************
popad
leave
      jmp lpOldRecvP                ;转到系统原来的Recv例程执行
_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来读数据包内容(重要)
;*************************************************************************************
;处理ARP包开始.只检测谁在伪装网关.把伪装ARP响应包改成ARP请求包并填写正确的网关MAC地址.
        mov edi,_HeaderBuffer
        .if word ptr [edi+0ch]==0608h                ;收到的网络包是ARP包.
            .if word ptr [edi+14h]==0200h            ;是ARP响应包.  
                lea esi,GateWay
                mov eax,[edi+1ch]
                mov ebx,[esi+6]  
                add edi,16h
                mov ecx,10
                .if word ptr [edi+14h]==0AA55h       ;自己的特殊向网关请求的ARP包标志.
                    xchg esi,edi
                    rep movsb                        ;保存正确的网关IP及MAC
                .elseif ebx==eax                     ;是来自网关的响应包.
                    mov word ptr [edi-02h],0100h     ;把他改成请求包.
                    rep movsb
                .endif
            .endif
        .endif
;处理ARP包结束
;*************************************************************************************
popad
leave
jmp lpOldRecv                ;转到系统原来的Recv例程执行
_myRecv endp
;这是我们HOOK tcpip协议的发送完成函数
_mySendComplete proc _PBC,_Packet,_Status
pushad .if szMyPacketLen                ;我们自己的构造的包长度
        invoke CopyPktTOLocBuf,_Packet,addr szTempBuffer
     mov esi,offset szTempBuffer
     mov edi,offset szMyPacketBuffer
     mov ecx,szMyPacketLen
     repz cmpsb                   ;比较包的内容
     .if !ecx                     ;是我们的包
         mov szMyPacketLen,0      ;设置包的长度
         popad
         leave
         xor eax,eax
         ret                      ;是我们的包直接返回
            .endif
.endif
popad                            ;不是我们的包转到系统原来例程
leave
jmp lpOldSendComplete            ;转到系统原来的SendComplete例程执行
_mySendComplete endp
;*********************************************************************************************
;*********************************************************************************************
;MySendPacket:    发送自已构造的数据帧(注意:包是直接交给网卡发送)
;入口:            BindingHandle=NDIS_PROTOCOL_BLOCK->_NDIS_OPEN_BLOCK
;                 MyPacket=数据帧缓冲首址,PacketLen=数据帧长度
;出口:            dwStatus=返回状态
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                               ;发送完成返回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
;***************************************************************************************************
;***************************************************************************************************
;以下空函数是为了填充NDIS_PROTOCOL_CHARACTERISTIC结构而设置的,实际下基本不会被系统调用,没有又不行。
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协议的及相关要用的函数在这里结束
;******************************************************************************************************
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
应用层源代码:
;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  该版本为调试版本试用系统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                                            ;接收数据事件
invoke MyArpPacket                                        ;自己构造的ARP请求包.
invoke WriteFile,hdrv,addr ArpPacket,64,addr dwTempVar,0  ;发送数据包
;.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上调试通过。。用的NetFuke ver1.01工具作arp双向欺骗作实验..

本人写的一个ARP防火墙源代码奉献(2)相关推荐

  1. 本人写的一个傲娇的语句

    客户在不同时间,可能过去的某一天缴费,他的账号的到期日期可能在过去的某一天,可能在未来的某一天,客户可能交一个月,可能交一年的费用,现在统计出过去一年,及未来一年,用户交的费用具体到每个月.这个背景下 ...

  2. 刚学vue,写的一个入门demo,时光网

    vue写的一个移动端时光网 刚学vue不久,动手写了一个demo. 源代码 源代码地址:GitHub 技术栈 vue2 + vuex + vue-router + webpack + ES6 + sc ...

  3. 师兄写的一个JAVA播放器的源代码(转)

    师兄写的一个JAVA播放器的源代码 MediaPlayer.java ----------------------------------------------------------------- ...

  4. 金山卫士开放第三批源代码 ARP防火墙可下载

    金山网络今日公布了金山卫士的第三批源代码--"ARP防火墙"代码.据悉,该批源代码彻底面向公众开放下载,通过对源代码的二次编译开发,ARP防火墙属于金山卫士开源应用层代码,用户可以 ...

  5. 快速发包突破ARP防火墙思路

    今天忽然想写个关于破Arp 防火墙的文章,也是老生常谈了,真理只有一条:知道原理,就能知道解决方案-- Arp 也是个很老的通讯协议了,Arp 攻击也很老了,关于Arp 欺骗原理,我写过很多了,这里不 ...

  6. 基于ASP.Net写的一个购物网站

    网站运行录像 在这里 链接:https://pan.baidu.com/s/1NaFNKnQ3UEorasadRf7EIA                                        ...

  7. 基于IMD驱动ARP防火墙设计(windows平台)

    基于 IMD 驱动 ARP 防火墙设计 (windows 平台 ) IMD 驱动认识 当 IMD 注册的时候,会同时注册协议和端口,他们分别代码着 protocol_block,miniport_bl ...

  8. 可突破任意ARP防火墙,以限制流量为目标的简单网络管理软件

    以下消息来自幻影论坛[Ph4nt0m]邮件组 软件说明: 可突破任意ARP防火墙,以限制流量为目标的简单网络管理软件. 使用方法: 1.在参数设置中选择好工作网卡: 2.检查网关信息和本机信息是否正确 ...

  9. python写机器人程序_用Python写的一个多线程机器人聊天程序

    本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...

最新文章

  1. 震撼!Science:“第三手指”可增强人体功能
  2. 关闭rdlc报表打印预览后,关闭客户端,抛出异常“发生了应用程序级的异常 将退出”...
  3. python ORM - sqlalchemy 操作使用
  4. django下创建APP
  5. C和混编混合编程----strcpy缓存溢出原理
  6. CPtrArray、CObArray类
  7. python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?
  8. matlab 一维 平滑,一维加噪信号的平滑处理(3)
  9. 终于有一次,排名没有进步
  10. 在vscode中打开PDF文件
  11. paypal支付注意事项
  12. 2020.2.4记账
  13. 电话键盘 电脑键盘与标点符号英文读法
  14. 由人眼追踪技术想到的
  15. Tk 的基本概念-组件—Tkinter 教程系列03
  16. 【安全资讯】网络安全拐点已至 行业如何破局?
  17. 妙赞大讲糖:哪些糖友可手术
  18. java读取大文件并添加入库,按行读取
  19. 体验全功能:Win 8激活方式详解
  20. vivado HLS 设计实现sBrief描述子

热门文章

  1. 家庭网络,防止蹭网指南
  2. 谷歌广告西联汇款到账的美元转人民币
  3. 通过程序压缩/解压文件
  4. XUPT Linux Group 2020 2021 2022 note
  5. 【OpenCV 例程200篇】34. 图像的投影变换(cv2.getPerspectiveTransform)
  6. 剑指offer- 顺时针打印矩阵 精品算法
  7. 【k8s】——Rancher(k8s图形化管理工具)
  8. QT二维图形的绘制(类的介绍与绘图实例)
  9. 转WinForm-SuspendLayout、ResumeLayout、PerformLayou
  10. 【图像处理】图像视频压缩编码技术综述