จะหลีกเลี่ยงวิศวกรรมย้อนกลับของไฟล์ APK ได้อย่างไร


764

ฉันกำลังพัฒนาแอปประมวลผลการชำระเงินสำหรับ Android และฉันต้องการป้องกันไม่ให้แฮ็กเกอร์เข้าถึงทรัพยากรทรัพย์สินหรือซอร์สโค้ดจากไฟล์APK

หากมีคนเปลี่ยนนามสกุล. apk ให้เป็น. zip พวกเขาสามารถคลายซิปและเข้าถึงทรัพยากรและทรัพย์สินทั้งหมดของแอปได้อย่างง่ายดายและใช้dex2jarและตัวถอดรหัสของ Java พวกเขายังสามารถเข้าถึงซอร์สโค้ดได้ มันง่ายมากที่จะทำวิศวกรรมย้อนกลับไฟล์ Android เอพีเค - สำหรับรายละเอียดเพิ่มเติมโปรดดูที่กองมากเกินคำถามวิศวกรรมย้อนกลับจากไฟล์ APK โครงการ

ฉันใช้เครื่องมือ Proguard ที่มาพร้อมกับ Android SDK เมื่อฉันแปลงไฟล์ APK ที่สร้างโดยใช้ keystore ที่ลงนามแล้วและ Proguard ฉันจะได้รับรหัสที่สับสน

อย่างไรก็ตามชื่อของส่วนประกอบ Android ยังคงไม่เปลี่ยนแปลงและบางรหัสเช่นรหัสคีย์ที่ใช้ในแอพยังคงไม่เปลี่ยนแปลง ตามเอกสารของ Proguard เครื่องมือไม่สามารถทำให้ส่วนประกอบสับสนที่กล่าวถึงในไฟล์มานิเฟสต์

ตอนนี้คำถามของฉันคือ:

  1. ฉันจะป้องกันวิศวกรรมย้อนกลับของ APK Android ได้อย่างสมบูรณ์ได้อย่างไร เป็นไปได้ไหม
  2. ฉันจะปกป้องทรัพยากรทรัพย์สินและซอร์สโค้ดทั้งหมดของแอปเพื่อให้แฮกเกอร์ไม่สามารถแฮ็คไฟล์ APK ในทางใดทางหนึ่งได้อย่างไร
  3. มีวิธีใดที่จะทำให้การแฮ็กยากขึ้นหรือเป็นไปไม่ได้ ฉันสามารถทำอะไรได้อีกเพื่อปกป้องซอร์สโค้ดในไฟล์ APK ของฉัน

120
ดูเหมือนว่าคุณอาจกำลังใช้ "ความปลอดภัยโดยความสับสน" หากรูปแบบการประมวลผลการชำระเงินของคุณขึ้นอยู่กับการดำเนินงานของลูกค้าที่เหลือเป็นความลับ
PeterJ

43
คุณได้พิจารณาการเขียนส่วนสำคัญของรหัสใน C / C ++ และเพิ่มพวกเขาเป็นห้องสมุดรวบรวม? พวกเขาสามารถถอดประกอบเป็นรหัสประกอบ แต่วิศวกรรมย้อนกลับห้องสมุดขนาดใหญ่จากการชุมนุมเป็นเวลานานมาก
Leo


60
ยินดีต้อนรับสู่ปัญหาพื้นฐานของการสร้างเนื้อหาดิจิทัลใด ๆ แฮกเกอร์สามารถลงไปถึงระดับการเรียนการสอนของเครื่องได้ดังนั้นหากคอมพิวเตอร์สามารถอ่านไฟล์ได้ก็จะสามารถแฮ็กเปิด / คัดลอกได้จำนวนของการทำให้งงงวยหรือ DRM ไม่สามารถหยุดแฮ็กเกอร์ที่กำหนดได้อย่างสมบูรณ์ หากคุณต้องการความปลอดภัยตรวจสอบให้แน่ใจว่าคีย์ส่วนตัวไม่เคยอยู่ในแหล่งที่มาและรู้ว่าในขั้นตอนการออกแบบที่แยกเฉพาะ (ระยะไกลและ / หรือฮาร์ดแวร์เฉพาะ) สามารถปกป้องพวกเขา
Keith

16
หมายเหตุว่าขึ้นอยู่กับสิ่งที่ app การประมวลผลการชำระเงินของคุณไม่อาจจะมีนโยบายกฎหมายและกฎระเบียบที่มีผลต่อแอปและ potetially จะเปิดเผยให้คุณโทษรุนแรง: ดูตาม PCI เริ่มต้นด้วยpcicomplianceguide.org/pcifaqs.php#11
bloopletech

คำตอบ:


372

 1. ฉันจะหลีกเลี่ยงวิศวกรรมย้อนกลับของ APK Android ได้อย่างสมบูรณ์ได้อย่างไร? เป็นไปได้ไหม

AFAIK ไม่มีเคล็ดลับใด ๆ สำหรับการหลีกเลี่ยงการย้อนกลับของวิศวกรรมอย่างสมบูรณ์

และยังได้เป็นอย่างดีกล่าวว่าโดย @inazaruk: สิ่งที่คุณทำกับโค้ดของคุณผู้บุกรุกที่มีศักยภาพสามารถที่จะเปลี่ยนในทางใดทางหนึ่งเธอหรือเขาพบว่ามันเป็นไปได้ คุณไม่สามารถป้องกันแอปพลิเคชันของคุณจากการถูกแก้ไข และการป้องกันใด ๆ ที่คุณใส่เข้าไปสามารถปิด / เปิดได้

 2. ฉันจะปกป้องทรัพยากรทรัพย์สินและซอร์สโค้ดทั้งหมดของแอปได้อย่างไรเพื่อให้แฮกเกอร์ไม่สามารถแฮ็คไฟล์ APK ในทางใดทางหนึ่ง

คุณสามารถทำเทคนิคต่าง ๆ เพื่อทำการแฮ็คให้ยากขึ้น ตัวอย่างเช่นใช้ obfuscation (ถ้าเป็นรหัส Java) สิ่งนี้มักทำให้วิศวกรรมย้อนกลับช้าลงอย่างมาก

 3. มีวิธีทำให้แฮ็คยากขึ้นหรือเป็นไปไม่ได้หรือไม่? ฉันสามารถทำอะไรได้อีกเพื่อปกป้องซอร์สโค้ดในไฟล์ APK ของฉัน

อย่างที่ทุกคนพูดและอย่างที่คุณอาจรู้ว่าไม่มีความปลอดภัย 100% แต่สถานที่ที่จะเริ่มต้นสำหรับ Android ที่ Google ได้สร้างไว้คือ ProGuard หากคุณมีตัวเลือกในการรวมไลบรารี่ที่แชร์คุณสามารถรวมโค้ดที่จำเป็นใน C ++ เพื่อตรวจสอบขนาดไฟล์การรวมกันและอื่น ๆ หากคุณต้องการเพิ่มไลบรารี่ภายนอกลงในโฟลเดอร์ไลบรารี่ของ APK ในทุกบิลด์ ตามคำแนะนำด้านล่าง

วางไลบรารีในพา ธ ไลบรารีเนทีฟซึ่งมีค่าเริ่มต้นเป็น "libs" ในโฟลเดอร์โครงการของคุณ ถ้าคุณสร้างรหัสพื้นเมืองสำหรับ'armeabi'เป้าหมายแล้ววางไว้ใต้libs / armeabi หากมันถูกสร้างขึ้นด้วยarmeabi-v7aให้วางไว้ใต้ libs / armeabi-v7a

<project>/libs/armeabi/libstuff.so

1
สำหรับธุรกรรมการชำระเงินฉันใช้มาตรฐาน ISO 8585 ตอนนี้สคีมาสำหรับมาตรฐานนี้อยู่ในคู่ของคีย์ - ค่าโดยใช้คอลเลกชัน HashMap ของ Java และเมื่อฉันทำวิศวกรรมย้อนกลับใน apk ฉันจะได้รับสคีมาทั้งหมด สัมผัสผ่านวิศวกรรมย้อนกลับ ข้อเสนอแนะล่าสุดของคุณในการแชร์ไลบรารีมีประโยชน์ในกรณีนี้หรือไม่? Doy คุณมีลิงค์ใด ๆ เพื่อให้ฉันได้สัมผัสกับไลบรารีที่แชร์ใน Android
sachin003

4
วิธีการเกี่ยวกับการเข้ารหัสสตริงของคุณในรหัสและถอดรหัสพวกเขาที่รันไทม์? หากคุณทำการถอดรหัสบนเซิร์ฟเวอร์ระยะไกลเช่นเดียวกับคนอื่น ๆ ที่แนะนำคุณจะไม่พบปัญหาว่ารหัสการถอดรหัสนั้นอยู่ในแหล่งที่มา
kutschkem

ใช่การเข้ารหัสเป็นวิธี แต่ก็ไม่แน่ใจว่าจะไม่แฮ็ก หากฉันกำลังเข้ารหัส String เพื่อถอดรหัสพวกเขาฉันต้องการหนึ่งรหัสที่ไม่ซ้ำกันในรหัส และถ้าใครสามารถถอดรหัสมันก็จะง่ายมากที่จะได้รับรหัสที่ไม่ซ้ำ
Bhavesh Patadiya

ทำไมคุณเพิ่มสิ่งที่แก้ไข มันปกติทั้งหมด
Mohammed Azharuddin Shaikh

@hotveryspicy: ใช่ตอนนี้ฉันได้ลบเครื่องหมาย "แก้ไข" ออกจากคำตอบฉันได้แก้ไขคำตอบของฉันเพราะเขาต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับวิธีแชร์ไลบรารีที่มีประโยชน์ในกรณีนี้
Bhavesh Patadiya

126

AFAIK คุณไม่สามารถป้องกันไฟล์ในไดเรกทอรี / res อีกต่อไปกว่าที่ได้รับการป้องกันในขณะนี้

อย่างไรก็ตามมีขั้นตอนที่คุณสามารถดำเนินการเพื่อปกป้องซอร์สโค้ดของคุณหรืออย่างน้อยมันจะทำอย่างไรถ้าไม่ใช่ทุกอย่าง

  1. ใช้เครื่องมือเช่น ProGuard สิ่งเหล่านี้จะทำให้รหัสของคุณสับสนและทำให้อ่านได้ยากขึ้นเมื่อ decompiled หากไม่สามารถทำได้
  2. ย้ายส่วนที่สำคัญที่สุดของบริการออกจากแอพและไปยังเว็บเซอร์เวอร์ซึ่งซ่อนอยู่หลังภาษาฝั่งเซิร์ฟเวอร์เช่น PHP ตัวอย่างเช่นหากคุณมีอัลกอริทึมที่จะนำคุณล้านดอลลาร์ในการเขียน เห็นได้ชัดว่าคุณไม่ต้องการให้คนอื่นขโมยแอปของคุณ ย้ายอัลกอริทึมและประมวลผลข้อมูลบนรีโมตเซิร์ฟเวอร์และใช้แอพเพื่อให้ข้อมูล หรือใช้ NDK เพื่อเขียนลงในไฟล์. so ซึ่งมีความเป็นไปได้น้อยที่จะถูกถอดรหัสกว่า apks ฉันไม่คิดว่าตัวถอดรหัสสำหรับไฟล์. so ยังคงมีอยู่ ณ ตอนนี้ (และแม้ว่ามันจะเป็นเช่นนั้นมันก็จะไม่ดีเท่าตัวถอดรหัส Java) นอกจากนี้ตามที่ @nikolay พูดถึงในความคิดเห็นคุณควรใช้ SSL เมื่อมีการโต้ตอบระหว่างเซิร์ฟเวอร์และอุปกรณ์
  3. เมื่อจัดเก็บค่าบนอุปกรณ์อย่าเก็บไว้ในรูปแบบดิบ ตัวอย่างเช่นหากคุณมีเกมและคุณกำลังจัดเก็บจำนวนเงินในสกุลเงินเกมที่ผู้ใช้มีใน SharedPreferences สมมติว่าเป็น10000เหรียญ แทนการบันทึกโดยตรงประหยัดโดยใช้ขั้นตอนวิธีการเช่น10000 ((currency*2)+1)/13ดังนั้นแทนที่จะ10000บันทึกไว้1538.53846154ใน SharedPreferences อย่างไรก็ตามตัวอย่างข้างต้นไม่สมบูรณ์แบบและคุณจะต้องทำงานเพื่อหาสมการที่จะไม่สูญเสียสกุลเงินไปยังข้อผิดพลาดในการปัดเศษเป็นต้น
  4. คุณสามารถทำสิ่งที่คล้ายกันสำหรับงานด้านเซิร์ฟเวอร์ ยกตัวอย่างเช่นลองใช้แอปประมวลผลการชำระเงินของคุณกัน $200สมมติว่าผู้ใช้มีการชำระเงินของ แทนการส่งดิบมูลค่าให้กับเซิร์ฟเวอร์ส่งชุดของขนาดเล็กที่กำหนดไว้ล่วงหน้าค่านิยมที่เพิ่มขึ้นเป็น$200 $200ตัวอย่างเช่นมีไฟล์หรือตารางบนเซิร์ฟเวอร์ของคุณที่เท่ากับคำที่มีค่า ดังนั้นขอบอกว่าCharlieสอดคล้องกับการ$47และการJohn $3ดังนั้นแทนที่จะส่ง$200คุณสามารถส่งCharlieสี่ครั้งและJohnสี่ครั้ง. บนเซิร์ฟเวอร์ตีความสิ่งที่พวกเขาหมายถึงและเพิ่มขึ้น วิธีนี้ป้องกันแฮกเกอร์จากการส่งค่าโดยพลการไปยังเซิร์ฟเวอร์ของคุณเนื่องจากพวกเขาไม่ทราบว่าคำใดตรงกับค่าใด เพื่อเป็นการเพิ่มความปลอดภัยคุณสามารถมีสมการคล้ายกับจุด 3 สำหรับเรื่องนี้ได้เช่นกันและเปลี่ยนคำหลักทุก ๆnวัน
  5. ในที่สุดคุณสามารถแทรกซอร์สโค้ดที่ไม่มีประโยชน์แบบสุ่มลงในแอปของคุณเพื่อให้แฮกเกอร์มองหาเข็มในกองหญ้า แทรกคลาสสุ่มที่มีตัวอย่างจากอินเทอร์เน็ตหรือเพียงแค่ฟังก์ชั่นสำหรับการคำนวณสิ่งต่าง ๆ เช่นลำดับฟีโบนักชี ตรวจสอบให้แน่ใจว่ามีการรวบรวมคลาสเหล่านี้ แต่ไม่ได้ใช้โดยฟังก์ชันการทำงานที่แท้จริงของแอพ เพิ่มคลาสที่ผิดเหล่านี้ให้เพียงพอและแฮ็กเกอร์อาจมีเวลายากในการค้นหารหัสจริงของคุณ

สรุปแล้วไม่มีทางที่จะปกป้องแอปของคุณได้ 100% คุณสามารถทำให้มันยากขึ้น แต่ไม่ใช่เป็นไปไม่ได้ เว็บเซิร์ฟเวอร์ของคุณอาจถูกบุกรุกแฮกเกอร์สามารถค้นหาคำหลักของคุณได้โดยการตรวจสอบจำนวนธุรกรรมและคำหลักที่คุณส่งไปแฮกเกอร์อาจพยายามไปถึงแหล่งที่มาอย่างระมัดระวังและค้นหาว่ารหัสใดเป็นตัวอย่าง

คุณสามารถต่อสู้กลับ แต่ไม่เคยชนะ


136
แทนที่จะใช้กลวิธีด้วยค่าที่คุณส่งไปยังเซิร์ฟเวอร์ของคุณให้ใช้ SSL และตรวจสอบใบรับรองเซิร์ฟเวอร์อย่างถูกต้อง การรักษาความปลอดภัยโดยความสับสนนั้นเป็นความคิดที่ไม่ดี
Nikolay Elenkov

48
คุณสามารถแทรกซอร์สโค้ดแบบไร้ประโยชน์ลงในแอปของคุณได้ สิ่งนี้ไม่สามารถช่วยได้จริงๆ สิ่งนี้จะขยายแอปพลิเคชันของคุณเท่านั้นในขณะที่ทำให้การบำรุงรักษายากขึ้นเช่นกัน
Anirudh Ramanathan

4
คุณสามารถปลอมใช้รหัสที่ไร้ประโยชน์และส่งข้อมูลไปยังเซิร์ฟเวอร์ที่จะทิ้งมัน การรักษาความปลอดภัยที่ผิดอาจเป็นไปได้ แต่ความเจ็บปวดในตูดสำหรับแฮ็กเกอร์ที่มีศักยภาพใช่มั้ย
เบอนัวต์ดัฟเช่

19
หากอัลกอริทึมของคุณมีค่าหนึ่งล้านดอลลาร์เพียงเพราะไม่มี decompiler สำหรับ.soไฟล์ไม่ได้หมายความว่าฉันไม่สามารถอ่านชุดประกอบได้ :) ส่วนใหญ่ตกอยู่ในกับดักเดียวกันเพียงแค่ทำให้งงงวยแทนที่จะปกป้องตัวเองอย่างเหมาะสม การทำให้งงงวยจะใช้งานได้ก็ต่อเมื่อมันไม่คุ้มค่ากับเวลาของผู้โจมตีในการติดตามดังนั้นถ้าคุณสร้างบางอย่างในเทคนิคเหล่านี้คุณควรที่จะหวังว่ามันจะไม่ได้รับความนิยมมิฉะนั้นคุณก็จะเมา ต้องการการเปลี่ยนแปลงครั้งใหญ่
Phoshi

23
ฉันไม่เข้าใจว่าทำไมคำตอบนี้จึงมีคะแนนสูง 3. และ 4. สำหรับคนที่โง่เง่าและจะไม่มีความปลอดภัยเลย
Matti Virkkunen

117

ไม่เคยมีประวัติในการคำนวณมาก่อนที่จะสามารถป้องกันการย้อนกลับของซอฟต์แวร์เมื่อคุณมอบสำเนาที่ใช้งานได้ให้แก่ผู้โจมตีของคุณ นอกจากนี้ในโอกาสส่วนใหญ่มันไม่เคยจะเป็นไปได้

ด้วยความเข้าใจดังกล่าวจึงมีทางออกที่ชัดเจน: อย่าให้ความลับกับผู้โจมตี แม้ว่าคุณจะไม่สามารถปกป้องเนื้อหาของ APK ของคุณได้ แต่สิ่งที่คุณสามารถป้องกันได้คือสิ่งที่คุณไม่ได้แจกจ่าย โดยทั่วไปนี่คือซอฟต์แวร์ฝั่งเซิร์ฟเวอร์ที่ใช้สำหรับสิ่งต่าง ๆ เช่นการเปิดใช้งานการชำระเงินการบังคับใช้กฎและรหัสฉ่ำ ๆ อื่น ๆ คุณสามารถปกป้องทรัพย์สินที่มีค่าได้โดยไม่เผยแพร่ใน APK ของคุณ ให้ตั้งค่าเซิร์ฟเวอร์ที่ตอบสนองคำขอจากแอปของคุณแทน "ใช้" เนื้อหา (สิ่งที่อาจหมายถึง) แล้วส่งผลลัพธ์กลับไปที่แอป หากโมเดลนี้ใช้ไม่ได้กับทรัพย์สินที่คุณมีอยู่ในใจคุณอาจต้องการคิดกลยุทธ์ใหม่

นอกจากนี้หากเป้าหมายหลักของคุณคือป้องกันการละเมิดลิขสิทธิ์แอพ : อย่าไปสนใจ คุณเสียเวลาและเงินไปกับปัญหานี้มากกว่ามาตรการป้องกันการละเมิดลิขสิทธิ์ที่อาจช่วยให้คุณประหยัดได้ ผลตอบแทนจากการลงทุนเพื่อแก้ไขปัญหานี้อยู่ในระดับต่ำจนไม่สามารถคิดได้


21
ย่อหน้าแรกคือคำตอบที่ดีที่สุด หากผู้โจมตีของคุณควบคุมฮาร์ดแวร์พวกเขาจะสามารถเอาชนะซอฟต์แวร์ของคุณได้อย่างใด สิ่งใดก็ตามที่จำเป็นต้องได้รับการปกป้องอย่างแท้จริงจะต้องอยู่บนฮาร์ดแวร์ที่คุณควบคุมมันเป็นเรื่องง่าย และย่อหน้าสุดท้ายเกี่ยวกับ ROI ก็เป็นเช่นเดียวกัน
Daniel Pryden

88

กฎข้อแรกของความปลอดภัยของแอพ:เครื่องใดก็ตามที่ผู้โจมตีได้รับสิทธิ์การเข้าถึงแบบฟิสิคัลหรืออิเลคทรอนิคส์แบบไม่ จำกัด ในตอนนี้จะเป็นของผู้โจมตีของคุณไม่ว่าจะอยู่ที่ไหนหรือจ่ายจริง

กฎข้อที่สองของความปลอดภัยของแอพ:ซอฟต์แวร์ใด ๆ ที่ปล่อยให้ขอบเขตทางกายภาพอยู่ภายในซึ่งผู้โจมตีไม่สามารถเจาะเข้าไปได้ในตอนนี้จะเป็นของผู้โจมตีของคุณไม่ว่าคุณจะใช้เวลาในการเข้ารหัสนานเท่าใดก็ตาม

กฎข้อที่สาม:ข้อมูลใด ๆ ที่ทำให้เกิดขอบเขตทางกายภาพแบบเดียวกันกับที่ผู้โจมตีไม่สามารถเจาะเข้าไปได้นั้นเป็นของผู้โจมตีของคุณไม่ว่ามันจะมีค่ากับคุณแค่ไหน

รากฐานของความปลอดภัยของเทคโนโลยีสารสนเทศนั้นตั้งอยู่บนหลักการพื้นฐานทั้งสามนี้ คอมพิวเตอร์ที่ปลอดภัยเพียงเครื่องเดียวเท่านั้นคือคอมพิวเตอร์ที่ถูกล็อคอยู่ในตู้นิรภัยภายในกรง Farraday ภายในกรงเหล็ก มีคอมพิวเตอร์ที่ใช้บริการส่วนใหญ่อยู่ในสถานะนี้ ปีละครั้ง (หรือน้อยกว่า) พวกเขาสร้างกุญแจส่วนตัวสำหรับผู้ออกใบรับรองหลักที่เชื่อถือได้ (หน้าโฮสต์ของพยานด้วยกล้องบันทึกทุกนิ้วของห้องที่พวกเขาอยู่)

ตอนนี้คอมพิวเตอร์ส่วนใหญ่ไม่ได้ใช้ภายใต้สภาพแวดล้อมประเภทนี้ พวกมันอยู่ในที่โล่งซึ่งเชื่อมต่อกับอินเทอร์เน็ตผ่านช่องวิทยุไร้สาย กล่าวโดยย่อคือพวกเขามีความเสี่ยงเช่นเดียวกับซอฟต์แวร์ของพวกเขา ดังนั้นจึงไม่น่าเชื่อถือ มีบางสิ่งที่คอมพิวเตอร์และซอฟต์แวร์ของพวกเขาจะต้องรู้หรือทำเพื่อให้มีประโยชน์ แต่ต้องระมัดระวังเพื่อให้แน่ใจว่าพวกเขาไม่สามารถรู้หรือทำพอที่จะทำให้เกิดความเสียหาย (อย่างน้อยก็ไม่ใช่ความเสียหายถาวรนอกขอบเขตของเครื่องเดียว )

คุณรู้ทั้งหมดนี้แล้ว นั่นเป็นสาเหตุที่คุณพยายามปกป้องรหัสของแอปพลิเคชันของคุณ แต่ปัญหาอยู่ที่นั้น เครื่องมือทำให้งงงวยสามารถทำให้รหัสเป็นระเบียบสำหรับมนุษย์ที่จะพยายามขุดผ่าน แต่โปรแกรมยังคงมีการเรียกใช้; นั่นหมายถึงการไหลตรรกะที่แท้จริงของแอพและข้อมูลที่ใช้จะไม่ได้รับผลกระทบจากความสับสน ด้วยความดื้อรั้นเล็กน้อยผู้โจมตีสามารถยกเลิกการทำให้งงงวยรหัสและไม่จำเป็นแม้แต่ในบางกรณีที่สิ่งที่เขามองไม่สามารถเป็นอย่างอื่นได้ แต่สิ่งที่เขากำลังมองหา

คุณควรพยายามทำให้มั่นใจว่าผู้โจมตีไม่สามารถทำอะไรกับรหัสของคุณได้ไม่ว่าเขาจะได้รับสำเนาที่ชัดเจนได้ง่ายเพียงใดก็ตาม นั่นหมายความว่าไม่มีความลับแบบเข้ารหัสเพราะความลับเหล่านั้นไม่เป็นความลับทันทีที่รหัสออกจากอาคารที่คุณพัฒนาขึ้น

คีย์ - ค่าเหล่านี้ที่คุณมีฮาร์ดโค้ดควรถูกลบออกจากซอร์สโค้ดของแอปพลิเคชันโดยสิ้นเชิง แต่ควรเป็นหนึ่งในสามแห่ง หน่วยความจำที่ระเหยได้บนอุปกรณ์ซึ่งเป็นเรื่องยาก (แต่ก็ยังเป็นไปไม่ได้) สำหรับผู้โจมตีที่จะได้รับสำเนาออฟไลน์ ถาวรในเซิร์ฟเวอร์คลัสเตอร์ที่คุณควบคุมการเข้าถึงด้วยกำปั้นเหล็ก; หรือในแหล่งข้อมูลที่สองที่ไม่เกี่ยวข้องกับอุปกรณ์หรือเซิร์ฟเวอร์ของคุณเช่นการ์ดจริงหรือในความทรงจำของผู้ใช้ของคุณ (ซึ่งหมายความว่าในที่สุดมันจะอยู่ในหน่วยความจำที่ระเหยได้

พิจารณาโครงร่างต่อไปนี้ ผู้ใช้ป้อนข้อมูลรับรองสำหรับแอปจากหน่วยความจำในอุปกรณ์ คุณต้องเชื่อมั่นว่าอุปกรณ์ของผู้ใช้นั้นยังไม่ได้รับอันตรายจาก keylogger หรือ Trojan; สิ่งที่ดีที่สุดที่คุณสามารถทำได้ในเรื่องนี้คือการใช้ความปลอดภัยแบบหลายปัจจัยโดยการจดจำข้อมูลที่ระบุตัวตนได้ยากเกี่ยวกับอุปกรณ์ที่ผู้ใช้ใช้ (MAC / IP, IMEI, ฯลฯ ) และให้ช่องทางเพิ่มเติมอย่างน้อยหนึ่งช่อง ความพยายามในการเข้าสู่ระบบบนอุปกรณ์ที่ไม่คุ้นเคยซึ่งสามารถตรวจสอบได้

ข้อมูลประจำตัวที่ป้อนครั้งเดียวจะสับสนโดยซอฟต์แวร์ไคลเอนต์ (ใช้แฮชที่ปลอดภัย) และข้อมูลประจำตัวของข้อความล้วนทิ้ง; พวกเขามีจุดประสงค์ ข้อมูลประจำตัวที่ยุ่งเหยิงจะถูกส่งผ่านช่องทางที่ปลอดภัยไปยังเซิร์ฟเวอร์ที่รับรองความถูกต้องซึ่งจะทำการแฮชอีกครั้งเพื่อสร้างข้อมูลที่ใช้ในการตรวจสอบความถูกต้องของการเข้าสู่ระบบ ด้วยวิธีนี้ลูกค้าไม่เคยรู้ว่าสิ่งที่จริงเมื่อเทียบกับค่าฐานข้อมูลเซิร์ฟเวอร์แอปไม่เคยรู้ข้อมูลประจำตัวของธรรมดาที่สิ่งที่ได้รับสำหรับการตรวจสอบความถูกต้องเซิร์ฟเวอร์ข้อมูลไม่เคยรู้ว่าข้อมูลที่เก็บไว้สำหรับการตรวจสอบ ตรงกลางเห็นซึ่งพูดไม่ชัดเท่านั้นแม้ว่าช่องทางที่ปลอดภัยถูกโจมตี

เมื่อตรวจสอบแล้วเซิร์ฟเวอร์จะส่งสัญญาณโทเค็นกลับไปที่ช่อง โทเค็นมีประโยชน์เฉพาะในเซสชั่นที่ปลอดภัยประกอบด้วยเสียงรบกวนแบบสุ่มหรือคัดลอกตัวระบุเซสชันและเข้ารหัส (และตรวจสอบได้) และแอปพลิเคชันไคลเอนต์จะต้องส่งโทเค็นนี้ในช่องทางเดียวกันไปยังเซิร์ฟเวอร์ ทำอะไรบางอย่าง. แอปพลิเคชันไคลเอนต์จะทำเช่นนี้หลายครั้งเพราะไม่สามารถทำสิ่งใด ๆ ที่เกี่ยวข้องกับเงินข้อมูลที่ละเอียดอ่อนหรือสิ่งอื่นใดที่อาจสร้างความเสียหายด้วยตัวเอง ต้องขอให้เซิร์ฟเวอร์ทำภารกิจนี้แทน แอปพลิเคชันไคลเอนต์จะไม่เขียนข้อมูลที่ละเอียดอ่อนใด ๆ ไปยังหน่วยความจำถาวรบนอุปกรณ์นั้นอย่างน้อยก็ไม่ใช่ข้อความธรรมดา ลูกค้าสามารถถามเซิร์ฟเวอร์ผ่านช่องทางที่ปลอดภัยสำหรับคีย์สมมาตรเพื่อเข้ารหัสข้อมูลในเครื่องใด ๆ ที่เซิร์ฟเวอร์จะจดจำ ในเซสชั่นในภายหลังลูกค้าสามารถขอเซิร์ฟเวอร์สำหรับคีย์เดียวกันเพื่อถอดรหัสข้อมูลเพื่อใช้ในหน่วยความจำที่ระเหยได้ ข้อมูลนั้นจะไม่เป็นเพียงสำเนาเท่านั้น ทุกสิ่งที่ลูกค้าจัดเก็บควรส่งในบางรูปแบบไปยังเซิร์ฟเวอร์

เห็นได้ชัดว่าสิ่งนี้ทำให้แอปพลิเคชันของคุณขึ้นอยู่กับการเข้าถึงอินเทอร์เน็ตเป็นอย่างมาก อุปกรณ์ไคลเอนต์ไม่สามารถทำหน้าที่พื้นฐานใด ๆ โดยไม่ต้องมีการเชื่อมต่อและการตรวจสอบความถูกต้องโดยเซิร์ฟเวอร์ ไม่แตกต่างจาก Facebook จริงๆ

ตอนนี้คอมพิวเตอร์ที่ผู้โจมตีต้องการคือเซิร์ฟเวอร์ของคุณเพราะไม่ใช่แอพ / อุปกรณ์ของลูกค้าเป็นสิ่งที่สามารถสร้างรายได้ให้กับเขาหรือทำให้คนอื่นเจ็บปวดสำหรับความเพลิดเพลินของเขา ไม่เป็นไร; คุณได้รับผลตอบแทนที่มากกว่าจากการใช้จ่ายเงินและความพยายามในการรักษาความปลอดภัยเซิร์ฟเวอร์มากกว่าการพยายามรักษาความปลอดภัยให้กับลูกค้าทั้งหมด เซิร์ฟเวอร์สามารถอยู่ด้านหลังไฟร์วอลล์ทุกชนิดและความปลอดภัยทางอิเล็กทรอนิกส์อื่น ๆ และนอกจากนี้ยังสามารถรักษาความปลอดภัยทางกายภาพหลังเหล็กคอนกรีตการเข้าถึงคีย์การ์ด / พินและการเฝ้าระวังวิดีโอตลอด 24 ชั่วโมง ผู้โจมตีของคุณจะต้องมีความซับซ้อนอย่างแท้จริงเพื่อเข้าถึงเซิร์ฟเวอร์ชนิดใด ๆ โดยตรงและคุณ (ควร) รู้เกี่ยวกับมันทันที

วิธีที่ดีที่สุดที่ผู้โจมตีสามารถทำได้คือขโมยโทรศัพท์และข้อมูลประจำตัวของผู้ใช้และล็อกอินเข้าสู่เซิร์ฟเวอร์ด้วยสิทธิ์ที่ จำกัด ของลูกค้า หากสิ่งนี้เกิดขึ้นเช่นเดียวกับการสูญเสียบัตรเครดิตผู้ใช้ที่ถูกกฎหมายควรได้รับคำสั่งให้โทรไปยังหมายเลข 800 (ควรจดจำได้ง่ายกว่าและไม่ใช่ด้านหลังของบัตรที่พวกเขาพกติดตัวไว้ในกระเป๋าเงินกระเป๋าสตางค์หรือกระเป๋าเอกสาร ถูกขโมยไปพร้อมกับอุปกรณ์พกพา) จากโทรศัพท์ทุกเครื่องที่พวกเขาสามารถเข้าถึงที่เชื่อมต่อโดยตรงกับบริการลูกค้าของคุณ พวกเขาระบุว่าโทรศัพท์ของพวกเขาถูกขโมยระบุตัวระบุพื้นฐานบางอย่างและบัญชีถูกล็อคธุรกรรมใด ๆ ที่ผู้โจมตีอาจได้รับการดำเนินการจะถูกย้อนกลับและผู้โจมตีกลับไปที่ช่องสี่เหลี่ยมหนึ่ง


1
คำตอบที่สมบูรณ์แบบ !! ฉันชอบวิธีของคุณในการรับข้อมูลจากเซิร์ฟเวอร์ด้วยโทเค็นที่เข้ารหัสบางส่วนฉันคิดว่านี่เป็นไปไม่ได้ที่จะถอดรหัสหลังจากนั้น
dharam

ฉันรู้ว่ามันช้าไปหน่อย แต่สิ่งที่เกี่ยวกับการเข้าถึงส่วนเซิร์ฟเวอร์ บริการอย่างเช่น Microsoft Azure ให้สิ่งนี้แก่คุณในการเข้าถึงเซิร์ฟเวอร์: MobileServiceClient mClient = new MobileServiceClient ("MobileServiceUrl", // แทนที่ด้วย URL ไซต์ "AppKey" ข้างต้น / แทนที่ด้วยรหัสแอปพลิเคชันนี้) และสวยมาก ๆ มีการเข้าถึงที่สามารถเข้าถึงเซิร์ฟเวอร์ของพวกเขาแก้ไขได้
edwinj

@edwinj - ไม่มีปัญหาในวิทยาการคอมพิวเตอร์ที่ไม่สามารถแก้ไขได้ด้วยการอ้อมอีกชั้นหนึ่ง ตัวอย่างข้อมูลของคุณให้แนวคิดพื้นฐานสำหรับการเข้าถึงบริการไคลเอ็นต์มือถือ Azure มันให้ระดับความปลอดภัยขั้นพื้นฐานต่อ "ไดรฟ์ bys" ของประตูหน้าของ Microsoft คุณสามารถเพิ่มเลเยอร์เพิ่มเติมเช่นต้องการคีย์เซสชัน (โดยทั่วไปคือโทเค็นที่เข้ารหัส) ในการเรียกใช้บริการใด ๆ และเพื่อรับคีย์นั้นพวกเขาจะต้องตรวจสอบสิทธิ์ด้วยการรวมกันของความรู้เกี่ยวกับข้อมูลประจำตัวและรูปแบบการเข้ารหัส
KeithS

1
หนึ่งในคำตอบที่ดีที่สุด
debo.stackoverflow

64

 1. ฉันจะหลีกเลี่ยงวิศวกรรมย้อนกลับของ APK Android ได้อย่างสมบูรณ์ได้อย่างไร? เป็นไปได้ไหม

มันเป็นไปไม่ได้

 2. ฉันจะปกป้องทรัพยากรทรัพย์สินและซอร์สโค้ดทั้งหมดของแอปได้อย่างไรเพื่อให้แฮกเกอร์ไม่สามารถแฮ็คไฟล์ APK ในทางใดทางหนึ่ง

เมื่อใครบางคนเปลี่ยนนามสกุล. apk เป็น. zip จากนั้นหลังจากการคลายซิปใครบางคนสามารถรับทรัพยากรทั้งหมดได้อย่างง่ายดาย (ยกเว้นManifest.xml ) แต่ด้วยAPKtoolเราสามารถรับเนื้อหาจริงของไฟล์ Manifest ได้เช่นกัน อีกครั้งไม่มี

 3. มีวิธีทำให้แฮ็คยากขึ้นหรือเป็นไปไม่ได้หรือไม่? ฉันสามารถทำอะไรได้อีกเพื่อปกป้องซอร์สโค้ดในไฟล์ APK ของฉัน

อีกครั้งไม่ได้ แต่คุณสามารถป้องกันได้ในระดับหนึ่งนั่นคือ

  • ดาวน์โหลดทรัพยากรจากเว็บและทำกระบวนการเข้ารหัส
  • ใช้ไลบรารีดั้งเดิมที่รวบรวมไว้ล่วงหน้า (C, C ++, JNI, NDK)
  • ดำเนินการ hashing บางอย่างเสมอ (แป้นMD5 / SHAหรือตรรกะอื่น ๆ )

แม้กับSmaliผู้คนสามารถเล่นกับรหัสของคุณ สรุปแล้วมันไม่ได้เป็นไปได้ทั้งหมด


7
@TrevorBoydSmith: การเข้ารหัสลับไม่ได้ช่วยอะไรมากนักเมื่อระบบปฏิบัติการโอเพ่นซอร์สและสามารถรูทได้ ระบบต้องการคีย์เพื่อถอดรหัส APK และเรียกใช้ข้อมูล และถ้าระบบมีกุญแจและฉันสามารถเข้าถึงระบบได้อย่างอิสระฉันก็รู้ว่าจะหากุญแจได้ที่ไหนและสามารถไปถึงมันได้ ความหมายฉันมีที่สำคัญในขณะนี้มากเกินไป
cHao

4
@ เทรเวอร์บอยด์สมิ ธ : มันเป็นส่วน "วิธีการทำ" แม้ว่ามันจะฆ่าความคิดทั้งหมด ไม่มีวิธีในการรันโค้ดที่เข้ารหัสโดยตรง ในบางจุดรหัสถอดรหัสต้องพร้อมใช้งาน ซึ่งหมายความว่า (1) จะต้องมีคีย์ (นั่นคือฉันในฐานะ root อาจเข้าถึง) และ (2) ฉันอาจสามารถค้นหาสำเนาที่ชัดเจนใน RAM และไม่ต้องกังวลเกี่ยวกับการเข้ารหัส
cHao

3
@TrevorBoydSmith: ปัญหาคือในกรณีนี้คุณไม่สามารถเพิ่มค่าใช้จ่ายได้มากพอที่จะทำให้มันไม่คุ้มค่า เราไม่ได้พูดถึงกุญแจที่ดุร้ายที่นี่ เรากำลังพูดถึงการมีอยู่แล้ว - ระบบปฏิบัติการจะต้องมีกุญแจและเรามีระบบปฏิบัติการ วิธีเดียวในการแก้ไขที่จะทำให้ OS ไม่สามารถรูทเครื่องได้ ขอให้โชคดี แม้ Apple จะไม่สามารถจัดการได้ :)
cHao

3
@ เทรเวอร์บอยด์สมิ ธ : ฉันไม่คิดว่าการเพิ่มต้นทุนโดยทั่วไปเป็นไปไม่ได้ ผมคิดว่า (และพูด) โดยเฉพาะอย่างยิ่งว่าข้อเสนอแนะของคุณเป็นไปไม่ได้ - เพราะมันเป็น MATLAB ไม่ใช่ Android และมีเสรีภาพบางอย่างที่ Android ไม่มี โดยเฉพาะอย่างยิ่งมันมีความงงงวยอยู่ด้านข้าง มันยากมากที่จะซ่อนรหัสการเข้ารหัส Android ทำเช่นนั้นไม่ได้ ทุกคนที่มีซอร์สโค้ดจะรู้ว่าคีย์ซ่อนอยู่ที่ไหนและจะมีเครื่องมือในการเรียกคืนข้อมูลเหล่านั้นภายใน 10 นาทีหลังจากที่มีการประกาศคุณสมบัติ มันเป็นไปไม่ได้ที่จะทำอย่างนั้น มันไม่สำคัญเลย
cHao

6
@ เทรเวอร์บอยด์สมิ ธ : ฉันไม่ได้ยืนยันอะไรเลย สิ่งที่ฉันเป็นแบบคงที่ยืนยันว่าการเปลี่ยนย้าย ฯลฯไม่ได้เรื่อง ในระบบปฏิบัติการโอเพ่นซอร์สการเข้ารหัสเพียงอย่างเดียวไม่สามารถป้องกันรหัสจากใครก็ตามที่สามารถทำวิศวกรรมย้อนกลับได้ เนื่องจากฉันสามารถอ่านรหัสที่จะทำการถอดรหัสโดยไม่คำนึงถึงวิธีการรับคีย์การใช้งานและ / หรือการจัดเก็บฉันสามารถดูวิธีการที่คุณทำและการทำซ้ำ - ได้ง่ายกว่าที่ฉันสามารถย้อนกลับบางความลับสุดยอด รหัสแอป
cHao

37

ไม่สามารถหลีกเลี่ยงวิศวกรรมย้อนกลับของ Android APK ได้ 100% แต่คุณสามารถใช้วิธีการเหล่านี้เพื่อหลีกเลี่ยงการดึงข้อมูลเพิ่มเติมเช่นซอร์สโค้ดสินทรัพย์จาก APK ของคุณและทรัพยากร:

  1. ใช้ ProGuard เพื่อทำให้งงงวยรหัสแอปพลิเคชัน

  2. ใช้NDKโดยใช้C และ C ++เพื่อวางแกนแอปพลิเคชันของคุณและรักษาความปลอดภัยของรหัสใน.soไฟล์

  3. หากต้องการรักษาความปลอดภัยของแหล่งข้อมูลอย่ารวมทรัพยากรที่สำคัญทั้งหมดไว้ในโฟลเดอร์ทรัพย์สินด้วย APK ดาวน์โหลดทรัพยากรเหล่านี้เมื่อเริ่มต้นแอปพลิเคชัน


7
สิ่งที่สามคือการทำให้งานของผู้โจมตีผ่อนคลายลงจริง ๆ การสื่อสารเครือข่ายดมกลิ่นทำได้ง่ายกว่าวิศวกรรมย้อนกลับ
Totten

เพื่อแก้ปัญหาของบุคคลที่สามหนึ่งสามารถเข้ารหัสเนื้อหาที่ดาวน์โหลดและ / หรือใช้การเชื่อมต่อที่เข้ารหัส (เช่น SSL / TLS)
Stradivari

1
การเข้ารหัสการเชื่อมต่อป้องกันบุคคลที่สูดดมหรือแก้ไขทราฟฟิก ในกรณีที่ผู้ใช้เองเป็นอันตราย (เช่นเขามี apk ของคุณและเขาพยายามแฮ็กมัน) เขาจะยังคงได้รับเนื้อหาโดยใช้แอปของคุณแยกทรัพยากรเป็นผู้ใช้รูท แต่ใช่มันช่วยต่อต้านการโจมตีการดมกลิ่นอย่างง่าย
Kevin Lee

เพิ่มไปที่: 4) ใช้ dexguard สำหรับ obfuscation ที่สูงขึ้น แต่จ่าย 5) ใช้ไฟล์ OBB สำหรับการดาวน์โหลดสินทรัพย์ในเวลาที่ดาวน์โหลดแอปมันจะช่วยลดขนาดแอปเช่นกัน
Ashok Kumar

35

นักพัฒนาสามารถทำตามขั้นตอนต่อไปนี้เพื่อป้องกัน APK จากการโจรกรรม

  • วิธีพื้นฐานที่สุดคือการใช้เครื่องมือเช่นProGuardทำให้รหัสของพวกเขาสับสน แต่จนถึงขณะนี้มันค่อนข้างยากที่จะป้องกันไม่ให้ใครบางคนทำการถอดรหัสแอป

  • นอกจากนี้ผมเคยได้ยินเกี่ยวกับเครื่องมือHoseDex2Jar มันหยุดDex2Jarโดยการใส่รหัสที่ไม่เป็นอันตรายใน Android APK ที่สร้างความสับสนและปิดการใช้งานDex2Jarและป้องกันรหัสจากการแยกส่วน มันสามารถป้องกันแฮ็กเกอร์ไม่ให้ทำการถอดรหัส APK เป็นโค้ดจาวาที่อ่านได้

  • ใช้แอปพลิเคชันฝั่งเซิร์ฟเวอร์เพื่อสื่อสารกับแอปพลิเคชันเฉพาะเมื่อจำเป็นเท่านั้น มันสามารถช่วยป้องกันข้อมูลสำคัญ

คุณไม่สามารถป้องกันรหัสของคุณจากแฮกเกอร์ที่มีศักยภาพได้อย่างสมบูรณ์ อย่างใดคุณอาจทำให้มันยากและเป็นงานที่น่าผิดหวังเล็กน้อยสำหรับพวกเขาในการแปลรหัสของคุณ วิธีที่มีประสิทธิภาพมากที่สุดวิธีหนึ่งคือการเขียนด้วยรหัสเนทีฟ (C / C ++) และเก็บไว้เป็นไลบรารีที่คอมไพล์


3
HoseDex2Jar ติดกับไร้ประโยชน์ มัน 'สับสน' เท่านั้น dex2jar และสามารถถูกบล็อกได้อย่างง่ายดาย smali / apktool ฯลฯ ทำงานได้ดีกับ APK 'hosed'
Nikolay Elenkov

@NikolayElenkov คุณรู้ไหมว่า HoseDex2Jar ทำงานอย่างไร สิ่งที่พวกเขาเคยหลีกเลี่ยงหรือสร้างความสับสนให้กับ dex2jar เพราะฉันไม่สามารถอัปโหลดไฟล์ apk ของฉันไปยังเว็บเพื่อใช้ HoseDex2Jar ถ้าฉันสามารถทำอะไรบางอย่างเช่น HoseDex2Jar เพื่อสร้างความสับสนให้กับ dex2jar มันจะทำให้การแฮ็กยากขึ้นโดยใช้เครื่องมือ dex2jar
sachin003

1
บางทีคุณอาจเข้าใจผิดจุดของฉัน: สิ่งที่ HoseDex2Jar ทำคือบรรจุ APK ของคุณใหม่เพื่อให้เครื่องมือ dex2jar ที่ได้รับความนิยมไม่สามารถย้อนกลับไปนอกกล่องได้ อย่างไรก็ตามเครื่องมืออื่น ๆ สามารถทำได้และเป็นเรื่องง่ายมากที่จะเอาชนะได้โดยทั่วไป ไม่มีประเด็นในการใช้งาน ไม่มีใครพูดถึง Dexguard I สิ่ง (โดยผู้เขียนของ ProGuard; ไม่ฟรี) แต่มันเป็นงานที่ดู มันทำอะไรได้มากกว่าการทำให้งงปกติ
Nikolay Elenkov

C ++ ไม่สามารถกลับรายการได้หรือไม่ มันยาก แต่เป็นไปได้ และมีเครื่องมือที่จะช่วยคุณในเรื่องนี้เช่นhex-rays.com/products/decompiler/index.shtml (ใช่พวกเขามีเวอร์ชั่น ARM ไม่ใช่มันไม่ใช่เรื่องง่ายที่จะได้รับ)
dkzm

ใช่ @VikartiAnatra: ฉันยังกล่าวถึงอย่างใดคุณอาจทำให้มันยาก
Sahil Mahajan Mj

24

นี่คือวิธีการบางอย่างที่คุณสามารถลองได้:

  1. ใช้obfuscationและเครื่องมือเช่นProGuard
  2. เข้ารหัสบางส่วนของแหล่งที่มาและข้อมูล
  3. ใช้การตรวจสอบ inbuilt ที่เป็นกรรมสิทธิ์ในแอพเพื่อตรวจจับการปลอมแปลง
  4. แนะนำรหัสเพื่อหลีกเลี่ยงการโหลดในโปรแกรมดีบั๊กซึ่งก็คือปล่อยให้แอปมีความสามารถในการตรวจจับตัวดีบั๊กและออก / ฆ่าตัวดีบัก
  5. แยกการรับรองความถูกต้องเป็นบริการออนไลน์
  6. ใช้ความหลากหลายของแอปพลิเคชัน
  7. ใช้เทคนิคการพิมพ์ลายนิ้วมือสำหรับเช่นลายเซ็นฮาร์ดแวร์ของอุปกรณ์จากระบบย่อยที่แตกต่างกันก่อนที่จะตรวจสอบอุปกรณ์

23

 1. ฉันจะหลีกเลี่ยงวิศวกรรมย้อนกลับของ APK Android ได้อย่างสมบูรณ์ได้อย่างไร? เป็นไปได้ไหม

เป็นไปไม่ได้

 2. ฉันจะปกป้องทรัพยากรทรัพย์สินและซอร์สโค้ดทั้งหมดของแอปได้อย่างไรเพื่อให้แฮกเกอร์ไม่สามารถแฮ็คไฟล์ APK ในทางใดทางหนึ่ง

เป็นไปไม่ได้

 3. มีวิธีทำให้แฮ็คยากขึ้นหรือเป็นไปไม่ได้หรือไม่? ฉันสามารถทำอะไรได้อีกเพื่อปกป้องซอร์สโค้ดในไฟล์ APK ของฉัน

ยากกว่า - เป็นไปได้ แต่ในความเป็นจริงมันจะยากกว่าสำหรับผู้ใช้ทั่วไป หากใครบางคนต้องการแฮ็คแอปของคุณจริง ๆ - มันจะถูกแฮกไม่ช้าก็เร็ว


22

 1. ฉันจะหลีกเลี่ยงวิศวกรรมย้อนกลับของ APK Android ได้อย่างสมบูรณ์ได้อย่างไร? เป็นไปได้ไหม

ว่าเป็นไปไม่ได้

 2. ฉันจะปกป้องทรัพยากรทรัพย์สินและซอร์สโค้ดทั้งหมดของแอปได้อย่างไรเพื่อให้แฮกเกอร์ไม่สามารถแฮ็คไฟล์ APK ในทางใดทางหนึ่ง

นักพัฒนาสามารถทำตามขั้นตอนต่าง ๆ เช่นการใช้เครื่องมือเช่น ProGuard เพื่อทำให้รหัสของพวกเขาสับสน แต่จนถึงขณะนี้มันค่อนข้างยากที่จะป้องกันไม่ให้ใครบางคนทำการถอดรหัสแอป

มันเป็นเครื่องมือที่ยอดเยี่ยมมากและสามารถเพิ่มความยากลำบากในการ 'ย้อนกลับ' โค้ดของคุณในขณะที่ลดขนาดรหัสของคุณ

การสนับสนุน ProGuard แบบรวม: ตอนนี้ ProGuard ได้รับการบรรจุด้วยเครื่องมือ SDK นักพัฒนาสามารถทำให้งงงวยรหัสของพวกเขาเป็นส่วนหนึ่งของการสร้างประกอบ

 3. มีวิธีทำให้แฮ็คยากขึ้นหรือเป็นไปไม่ได้หรือไม่? ฉันสามารถทำอะไรได้อีกเพื่อปกป้องซอร์สโค้ดในไฟล์ APK ของฉัน

ขณะที่การวิจัยผมมารู้เกี่ยวกับHoseDex2Jar เครื่องมือนี้จะปกป้องรหัสของคุณจากการถอดรหัส แต่ดูเหมือนว่าจะเป็นไปไม่ได้ที่จะปกป้องรหัสของคุณอย่างสมบูรณ์

ลิงก์ที่มีประโยชน์บางอย่างคุณสามารถอ้างอิงได้


21

คำถามหลักที่นี่คือสามารถแยกไฟล์ dex และคำตอบคือ "เรียงลำดับ" มี disassemblers เหมือนdedexerและsmali

ProGuard กำหนดค่าอย่างเหมาะสมจะทำให้รหัสของคุณงงงวย DexGuard ซึ่งเป็น ProGuard เวอร์ชันขยายในเชิงพาณิชย์อาจช่วยได้มากกว่านี้ อย่างไรก็ตามโค้ดของคุณยังสามารถแปลงเป็น Smali และนักพัฒนาที่มีประสบการณ์ด้านวิศวกรรมย้อนกลับจะสามารถทราบได้ว่าคุณกำลังทำอะไรจาก Smali

อาจเลือกใบอนุญาตที่ดีและบังคับใช้ตามกฎหมายในวิธีที่ดีที่สุด


4
ในฐานะที่เป็นหมายเหตุด้านข้าง (ข้อจำกัดความรับผิดชอบ: IANAL) - ใบอนุญาตจะไม่ปกป้องแอปพลิเคชันภายใต้เขตอำนาจศาลทั้งหมดในทุกสถานการณ์ (ตัวอย่างเช่นในบางประเทศในยุโรปจะได้รับอนุญาตให้ถอดชิ้นส่วนเพื่อเพิ่มความเข้ากันได้)
Maciej Piechotka

12

ลูกค้าของคุณควรจ้างคนที่รู้ว่าพวกเขากำลังทำอะไรใครสามารถตัดสินใจได้ถูกต้องและสามารถให้คำปรึกษาคุณได้

พูดถึงข้างต้นเกี่ยวกับคุณที่มีความสามารถในการเปลี่ยนระบบประมวลผลธุรกรรมในแบ็กเอนด์นั้นเป็นเรื่องที่ไร้สาระ - คุณไม่ควรได้รับอนุญาตให้ทำการเปลี่ยนแปลงสถาปัตยกรรมดังกล่าวดังนั้นอย่าคาดหวังว่าจะสามารถทำได้

เหตุผลของฉันเกี่ยวกับเรื่องนี้:

เนื่องจากโดเมนของคุณคือการประมวลผลการชำระเงินมันปลอดภัยที่จะสมมติว่า PCI DSS และ / หรือ PA DSS (และกฎหมายของรัฐ / รัฐบาลกลางที่อาจเกิดขึ้น) จะมีความสำคัญต่อธุรกิจของคุณ - เพื่อให้เป็นไปตามมาตรฐานคุณต้องแสดงว่าคุณปลอดภัย เพื่อไม่ปลอดภัยจากนั้นค้นหา (ผ่านการทดสอบ) ที่คุณไม่ปลอดภัยจากนั้นทำการแก้ไขทดสอบซ้ำและอื่น ๆ จนกระทั่งสามารถตรวจสอบความปลอดภัยในระดับที่เหมาะสม = แพงช้าและมีความเสี่ยงสูงสู่ความสำเร็จ ในการทำสิ่งที่ถูกต้องให้คิดล่วงหน้าทำความสามารถที่มีประสบการณ์ให้กับงานพัฒนาอย่างปลอดภัยแล้วทดสอบแก้ไข (น้อยกว่า) ฯลฯ (น้อยกว่า) จนกระทั่งความปลอดภัยสามารถตรวจสอบได้ในระดับที่เหมาะสม = ราคาถูกรวดเร็ว วิธีที่มีความเสี่ยงต่ำสู่ความสำเร็จ


8

ในฐานะที่เป็นคนที่ทำงานอย่างกว้างขวางในแพลตฟอร์มการชำระเงินรวมถึงแอปพลิเคชันการชำระเงินมือถือ (MyCheck) ฉันจะบอกว่าคุณต้องมอบหมายพฤติกรรมนี้ให้กับเซิร์ฟเวอร์ไม่ควรมีชื่อผู้ใช้หรือรหัสผ่านสำหรับตัวประมวลผลการชำระเงิน hardcoded ในแอปพลิเคชั่นมือถือนั่นเป็นสิ่งสุดท้ายที่คุณต้องการเพราะสามารถเข้าใจได้ถึงแหล่งที่มาแม้ว่าคุณจะทำให้รหัสสับสน

นอกจากนี้คุณไม่ควรเก็บบัตรเครดิตหรือโทเค็นการชำระเงินในแอปพลิเคชันทุกอย่างควรได้รับการมอบหมายให้บริการที่คุณสร้างขึ้นอีกครั้งมันจะช่วยให้คุณได้รับในภายหลังเป็น PCI-compliant ได้ง่ายขึ้นและ บริษัท บัตรเครดิต ไม่ต้องหายใจคอของคุณ (เหมือนที่พวกเราทำ)


7

คำตอบ upvoted อื่น ๆ ที่นี่ถูกต้อง ฉันแค่ต้องการให้ตัวเลือกอื่น

สำหรับการทำงานบางอย่างที่คุณเห็นว่าสำคัญคุณสามารถโฮสต์ตัวควบคุมWebViewในแอปของคุณ จะมีการใช้งานฟังก์ชันบนเว็บเซิร์ฟเวอร์ของคุณ ดูเหมือนว่าแอปพลิเคชันของคุณจะทำงาน


@Sales Botha ใช่สำหรับหน้าจอ IMP ฉันใช้ webview แล้วและใช่นี่เป็นวิธีหนึ่งในการรักษาความปลอดภัยฉันยอมรับคำตอบของคุณ
sachin003

7

ถ้าเราต้องการสร้างวิศวกรรมย้อนกลับ (เกือบ) เป็นไปไม่ได้เราสามารถใส่แอปพลิเคชันลงบนชิปที่ทนทานต่อการงัดแงะสูงซึ่งดำเนินการสิ่งที่มีความอ่อนไหวทั้งหมดภายในและสื่อสารกับโปรโตคอลบางอย่างเพื่อให้สามารถควบคุม GUI ได้บนโฮสต์ แม้แต่ชิปที่ทนต่อการงัดแงะก็ไม่ได้มีการแตกหัก 100% พวกเขาเพียงตั้งค่าบาร์สูงกว่าวิธีการซอฟต์แวร์ แน่นอนว่ามันไม่สะดวก: แอพพลิเคชั่นต้องมีหูด USB เล็ก ๆ น้อย ๆ ซึ่งถือชิปไว้เพื่อที่จะเสียบเข้าไปในอุปกรณ์

คำถามไม่ได้เปิดเผยแรงจูงใจที่ต้องการปกป้องแอปพลิเคชันนี้อย่างอิจฉา

หากเป้าหมายคือการปรับปรุงความปลอดภัยของวิธีการชำระเงินโดยการปกปิดข้อบกพร่องด้านความปลอดภัยใด ๆ ที่แอปพลิเคชันอาจมี บิตที่มีความอ่อนไหวต่อความปลอดภัยควรเป็นแบบโอเพ่นซอร์สหากเป็นไปได้ คุณควรทำให้ง่ายที่สุดสำหรับนักวิจัยด้านความปลอดภัยที่ตรวจสอบใบสมัครของคุณเพื่อค้นหาบิตเหล่านั้นและกลั่นกรองการทำงานของพวกเขาและติดต่อคุณ แอปพลิเคชันการชำระเงินไม่ควรมีใบรับรองฝังตัวใด ๆ กล่าวคือไม่ควรมีเซิร์ฟเวอร์ appliaction ที่เชื่อถืออุปกรณ์เพียงเพราะมีใบรับรองคงที่จากโรงงาน ธุรกรรมการชำระเงินควรทำในข้อมูลประจำตัวของผู้ใช้เพียงอย่างเดียวโดยใช้โปรโตคอลการตรวจสอบแบบ end-to-end ที่ได้รับการออกแบบอย่างถูกต้องซึ่งขัดขวางการเชื่อถือแอปพลิเคชันหรือแพลตฟอร์มหรือเครือข่าย ฯลฯ

หากจุดประสงค์คือป้องกันการโคลนนิ่งซึ่งขาดชิปที่พิสูจน์ได้ว่าไม่มีอะไรที่คุณสามารถทำได้เพื่อป้องกันโปรแกรมจากการทำวิศวกรรมย้อนกลับและการคัดลอก เพิ่มขึ้นเป็น "ลูกค้าที่ไม่ได้รับอนุญาต" มีวิธีที่จะทำให้การพัฒนาลูกค้าที่ไม่ได้รับอนุญาตเป็นเรื่องยาก หนึ่งในนั้นคือการสร้าง checksums โดยยึดตามสแน็ปช็อตของสถานะสมบูรณ์ของโปรแกรม: ตัวแปรสถานะทั้งหมดสำหรับทุกสิ่ง GUI, ตรรกะ, อะไรก็ตาม โปรแกรมโคลนจะไม่มีสถานะภายในเหมือนกันทุกประการ แน่นอนว่าเป็นเครื่องรัฐที่มีการเปลี่ยนสถานะที่มองเห็นได้จากภายนอกคล้ายกัน (ซึ่งสามารถสังเกตได้จากอินพุตและเอาต์พุต) แต่แทบจะไม่เหมือนสถานะภายในเดียวกัน แอปพลิเคชันเซิร์ฟเวอร์สามารถสอบถามโปรแกรม: สถานะรายละเอียดของคุณคืออะไร (เช่น ให้ฉันตรวจสอบกับตัวแปรสถานะภายในทั้งหมดของคุณ) สิ่งนี้สามารถนำมาเปรียบเทียบกับรหัสลูกค้าจำลองที่รันบนเซิร์ฟเวอร์แบบขนานโดยผ่านการเปลี่ยนสถานะของแท้ บุคคลที่สามโคลนจะต้องทำซ้ำการเปลี่ยนแปลงสถานะที่เกี่ยวข้องทั้งหมดของโปรแกรมของแท้เพื่อให้การตอบสนองที่ถูกต้องซึ่งจะขัดขวางการพัฒนาของ


7

เห็นด้วยกับ @Muhammad Saqib ที่นี่: https://stackoverflow.com/a/46183706/2496464

และ @Mumair ให้ขั้นตอนเริ่มต้นที่ดี: https://stackoverflow.com/a/35411378/474330

ถือว่าปลอดภัยเสมอว่าทุกสิ่งที่คุณแจกจ่ายไปยังอุปกรณ์ของผู้ใช้เป็นของผู้ใช้ เรียบง่าย. คุณอาจจะสามารถใช้เครื่องมือและขั้นตอนล่าสุดในการเข้ารหัสทรัพย์สินทางปัญญาของคุณ แต่ไม่มีวิธีที่จะป้องกันไม่ให้บุคคลที่ได้รับการพิจารณา 'เรียนรู้' ระบบของคุณ และแม้ว่าเทคโนโลยีในปัจจุบันอาจทำให้มันยากสำหรับพวกเขาในการเข้าถึงที่ไม่พึงประสงค์อาจมีวิธีง่าย ๆ ในวันพรุ่งนี้หรือแม้กระทั่งเพียงชั่วโมงถัดไป!

ดังนั้นที่นี่มาสมการ:

When it comes to money, we always assume that client is untrusted.

แม้จะง่ายเหมือนเศรษฐกิจในเกม (โดยเฉพาะอย่างยิ่งในเกมมีผู้ใช้ 'ซับซ้อน' มากขึ้นที่นั่นและช่องโหว่แพร่กระจายในไม่กี่วินาที!)

เราจะอยู่อย่างปลอดภัยได้อย่างไร

ส่วนใหญ่ถ้าไม่ทั้งหมดของระบบการประมวลผลที่สำคัญของเรา (และฐานข้อมูลของหลักสูตร) ​​ตั้งอยู่บนฝั่งเซิร์ฟเวอร์ และระหว่างไคลเอนต์และเซิร์ฟเวอร์, การสื่อสารที่เข้ารหัส, การตรวจสอบความถูกต้อง ฯลฯ นั่นคือแนวคิดของ thin client


5

ผมขอแนะนำให้คุณดูที่การใช้งานซอฟแวร์ป้องกันจากการโจมตี มันเป็นบริการเชิงพาณิชย์ แต่ บริษัท ของเพื่อนฉันใช้มันและพวกเขาก็ดีใจที่ได้ใช้มัน


4

รูปแบบลายเซ็น APK v2 ใน Android N

PackageManager class ในขณะนี้รองรับการตรวจสอบแอพโดยใช้รูปแบบ APK v2 รูปแบบลายเซ็น APK v2 เป็นรูปแบบลายเซ็นทั้งไฟล์ที่ปรับปรุงความเร็วการตรวจสอบอย่างมีนัยสำคัญและเสริมสร้างความสมบูรณ์ของการรับรองความถูกต้องโดยตรวจสอบการเปลี่ยนแปลงใด ๆ

เพื่อรักษาความเข้ากันได้แบบย้อนหลัง APK จะต้องลงชื่อด้วยชุดลายเซ็น v1 (ชุดลายเซ็น JAR) ก่อนที่จะลงนามด้วยชุดลายเซ็น v2 ด้วยรูปแบบลายเซ็น v2 การตรวจสอบจะล้มเหลวหากคุณลงชื่อ APK ด้วยใบรับรองเพิ่มเติมหลังจากเซ็นชื่อด้วยรูปแบบ v2

การสนับสนุนรูปแบบ APK v2 จะมีให้ในภายหลังในหน้าตัวอย่าง N Developer

http://developer.android.com/preview/api-overview.html#apk_signature_v2


2
Apk Signature v2 ป้องกันทรัพยากรจากการถูกดัดแปลงเท่านั้น แต่ไม่ได้ทำให้วิศวกรรมย้อนกลับยากขึ้นอีกแล้ว ...
Louis CAD

1
นอกจากนี้คุณสามารถลบลายเซ็นและลงชื่ออีกครั้ง ลายเซ็น v2 เป็นเพียงกลุ่มข้อมูลในไฟล์ APK
Robert

4

ไม่มีวิธีหลีกเลี่ยงวิศวกรรมย้อนกลับของ APK อย่างสมบูรณ์ เพื่อปกป้องทรัพยากรแอปพลิเคชันทรัพยากรคุณสามารถใช้การเข้ารหัส

  • การเข้ารหัสจะทำให้ใช้งานได้ยากขึ้นโดยไม่ต้องถอดรหัสการเลือกใช้อัลกอริธึมการเข้ารหัสที่แข็งแกร่งจะทำให้การถอดรหัสยากขึ้น
  • การเพิ่มรหัสการปลอมแปลงลงในตรรกะหลักของคุณเพื่อให้ยากขึ้นสำหรับการถอดรหัส
  • หากคุณสามารถเขียนตรรกะที่สำคัญของคุณในภาษาพื้นเมืองใด ๆ และนั่นทำให้ยากต่อการถอดรหัส
  • ใช้กรอบความปลอดภัยของบุคคลที่สามใด ๆ เช่นQuixxi

3

โดยทั่วไปมันเป็นไปไม่ได้ มันจะไม่เป็นไปได้ อย่างไรก็ตามมีความหวัง คุณสามารถใช้obfuscatorเพื่อทำให้การโจมตีทั่วไปบางอย่างยากที่จะดำเนินการรวมถึงสิ่งต่าง ๆ เช่น:

  1. การเปลี่ยนชื่อเมธอด / คลาส (ดังนั้นในตัวถอดรหัสที่คุณได้รับเช่นa.a)
  2. การควบคุมการไหลของข้อมูลที่สับสน (ดังนั้นในตัวถอดรหัสการถอดรหัสทำให้อ่านยากมาก)
  3. การเข้ารหัสสตริงและทรัพยากรที่เป็นไปได้

ฉันแน่ใจว่ามีคนอื่น แต่นั่นเป็นคนหลัก ฉันทำงานให้กับ บริษัท ชื่อ PreEmptive Solutions บน. NET obfuscator พวกเขายังมีผลงาน Java Obfuscator ว่าสำหรับ Android เช่นกันเรียกว่าDashO

แม้ว่าความสับสนจะมาพร้อมกับราคาเสมอ โดยเฉพาะอย่างยิ่งประสิทธิภาพมักแย่ลงและต้องใช้เวลาเพิ่มในการปล่อย อย่างไรก็ตามหากทรัพย์สินทางปัญญาของคุณมีความสำคัญอย่างยิ่งสำหรับคุณก็มักจะคุ้มค่า

มิฉะนั้นตัวเลือกเดียวของคุณคือการทำให้แอปพลิเคชัน Android ของคุณเพิ่งผ่านไปยังเซิร์ฟเวอร์ที่โฮสต์ตรรกะจริงทั้งหมดของแอปพลิเคชันของคุณ นี่เป็นปัญหาของตัวเองเพราะมันหมายความว่าผู้ใช้จะต้องเชื่อมต่อกับอินเทอร์เน็ตเพื่อใช้แอพของคุณ

นอกจากนี้มันไม่ใช่แค่ Android ที่มีปัญหานี้ มันเป็นปัญหาในทุกร้านแอพ มันเป็นเรื่องของความยากลำบากในการเข้าถึงไฟล์แพ็คเกจ (ตัวอย่างเช่นฉันไม่เชื่อว่ามันง่ายบน iPhone แต่ยังคงเป็นไปได้)


น่าเสียดายถ้าแฮ็กลูกค้า (แอป) พวกเขาจะสามารถเห็นรูปแบบการสื่อสารและสร้างเซิร์ฟเวอร์ของตัวเอง :(
Jocky Doe

3

มันเป็นไปไม่ได้ที่จะหลีกเลี่ยง RE อย่างสมบูรณ์ แต่ด้วยการทำให้มันซับซ้อนมากขึ้นภายในทำให้คุณยากที่ผู้โจมตีจะเห็นการทำงานที่ชัดเจนของแอพซึ่งอาจลดจำนวนของเวกเตอร์การโจมตี

หากแอปพลิเคชันจัดการกับข้อมูลที่มีความอ่อนไหวสูงมีเทคนิคหลากหลายที่สามารถเพิ่มความซับซ้อนของวิศวกรรมย้อนกลับโค้ดของคุณ เทคนิคหนึ่งคือการใช้ C / C ++ เพื่อ จำกัด การใช้งานจริงของผู้โจมตี มีไลบรารี C และ C ++ ที่เพียงพอซึ่งเป็นผู้ใหญ่มากและง่ายต่อการรวมเข้ากับ Android ที่เสนอ JNI ผู้โจมตีต้องหลีกเลี่ยงข้อ จำกัด ในการดีบักเพื่อโจมตีแอปพลิเคชันในระดับต่ำ นี่เป็นการเพิ่มความซับซ้อนในการโจมตี แอปพลิเคชัน Android ควรมี android: debuggable =” false” ที่กำหนดไว้ในรายการแอปพลิเคชันเพื่อป้องกันการจัดการเวลาที่ง่ายดายโดยผู้โจมตีหรือมัลแวร์

การตรวจสอบติดตาม - แอปพลิเคชันสามารถกำหนดได้ว่ากำลังถูกติดตามโดยดีบักเกอร์หรือเครื่องมือแก้ไขข้อบกพร่องอื่น ๆ หรือไม่ หากถูกติดตามแอปพลิเคชันสามารถดำเนินการตอบสนองการโจมตีที่เป็นไปได้จำนวนเท่าใดก็ได้เช่นการทิ้งคีย์การเข้ารหัสเพื่อปกป้องข้อมูลผู้ใช้แจ้งผู้ดูแลเซิร์ฟเวอร์หรือการตอบสนองประเภทอื่น ๆ เพื่อพยายามปกป้องตัวเอง สิ่งนี้สามารถกำหนดได้โดยการตรวจสอบสถานะสถานะกระบวนการหรือใช้เทคนิคอื่น ๆ เช่นการเปรียบเทียบค่าส่งคืนของ ptrace Attach, การตรวจสอบกระบวนการผู้ปกครอง, บัญชีดำ debuggers ในรายการกระบวนการหรือเปรียบเทียบการประทับเวลาในสถานที่ที่แตกต่างกันของโปรแกรม

การปรับให้เหมาะสม - เพื่อซ่อนการคำนวณทางคณิตศาสตร์ขั้นสูงและตรรกะเชิงซ้อนประเภทอื่น ๆ การใช้การปรับให้เหมาะสมของคอมไพเลอร์สามารถช่วยทำให้รหัสวัตถุสับสนทำให้ผู้โจมตีไม่สามารถถอดแยกชิ้นส่วนได้อย่างง่ายดาย ใน Android สามารถทำได้ง่ายขึ้นโดยใช้ไลบรารีที่คอมไพล์ด้วย NDK นอกจากนี้การใช้ LLVM Obfuscator หรือ SDK ป้องกันใด ๆ จะให้รหัสเครื่องที่ดีกว่า

การปอกไบนารี - การปอกไบนารีเนทีฟเป็นวิธีที่มีประสิทธิภาพในการเพิ่มระยะเวลาและระดับทักษะที่ผู้โจมตีต้องการเพื่อดูการแต่งหน้าของฟังก์ชันระดับต่ำในแอปพลิเคชันของคุณ โดยการปอกไบนารีตารางสัญลักษณ์ของไบนารีจะถูกปล้นดังนั้นผู้โจมตีไม่สามารถตรวจแก้จุดบกพร่องหรือย้อนกลับวิศวกรแอปพลิเคชันได้อย่างง่ายดายคุณสามารถอ้างถึงเทคนิคที่ใช้ในระบบ GNU / Linux เช่น sstriping หรือใช้ UPX

และในที่สุดคุณต้องระวังเกี่ยวกับการทำให้งงงวยและเครื่องมือเช่น ProGuard


3

หากแอปของคุณมีความละเอียดอ่อนนี้คุณควรพิจารณาส่วนการประมวลผลการชำระเงินที่ฝั่งเซิร์ฟเวอร์ ลองเปลี่ยนวิธีการชำระเงินของคุณ ใช้แอพ android สำหรับการรวบรวมและแสดงข้อมูลผู้ใช้ (เช่นยอดคงเหลือในบัญชี) และแทนที่จะประมวลผลการชำระเงินภายในรหัส java ส่งงานนี้ไปยังเซิร์ฟเวอร์ของคุณโดยใช้โปรโตคอล SSL ที่ปลอดภัยพร้อมพารามิเตอร์ที่เข้ารหัส สร้าง API ที่เข้ารหัสและปลอดภัยทั้งหมดเพื่อสื่อสารกับเซิร์ฟเวอร์ของคุณ

แน่นอนว่ามันอาจถูกแฮ็กด้วยเช่นกันและไม่มีส่วนเกี่ยวข้องกับการป้องกันซอร์สโค้ด แต่ให้พิจารณาว่าเป็นเลเยอร์ความปลอดภัยอื่นเพื่อให้แฮกเกอร์หลอกแอปของคุณได้ยากขึ้น


2

ชิป TPM (โมดูลแพลตฟอร์มที่เชื่อถือได้) ไม่ควรจัดการรหัสที่ป้องกันสำหรับคุณหรือไม่ พวกเขากลายเป็นเรื่องธรรมดาในพีซี (โดยเฉพาะอย่างยิ่ง Apple) และอาจมีอยู่ในชิปสมาร์ทโฟนในปัจจุบัน น่าเสียดายที่ไม่มี OS API ที่จะใช้ประโยชน์จากมัน หวังว่า Android จะเพิ่มการรองรับในวันนี้ นั่นเป็นกุญแจสำคัญในการล้าง DRM เนื้อหา (ซึ่ง Google กำลังทำงานสำหรับ WebM)


2

ไม่มีอะไรปลอดภัยเมื่อคุณวางไว้ในมือผู้ใช้ แต่วิธีปฏิบัติทั่วไปบางอย่างอาจทำให้ผู้โจมตีขโมยข้อมูลได้ยากขึ้น

  • วางตรรกะหลักของคุณ (อัลกอริทึม) ลงในฝั่งเซิร์ฟเวอร์
  • สื่อสารกับเซิร์ฟเวอร์และลูกค้า ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ b / w และไคลเอ็นต์การสื่อสารนั้นปลอดภัยผ่าน SSL หรือ HTTPS หรือใช้เทคนิคอัลกอริธึมการสร้างคู่คีย์ (ECC, RSA) ตรวจสอบให้แน่ใจว่าข้อมูลที่ละเอียดอ่อนยังคงถูกเข้ารหัสแบบ End-to-End
  • ใช้เซสชันและหมดอายุพวกเขาหลังจากช่วงเวลาที่ระบุ
  • เข้ารหัสทรัพยากรและดึงข้อมูลจากเซิร์ฟเวอร์ตามต้องการ
  • หรือคุณสามารถสร้างแอพ Hybrid ซึ่งเป็นระบบการเข้าถึงผ่านการwebviewปกป้องทรัพยากร + รหัสบนเซิร์ฟเวอร์

หลายวิธี; ชัดเจนว่าคุณต้องเสียสละระหว่างประสิทธิภาพและความปลอดภัย


2

ฉันเห็นคำตอบที่ดีในกระทู้นี้ นอกจากนี้คุณสามารถใช้ facebook redexเพื่อเพิ่มประสิทธิภาพรหัส Redex ทำงานใน.dexระดับที่ proguard ทำงานเป็น.classระดับ


2

ความปลอดภัย 100% ของรหัสต้นฉบับและทรัพยากรเป็นไปไม่ได้ใน Android แต่คุณสามารถทำให้ยากเล็กน้อยสำหรับวิศวกรย้อนกลับ คุณสามารถหารายละเอียดเพิ่มเติมได้จากลิงค์ด้านล่าง:

เยี่ยมชมการบันทึกค่าคงที่อย่างปลอดภัย และhttps://www.agicent.com/blog/mobile-app-security-best-practices/


1

ฉันจะปกป้องทรัพยากรทรัพย์สินและซอร์สโค้ดทั้งหมดของแอปเพื่อให้แฮกเกอร์ไม่สามารถแฮ็คไฟล์ APK ในทางใดทางหนึ่งได้อย่างไร

ไฟล์ APK ได้รับการป้องกันด้วยอัลกอริทึมSHA-1 คุณสามารถดูไฟล์บางไฟล์ได้ในโฟลเดอร์META-INFของ APK หากคุณแตกไฟล์ APK และเปลี่ยนแปลงเนื้อหาใด ๆ แล้วบีบอัดอีกครั้งและเมื่อคุณเรียกใช้ไฟล์ APK ใหม่บนเครื่อง Android ไฟล์นั้นจะไม่ทำงานเนื่องจากแฮช SHA-1 จะไม่ตรงกัน


นี่เป็นเรื่องจริง แต่มันเป็นเรื่องเล็กน้อยที่จะลาออกจาก APK (ด้วยใบรับรองอื่น) และทุกอย่างจะทำงานได้อีกครั้ง เป็นไปได้ที่จะตรวจสอบว่ามีการใช้ลายเซ็นใดบ้างในการลงชื่อ APK จากภายในแอปพลิเคชันและเกิดข้อผิดพลาดหากใบรับรองเปลี่ยนแปลง แต่เพียงเล็กน้อยเล็กน้อยที่จะแก้ไขรหัสนี้ออกจากแอปพลิเคชัน
เดวิดให้

สิ่งนี้อาจป้องกันไม่ให้อุปกรณ์ Android เรียกใช้รหัสที่แก้ไข แต่คุณยังสามารถแยกรหัสที่เกี่ยวข้องได้อย่างง่ายดายและเขียนรหัสใหม่บนพีซีที่ทำสิ่งที่คุณต้องการ
Sarel Botha


1

เครื่องมือ: การใช้ Proguard ในแอปพลิเคชันของคุณสามารถ จำกัด ให้วิศวกรรมย้อนกลับแอปพลิเคชันของคุณได้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.