標籤:沙箱
最近在解決一個問題,在我們的沙箱中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 Site00 fffff880`0505f14c : 00000000`00000000 00000000`000007a0 fffffa80`02894010 00000000`00000018 : afd! ?? ::NNGAKEGL::`string‘+0x1b1a01 fffff880`04c20ed7 : 00000000`000007a0 00000000`000007a0 00000000`00000000 00000000`00000000 : afd!AfdDispatch+0x6c02 fffff880`04c20095 : 00000000`00000010 00000000`00000000 fffff880`021776d8 fffffa80`02c49710 : 360AntiHacker64+0x2ed703 fffff800`041d9477 : 00000000`00000005 fffff800`041d8ed0 fffffa80`05600870 fffffa80`02c497a8 : 360AntiHacker64+0x209504 fffff800`041cf764 : fffffa80`035d23b0 00000000`00000000 fffffa80`035f1360 00000000`00000001 : nt!IopParseDevice+0x5a705 fffff800`041d4876 : fffffa80`035f1360 fffff880`021779f0 fffffa80`00000042 fffffa80`02548820 : nt!ObpLookupObjectName+0x58506 fffff800`041db587 : 00000000`00000000 00000000`00000003 00000000`00000001 00000000`00000000 : nt!ObOpenObjectByName+0x30607 fffff800`041e5198 : 00000000`067ee158 00000000`c0140000 00000000`00000000 00000000`067ee180 : nt!IopCreateFile+0x2b708 fffff800`03ed8153 : fffff880`02177c60 fffffa80`03867500 fffff880`02177bb8 00000000`00000000 : nt!NtCreateFile+0x7809 00000000`76ff040a : 000007fe`fc502747 00000000`0532e1f0 00000000`00000000 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x130a 000007fe`fc502747 : 00000000`0532e1f0 00000000`00000000 00000000`00000000 00000000`0052ba80 : ntdll!ZwCreateFile+0xa0b 000007fe`fc503874 : 00630069`004d005c 006f0073`006f0072 0057005c`00740066 00000000`067ee320 : mswsock!SockSocket+0x5020c 000007fe`fdb81fe2 : 00000000`00000000 00000000`004c3f90 00000000`00000002 00000000`00000000 : mswsock!WSPSocket+0x23a0d 000007fe`fdb83600 : 00000004`00000017 000007fe`00000002 00000000`00000000 00000000`00000000 : ws2_32!WSASocketW+0x1120e 000007fe`fdb84b60 : 000007fe`00000002 00000000`05309f70 00000000`00000000 00000000`004a6ea0 : ws2_32!GetProtocolStateForFamily+0x7c0f 000007fe`fdb83332 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`067ee5f4 : ws2_32!LookupAddressForName+0x10010 000007fe`fdb82d28 : 00000000`00000000 00000000`00000000 00000000`0050b620 000007fe`fd7a3b2c : ws2_32!GetAddrInfoW+0x23211 000007fe`fd1b1845 : 00000000`00000000 00000000`067ee818 00000000`067ee838 00000000`00000000 : ws2_32!getaddrinfo+0x9812 000007fe`fd1cfabb : 00000000`00000000 00000000`0050bec0 00000000`03d496c0 00000000`0050b620 : WININET!MyGetAddrWithTracing+0xca13 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 Site00 fffff880`0184e33d : fffffa80`03940950 fffff880`01966128 00000000`00000001 fffff880`018602bf : tcpip!InetInspectCreateEndpoint+0x5e01 fffff880`0184e24c : fffffa80`03940950 fffffa80`037f3d70 fffffa80`02d6d930 00000000`000007ff : tcpip!UdpCreateEndpointWorkQueueRoutine+0xad02 fffff880`0184e3e9 : 00000000`00000011 fffffa80`025e78c0 fffffa80`03612c60 fffff880`0184e3b0 : tcpip!UdpCreateEndpoint+0x1ac03 fffff880`0504ee17 : fffff8a0`098abde0 fffffa80`025e78c0 fffffa80`03612c60 fffffa80`026e1530 : tcpip!UdpTlProviderEndpoint+0x3904 fffff880`0505f14c : 00000000`00000000 00000000`000007a0 fffffa80`026e1530 00000000`00000018 : afd! ?? ::NNGAKEGL::`string‘+0x1b1a05 fffff880`04c20ed7 : 00000000`000007a0 00000000`000007a0 00000000`00000000 00000000`00000000 : afd!AfdDispatch+0x6c06 fffff880`04c20095 : 00000000`00000010 00000000`00000000 fffff880`040806d8 fffffa80`04f25d00 : 360AntiHacker64+0x2ed707 fffff800`041d9477 : 00000000`00000005 fffff800`041d8ed0 fffffa80`027ec9c0 fffffa80`04f25d98 : 360AntiHacker64+0x209508 fffff800`041cf764 : fffffa80`035d23b0 00000000`00000000 fffffa80`042c8760 00000000`00000001 : nt!IopParseDevice+0x5a709 fffff800`041d4876 : fffffa80`042c8760 fffff880`040809f0 00000000`00000042 fffffa80`02548820 : nt!ObpLookupObjectName+0x5850a fffff800`041db587 : 00000000`00000000 00000000`00000003 00000000`00000001 00000000`00000000 : nt!ObOpenObjectByName+0x3060b fffff800`041e5198 : 00000000`0647da68 00000000`c0140000 00000000`00000000 00000000`0647da90 : nt!IopCreateFile+0x2b70c fffff800`03ed8153 : fffff880`04080c60 fffffa80`03867500 fffff880`04080bb8 00000000`00000000 : nt!NtCreateFile+0x780d 00000000`76ff040a : 000007fe`fc502747 00000000`0532efb0 00000000`00000000 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x130e 000007fe`fc502747 : 00000000`0532efb0 00000000`00000000 00000000`00000000 00000000`0052ba80 : ntdll!ZwCreateFile+0xa0f 000007fe`fc503874 : 00630069`004d005c 006f0073`006f0072 0057005c`00740066 00000000`0647dc30 : mswsock!SockSocket+0x50210 000007fe`fdb81fe2 : 00000000`00000000 00000000`004c3f90 00000000`00000002 00000000`00000000 : mswsock!WSPSocket+0x23a11 000007fe`fdb83600 : 00000004`00000017 00000000`00000002 00000000`00000000 00000000`00000000 : ws2_32!WSASocketW+0x11212 000007fe`fdb84b60 : 000007fe`00000002 00000000`03d47f60 00000000`00000000 00000000`004a6ea0 : ws2_32!GetProtocolStateForFamily+0x7c13 000007fe`fdb83332 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`0647df04 : ws2_32!LookupAddressForName+0x100tcpip!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有問題呢?使用隨身碟啟動,然後修改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乾脆都改名字,省著有些保護程式礙事。找到問題定位問題是很費事的事情,修改就簡單多了。