VpnService protect() эсвэл програмыг хасах: чиглүүлэлтийг юу засдаг вэ
Туннелийг зөөвөрлөх сокетыг хамгаалах эсвэл бүх програмыг хасах: таны Android VPN-д ямар хүрээ хэрэгтэйг тодорхойлох гурван нөхцөл.
Туннелийн өөрийнх нь пакетуудыг туннелээс гадуур байлгах хоёр арга бий: тээвэрлэлтийн сокетыг хамгаалах, эсвэл бүх програмыг VPN-ээс гаргах. Тэд өөр өөр асуудлыг шийддэг бөгөөд холбоход хялбар учраас илүү өргөнийг сонгох нь програмууд анзааралгүйгээр орон нутгийн сүлжээнд хандах боломж, хуваагдсан DNS-ээ алдах зам юм. Туннелээс гадуур үлдэх ёстой зүйлээс эхэлж, дараа нь үүнийг биелүүлэх хамгийн бага хүрээг сонго.
protect() туннелээс юуг арилгадаг вэ
VpnService.protect() нь сокет бүрийн дуудалт юм. Та түүнд туннелийг зөөвөрлөх сокет эсвэл дескрипторийг өгөхөд Android тэр сокетыг тэмдэглэж, түүний урсгал VPN интерфэйсийн оронд доорх сүлжээг ашиглана. Программын илгээх бусад бүх зүйл ердийн VPN замналаар үргэлжилнэ.
Яг энэ нарийн хүрээ нь гол санаа. Хамгаалагдсан сокет нь таны HTTP клиент нэрсийг хэрхэн шийдэх, аналитикийн дуудалтууд ямар интерфэйс ашиглах эсвэл дараа нээгдэх хоёр дахь холболтод юу тохиолдохыг өөрчлөхгүй.
Хүрээг тодорхойлох гурван нөхцөл
Эхний нөхцөл нь зөвхөн туннелийн тээвэрлэлт л гарч болох уу. Хэрэв програмын бусад урсгал VPN-ээр үргэлжлүүлэн гарах ёстой бол сокетын хамгаалалт зөв хүрээ юм. Хоёр дахь нөхцөл нь сокет үүсгэхийг та хянаж байгаа эсэх. Дотроо гүнзгий өөрийн сокетыг нээдэг сан танд protect() дуудах газар үлдээхгүй, хэрэв тэр hook санал болгохгүй эсвэл бэлэн сокет хүлээж авахгүй бол. Гурав дахь нөхцөл нь програм орон нутгийн сүлжээ эсвэл captive portal-д шууд хүрэх шаардлагатай эсэх бөгөөд энэ нь туннелийг амьд байлгахаас өөр шаардлага юм.
Програмыг addDisallowedApplication()-ээр хасах нь бүдүүн хэрэгсэл. Энэ нь програмын хийх бүх холболтыг VPN-ээс арилгана, таны шалгахыг хүссэн холболтуудыг оролцуулан, зарим төхөөрөмж дээр орон нутгийн илрүүлэлтийн зан төлөвийг ч өөрчилдөг.
Гурав дахь сонголт нь тээвэрлэлтийг сонгосон сүлжээнд холбох:bindProcessToNetwork() эсвэл сокетын түвшний сүлжээний бариулаар. Төхөөрөмж нэгэн зэрэг Wi-Fi болон гар утасны сүлжээтэй үед туннелийг тодорхой дээш гарцгаар явуулахыг хүсвэл энэ нь ашигтай.
Туннель үүсэж байх үед нь дууд
Дууд protect() туннелийг үүсгэдэг ижил блокт,connect() эсвэл send()-ээс өмнө. Хэрэв дуудалт false буцаавал сокетыг хааж, тохиргоог бүтэлгүйтүүл; үргэлжлүүлбэл пакетууд нь таны өөрийн интерфэйс рүү дахин орж болох тээвэрлэлт танд үлдэнэ.
Хэлбэр нь нэг газар байлгахад хангалттай жижиг:
DatagramSocket transport = new DatagramSocket();
if (!protect(transport)) {
transport.close();
throw new IOException("transport not protected");
}
transport.connect(serverAddress);Энд гурван нарийн зүйл хатдаг. Нэгд,boolean нь таны авах цорын ганц дохио, тиймээс бүтэлгүйтлийг цуцлагдсан зөвшөөрөл ба татгалзсан дуудалтыг ялгах хангалттай контексттой бүртгэ. Хоёрт,protect() сокетыг хамардаг, дескрипторын дугаарыг биш: сокетыг хааж, дараа нь мөн тэр бүхэл тоог өөр сокетод ашиглавал шинэ сокет хамгаалагдаагүй болно. Гуравт, native сан тээвэрлэлтийг нээх үед native код холбогдохоос өмнө дескрипторийг хамгаал, эс бөгөөс замнал аль хэдийн сонгогдсон байж болно.VpnService лавлагаа нь таны зорилтот API түвшин яг ямар хэт ачааллыг санал болгодогийг батлах газар юм.
Зөвхөн азтай замыг биш, хаагдсан замыг турш
Туннелийг өргөсөн байдалд шалга, учир нь хоёр зам зөвхөн тэр үед л ялгаатай байж болно. Хамгаалагдсан тээвэрлэлтээр нэг хүсэлт,protect() хэзээ ч дуудаагүй кодын замаас өөр нэг хүсэлт илгээж, алслагдсан төгсгөл юу харж байгааг харьцуул: хамгаалагдсан холболт доорх сүлжээг эх сурвалж болгон ирэх ёстой, хамгаалагдаагүй нь туннелийн өөрийн хаягийг харуулж, туннелийн байт тоолуурыг хөдөлгөнө. Төхөөрөмж дээр ss эсвэл netstat радиогоос ямар нэг зүйл гарахаас өмнө мөн тэр хуваагдлыг харуулна.
Цуцлалтыг тусдаа турш, учир нь зөвшөөрлийн өөрчлөлт таны сокетын кодонд хүрэхгүйгээр интерфэйсийг нураана. VPN зөвшөөрлийг цуцал эсвэл үйлчилгээг зогсоож, тээвэрлэлтийг дахин барьж,protect() одоо ч true буцааж, зөвшөөрөл дахин өгөгдмөгц тээвэрлэлт дахин холбогддог гэдгийг батал.
Хэрэв хамгаалагдсан хүсэлт бүр туннелийг дагаж байвал хамгаалалтын дуудалт сокет аль хэдийн чиглүүлэгдсэний дараа болж байна. Үүнийг эрт рүү зөөж, дахин турш.
Шийдвэрийг тээвэрлэлтийн тохиргооны хажууд бичээрэй: аль сокетууд хамгаалагдсан, ямар програмын урсгал хасагдсан, хамгаалалт бүтэлгүйтэхэд програм юу хийдэг. Яг тэр мөр нь нэг тест унасан учраас хасалтыг бүх программ руу тэлэхээс хойшхи дахин зохион байгуулалтыг сэргийлдэг. Энэ нь дараагийн хүнд манифестыг урвуу инженерчлэлгүйгээр зорилгыг шалгах арга замыг ч өгдөг.