近期在解决一个问题,在我们的沙箱中IE不能上网
现象:
IE不能上网。输入www.baidu.com 提示:不能查找到DNS。也不能ping 通
其它浏览器上网没有问题(SG浏览器,Chrome ,firefox,猎豹,360)
为什么IE不能上网呢?
解决:
在应用层挂调试IE,在ws2_32!socket 下断点。发现 socket 不能创建成功。然后发现首先须要訪问 qurl.f.360.cn ,然后再訪问www.baidu.com
那么难道我訪问网址须要经过qurl.f.360.cn过滤么?而qurl.f.360.cn 域名解析不成功然后就不能上网么?在ws2_32!socket 上继续追踪
在内核模式调试。最后定位的栈
kd> kbn
# RetAddr : Args to Child : Call Site
00 fffff880`0505f14c : 00000000`00000000 00000000`000007a0 fffffa80`02894010 00000000`00000018 : afd! ?
? ::NNGAKEGL::`string'+0x1b1a
01 fffff880`04c20ed7 : 00000000`000007a0 00000000`000007a0 00000000`00000000 00000000`00000000 : afd!AfdDispatch+0x6c
02 fffff880`04c20095 : 00000000`00000010 00000000`00000000 fffff880`021776d8 fffffa80`02c49710 : 360AntiHacker64+0x2ed7
03 fffff800`041d9477 : 00000000`00000005 fffff800`041d8ed0 fffffa80`05600870 fffffa80`02c497a8 : 360AntiHacker64+0x2095
04 fffff800`041cf764 : fffffa80`035d23b0 00000000`00000000 fffffa80`035f1360 00000000`00000001 : nt!IopParseDevice+0x5a7
05 fffff800`041d4876 : fffffa80`035f1360 fffff880`021779f0 fffffa80`00000042 fffffa80`02548820 : nt!ObpLookupObjectName+0x585
06 fffff800`041db587 : 00000000`00000000 00000000`00000003 00000000`00000001 00000000`00000000 : nt!ObOpenObjectByName+0x306
07 fffff800`041e5198 : 00000000`067ee158 00000000`c0140000 00000000`00000000 00000000`067ee180 : nt!IopCreateFile+0x2b7
08 fffff800`03ed8153 : fffff880`02177c60 fffffa80`03867500 fffff880`02177bb8 00000000`00000000 : nt!NtCreateFile+0x78
09 00000000`76ff040a : 000007fe`fc502747 00000000`0532e1f0 00000000`00000000 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x13
0a 000007fe`fc502747 : 00000000`0532e1f0 00000000`00000000 00000000`00000000 00000000`0052ba80 : ntdll!ZwCreateFile+0xa
0b 000007fe`fc503874 : 00630069`004d005c 006f0073`006f0072 0057005c`00740066 00000000`067ee320 : mswsock!SockSocket+0x502
0c 000007fe`fdb81fe2 : 00000000`00000000 00000000`004c3f90 00000000`00000002 00000000`00000000 : mswsock!WSPSocket+0x23a
0d 000007fe`fdb83600 : 00000004`00000017 000007fe`00000002 00000000`00000000 00000000`00000000 : ws2_32!WSASocketW+0x112
0e 000007fe`fdb84b60 : 000007fe`00000002 00000000`05309f70 00000000`00000000 00000000`004a6ea0 : ws2_32!GetProtocolStateForFamily+0x7c
0f 000007fe`fdb83332 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`067ee5f4 : ws2_32!LookupAddressForName+0x100
10 000007fe`fdb82d28 : 00000000`00000000 00000000`00000000 00000000`0050b620 000007fe`fd7a3b2c : ws2_32!GetAddrInfoW+0x232
11 000007fe`fd1b1845 : 00000000`00000000 00000000`067ee818 00000000`067ee838 00000000`00000000 : ws2_32!getaddrinfo+0x98
12 000007fe`fd1cfabb : 00000000`00000000 00000000`0050bec0 00000000`03d496c0 00000000`0050b620 : WININET!MyGetAddrWithTracing+0xca
13 000007fe`fd1b249b : 00000000`00549a50 00000000`00000000 00000000`00549a50 00000000`00000000 : WININET!CAddressList::ResolveHost_Fsm+0x3a6
从ws2_32 调用 getaddrinfo 后经过 360AntiHacker64 然后再到tcpip
最后出错的栈
kd> kbn
# RetAddr : Args to Child : Call Site
00 fffff880`0184e33d : fffffa80`03940950 fffff880`01966128 00000000`00000001 fffff880`018602bf : tcpip!InetInspectCreateEndpoint+0x5e
01 fffff880`0184e24c : fffffa80`03940950 fffffa80`037f3d70 fffffa80`02d6d930 00000000`000007ff : tcpip!UdpCreateEndpointWorkQueueRoutine+0xad
02 fffff880`0184e3e9 : 00000000`00000011 fffffa80`025e78c0 fffffa80`03612c60 fffff880`0184e3b0 : tcpip!UdpCreateEndpoint+0x1ac
03 fffff880`0504ee17 : fffff8a0`098abde0 fffffa80`025e78c0 fffffa80`03612c60 fffffa80`026e1530 : tcpip!UdpTlProviderEndpoint+0x39
04 fffff880`0505f14c : 00000000`00000000 00000000`000007a0 fffffa80`026e1530 00000000`00000018 : afd! ?? ::NNGAKEGL::`string'+0x1b1a
05 fffff880`04c20ed7 : 00000000`000007a0 00000000`000007a0 00000000`00000000 00000000`00000000 : afd!AfdDispatch+0x6c
06 fffff880`04c20095 : 00000000`00000010 00000000`00000000 fffff880`040806d8 fffffa80`04f25d00 : 360AntiHacker64+0x2ed7
07 fffff800`041d9477 : 00000000`00000005 fffff800`041d8ed0 fffffa80`027ec9c0 fffffa80`04f25d98 : 360AntiHacker64+0x2095
08 fffff800`041cf764 : fffffa80`035d23b0 00000000`00000000 fffffa80`042c8760 00000000`00000001 : nt!IopParseDevice+0x5a7
09 fffff800`041d4876 : fffffa80`042c8760 fffff880`040809f0 00000000`00000042 fffffa80`02548820 : nt!ObpLookupObjectName+0x585
0a fffff800`041db587 : 00000000`00000000 00000000`00000003 00000000`00000001 00000000`00000000 : nt!ObOpenObjectByName+0x306
0b fffff800`041e5198 : 00000000`0647da68 00000000`c0140000 00000000`00000000 00000000`0647da90 : nt!IopCreateFile+0x2b7
0c fffff800`03ed8153 : fffff880`04080c60 fffffa80`03867500 fffff880`04080bb8 00000000`00000000 : nt!NtCreateFile+0x78
0d 00000000`76ff040a : 000007fe`fc502747 00000000`0532efb0 00000000`00000000 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x13
0e 000007fe`fc502747 : 00000000`0532efb0 00000000`00000000 00000000`00000000 00000000`0052ba80 : ntdll!ZwCreateFile+0xa
0f 000007fe`fc503874 : 00630069`004d005c 006f0073`006f0072 0057005c`00740066 00000000`0647dc30 : mswsock!SockSocket+0x502
10 000007fe`fdb81fe2 : 00000000`00000000 00000000`004c3f90 00000000`00000002 00000000`00000000 : mswsock!WSPSocket+0x23a
11 000007fe`fdb83600 : 00000004`00000017 00000000`00000002 00000000`00000000 00000000`00000000 : ws2_32!WSASocketW+0x112
12 000007fe`fdb84b60 : 000007fe`00000002 00000000`03d47f60 00000000`00000000 00000000`004a6ea0 : ws2_32!GetProtocolStateForFamily+0x7c
13 000007fe`fdb83332 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`0647df04 : ws2_32!LookupAddressForName+0x100
tcpip!WfpAleCaptureSecurityInformation
WfpAlepLookupProcessInformation 函数的代码:
.text:0000000000068EB0 mov [rsp+arg_0], rbx
.text:0000000000068EB5 push rdi
.text:0000000000068EB6 sub rsp, 40h
.text:0000000000068EBA mov rdx, [rdx]
.text:0000000000068EBD mov rbx, r8
.text:0000000000068EC0 mov rdi, rcx
.text:0000000000068EC3 test rdx, rdx
.text:0000000000068EC6 jz loc_9894A
.text:0000000000068ECC
.text:0000000000068ECC loc_68ECC: ; CODE XREF: WfpAlepLookupProcessInformation+2FA9Ej
.text:0000000000068ECC lea r8, [rsp+48h+var_28]
.text:0000000000068ED1 lea rcx, gAleMasterHashTable
.text:0000000000068ED8 call cs:__imp_RtlLookupEntryHashTable
.text:0000000000068EDE test rax, rax
.text:0000000000068EE1 jz loc_9896E
.text:0000000000068EE7
.text:0000000000068EE7 loc_68EE7: ; CODE XREF: WfpAlepLookupProcessInformation+2FAB8j
.text:0000000000068EE7 add rax, 0FFFFFFFFFFFFFFB8h
.text:0000000000068EEB cmp [rax], rdi
.text:0000000000068EEE jnz loc_98953
.text:0000000000068EF4 mov [rbx], rax
.text:0000000000068EF7 xor eax, eax
.text:0000000000068EF9
.text:0000000000068EF9 loc_68EF9: ; CODE XREF: WfpAlepLookupProcessInformation+2FAD9j
.text:0000000000068EF9 mov rbx, [rsp+48h+arg_0]
.text:0000000000068EFE add rsp, 40h
.text:0000000000068F02 pop rdi
.text:0000000000068F03 retn
最后 call cs:__imp_RtlLookupEntryHashTable 返回 0 ,出错。可是为何出错还是一头雾水
究竟是360AntiHacker64中做了什么么?逆向在360AntiHacker64 没有文件操作的痕迹。
那么究竟是否是360AntiHacker64有问题呢?
使用U盘启动。然后改动360全部的exe 的名字,全部的sys都改名。IE能上网了。
然后将360AntiHacker64.sys 保留 也能上网,再实验将360Box64.sys保留,问题出现了。而且沙箱初始化过程非常慢。
由于我们的沙箱和360沙箱用的都是minifilter 文件过滤技术。因此假设一个文件的訪问,比方
CreateFile --->我们的驱动--->360box64.sys--->ntfs驱动
或者CreateFile --->360box64.sys--->我们的驱动-->ntfs驱动
那么谁在前呢?注冊表中 Altitude 决定的 360box64为 : 382310 我们的为140000。我们的驱动在后面执行
当我把此驱动的Altitude 改动为382311 ,重新启动后。OK
由于同为文件过滤驱动,你重定向后的路径须要传递给下个驱动。而下个驱动怎么操作不知道,是否处理也不知道,是否360box64 对IE的文件操作进行了过滤也没有进行深究。
当中还发生了一些插曲:
1 观察驱动之间的通讯。都是构造IRP然后调用IofCallDriver
2 调用其它驱动中的函数,找到其它驱动的DeviceObject 然后获得Device扩展。然后使用当中的函数指针
3 驱动和应用层通讯居然使用物理内存映射到虚拟内存然后和应用层共享
4 在进程被杀掉后,进程的thread都被释放可是进程并没有消失。仅仅是在人物管理器中不见了。
比方讲360AntiHacker64改名后,被改动了回来。所以干脆把exe和sys干脆都改名字,省着有些保护程序碍事。
找到问题定位问题是非常费事的事情。改动就简单多了。