นักพัฒนา Android สามารถปกป้องแอปของตนจากแฮกเกอร์ IAP ได้อย่างไร



ลองใช้เครื่องมือของเราเพื่อกำจัดปัญหา

คู่มือนี้มีไว้สำหรับนักพัฒนาแอป 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 นาที