大连网站建设,株洲做网站需要多少钱,安徽平台网站建设设计,网站开发长沙原文作者#xff1a;MaD 原文标题#xff1a;The truth aboutpersonal firewalls电子邮件#xff1a;mad-factormail.ru作者国籍#xff1a;俄罗斯声明#xff1a;1、本人翻译水平有限#xff0c;有不当之请大家理解。如部分看不懂可以和原文对照。 2、欢迎转…原文作者MaD 原文标题The truth aboutpersonal firewalls电子邮件mad-factormail.ru作者国籍俄罗斯声明1、本人翻译水平有限有不当之请大家理解。如部分看不懂可以和原文对照。 2、欢迎转载但请不要漏掉原文作者和翻译者的信息。 3、欢迎大家指出我翻译中的错误我好改正。内容 有多种方式来保护你的计算机免受恶意软件的侵害,比如软件防火墙,病毒和Rootkit检 测软件等。所有这些防护软件都基于一些众所周知而几乎没有改进的技术而且这些技术你也许已经知道继承这些技术的安全产品也是不完善的。这样的后果通常 是可怕的。然而这些安全公司却天真的认为他们的产品是最先进的包含了最新的特性是用户必备的。但是只要你透过他们的华丽的外衣就会看到他们的Bug和错误甚至比你在学校的设计还要多。虽说生产一款产品首要的是好而强有力的广告。但沉重的广告和糟糕的测试结合在一起能向用户展示一些产品所谓的强大吗能使其产生一种强烈的购买欲望吗当然不行。 保护你的个人电脑免受外部的和内部的第三者的攻击是一个好主意。一些保护你的PC远离木马和间谍软件“启发式”的方法好像真在工作。如果他们工作的话付30到50美元就能获得实时的保护和更新的确是个非常好的想法。可惜他们不能。 首先我想为我糟糕的英语道歉。我们的讨论将会涉及以下产品 ZoneAlarm Firewall 6.x Outpost Firewall 3.x and 4.x LooknStop Firewall 2.0 Kerio Firewall 4.3 Sygate Firewall 5.6 Jetico Firewall 1.0 PortsLock Firewall 1.9 Tiny Firewall 6.5 Norton Internet Security 8.0 Comodo Firewall 2.4 OnlineArmor Firewall 2.1 个人软件防火墙的保护有2种基本级别NDIS网络驱动接口规范和TDI传输数据接口。NDIS级是建立在TCP/IP栈的基础上的在这个级别上的保护能阻止基于TCP/IP栈BUG的攻击甚至你不用更新你的栈他也能防御许多电子欺骗洪水攻击和分布式拒绝服务攻击。没有使用NDIS技术的防火墙自然变成了局外人。失败者有PortsLock防火墙, Norton Internet Security, Comodo防火墙 等。你真的愿意为PortsLock防火墙付35欧元吗他甚至不能抵御低级别的TCP/IP攻击。或者为Comodo付79美元为你的系统感到悲哀。真正的防火墙是基于NDIS级的。基于NDIS有两种不同的保护方法。第一种是NDIS-hooking保护。主要方法是HooksNdisRegisterProtocol()/NdisOpenAdapter()。当NDIS协议试图被注册时或是正要绑定某个适配器时防火墙将接到通知。在防火墙正在HOOK NDIS_PROTOCOL_BLOCK andNDIS_OPEN_BLOCK的句柄的这个关键时刻并且当系统想要发送或接收数据包时防火墙将会被通知当这些发生的时候。防火墙正试图安装他们的钩子时是有趣的时候几乎每个防火墙都是hook NDIS_PROTOCOL_BLOCK的句柄但是Sygate, Kerio 和Jetico等除外他们是HOOK NDIS_PROTOCOL_CHARACTERISTICS的句柄而不是调用真正的NdisRegisterProtocol()在那之后他们又移动到原来的句柄。更安全吗对吗正是防火墙应该独立工作与多少协议被注册和多少被绑定无关。是的每个防火墙都支持这个。例如当ZoneAlarm正在hook一个句柄时他是分配一个无分页的内存并且放入以下几条指令。 pop eax ; 58push HookData ; 68 XX XX XX XXpush eax ; 50jmp HookedHandler ; E9 XX XX XX XX 然后他写一些重要的信息在其他内存片调用HookData和所有在NDIS_PROTOCOL_BLOCK中被hook的句柄 OpenAdapterCompleteHandlerCloseAdapterCompleteHandlerBindAdapterHandlerUnbindAdapterHandler 在NDIS_OPEN_BLOCK中的: SendHandler ReceiveHandler ReceivePacketHandler SendPacketsHandler 对NDIS_PROTOCOL_BLOCK象下面这样 VOID HookedOpenAdapterComplete( PVOID HookData, INNDIS_HANDLE ProtocolBindingContext, INNDIS_STATUS Status, INNDIS_STATUS OpenErrorStatus ); 真正的OpenAdapterComplete() 句柄被放在这[HookData 0x770] VOID HookedCloseAdapterComplete( PVOID HookData, INNDIS_HANDLE ProtocolBindingContext, INNDIS_STATUS Status ); 真正的CloseAdapterComplete() 句柄被放在这[HookData 0x774] VOID HookedBindAdapter( PVOID HookData, OUT PNDIS_STATUS Status, INNDIS_HANDLE BindContext, INPNDIS_STRING DeviceName, INPVOID SystemSpecific1, INPVOID SystemSpecific2 ); 真正的BindAdapter() 句柄被放在这[HookData 0x764] VOID HookedUnbindAdapter( PVOID HookData, OUT PNDIS_STATUS Status, INNDIS_HANDLE ProtocolBindingContext, INNDIS_HANDLE UnbindContext ); 真正的UnbindAdapter() 句柄被放在这 [HookData 0x768] For NDIS_OPEN_BLOCK: VOIDHookedSend( PVOID HookData, INNDIS_HANDLE NdisBindingHandle, IN PNDIS_PACKET Packet ); 真正的Send() 句柄被放在这 [HookData 0x1A4] VOID HookedReceive( PVOID HookData, IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookaheadBufferSize, IN UINT PacketSize ); 真正的Receive() 句柄被放在这 [HookData 0x4D0] VOID HookedReceivePacket( PVOID HookData, IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet); 真正的ReceivePacket() 句柄被放在这 [HookData 0x570] VOID HookedSendPackets( PVOID HookData, INNDIS_HANDLE MiniportAdapterContext, INPPNDIS_PACKET PacketArray, INUINT NumberOfPackets); 真正的SendPackets() 句柄被放在这 [HookData2E4h] 可怜的ZoneAlarm这是如此的简单对于获取真实的句柄并恢复他。 我说过每个防火墙都支持多数的注册协议。事实上并不是每个。Sygate认为保持关于协议和公开包的所有信息在他的.data段中已经足够了。不幸是个坏主意。他的句柄HOOK方式比ZoneAlarm简单但是说明哪些内存将被分配的指令被 放在Sygate的驱动Teefer.sys中 pop eax ; 58 push HookData ; 68XX XX XX XX push eax ; 50 jmp FakeHandler ;E9 XX XX XX XX HookData也是放在.data中的。Sygate总共能HOOK576个句柄包括协议和开放块句柄。于是大约有40-50个NDIS_PROTOCOL_BLOCK和NDIS_OPEN_BLOCK能被Hook不要忘记几个开放块能被附加到一个协议块。大概40-50块已经足够了但那样的代码实在是个糟糕的设计给缓冲区溢出打了个招呼。 我有另外一个好例子是关于关于多么有必要知道怎样Hook和hook多少。那些来自Kerio防火墙小组的家伙不知道这些。作为一个好的防火墙设置HOOK在 NdisRegisterProtocol(), NdisDeregisterProtocol(), NdisOpenAdapter(),NdisCloseAdapter() 等函数并且HOOK句柄。就像我说的Kerio只是hook NDIS_PROTOCOL_CHARACTERISTICS的句柄并且仅仅调用NdisRegisterProtocol()函数但他不将句柄移回NDIS_PROTOCOL_CHARACTERISTICS。这会怎样未公开的特性我不这样认为恰恰是粗心的编码和对内核标准和架构的误解。另一个好的例子是Kerio团队不知道任何关于NDIS的开发事实就是这样他们甚至不知道怎样去HOOK。Kerio防火墙HOOK在NDIS_PROTOCOL_CHARACTERISTICS里 OpenAdapterCompleteHandler CloseAdapterCompleteHandler 并这样hook NDIS_OPEN_BLOCK: SendHandler SendPacketsHandler 不是太多刚好。他能被用来绕过他的NDIS保护并发送一个包给TCP/IP栈。你虽然已经按了“阻止所有”按钮但仍然能在本地嗅探器下看到进来的数据包。我可不喜欢像Kerio防火墙假装的那样假装自己受保护的时候再去嗅探器下看数据包。从另一个方面来说Outpost防火墙喜欢在NDIS_PROTOCOL_BLOCK中hook更多的句柄 OpenAdapterCompleteHandler SendCompleteHandler TransferDataCompleteHandler RequestCompleteHandler ReceiveHandler StatusHandler ReceivePacketHandler BindAdapterHandler UnbindAdapterHandler 在 NDIS_OPEN_BLOCK中: Outpost4.0: SendCompleteHandler TransferDataCompleteHandler ReceiveHandler ReceivePacketHandler StatusHandler Outpost 3.x: SendHandler TransferDataHandler SendCompleteHandler TransferDataCompleteHandler ReceiveHandler RequestCompleteHandler ReceivePacketHandler SendPacketsHandler StatusHandler 他的句柄调用和防火墙之间的代码是非常有趣的 call ImCode ; E8 XX XX XX XX For Outpost3.x: pop eax ; 58 push [eax] ; FF30 Pushing the real handler pushad ; 60 push [eax4] ; FF 70 04 push [esp28h] ; FF74 24 28 Pushing return address jmp [eax8] ; FF 60 08 For Outpost 4.0: pop eax ; 58 add eax,3 ; 83 C0 03 Missing three zero bytes after call push [eax] ; FF30 Pushing the real handler pushad ; 60 push [eax4] ; FF 70 04 push [esp28h] ; FF74 24 28 Pushing return address jmp [eax8] ; FF 60 08 像我们看到的那样那不是一个问题对于卸载所有的HOOK并立即获取系统控制权。如果你厌烦了这中间的汇编代码他们通常是能够转换成普通C代码的我能向你展示一些来自Tiny防火墙团队有趣的东西他假装是真正的安全并且向我们展示了很多的hook NdisOpenAdapter NdisCloseAdapter NdisInitializeWrapper NdisTerminateWrapper NdisMRegisterMiniport NdisIMRegisterLayeredMiniport NdisRegisterProtocol NdisMSetAttributesEx NdisRegisterMac NdisIMAssociateMiniport NdisClOpenAddressFamily NdisCmRegisterAddressFamily NdisMCmRegisterAddressFamily NdisMCoSendComplete 哦看起来很优秀也真是很优秀的样子他们试图对这些函数做一个结合HOOK通过设置跳转到他们的句柄。我不喜欢“结合”知道为什么吗那不是因为他难以实现或是有些指令很难“结合”理论上可行实践上未必我不认为在真正函数的开端那样做可行。主要的原因是那样不安全。Rootkit开发者使用他是因为那是一种获取控制权的简单的方式但不要试图把他用作安全软件中就像用恐怖份子的方法对付恐怖分子一样。还有要说的是我没有发现任何线程安全和多处理器安全的代码。再一次失败。当你在“结合”某些代码的时候你需要确信没有一个线程、没有一个CPU在运行这些代码。 Tiny防火墙为每个HOOK句柄申请内存并拷贝这些C函数在开端和结尾 push ebp ; 55 mov ebp,esp ; 8B EC sub esp,XXh ; 83 EC XX mov byte ptr [ebp-1],XXh ; C6 45FF XX mov dword ptr [ebp-8],HookedHandler ; C7 45 F8 XX XX XX XX ... push RealHandler call [ebp-8] mov esp, ebp pop ebp ret XXh 于是这就变的相当简单对于从新句柄偏移0xD去获得真的句柄。对所有的句柄Tiny都是拷贝上面的代码。 hook在NDIS_PROTOCOL_BLOCK中: SendCompleteHandler StatusHandler Hooked 在 NDIS_OPEN_BLOCK中: TransferDataHandler SendCompleteHandler TransferDataCompleteHandler ReceiveHandler ReceivePacketHandler StatusHandler 需要说的是有些防火墙变聪明了如果他们被别人hook的时候他们会试图恢复他们的hook。例如Outpost防火墙就检测这个并监视他们的hook但仅仅像指针的安全那样。也许他们不认为会有剪接戏法Outpost小组不知道白帽子Sygate防火墙也能恢复他们的hook但他恢复的仅仅是NDIS_OPEN_BLOCK.SendHandler和 NDIS_OPEN_BLOCK.SendPacketsHandler。那是奇怪的因为因为他们hook了很多NDIS_PROTOCOL_BLOCK中的句柄 OpenAdapterCompleteHandler CloseAdapterCompleteHandler TransferDataCompleteHandler ReceiveHandler StatusHandler 和 NDIS_OPEN_BLOCK 的hook: SendHandler TransferDataHandler TransferDataCompleteHandler ReceiveHandler ReceivePacketHandler SendPacketsHandler StatusHandler 只有几种防火墙用中间层NDIS驱动来做NDIS级的保护。这是一个聪明的解决方案。例如Look’n’Stop 和 Outpost 2008 防火墙用IM NDIS驱动。Outpost好的改进是在去年。但是现在绕过防火墙变的容易使因为没有HOOK没有伎俩和没有任何未公布的特性被使用。现在你能粉碎所有的IM NDIS防火墙只是绕过他们。不需要扰乱防火墙接受和发送包的句柄你也不用向他们发送包。总之使用IM NDIS驱动是好的众所周知的已公布的一个正确的保护系统不受外部攻击的方法。 像你可能看到的那样技术各个防火墙的技术是相似的思路甚至能被盗用并且没有人会说你盗用了一个想法。好的方式是透过表面创新你的产品。不需去思考不用产生想法去反汇编、调试并且对它感兴趣。第二种主级别的防火墙基于TDI传输数据接口能为内核传输协议栈提供更高级别的访问。Afd.sys能解析winsock经由tdi.sysTDI层上面层说过与Windows TCP/IP栈tcpip.sys通信。于是又几种方式和地方去安装hook并监视你的程序和网络通信。设置你的保护最好的地方正是在tcpip.sys设备它能在协议栈的最上层解释执行 DeviceIp DeviceTcp DeviceUdp DeviceIPMULTICAST DeviceRawIp 好的你甚至能通过/Device/RawIp来戏弄一些人。对于阻止程序的一个访问网络的请求最好的方式公开的方式也是重要的是附加到这些设备上并监视他们。几乎所有的防火墙都这样做了因为这是通知用户陌生程序要访问网络的好方法。例如Look’n’Stop附加他的设备到tcpip.sys设备 DevicePcaTcpFilter - DeviceTcp DevicePcaUdpFilter - DeviceUdp DevicePcaRawIpFilter - DeviceRawIp /Device/Ip在那里不是足够的我们需要确信所有种类的连接需要被监视或是他们恰恰通过了这个假冒的保护。 你的看见这些设备在你的WinObj工具里 DeviceComodoRawIpFilter DeviceComodoUdpFilter DeviceComodoTcpFilter DeviceComodoIpFilter 我希望你能猜到Comodo防火墙是附加设备到相同名字的tcpip.sys设备。 Outpost、Kerio、Jetico 防火墙, Norton InternetSecurity仅仅附加一个无名的设备到TcpUdpIpRawIp没有感兴趣的事。了解设备栈结构的人应该知道抛开这些附加设备使防火墙不再提示是相当容易的。你只需要找到tcpip.sys的DRIVER_OBJECT的指针遍历DeviceObject列表清空所有DEVICE_OBJECT的附加项。相当容易吧但对对抗防火墙很有效他们的防护程序就是在那附近。另一个脆弱防火墙的错误和夸大的广告。除了附加技术外还有另一种有趣而复杂的的技术但对恶意软件更有效这就是MajorTable hook。大家都知道当用户态程序想与驱动交互的时候他通知要交互驱动的I/O管理器。I/O管理器产生一个IRP并调用DRIVER_OBJECT.MajorTable[IRP_MJ_XXX]的句柄。就在tcpip.sys这一些防火墙仅仅hook一个IRP_MJ_XXX句柄并监视所有调用通过允许请求和拒绝禁止。找到一个真的句柄不是很容易哈几乎每个人都认为那不可能。寻找一些被hook的句柄的主要方法是他必须被调用然后会被发现。通过hook Int 0x01设置TF防火墙句柄的所有调用我们能发现一个防火墙要调用的真的句柄。简单MajorTable-hooking技术被像ZoneAlarm这样的防火墙青睐他是这样HOOK的 IRP_MJ_CREATE IRP_MJ_CLOSE IRP_MJ_DEVICE_CONTROL IRP_MJ_INTERNAL_DEVICE_CONTROL IRP_MJ_CLEANUP 另一个局部hook的失败是tcpip.sys仅有TCPDispatch() 和TCPDispatchInternalDeviceControl()2个IRP句柄第一个被所有 MajorTable填充把它从另一个句柄上移出时容易的。TCPDispatchInternalDeviceControl()你能通过使用另一个方法 (例如前面说的追踪方法和反汇编方法)来发现。Sygate防火墙喜欢HOOK这些句柄 IRP_MJ_CREATE IRP_MJ_CLOSE IRP_MJ_DEVICE_CONTROL IRP_MJ_INTERNAL_DEVICE_CONTROL PortsLock防火墙hook所有MajorTable句柄。好主要既不将TCPDispatch()也不将TCPDispatchInternalDeviceControl()给敌人。Tiny防火墙是hook下面的句柄。 IRP_MJ_CREATE IRP_MJ_CLOSE IRP_MJ_DEVICE_CONTROL IRP_MJ_INTERNAL_DEVICE_CONTROL IRP_MJ_CLEANUP 对于在一个防火墙中仅有这种类型的保护是不严重的你不这样认为吗我认为像PortsLock防火墙Norton Internet SecurityComodo防火墙和其他有“防火墙”这个错误称号的就像一些有着很漂亮界面的保护系统。恶意软件正在变的越来越猖獗每天都有大量的ROOTKIT杯注册更多老练的先进的比防火墙更底层的正在不断涌现。他们试图影响其他进程并隐匿其中。就像一个披着羊皮的狼。我谈到injection, OpenProcess()/WriteProcessMemory()/CreateRemoteThread()和一个好的shellcode或一个self-mapped模块等都能透过防护与外部通信而且工作的很好也很容易编写所有需要好的保护而不受其侵害。系统服务标提供内核函数的访问通道他是通过调_KiSystemService那是用用户模式和驱动来实现的。防火墙为了阻止这些动作使系统保持健壮成功地hook了打开进程、写进程内存、创建远线程、进程、文件、文件编辑等函数。防火墙喜欢做这些例如ZoneAlarm防火墙hook以下系统服务 ZwConnectPort ZwCreateFile ZwCreateKey ZwCreatePort ZwCreateProcess ZwCreateProcessEx ZwCreateSection ZwCreateWaitablePort ZwDeleteFile ZwDeleteKey ZwDeleteValueKey ZwDuplicateObject ZwLoadKey ZwMapViewOfSection ZwOpenFile ZwOpenProcess ZwOpenThread ZwReplaceKey ZwRequestWaitReplyPort ZwRestoreKey ZwSecureConnectPort ZwSetInformationFile ZwSetSystemInformation ZwSetValueKey ZwTerminateProcess 他监视对注册表进程驱动文件的访问并阻止自己被关闭。Outpost Firewall 4 hook更多的服务 ZwAssignProcessToJobObject ZwClose ZwCreateFile ZwCreateKey ZwCreateProcess ZwCreateProcessEx ZwCreateSymbolicLinkObject ZwCreateThread ZwDeleteFile ZwDeleteKey ZwDeleteValueKey ZwLoadDriver ZwMakeTemporaryObject ZwOpenFile ZwOpenKey ZwOpenProcess ZwProtectVirtualMemory ZwQueryDirectoryFile ZwQueryKey ZwQueryValueKey ZwReplaceKey ZwRestoreKey ZwSaveKey ZwSaveKeyEx ZwSetInformationFile ZwSetValueKey ZwTerminateProcess ZwTerminateThread ZwUnloadDriver ZwWriteVirtualMemory 但事实上他仅用了他们的一半。他不关心驱动你能加载任何你想要的但他hook了ZwLoadDriver。更多的hook就更好吗啊哈对漏洞挖掘者来说更好。不是每个人都知道代码的质量怎样它将要运行当我们调用ZwOpenKey时。我的系统将要蓝屏吗另一个关于hook的例子是Kerio防火墙: ZwClose ZwCreateFile ZwCreateKey ZwCreateProcess ZwCreateProcessEx ZwCreateThread ZwDeleteFile ZwDeleteKey ZwDeleteValueKey ZwLoadDriver ZwMapViewOfSection ZwOpenFile ZwOpenKey ZwResumeThread ZwSetInformationFile ZwSetValueKey ZwTerminateProcess ZwWriteFile 没看见ZwOpenProcess/ZwWriteVirtualMemory的hook。使用Kerio你能插入你想要的每个进程包括允许的进程。Sygate所用的hook比其他的少 ZwTerminateProcess ZwMapViewOfSection ZwAllocateVirtualMemory ZwCreateThread ZwProtectVirtualMemory ZwWriteVirtualMemory 他们认为能通过hookZwWriteVirtualMemory来保护系统。那是有BUG的你能打开进程并改变一些线程的context几乎与 Jetico做的相同 ZwConnectPort ZwCreatePort ZwCreateThread ZwTerminateProcess ZwWriteVirtualMemory 不是很有趣。Tiny防火墙做的最有趣 ZwCreateKey ZwCreateSection ZwOpenKey ZwSetInformationProcess ZwTerminateProcess 你能这样说吗这是容易的对于通过ZwWriteVirtualMemory来插入一些东西。当然但当此恶意行为发生时用户将被通知。这是个愚蠢的小玩笑对于在用户模式下来保护Tiny防火墙载入他的UmxSbxExw.dll 到每个进程并hook许多进程通过安装每个函数开始的跳转 kernel32.dll:CreateProcessACreateProcessWCreateRemoteThreadDebugActiveProcessFreeLibraryGetProcAddressLoadLibraryExWOpenThreadTerminateProcessTerminateThreadWriteProcessMemoryuser32.dll:BroadcastSystemMessageBroadcastSystemMessageABroadcastSystemMessageExABroadcastSystemMessageExWBroadcastSystemMessageWEndTaskExitWindowsExOpenClipboardPostMessageAPostMessageWPostThreadMessageAPostThreadMessageWSendDlgItemMessageASendDlgItemMessageWSendMessageASendMessageCallbackASendMessageCallbackWSendMessageTimeoutASendMessageTimeoutWSendMessageWSendNotifyMessageASendNotifyMessageWSetUserObjectSecuritySetWindowsHookASetWindowsHookExASetWindowsHookExWSetWindowsHookWadvapi32.dll:AbortSystemShutdownWAdjustTokenPrivilegesChangeServiceConfig2AChangeServiceConfig2WChangeServiceConfigAChangeServiceConfigWControlServiceCreateProcessAsUserACreateProcessAsUserWCreateProcessWithLogonWCreateServiceACreateServiceWDeleteServiceEnumDependentServicesAEnumDependentServicesWEnumServicesStatusAEnumServicesStatusExAEnumServicesStatusExWEnumServicesStatusWInitiateSystemShutdownExWInitiateSystemShutdownWOpenSCManagerAOpenSCManagerWOpenServiceAOpenServiceWQueryServiceConfig2AQueryServiceConfig2WQueryServiceConfigAQueryServiceConfigWQueryServiceStatusQueryServiceStatusExSetFileSecurityWSetKernelObjectSecuritySetNamedSecurityInfoWSetSecurityInfoSetServiceObjectSecurityStartServiceAStartServiceW 哦Tiny是个hook怪物。你能看见在kernel32.dll上的hookWriteProcessMemory在他们的保护之下以防止被插入。Tiny防火墙团队认为那是一个很酷的保护方式在一些不稳定的程序中他可能会挂掉。从那些进程中卸载掉他的Dll也不是件难事恢复所有的函数入口就可以享受生活了。Outpost也喜欢这样做他加载他的wl_hook.dll到应该被保护以防止恶意软件的每个进程。那是庞大的hook队列 kernel32.dll:CreateProcessACreateProcessWCreateRemoteThreadDebugActiveProcessWinExecntdll.dll:LdrLoadDllLdrUnloadDllNtCreateThreadNtResumeProcessNtResumeThreadNtSetContextThreadNtSetValueKeyNtSuspendProcessNtSuspendThreadNtTerminateProcessNtWriteVirtualMemoryZwCreateThreadZwResumeProcessZwResumeThreadZwSetContextThreadZwSetValueKeyZwSuspendProcessZwSuspendThreadZwTerminateProcessZwWriteVirtualMemoryuser32.dll:CallNextHookExChangeDisplaySettingsExAChangeDisplaySettingsExWDdeConnectDdeConnectListDdeInitializeADdeInitializeWEndTaskExitWindowsExFindWindowExAFindWindowExWPostMessageAPostMessageWSendInputSendMessageASendMessageCallbackASendMessageCallbackWSendMessageTimeoutASendMessageTimeoutWSendMessageWSendNotifyMessageASendNotifyMessageWSetForegroundWindowSetWindowPosSetWindowsHookExASetWindowsHookExW 那不是一个保护是没有必要的代码。是的他能抵制一些稀有恶意代码但没有更多。一些防火墙不仅想被作为一个防火墙来使用他们包含了一些有趣的特性像间谍软件或rootkit的检测程序。是的他们工作了 这就产生了一个印象。在遇到调试之前的几分钟。一些防火墙试图监视模块的加载通过设置经由PsSetLoadImageNotiryRoutine()的例行检查。Jetico Firewall, Look’n’Stop Firewall, Tiny Firewall,ZoneAlarm Firewall, Outpost Firewall是这样做的。例如当Outpost加载时监视dnsapi.dll的加载他通知用户一些程序试图使用DNS服务。这将会发生当你将要调用gethostbyname()时dnsapi.dll 会自动加载。不是很酷。重命名dnsapi.dll到xxx.dll,加载它找到DnsQuery_A的指针并使用它来解析OutPost将会关闭。这是个糟糕的方式对于在这儿的保护。几乎在每个防火墙中你都能发现很多无用的无效的东西。有时它帮助理解部分代码或给出一个例子函数命名甚至你能发现一些调式信息。Look’n’Stop防火墙团队没有区分发布版和调试版可能那就是他们为什么留下这些东西在这 push offsetasc_187DC ; f://dev//lns//2.05.cur//tdisys//w32api.c push offset aKegetcurren_23 ; KeGetCurrentIrql() PASSIVE_LEVEL call ds:RtlAssert 断言在调试构建时是有用的但不是在发布版中。Tiny防火墙有很多奇怪的格式串日志 .text:00011608 aNbh0x08xMac0x0 db9,nbh:0xX mac:0xX mah:0xX pbc:0xX,0Dh,0Ah.text:00011608 ; DATA XREF:HookedNdisOpenAdapter273 o.text:00011608 db9,med:%s,0Dh,0Ah.text:00011608 db9,drv:%s,0Dh,0Ah.text:00011608 db9,dev:%s,0Dh,0Ah.text:00011608 db9,ada:%s,0.text:00011661 align 4我认为没人想因为这些奇怪的记录而看见蓝屏。ZoneAlarm也喜欢记录.text:0001A610 aUPacketSProtoS db %uPacket %s: Proto: %s Flags: 0xlx Src: %2u.%2u.%2u.%2u .text:0001A610 ; DATA XREF:sub_1A693119 o.text:0001A610 db Dest: %2u.%2u.%2u.%2u,0他尤其喜欢记录在发布版本中当然。.text:00025A84 aSFragTLxHLxPfl db %sfrag: t%lx h%lx pflg%lx subp%lx sip%d.%d.%d.%d dip%.text:00025A84 ; DATA XREF:sub_25BAA2D1 o.text:00025A84 db d.%d.%d.%d id%xf%s%s%s off%hu act%lx,0Ah,0我喜欢 ZoneAlarm他给我一些函数的名字.text:00050250 aVsdatantVstdic dbVSDATANT:vsTdiClientRequestReceivePreProc(): FO%p SE%p RE#.text:00050250 ; DATA XREF: sub_502A6D3o.text:00050250 db %d IRP%p :TIMEOUT(%u),0Ah,0Kerio防火墙团队不包含路径就不能生成他们的驱动.rdata:00433704aCProjectsNetsecuritytoolsFire db C:/Projects/netsecuritytools/FirewallSDK/Build.Release/4.3..rdata:00433704 dbx/bin/Release/fwdrv.pdb,0他们也这样记录.data:00434020 aFwdrvApicopyas dbFWDRV: ApiCopyAssociatedEndpoint: Local: %u.%u.%u.%u:%u Remo.data:00434020 ; DATA XREF:sub_4011503B4 o.data:00434020 db te:%u.%u.%u.%u:%u,SpeedIn: %u, SpeedOut: %u, PID: 0xX, A.data:00434020 db pp: [%s], Service:[%s],0并且真是有大量这样的记录.data:0043B1D4 aSPagedCodeCa_7 db %s():Paged code called on IRQL %d,0 我想说的是不要紧你喜欢记录多少你应该移走这样的垃圾记录和垃圾代码在发布版中。越少的代码越少的bug。也学下次蓝屏会刚好在那些糟糕测试并绑定调试信息的代码中。今年的首次揭幕是OnlineArmor防火墙。“Online Armor有一个非常好的机会调者华尔兹就窃取了苏格兰时事通讯2008最佳软件防火墙的荣誉称号” 是的在DriverVerifier下的首次测试就给我了一个蓝屏。真是很有趣他在标准检查工具下挂掉了。 在里面你能发现IRP_MJ_DEVICE_CONTROL 句柄那是处理所有与METHOD_NEITHER有关的IOCTLs。 你知道ProbeForRead()/ProbeForWrite()他们甚至不检查指针是否为空这真是可笑所有Windows用户的最好保护软件有如此多的问题。猜猜它能怎么样一部分16进制的代码如下所示 int __stdcall DispatchDeviceControl(intDeviceObject, PIRP Irp){ struct_IRP::$::$::$::$A02EC6A2CE86544F716F4825015773AC::_IO_STACK_LOCATION *Stack; //eax1 unsigned int Status; // edi1 PIRP _Irp; // esi1 void *InBuffer; // ecx2 int InBufferSize; // edi2 PVOID OutBuffer; // edx2 int OutBufferSize; // ebx2 int Length; // eax3 int ReturnLength; // [sp8h][bp-4h]1 ReturnLength 0; _Irp Irp; Stack Irp-Tail.Overlay.CurrentStackLocation; Status 0xC00000BBu; if ( *(_BYTE *)Stack 14 ) { InBuffer (void*)*((_DWORD *)Stack 4); InBufferSize *((_DWORD *)Stack 2); OutBuffer Irp-UserBuffer; OutBufferSize *((_DWORD *)Stack 1); Irp (PIRP)*((_DWORD*)Stack 3); Status HandleRequest((int)Irp, InBuffer, InBufferSize, OutBuffer, OutBufferSize,ReturnLength); } Length ReturnLength; _Irp-IoStatus.Status Status; _Irp-IoStatus.Information Length; IofCompleteRequest(_Irp, 0); return Status;}int __stdcall HandleRequest(int Ioctl,void *InBuffer, int InBufferSize, void *OutBuffer, int OutBufferSize, int*ReturnLength){ … if ( Ioctl 0x830020EB ) { sub_1484A((int)OutBuffer); *v6 28; return 0; }在sub_1484A()里什么是如此的有趣看看这里int __stdcall sub_1484A(int a1){ int result; // eax3 CPPEH_RECORD ms_exc; // [spCh][bp-18h]1 ms_exc.disabled 0; if ( dword_16168 ) { memcpy((void *)a1,(const void *)dword_161A8, 0x1Cu); } else { result 0; memset((void *)a1, 0,0x1Cu); } return result;} 酷在内核空间写些东西已经没有任何困难了我们能制造一个DOS甚至可以执行代码。我只是不想进一步发掘了希望剩下的将被同道之一完成。如果我说的是真的话似乎每个防火墙都能被绕过没有东西能做到100%的保护。Rootkit木马蠕虫和其他恶意软件变的更加隐蔽、复杂而且很难被发现。我不想给出任何关于选择哪款防火墙的建议只是要确信你用了一个功能强大的防火墙。转载于:https://www.cnblogs.com/airoot/p/4131855.html