एंड्रॉइड पैकेट फ़िल्टर (एपीएफ) रनटाइम पर फ्रेमवर्क को हार्डवेयर पैकेट फ़िल्टरिंग तर्क को नियंत्रित करने देता है। यह सिस्टम को हार्डवेयर में पैकेट गिराकर बिजली बचाने की सुविधा देता है, जबकि एंड्रॉइड फ्रेमवर्क को नेटवर्क स्थितियों के आधार पर रनटाइम पर फ़िल्टरिंग नियमों को बदलने की अनुमति देता है।
एपीएफ सिंहावलोकन
एपीएफ में दो मुख्य घटक होते हैं:
- एपीएफ दुभाषिया नेटवर्किंग हार्डवेयर (आमतौर पर, वाई-फाई चिपसेट) पर चलता है। एपीएफ दुभाषिया हार्डवेयर द्वारा प्राप्त पैकेटों पर एपीएफ बाइटकोड चलाता है और निर्णय लेता है कि उन्हें स्वीकार करना है या छोड़ना है।
- एपीएफ प्रोग्राम जेनरेशन कोड मुख्य सीपीयू पर चलता है। कोड नेटवर्क और डिवाइस स्थिति के अनुसार एपीएफ प्रोग्राम बनाता और अपडेट करता है।
वाई-फाई एचएएल विधियां एंड्रॉइड फ्रेमवर्क को एपीएफ प्रोग्राम बाइटकोड स्थापित करने और वर्तमान काउंटरों को पढ़ने की अनुमति देती हैं। नेटवर्क स्टैक मेनलाइन मॉड्यूल एपीएफ चलने के दौरान किसी भी समय एपीएफ प्रोग्राम बाइटकोड को अपडेट कर सकता है।
कई एपीएफ फ़िल्टर लागू किए गए हैं। उदाहरण के लिए, एपीएफ में अस्वीकृत ईथरटाइप को हटाने के लिए फिल्टर, आईपीवी 6 राउटर विज्ञापन (आरए) पैकेट को फिल्टर करना, मल्टीकास्ट लॉक न होने पर मल्टीकास्ट और ब्रॉडकास्ट ट्रैफिक को फिल्टर करना, अन्य होस्ट के लिए डीएचसीपी पैकेट को छोड़ना और अनचाहे एड्रेस रिजोल्यूशन प्रोटोकॉल (एआरपी) को छोड़ना शामिल है। और (पड़ोसी खोज) एनडी पैकेट। फ़िल्टर की पूरी सूची ApfFilter
में परिभाषित की गई है।
क्योंकि एपीएफ प्रोग्राम जेनरेशन कोड नेटवर्क स्टैक मॉड्यूल का हिस्सा है, फ़िल्टरिंग लॉजिक को अपडेट किया जा सकता है, और मासिक मेनलाइन अपडेट के माध्यम से नए फ़िल्टर जोड़े जा सकते हैं।
एपीएफ एकीकरण
APF API को apf_interpreter.h
में परिभाषित किया गया है। वाई-फ़ाई फ़र्मवेयर कोड यह निर्धारित करने के लिए int accept_packet()
को कॉल करता है कि पैकेट को छोड़ा जाना चाहिए (शून्य रिटर्न मान) या पास किया जाना चाहिए (नॉनज़ेरो रिटर्न मान)। एपीएफ निर्देश परिवर्तनीय लंबाई के हैं। प्रत्येक निर्देश की लंबाई कम से कम एक बाइट है। APF निर्देश कोड apf.h
में परिभाषित हैं।
एपीएफ समर्पित मेमोरी पर निर्भर करता है। मेमोरी का उपयोग एपीएफ प्रोग्राम और डेटा स्टोरेज दोनों के लिए किया जाता है, और एपीएफ एचएएल तरीकों को छोड़कर मेमोरी को चिपसेट द्वारा साफ़ या लिखा नहीं जाना चाहिए। एपीएफ बाइटकोड स्वीकृत और गिराए गए पैकेटों के लिए काउंटरों को संग्रहीत करने के लिए डेटा भंडारण का उपयोग करता है। डेटा क्षेत्र को एंड्रॉइड फ्रेमवर्क से पढ़ा जा सकता है। एपीएफ के लिए उपलब्ध मेमोरी की न्यूनतम मात्रा 1024 बाइट्स होनी चाहिए।
एपीएफ डीबग करें
यह जांचने के लिए कि डिवाइस पर एपीएफ सक्षम है या नहीं, वर्तमान प्रोग्राम प्रदर्शित करें, और वर्तमान काउंटर दिखाएं, adb shell dumpsys network_stack
कमांड चलाएं। इस आदेश का एक उदाहरण निम्नलिखित है:
adb shell dumpsys network_stack
......
IpClient.wlan0 APF dump:
Capabilities: ApfCapabilities{version: 4, maxSize: 4096, format: 1}
......
Last program:
6bfcb03a01b8120c6b9494026506006b907c025e88a27c025988a47c025488b87c024f88cd7c024a88e17c024588e384004408066a0e6bdca4022b000600010800060412147a1e016bd884021f00021a1c6b8c7c021c0000686bd4a402080006ffffffffffff6a266bbca402010004c0a801eb6bf87401f6120c84005f08000a17821f1112149c00181fffab0d2a108211446a3239a20506c2fc393057dd6bf47401cb0a1e52f06bac7c01c600e06bb41a1e7e000001b9ffffffff6bb07e000001aec0a801ff6be868a4019a0006ffffffffffff6bb874019b6bf07401907c001386dd686bd0a4017d0006ffffffffffff6bc874017e0a147a0e3a6b980a267c017000ff6be07401650a366ba87c016200858219886a26a2050fff02000000000000000000000000006ba4740146aa0e84013700e6aa0f8c0130006068a4011b000f33330000000184c9b26aed4c86dd606a12a2f02600b03afffe8000000000000086c9b2fffe6aed4cff02000000000000000000000000000186006a3aa2e9024000123c92e4606a3ea2d70800000000000000006a56a2ce04030440c01a5a92c9601a5e92c4606a62a2bb04000000006a66a2a6102401fa00049c048400000000000000006a76a29d04030440c01a7a9298601a7e9293606c0082a28904000000006c0086a27310fdfd9ed67950000400000000000000006c0096a2690418033c001a9a9264606c009ea24e102401fa00049c048000000000000000006c00aea24404180330001ab2923f606c00b6a22910fdfd9ed67950000000000000000000006c00c6a21f04190300001aca921a606c00cea20410fdfd9ed67950000400000000000000016bc472086be4b03a01b87206b03a01b87201
APF packet counters:
TOTAL_PACKETS: 469
PASSED_DHCP: 4
PASSED_IPV4: 65
PASSED_IPV6_NON_ICMP: 64
PASSED_IPV4_UNICAST: 64
PASSED_IPV6_ICMP: 223
PASSED_IPV6_UNICAST_NON_ICMP: 6
PASSED_ARP_UNICAST_REPLY: 4
PASSED_NON_IP_UNICAST: 1
DROPPED_RA: 4
DROPPED_IPV4_BROADCAST_ADDR: 7
DROPPED_IPV4_BROADCAST_NET: 27
इस उदाहरण के लिए adb shell dumpsys network_stack
कमांड के आउटपुट में निम्नलिखित शामिल हैं:
-
ApfCapabilities{version: 4, maxSize: 4096, format: 1}
: इसका मतलब है कि वाई-फाई चिप्स एपीएफ (संस्करण 4) का समर्थन करते हैं। -
Last program
: यह अनुभाग हेक्स स्ट्रिंग प्रारूप में नवीनतम स्थापित एपीएफ प्रोग्राम बाइनरी है। -
APF packet counters
: यह अनुभाग दिखाता है कि एपीएफ द्वारा कितने पैकेट पास या गिराए गए हैं और विशिष्ट कारण क्या हैं।
कोड को मानव-पठनीय असेंबलर भाषा में डिकोड और अलग करने के लिए, apf_disassembler
टूल का उपयोग करें। निष्पादन योग्य बाइनरी को संकलित करने के लिए, m apf_disassembler
कमांड चलाएँ। apf_disassembler
टूल का उपयोग कैसे करें इसका एक उदाहरण निम्नलिखित है।
echo "6bfcb03a01b8120c6b949401e906006b907c01e288a27c01dd88a47c01d888b87c01d388cd7c01ce88e17c01c988e384004008066a0e6bdca401af000600010800060412147a1e016bd88401a300021a1c6b8c7c01a00000686bd4a4018c0006ffffffffffff1a266bc07c018900006bf874017e120c84005408000a17821f1112149c00181fffab0d2a108211446a3239a205065a56483ac3146bf47401530a1e52f06bac7c014e00e06bb41a1e7e00000141ffffffff6be868a4012d0006ffffffffffff6bb874012e6bf07401237c001386dd686bd0a401100006ffffffffffff6bc87401110a147a0d3a6b980a267c010300ff6be072f90a366ba87af8858218886a26a2040fff02000000000000000000000000006ba472ddaa0e82d0aeaa0f8c00c9025868a2b60f5a56483ac3140c8126f3895186dd606a12a28b2600783afffe8000000000000002005efffe00026fff02000000000000000000000000000186006a3aa284024000123c94007d02586a3ea2700800000000000000006a56a26704190500001a5a94006002586a5ea23b2020014860486000000000000000006464200148604860000000000000000000646a7ea23204030440c01a8294002b02581a8694002402586c008aa21a04000000006c008ea204102a0079e10abcf60500000000000000006bc472086be4b03a01b87206b03a01b87201" | out/host/linux-x86/bin/apf_disassembler
0: li r1, -4
2: lddw r0, [r1+0]
3: add r0, 1
5: stdw r0, [r1+0]
6: ldh r0, [12]
8: li r1, -108
10: jlt r0, 0x600, 504
15: li r1, -112
17: jeq r0, 0x88a2, 504
22: jeq r0, 0x88a4, 504
27: jeq r0, 0x88b8, 504
32: jeq r0, 0x88cd, 504
37: jeq r0, 0x88e1, 504
42: jeq r0, 0x88e3, 504
47: jne r0, 0x806, 116
......
एपीएफ परिणाम ऑफ़लाइन जांचने के लिए, apf_run
टूल का उपयोग करें। निष्पादन योग्य बाइनरी को संकलित करने के लिए, m apf_run
कमांड चलाएँ। निम्नलिखित एक उदाहरण है कि apf_run
कमांड का उपयोग करके एकल पैकेट की जांच कैसे करें।
कच्चे पैकेट की हेक्स बाइनरी स्ट्रिंग प्रस्तुति प्रदान करने के लिए --packet
विकल्प का उपयोग करें। डेटा क्षेत्र की हेक्स बाइनरी स्ट्रिंग प्रदान करने के लिए, जिसका उपयोग एपीएफ काउंटर को स्टोर करने के लिए किया जाता है, --data option
उपयोग करें। क्योंकि प्रत्येक काउंटर 4 बाइट लंबा है, डेटा क्षेत्र इतना लंबा होना चाहिए कि यह सुनिश्चित हो सके कि कोई बफर ओवरफ्लो न हो।
out/host/linux-x86/bin/apf_run --program 6bfcb03a01b8120c6b9494010c06006b907c010588a27c010088a47c00fb88b87c00f688cd7c00f188e17c00ec88e384003908066a0e6bdca2d40600010800060412147a18016bd882ca021a1c6b8c7ac900686bd4a2b706ffffffffffff6a266bbca2b204c0a814656bf872a8120c84005808000a17821e1112149c00171fffab0d2a108210446a3239a204064651dbcc88ff6bf4727e0a1e52f06bac7a7be06bb41a1e7e0000006effffffff6bb07e00000063c0a814ff6be868a25106ffffffffffff6bb872536bf072497c001086dd686bd0a23806ffffffffffff6bc8723a0a147a0b3a6b980a267a2eff6be072240a366ba87a23858218886a26a2040fff02000000000000000000000000006ba472086be4b03a01b87206b03a01b87201 --packet 5ebcd79a8f0dc244efaab81408060001080006040002c244efaab814c0a8ca1e5ebcd79a8f0d --data 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Packet passed
Data: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000001
Tcpdump द्वारा ली गई pcap फ़ाइल के विरुद्ध APF परिणामों की जाँच करने के लिए, apf_run
कमांड का उपयोग निम्नानुसार करें:
out/host/linux-x86/bin/apf_run --program 6bfcb03a01b8120c6b989401df06006b947c01d888a27c01d388a47c01ce88b87c01c988cd7c01c488e17c01bf88e384004408066a0e6bdca401a5000600010800060412147a1e016bd884019900021a1c6b907c01960000686bd4a401820006ffffffffffff6a266bc0a4017b0004c0a82b056bf874017084005f08000a17821f1112149c00181fffab0d2a108211446a3239a20506fabe589435936bf47401470a1e52f06bb07c014200e06bb81a1e7e00000135ffffffff6bb47e0000012ac0a82bff6be868a401160006ffffffffffff6bbc7401176bf074010c7c001086dd686bd0a2fb06ffffffffffff6bcc72fd0a147a0b3a6b9c0a267af1ff6be072e70a366bac7ae6858218886a26a2040fff02000000000000000000000000006ba872cbaa0e82be8eaa0f8c00b7025868a2a40ffabe5894359352a9874d08aa86dd606a12a2792600583afffe80000000000000f7d4e8ccd81ddb43fe80000000000000f8be58fffe94359386006a3aa272024108123c94006b02586a3ea25e0800000000000000006a56a25504030440c01a5a94004e02581a5e94004702586a62a23e04000000006a66a229102409891f9a26ae6d00000000000000006a76a22004190300001a7a94001902586a7ea204102409891f9a26ae6dba98e781ca9ef9ba6bc872086be4b03a01b87206b03a01b87201 --pcap apf.pcap --data 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
37 packets dropped
1733 packets passed
Data: 00000000000000000000000000000000000000000200000005000000000000000000000002000000000000001b000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000689000000000000003c00000000000000000000000000000000000006ea