2017-09-10 2 views
0

ich ein Netzwerk Kernel-Erweiterung auf Mac-Code, wie folgt :, die funcation proxy_tcp_unregistered, proxy_tcp_attach sind proxy_tcp_detach leer funcation, die nichts tunNetzwerk Kernel Extensions Fall Mac Kernel Panic

const static struct sflt_filter tcp_filter = 
{ 
    PROXY_TCP_FILTER_HANDLE, 
    SFLT_GLOBAL, 
    BUNDLE_NAME, 
    proxy_tcp_unregistered, //do nothing 
    proxy_tcp_attach,  //do nothing 
    proxy_tcp_detach,  //do nothing 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
    NULL 
}; 

kern_return_t kerntest_start(kmod_info_t * ki, void *d) 
{ 
    sflt_register(&tcp_filter, PF_INET, SOCK_STREAM, IPPROTO_TCP); 
    return KERN_SUCCESS; 
} 

kern_return_t kerntest_stop(kmod_info_t *ki, void *d) 
{ 
    sflt_unregister(PROXY_TCP_FILTER_HANDLE); 
    return KERN_SUCCESS; 
} 

Und eine Shell verwenden, um zu testen nach Belastung etwa 50 mal, entladen (kextload und kextunload), passierte der Mac Kernel Panic:

*** Panic Report *** 
panic(cpu 3 caller 0xffffff8009a065ea): Kernel trap at 0xffffff7f8c775ba0, type 14=page fault, registers: 
.... 
Fault CR2: 0xffffff7f8c775ba0, Error code: 0x0000000000000010, Fault CPU: 0x3, PL: 0 

Backtrace (CPU 3), Frame : Return Address 
..... 
     Kernel Extensions in backtrace: 
     xxxx.xxxx.proxy.hook(1.0)[7A521823-D1CF-353E-93CA-0345CD6F5454]@0xffffff7f8c771000->0xffffff7f8c777fff 
      kmod dependency scan stopped due to missing dependency page: 0xc0ffee570a4457da 

BSD process name corresponding to current thread: kernel_task 

Mac OS version: 
16B2555 

Kernel version: 
Darwin Kernel Version 16.1.0: Thu Oct 13 21:26:57 PDT 2016; root:xnu-3789.21.3~60/RELEASE_X86_64 
Kernel UUID: 8941AC1C-B084-37DE-8A34-4CE638C5CFC9 
Kernel slide:  0x0000000009600000 
... 

System uptime in nanoseconds: 28211489690166 
last loaded kext at 28211416923440: com.test.kextext 1.0 (addr 0xffffff7f8c778000, size 40960) 
last unloaded kext at 28211489331506: com.test.kextext 1.0 (addr 0xffffff7f8c771000, size 28672) 
loaded kexts: 
com.test.kextext 1.0 
com.apple.filesystems.smbfs 3.1 

Was ich zu tun haben sollte damit umgehen, ist es nicht passiert die ganze Zeit.

Antwort

1

Wenn man sich die Dokumentation sucht sflt_unregister, werden Sie 2 Dinge bemerken:

1:

Hebt die Registrierung einen Socket-Filter. Dadurch wird der Socket-Filter nicht von allen Sockeln getrennt, an die er angeschlossen werden kann, unter der Zeit, es wird nur verhindert, dass der Socket-Filter an alle neuen Sockets angeschlossen wird .

Die Implikation davon ist, dass Ihre Rückrufe immer noch aufgerufen werden können, nachdem sflt_unregister zurückgibt. Sie müssen alle Sockets, die möglicherweise noch an Ihrem Filter angebracht sind, ordnungsgemäß bereinigen, bevor Sie zulassen, dass der Kext entladen wird.

2:

Returns: 0 auf Erfolg sonst die errno Fehler.

Sie sollten es wahrscheinlich nicht zulassen, den Kext zu entladen, wenn die Registrierung fehlschlägt. (Und ebenso, Sie sollten wahrscheinlich nicht einmal versuchen, einen Filter, für den Registrierung ursprünglich während Kext Start fehlgeschlagen zu registrieren.)

+0

Tanks, ich fand ein Mac Beispiel tcplognke, es zeigt, was Sie sagen, ist richtig. – waitianlou

Verwandte Themen