คู่มือนี้มีไว้สำหรับนักพัฒนาแอป Android ที่มีรายได้จาก IAP และต้องการปกป้องตนเองจากแฮกเกอร์และการซื้อสินค้าที่หลอกลวงผ่านเครื่องมือแฮ็ก มีเครื่องมือแฮ็ก IAP ที่รู้จักกันดีหลายตัวซึ่งฉันจะไม่แสดงรายการที่นี่ แต่โดยพื้นฐานแล้วเครื่องมือเหล่านี้จะส่งใบเสร็จการซื้อที่ผิดพลาดไปยังแอปของคุณเพื่อให้ผู้ใช้เพลิดเพลินกับ IAP ฟรี ซึ่งอาจเป็นอะไรก็ได้ตั้งแต่การสมัครสมาชิกรายเดือนไปจนถึงโทเค็นในเกม
แม้ว่าเครื่องมือแฮ็คเวอร์ชันใหม่เหล่านี้จะถูกปล่อยออกมาอยู่เสมอ แต่ความขยันหมั่นเพียรในการรับทราบการอัปเดตและวิธีการล่าสุดเป็นสิ่งสำคัญมาก แต่มีบางสิ่งที่คุณสามารถทำได้เพื่อป้องกัน IAP ของแอปของคุณจากการถูกขโมย โดยเฉพาะอย่างยิ่งคุณต้องเปิดใช้งานวิธีการตรวจสอบ IAP ฝั่งเซิร์ฟเวอร์หลายวิธีซึ่งฉันจะให้รายละเอียดด้านล่าง
คู่มือนี้ไม่ได้มีไว้สำหรับมือใหม่ แต่เป็นนักพัฒนาแอพที่มีประสบการณ์ซึ่งจะเข้าใจศัพท์แสงต่างๆในคู่มือนี้
การใช้ปลั๊กอิน Git Repo เพื่อจุดประสงค์นี้โดยเฉพาะ:
PiracyChecker
เพิ่มที่เก็บในโครงการของคุณ build.gradle :
ที่เก็บ {
maven {
URL“ https://jitpack.io”
}
}
และเพิ่มไลบรารีลงในโมดูลของคุณ build.gradle :
การอ้างอิง {
รวบรวม 'com.github.javiersantos: PiracyChecker: 1.1'
}
คำแนะนำ
- เปิดใช้งาน ProGuard เสมอในรุ่นที่ใช้งานจริงของคุณ
- PiracyChecker ควรรวมอยู่ในเมธอด onCreate ของคุณเพื่อตรวจสอบใบอนุญาตที่ถูกต้องโดยเร็วที่สุด
- ขอแนะนำให้แสดงกิจกรรมใหม่แทนกล่องโต้ตอบเมื่อใบอนุญาตไม่ถูกต้อง วิธีนี้จะทำให้แน่ใจว่ากิจกรรมหลักของแอปเสร็จสิ้นแล้ว ดู“ แสดงผลลัพธ์ในกล่องโต้ตอบหรือกิจกรรมใหม่ '.
ตรวจสอบสิทธิ์การใช้งาน Google Play (LVL)
Google Play มีบริการออกใบอนุญาตที่ช่วยให้คุณบังคับใช้นโยบายใบอนุญาตสำหรับแอปพลิเคชันที่คุณเผยแพร่บน Google Play ด้วยการให้สัญญาอนุญาตของ Google Play แอปพลิเคชันของคุณสามารถสอบถาม Google Play เพื่อรับสถานะใบอนุญาตสำหรับผู้ใช้ปัจจุบัน
แอปพลิเคชันใด ๆ ที่คุณเผยแพร่ผ่าน Google Play สามารถใช้บริการใบอนุญาต Google Play ได้ ไม่จำเป็นต้องมีบัญชีพิเศษหรือการลงทะเบียน
PiracyChecker ใหม่ (นี้)
.enableGooglePlayLicensing (“ BASE_64_LICENSE_KEY”)
...
.start ();
ในการดึงรหัสใบอนุญาต BASE64 ของคุณแอปของคุณจะต้องอัปโหลดไปยังไฟล์ Google Play Developer Console . จากนั้นเข้าถึงแอปของคุณ -> บริการและ API
เมื่อใช้การอนุญาตให้ใช้สิทธิ์ Google Play คุณควรเรียก. Destroy () ในเมธอด onDestroy () ของกิจกรรมของคุณเพื่อหลีกเลี่ยงการทำงานของบริการหลายอินสแตนซ์
ตรวจสอบใบรับรองการลงนามของแอป (ลายเซ็น)
นักพัฒนาจะต้องลงนามแอปพลิเคชันด้วยคีย์ส่วนตัว / ใบรับรอง (อยู่ในไฟล์. keystore) ก่อนจึงจะสามารถติดตั้งแอปบนอุปกรณ์ของผู้ใช้ได้ ใบรับรองการลงนามจะต้องมีความสอดคล้องกันตลอดอายุการใช้งานของแอปและโดยทั่วไปจะมีวันหมดอายุ 25 ปี
ลายเซ็นของแอพจะเสียหาก. apk ถูกแก้ไขไม่ว่าด้วยวิธีใดก็ตาม - โดยทั่วไปแอพที่ไม่ได้ลงชื่อจะไม่สามารถติดตั้งได้ เราสามารถจินตนาการได้ว่าผู้โจมตีกำลังลบรหัสตรวจสอบใบอนุญาตเพื่อเปิดใช้งานฟีเจอร์แอพเต็มรูปแบบโดยไม่ต้องจ่ายเงิน ตัวอย่างที่อันตรายกว่านั้นคือการแก้ไข. apk ให้รวมมัลแวร์ไว้ในแอปที่ถูกต้องเพื่อรวบรวมข้อมูลผู้ใช้ที่ละเอียดอ่อน เพื่อให้ติดตั้ง. apk ที่เปลี่ยนแปลงได้ผู้โจมตีจะต้องลาออก
PiracyChecker ใหม่ (นี้)
.enableSigningCertificate (“ 478yYkKAQF + KST8y4ATKvHkYibo =”) // ลายเซ็น APK ดั้งเดิมสำหรับรุ่น PRODUCTION
...
.start ();
ระวัง!! สามารถดึงลายเซ็นแอปของคุณได้โดยใช้เมธอด PiracyCheckerUtils ตรวจสอบให้แน่ใจว่าคุณได้ลงนาม APK ของคุณโดยใช้ที่เก็บคีย์ PRODUCTION ของคุณ (ไม่ได้ใช้ DEBUG one) และติดตั้งเวอร์ชันที่คุณวางแผนจะแจกจ่าย จากนั้นคัดลอกลายเซ็นที่ส่งคืนโดยวิธีนี้บนคอนโซลและวางใน. enableSigningCertificate (“ YOUR_APK_SIGNATURE”)
// วิธีนี้จะพิมพ์ลายเซ็นแอปของคุณในคอนโซล
Log.e (“ SIGNATURE”, PiracyCheckerUtils.getAPKSignature (this));
ตรวจสอบตัวติดตั้ง
หากคุณวางแผนที่จะเผยแพร่แอปในร้านค้าใดร้านหนึ่งเท่านั้นเทคนิคนี้จะบล็อกไม่ให้ติดตั้งแอปโดยใช้ร้านค้าอื่น
ร้านค้าที่รองรับ: Google Play, Amazon App Store และ Samsung Galaxy Apps
PiracyChecker ใหม่ (นี้)
.enableInstallerId (InstallerID.GOOGLE_PLAY)
.enableInstallerId (InstallerID.AMAZON_APP_STORE)
.enableInstallerId (InstallerID.GALAXY_APPS)
...
.start ();
ระวัง!! นี่เป็นเทคนิคที่เข้มงวดมากเนื่องจากจะบล็อกแอปของคุณไม่ให้ติดตั้งโดยใช้ตลาดอื่นหรือติดตั้ง. apk ลงในอุปกรณ์โดยตรง ไม่แนะนำสำหรับกรณีส่วนใหญ่
ตรวจสอบการใช้แอปละเมิดลิขสิทธิ์
หากคุณต้องการตรวจสอบว่าผู้ใช้ติดตั้งแอปละเมิดลิขสิทธิ์หรือไม่คุณสามารถใช้รหัสนี้ได้
จะตรวจสอบ: Lucky Patcher, Uret Patcher, Freedom และ CreeHack
PiracyChecker ใหม่ (นี้)
.enableUnauthorizedAppsCheck ()
...
.start ();
คุณสามารถบล็อกแอปได้แม้ว่าจะถอนการติดตั้งแอปละเมิดลิขสิทธิ์แล้วก็ตาม ซึ่งจะป้องกันไม่ให้แอปถูกแพตช์จากนั้นถอนการติดตั้งแอปละเมิดลิขสิทธิ์เพื่อใช้งานแอปของคุณต่อ ไลบรารีจะบันทึกค่า SharedPreference เพื่อให้ทราบเมื่อตรวจพบแอปละเมิดลิขสิทธิ์
มีสองวิธีในการดำเนินการนี้:
กำหนด SharedPreferences และชื่อของการกำหนดลักษณะที่คุณต้องการบันทึกผลลัพธ์
PiracyChecker ใหม่ (นี้)
.enableUnauthorizedAppsCheck ()
.blockIfUnauthorizedAppUninstalled (ค่ากำหนด,“ app_unauthorized”) // เปลี่ยน“ app_unauthorized” ด้วยค่าของคุณเอง
...
.start ();
กำหนดชื่อ SharedPreferences และชื่อของการกำหนดลักษณะที่คุณต้องการบันทึกผลลัพธ์
PiracyChecker ใหม่ (นี้)
.enableUnauthorizedAppsCheck ()
.blockIfUnauthorizedAppUninstalled (“ license_preferences”,“ app_unauthorized”) // เปลี่ยน“ license_preferences” และ“ app_unauthorized” ด้วยค่าของคุณเอง
...
.start ();
ตรวจสอบการใช้แอพร้านค้าของบุคคลที่สาม
หากคุณต้องการตรวจสอบว่าผู้ใช้ติดตั้งแอพสโตร์ของ บริษัท อื่นหรือไม่คุณสามารถใช้รหัสนี้ได้
จะตรวจสอบ: Aptoide, BlackMart, Mobogenie, 1Mobile, GetApk, GetJar, SlideMe และ ACMarket
PiracyChecker ใหม่ (นี้)
.enableStoresCheck ()
...
.start ();
ตรวจสอบว่าแอปเป็นรุ่นแก้จุดบกพร่องหรือไม่
หากแอปของคุณทำงานบนโปรแกรมจำลองนอกขั้นตอนการพัฒนาแอปจะเป็นการบ่งชี้ว่ามีบุคคลอื่นที่ไม่ใช่คุณกำลังพยายามวิเคราะห์แอป
PiracyChecker ใหม่ (นี้)
.enableDebugCheck ()
...
.start ();
ตรวจสอบว่าแอปกำลังทำงานในโปรแกรมจำลองหรือไม่
นอกเหนือจากการพัฒนาแล้วแอปของคุณไม่ควรทำงานบนโปรแกรมจำลองและไม่แนะนำให้ปล่อยแอปที่เปิดใช้งานการแก้ไขข้อบกพร่องเนื่องจากอนุญาตให้คอมพิวเตอร์ที่เชื่อมต่อเข้าถึงและแก้ไขข้อบกพร่องของแอปผ่าน Android Debug Bridge
บูลีนลึก = เท็จ;
PiracyChecker ใหม่ (นี้)
.enableEmulatorCheck (ลึก)
...
.start ();
บันทึก: บูลีนแบบลึกที่ทำให้ไลบรารีทำการตรวจสอบเพิ่มเติมเพื่อตรวจสอบว่าอุปกรณ์เป็นตัวจำลองหรือไม่ อาจทำให้เกิดข้อขัดข้องแปลก ๆ ได้ดังนั้นควรใช้อย่างชาญฉลาด
บันทึกผลลัพธ์ของการตรวจสอบใบอนุญาตใน SharedPreferences
การบันทึกผลการตรวจสอบใบอนุญาตมีประโยชน์สำหรับการตรวจสอบสถานะใบอนุญาตโดยไม่ต้องโทร. start () หลาย ๆ ครั้ง
มีสองวิธีในการดำเนินการนี้:
กำหนด SharedPreferences และชื่อของการกำหนดลักษณะที่คุณต้องการบันทึกผลลัพธ์
PiracyChecker ใหม่ (นี้)
.saveResultToSharedPreferences (ค่ากำหนด,“ valid_license”) // เปลี่ยน“ valid_license” ด้วยค่าของคุณเอง
...
.start ();
กำหนดชื่อ SharedPreferences และชื่อของการกำหนดลักษณะที่คุณต้องการบันทึกผลลัพธ์
PiracyChecker ใหม่ (นี้)
.saveResultToSharedPreferences (“ license_preferences”,“ valid_license”) // เปลี่ยน“ license_preferences” และ“ valid_license” ด้วยค่าของคุณเอง
...
.start ();
การปรับแต่ง
แสดงผลลัพธ์ในกล่องโต้ตอบหรือกิจกรรมใหม่
ขอแนะนำให้แสดงกิจกรรมใหม่แทนกล่องโต้ตอบเมื่อใบอนุญาตไม่ถูกต้อง วิธีนี้จะทำให้แน่ใจว่ากิจกรรมหลักของแอปเสร็จสิ้นแล้ว
ตามค่าเริ่มต้นกล่องโต้ตอบที่ไม่สามารถยกเลิกได้จะปรากฏขึ้น
PiracyChecker ใหม่ (นี้)
.display (Display.ACTIVITY)
...
.start ();
โดยค่าเริ่มต้นกิจกรรมที่แสดงจะใช้สีของไลบรารี หากต้องการใช้สีเข้มหลักและสีหลักที่กำหนดเองและกำหนดว่ากิจกรรมควรแสดงแถบสถานะปกติหรือสีอ่อนให้ใช้:
.withActivityColors (R.color.colorPrimary, R.color.colorPrimaryDark, withLightStatusBar)
คุณยังสามารถกำหนด xml เลย์เอาต์แบบกำหนดเองสำหรับเนื้อหากิจกรรมนี้โดยใช้:
.withActivityLayout (Rlayout.my_custom_layout)
ใช้การโทรกลับที่กำหนดเอง
การเพิ่มการโทรกลับไปยังตัวสร้างช่วยให้คุณสามารถกำหนดสิ่งที่จะเกิดขึ้นเมื่อมีการตรวจสอบใบอนุญาตและจัดการข้อผิดพลาดในการตรวจสอบใบอนุญาตหากผู้ใช้ไม่ได้รับอนุญาตให้ใช้แอป โปรดทราบว่าเมื่อใช้วิธีนี้ คุณต้องระวังการบล็อกแอปจากผู้ใช้ที่ไม่ได้รับอนุญาต .
ตามค่าเริ่มต้นไลบรารีจะแสดงกล่องโต้ตอบที่ไม่สามารถยกเลิกได้หากผู้ใช้ไม่ได้รับอนุญาตให้ใช้แอปมิฉะนั้นจะไม่มีอะไรเกิดขึ้น
ใช้ตัวสร้างและเพิ่มสิ่งต่อไปนี้:
.callback (PiracyCheckerCallback ใหม่ () {
@แทนที่
โมฆะสาธารณะ allow () {
// ทำบางอย่างเมื่อผู้ใช้ได้รับอนุญาตให้ใช้แอพ
}
@แทนที่
โมฆะสาธารณะ dontAllow (ข้อผิดพลาด @NonNull PiracyCheckerError, แอป @Nullable PirateApp) {
// คุณสามารถทำบางอย่างที่เฉพาะเจาะจงเมื่อผู้ใช้ไม่ได้รับอนุญาตให้ใช้แอพ
// หรือจัดการข้อผิดพลาดโดยใช้พารามิเตอร์ 'error' ด้วยตัวคุณเอง (ตรวจสอบข้อผิดพลาดที่ {@link PiracyCheckerError})
// นอกจากนี้หากคุณเปิดใช้งานการตรวจสอบแอปละเมิดลิขสิทธิ์และ / หรือร้านค้าของบุคคลที่สามพารามิเตอร์ 'แอป'
// คือแอปที่ตรวจพบบนอุปกรณ์ แอปสามารถเป็นโมฆะและเมื่อเป็นโมฆะหมายความว่าไม่พบแอปหรือร้านค้าละเมิดลิขสิทธิ์
// หรือคุณปิดใช้งานการตรวจสอบแอปเหล่านั้น
// สิ่งนี้ช่วยให้คุณสามารถแจ้งให้ผู้ใช้ทราบถึงสาเหตุที่เป็นไปได้ว่าทำไมใบอนุญาตไม่ถูกต้อง
}
@แทนที่
โมฆะสาธารณะ onError (ข้อผิดพลาด @NonNull PiracyCheckerError) {
// วิธีนี้ไม่จำเป็นต้องนำไปใช้ / overriden แต่ ...
// คุณสามารถทำบางอย่างเฉพาะเมื่อเกิดข้อผิดพลาดขณะตรวจสอบใบอนุญาต
// หรือจัดการข้อผิดพลาดโดยใช้พารามิเตอร์ 'error' ด้วยตัวคุณเอง (ตรวจสอบข้อผิดพลาดที่ {@link PiracyCheckerError})
}
})
อ่าน 6 นาที