วิธีเปิด APK และวิธีแก้ไข การใช้โปรแกรม apktool เพื่อแยกและประกอบไฟล์ APK

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

การแนะนำ

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

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

ดังนั้นแพ็คเกจ APK ที่แจกจ่ายซอฟต์แวร์ Android ทั้งหมดคืออะไร?

การถอดรหัสแอปพลิเคชัน

ในบทความนี้ เราทำงานกับโค้ดแอปพลิเคชันแบบแยกส่วนเท่านั้น แต่หากมีการเปลี่ยนแปลงที่ร้ายแรงยิ่งขึ้นกับแอปพลิเคชันขนาดใหญ่ การทำความเข้าใจโค้ด smali จะยากขึ้นมาก โชคดีที่เราสามารถถอดรหัสโค้ด dex ให้เป็นโค้ด Java ได้ ซึ่งแม้ว่าจะไม่ใช่ต้นฉบับและไม่ได้คอมไพล์กลับ แต่ก็อ่านและเข้าใจตรรกะของแอปพลิเคชันได้ง่ายกว่ามาก ในการทำเช่นนี้ เราจะต้องมีเครื่องมือสองอย่าง:

  • dex2jar เป็นตัวแปล Dalvik bytecode ไปเป็น JVM bytecode ซึ่งเราสามารถรับโค้ดในภาษา Java ได้
  • jd-gui เป็นตัวถอดรหัสที่ช่วยให้คุณรับโค้ด Java ที่อ่านได้จาก JVM bytecode คุณสามารถใช้ Jad (www.varaneckas.com/jad) แทนได้ แม้ว่าจะค่อนข้างเก่า แต่ในบางกรณีก็สร้างโค้ดที่อ่านได้ง่ายกว่า Jd-gui

นี่คือวิธีที่ควรใช้ ขั้นแรก เราเปิดตัว dex2jar โดยระบุเส้นทางไปยังแพ็คเกจ APK เป็นอาร์กิวเมนต์:

% dex2jar.sh เมล apk

ด้วยเหตุนี้ แพ็กเกจ Java mail.jar จะปรากฏในไดเร็กทอรีปัจจุบัน ซึ่งสามารถเปิดใน jd-gui เพื่อดูโค้ด Java ได้

การจัดเรียงแพ็คเกจ APK และรับ

แพ็คเกจแอป Android นั้นเป็นไฟล์ ZIP ทั่วไปที่ไม่ต้องใช้เครื่องมือพิเศษใดๆ ในการดูเนื้อหาหรือแตกไฟล์ ก็เพียงพอแล้วที่จะมีผู้จัดเก็บ - 7zip สำหรับ Windows หรือคลายซิปคอนโซลบน Linux แต่นั่นก็เกี่ยวกับกระดาษห่อหุ้ม อะไรอยู่ข้างใน? โดยทั่วไปแล้ว เรามีโครงสร้างภายในดังนี้:

  • เมตา-INF/- มีใบรับรองดิจิทัลของแอปพลิเคชัน ระบุผู้สร้าง และการตรวจสอบไฟล์แพ็คเกจ
  • res/ - ทรัพยากรต่างๆ ที่แอปพลิเคชันใช้ในการทำงาน เช่น รูปภาพ คำอธิบายอินเทอร์เฟซ ตลอดจนข้อมูลอื่น ๆ
  • AndroidManifest.xml- คำอธิบายของแอปพลิเคชัน ซึ่งรวมถึงรายการสิทธิ์ที่จำเป็น เวอร์ชัน Android ที่จำเป็น และความละเอียดหน้าจอที่ต้องการ
  • คลาส.dex- รวบรวม bytecode ของแอปพลิเคชันสำหรับเครื่องเสมือน Dalvik
  • ทรัพยากร.arsc- รวมถึงทรัพยากร แต่เป็นประเภทที่แตกต่างกัน - โดยเฉพาะสตริง (ใช่ ไฟล์นี้สามารถใช้สำหรับ Russification ได้!)

ไฟล์และไดเร็กทอรีที่อยู่ในรายการอาจอยู่ใน APK ส่วนใหญ่หากไม่ใช่ทั้งหมด อย่างไรก็ตาม มีไฟล์/ไดเร็กทอรีที่ไม่ธรรมดาอีกสองสามรายการที่ควรค่าแก่การกล่าวถึง:

  • สินทรัพย์- อะนาล็อกของทรัพยากร ข้อแตกต่างที่สำคัญคือในการเข้าถึงทรัพยากร คุณต้องทราบตัวระบุ แต่สามารถรับรายการสินทรัพย์แบบไดนามิกได้โดยใช้เมธอด AssetManager.list() ในโค้ดแอปพลิเคชัน
  • lib- ไลบรารี Linux ดั้งเดิมที่เขียนโดยใช้ NDK (Native Development Kit)

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

  • ส่วนขยาย APK Downloader สำหรับ Chrome;
  • แอป APK Leecher จริง;
  • การโฮสต์ไฟล์ต่างๆ และ Varezniks

จะใช้อันไหนเป็นเรื่องของรสนิยม เราต้องการใช้แอปพลิเคชันแยกกัน ดังนั้นเราจะอธิบายการใช้งาน Real APK Leecher โดยเฉพาะอย่างยิ่งเมื่อเขียนด้วยภาษา Java และดังนั้นจึงใช้งานได้กับ Windows หรือ Nix

หลังจากเริ่มโปรแกรม คุณจะต้องกรอกข้อมูลในสามฟิลด์: อีเมล รหัสผ่าน และรหัสอุปกรณ์ - และเลือกภาษา สองรายการแรกคืออีเมลและรหัสผ่านของบัญชี Google ที่คุณใช้บนอุปกรณ์ ตัวที่สามคือตัวระบุอุปกรณ์และสามารถรับได้โดยการพิมพ์รหัสบนตัวเรียกเลขหมาย # #8255## จากนั้นจึงค้นหาบรรทัด Device ID เมื่อกรอก คุณจะต้องป้อน ID โดยไม่ต้องใส่คำนำหน้า android

หลังจากกรอกและบันทึกแล้ว ข้อความ “ข้อผิดพลาดขณะเชื่อมต่อกับเซิร์ฟเวอร์” มักจะปรากฏขึ้น มันไม่เกี่ยวอะไรกับ Google Play ดังนั้นอย่าลังเลที่จะเพิกเฉยและมองหาแพ็คเกจที่คุณสนใจ

ดูและแก้ไข

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

  • โปรแกรมเก็บ ZIPสำหรับการแกะและบรรจุ
  • สมาลี- แอสเซมเบลอร์ / แอสเซมเบลอร์เครื่องเสมือน Dalvik (code.google.com/p/smali)
  • เหมาะสม- เครื่องมือสำหรับการบรรจุทรัพยากร (โดยค่าเริ่มต้น ทรัพยากรจะถูกจัดเก็บในรูปแบบไบนารีเพื่อเพิ่มประสิทธิภาพแอปพลิเคชัน) รวมอยู่ใน Android SDK แต่สามารถรับแยกต่างหากได้
  • ผู้ลงนาม- เครื่องมือสำหรับการลงนามแบบดิจิทัลในแพ็คเกจที่แก้ไข (bit.ly/Rmrv4M)

คุณสามารถใช้เครื่องมือเหล่านี้แยกกันได้ แต่จะไม่สะดวกดังนั้นจึงควรใช้ซอฟต์แวร์ระดับสูงกว่าที่สร้างขึ้นบนพื้นฐานของเครื่องมือเหล่านี้ หากคุณทำงานบน Linux หรือ Mac OS X จะมีเครื่องมือชื่อ apktool ช่วยให้คุณสามารถแยกทรัพยากรในรูปแบบดั้งเดิม (รวมถึงไฟล์ XML ไบนารีและ arsc) สร้างแพ็คเกจใหม่ด้วยทรัพยากรที่เปลี่ยนแปลง แต่ไม่ทราบวิธีลงนามแพ็คเกจ ดังนั้นคุณจะต้องเรียกใช้ยูทิลิตี้ผู้ลงนามด้วยตนเอง แม้ว่ายูทิลิตี้นี้จะเขียนด้วยภาษา Java แต่การติดตั้งนั้นค่อนข้างไม่ได้มาตรฐาน ก่อนอื่นคุณต้องได้รับไฟล์ jar เอง:

$ ซีดี /tmp $ wget http://bit.ly/WC3OCz $ tar -xjf apktool1.5.1.tar.bz2

$ wget http://bit.ly/WRjEc7 $ tar -xjf apktool-install-linux-r05-ibot.tar.bz2

$ mv apktool.jar ~/bin $ mv apktool-install-linux-r05-ibot/* ~/bin $ ส่งออก PATH=~/bin:$PATH

หากคุณทำงานบน Windows แสดงว่ามีเครื่องมือที่ยอดเยี่ยมที่เรียกว่า Virtuous Ten Studio ซึ่งรวบรวมเครื่องมือเหล่านี้ทั้งหมด (รวมถึง apktool เอง) แต่แทนที่จะเป็นอินเทอร์เฟซ CLI จะให้อินเทอร์เฟซแบบกราฟิกที่ใช้งานง่ายแก่ผู้ใช้ซึ่งคุณสามารถทำได้ ดำเนินการเพื่อแกะกล่อง การแยกส่วน และการแยกส่วนออกด้วยการคลิกเพียงไม่กี่ครั้ง เครื่องมือนี้เป็น Donation-ware นั่นคือบางครั้งหน้าต่างปรากฏขึ้นเพื่อขอให้คุณได้รับใบอนุญาต แต่ในท้ายที่สุดก็สามารถยอมรับได้ ไม่มีประโยชน์ที่จะอธิบายเพราะคุณสามารถเข้าใจอินเทอร์เฟซได้ภายในไม่กี่นาที แต่ควรพูดคุยถึงรายละเอียดเพิ่มเติมเนื่องจากลักษณะของคอนโซล apktool


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

ลองดูตัวเลือกที่น่าสนใจที่สุดของคำสั่งแรก:

  • -ส- อย่าแยกไฟล์ dex;
  • -ร- อย่าแกะทรัพยากร
  • -ข- อย่าใส่ข้อมูลการดีบักลงในผลลัพธ์ของการแยกส่วนไฟล์ dex
  • --frame-เส้นทาง- ใช้เฟรมเวิร์ก UI ที่ระบุแทนเฟรมเวิร์กที่สร้างไว้ใน apktool ตอนนี้เรามาดูตัวเลือกสองสามตัวสำหรับคำสั่ง b:
  • -ฉ- บังคับประกอบโดยไม่ตรวจสอบการเปลี่ยนแปลง
  • -ก- ระบุเส้นทางไปยัง aapt (เครื่องมือสำหรับสร้างไฟล์เก็บถาวร APK) หากคุณต้องการใช้จากแหล่งอื่นด้วยเหตุผลบางประการ

การใช้ apktool นั้นง่ายมาก ในการดำเนินการนี้ เพียงระบุคำสั่งใดคำสั่งหนึ่งและเส้นทางไปยัง APK เช่น:

$ apktool และ mail.apk

หลังจากนี้ไฟล์ที่แยกและแยกส่วนของแพ็คเกจทั้งหมดจะปรากฏในไดเร็กทอรีเมล

การตระเตรียม. ปิดการใช้งานการโฆษณา

แน่นอนว่าทฤษฎีนั้นดี แต่ทำไมจึงต้องมีถ้าเราไม่รู้ว่าจะทำอย่างไรกับบรรจุภัณฑ์ที่แกะออกมาแล้ว เรามาลองใช้ทฤษฎีนี้เพื่อประโยชน์ของเรา กล่าวคือ ปรับเปลี่ยนซอฟต์แวร์บางตัวเพื่อไม่ให้แสดงโฆษณาให้เราเห็น ตัวอย่างเช่น ปล่อยให้เป็น Virtual Torch - คบเพลิงเสมือนจริง ซอฟต์แวร์นี้เหมาะสำหรับเรา เนื่องจากมีโฆษณาที่น่ารำคาญเต็มเปี่ยม และยิ่งกว่านั้น ยังเรียบง่ายพอที่จะไม่หลงไปกับโค้ดอันยุ่งเหยิง


ดังนั้นโดยใช้วิธีใดวิธีหนึ่งข้างต้น ให้ดาวน์โหลดแอปพลิเคชันจากตลาด หากคุณตัดสินใจใช้ Virtuous Ten Studio เพียงเปิดไฟล์ APK ในแอปพลิเคชันแล้วแตกไฟล์ สร้างโปรเจ็กต์ (ไฟล์ -> โปรเจ็กต์ใหม่) จากนั้นเลือกนำเข้าไฟล์ในเมนูบริบทของโปรเจ็กต์ หากตัวเลือกของคุณตกอยู่ที่ apktool ให้รันเพียงคำสั่งเดียว:

$ apktool และ com.kauf.particle.virtualtorch.apk

หลังจากนี้ แผนผังไฟล์ที่คล้ายกับที่อธิบายไว้ในส่วนก่อนหน้าจะปรากฏในไดเร็กทอรี com.kauf.particle.virtualtorch แต่มีไดเร็กทอรี smali เพิ่มเติมแทนไฟล์ dex และไฟล์ apktool.yml ไฟล์แรกประกอบด้วยโค้ดที่ถอดประกอบได้ของไฟล์ dex ที่ปฏิบัติการได้ของแอปพลิเคชัน ส่วนไฟล์ที่สองประกอบด้วยข้อมูลบริการที่จำเป็นสำหรับ apktool ในการประกอบแพ็กเกจกลับ

แน่นอนว่าที่แรกที่เราควรดูคือ AndroidManifest.xml และที่นี่เราพบบรรทัดต่อไปนี้ทันที:

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

$ apktool ข com.kauf.particle.virtualtorch

ไฟล์ APK ที่ได้จะปรากฏในไดเร็กทอรี com.kauf.particle.virtualtorch/build/ อย่างไรก็ตาม จะไม่สามารถติดตั้งได้ เนื่องจากไม่มีลายเซ็นดิจิทัลและเช็คซัมไฟล์ (เพียงแต่ไม่มีไดเรกทอรี META-INF/) เราต้องลงนามแพ็คเกจโดยใช้ยูทิลิตี้ apk-signer เปิดตัวแล้ว อินเทอร์เฟซประกอบด้วยสองแท็บ - แท็บแรก (ตัวสร้างคีย์) ที่เราสร้างคีย์ และแท็บที่สอง (APK Signer) ที่เราลงนาม หากต้องการสร้างคีย์ส่วนตัวของเรา ให้กรอกข้อมูลในช่องต่อไปนี้:

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

โดยทั่วไปช่องที่เหลือจะเป็นตัวเลือก - แต่ต้องกรอกอย่างน้อยหนึ่งช่อง


คำเตือน

หากต้องการลงนามแอปพลิเคชันโดยใช้ apk-signer คุณต้องติดตั้ง Android SDK และระบุเส้นทางแบบเต็มในการตั้งค่าแอปพลิเคชัน

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

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

ข้อมูล

เนื่องจากเราลงนามแพ็คเกจด้วยคีย์ของเราเอง มันจะขัดแย้งกับแอปพลิเคชันดั้งเดิม ซึ่งหมายความว่าเมื่อเราพยายามอัปเดตซอฟต์แวร์ผ่านตลาด เราจะได้รับข้อผิดพลาด

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

หลังจากนั้น ดาวน์โหลดแพ็คเกจลงในสมาร์ทโฟนของคุณ ติดตั้งและเปิดใช้งาน Voila โฆษณาหายไป! แต่มีข้อความปรากฏว่าเราไม่มีอินเทอร์เน็ตหรือไม่มีสิทธิ์ที่เหมาะสม ตามทฤษฎีแล้ว นี่อาจเพียงพอแล้ว แต่ข้อความดูน่ารำคาญ และบอกตามตรงว่าเราโชคดีกับแอปพลิเคชันโง่ๆ ซอฟต์แวร์ที่เขียนขึ้นตามปกติมักจะชี้แจงข้อมูลประจำตัวของตนให้ชัดเจนหรือตรวจสอบการเชื่อมต่ออินเทอร์เน็ต มิฉะนั้นก็เพียงปฏิเสธที่จะเปิดตัว ในกรณีนี้จะเป็นอย่างไร? แน่นอนแก้ไขโค้ด

โดยทั่วไปแล้ว ผู้เขียนแอปพลิเคชันจะสร้างคลาสพิเศษสำหรับการแสดงโฆษณาและวิธีการเรียกใช้คลาสเหล่านี้เมื่อแอปพลิเคชันหรือ "กิจกรรม" อย่างใดอย่างหนึ่ง (กล่าวง่ายๆ คือ หน้าจอแอปพลิเคชัน) เปิดตัว ลองหาคลาสเหล่านี้ดู เราไปที่ไดเร็กทอรี smali จากนั้น com (org มีเฉพาะไลบรารีกราฟิกแบบเปิด cocos2d) จากนั้น kauf (นี่คือที่ที่มันอยู่เพราะนี่คือชื่อของนักพัฒนาและโค้ดทั้งหมดของเขาอยู่ที่นั่น) - และนี่คือ ไดเร็กทอรีการตลาด ข้างในเราจะพบไฟล์จำนวนหนึ่งที่มีนามสกุล smali เหล่านี้เป็นคลาสและคลาสที่โดดเด่นที่สุดคือคลาส Ad.smali จากชื่อที่ง่ายต่อการเดาว่าเป็นคลาสที่แสดงโฆษณา

เราสามารถเปลี่ยนตรรกะของการดำเนินการได้ แต่จะง่ายกว่ามากในการลบการเรียกไปยังวิธีการใด ๆ ออกจากแอปพลิเคชันเอง ดังนั้นเราจึงออกจากไดเร็กทอรีการตลาดและไปที่ไดเร็กทอรีอนุภาคที่อยู่ติดกัน จากนั้นจึงไปที่ virtualtorch ไฟล์ MainActivity.smali สมควรได้รับความสนใจเป็นพิเศษที่นี่ นี่คือคลาส Android มาตรฐานที่สร้างโดย Android SDK และติดตั้งเป็นจุดเริ่มต้นในแอปพลิเคชัน (คล้ายกับฟังก์ชันหลักใน C) เปิดไฟล์เพื่อแก้ไข

ข้างในมีรหัส smali (ผู้ประกอบท้องถิ่น) มันค่อนข้างน่าสับสนและอ่านยากเนื่องจากมีลักษณะเป็นระดับต่ำ ดังนั้นเราจะไม่ศึกษามัน แต่จะค้นหาการอ้างอิงถึงคลาสโฆษณาทั้งหมดในโค้ดและแสดงความคิดเห็น เราป้อนบรรทัด "โฆษณา" ในการค้นหาและไปที่บรรทัดที่ 25:

โฆษณาส่วนตัวของฟิลด์:Lcom/kauf/marketing/Ad;

ที่นี่ฟิลด์โฆษณาถูกสร้างขึ้นเพื่อจัดเก็บออบเจ็กต์คลาสโฆษณา เราแสดงความคิดเห็นโดยติดเครื่องหมาย ### ไว้หน้าบรรทัด เราทำการค้นหาต่อไป บรรทัด 423:

อินสแตนซ์ใหม่ v3, Lcom/kauf/marketing/Ad;

นี่คือจุดที่การสร้างวัตถุเกิดขึ้น มาแสดงความคิดเห็นกัน เราทำการค้นหาต่อไปและค้นหาในบรรทัด 433, 435, 466, 468, 738, 740, 800 และ 802 การเรียกไปยังเมธอดของคลาสโฆษณา มาแสดงความคิดเห็นกัน ดูเป็นอันนั้นแหละ.. มาบันทึกกันเถอะ ตอนนี้จำเป็นต้องประกอบแพ็คเกจกลับเข้าด้วยกันและตรวจสอบการทำงานและการมีโฆษณา เพื่อความบริสุทธิ์ของการทดสอบ เราจะส่งคืนบรรทัดที่ลบออกจาก AndroidManifest.xml ประกอบแพ็กเกจ ลงนาม และติดตั้ง

หนูตะเภาของเรา โฆษณาที่มองเห็นได้

อ๊ะ! โฆษณาหายไปเฉพาะในขณะที่แอปพลิเคชันทำงาน แต่ยังคงอยู่ในเมนูหลัก ซึ่งเราจะเห็นเมื่อเราเปิดตัวซอฟต์แวร์ ดังนั้นเดี๋ยวก่อน แต่จุดเริ่มต้นคือคลาส MainActivity และโฆษณาหายไปในขณะที่แอปพลิเคชันกำลังทำงาน แต่ยังคงอยู่ในเมนูหลัก ดังนั้นจุดเริ่มต้นจึงแตกต่างออกไป หากต้องการระบุจุดเริ่มต้นที่แท้จริง ให้เปิดไฟล์ AndroidManifest.xml อีกครั้ง และใช่ มันมีบรรทัดต่อไปนี้:

พวกเขาบอกเรา (และที่สำคัญกว่านั้นคือ android) ว่ากิจกรรมชื่อ Start ควรเปิดตัวเพื่อตอบสนองต่อการสร้างเจตนา (เหตุการณ์) android.intent.action.MAIN จากหมวดหมู่ android.intent.category.LAUNCHER เหตุการณ์นี้สร้างขึ้นเมื่อคุณแตะที่ไอคอนแอปพลิเคชันในตัวเรียกใช้งาน ดังนั้นจึงกำหนดจุดเริ่มต้น ซึ่งก็คือคลาสเริ่มต้น เป็นไปได้มากที่โปรแกรมเมอร์จะเขียนแอปพลิเคชันโดยไม่มีเมนูหลักซึ่งเป็นจุดเริ่มต้นซึ่งเป็นคลาส MainActivity มาตรฐานจากนั้นจึงเพิ่มหน้าต่างใหม่ (กิจกรรม) ที่มีเมนูและอธิบายไว้ในคลาส Start และทำให้เป็นรายการด้วยตนเอง จุด.

เปิดไฟล์ Start.smali และมองหาบรรทัด "โฆษณา" อีกครั้ง เราพบการกล่าวถึงคลาส FirstAd ในบรรทัดที่ 153 และ 155 นอกจากนี้ยังอยู่ในซอร์สโค้ดและเมื่อพิจารณาจากชื่อแล้วจะมีหน้าที่แสดงโฆษณาบนหน้าจอหลัก ลองดูเพิ่มเติม มีการสร้างอินสแตนซ์ของคลาส FirstAd และเจตนาที่เกี่ยวข้องกับอินสแตนซ์นี้ตามบริบท ตามด้วยป้ายกำกับ con_10 ซึ่งเป็นการเปลี่ยนแปลงแบบมีเงื่อนไขซึ่งดำเนินการก่อนสร้างอินสแตนซ์ทุกประการ ของชั้นเรียน:

If-ne p1, v0, :cond_10 .line 74 อินสแตนซ์ใหม่ v0, Landroid/เนื้อหา/เจตนา; ... :cond_10

เป็นไปได้มากว่าโปรแกรมจะสุ่มคำนวณว่าควรแสดงโฆษณาบนหน้าจอหลักหรือไม่ และหากไม่เป็นเช่นนั้น ให้ข้ามไปที่ cond_10 โดยตรง ตกลง มาทำให้งานของเธอง่ายขึ้นและแทนที่การเปลี่ยนแปลงแบบมีเงื่อนไขด้วยการเปลี่ยนแบบไม่มีเงื่อนไข:

#if-ne p1, v0, :cond_10 ไปที่:cond_10

ไม่มีการกล่าวถึง FirstAd ในโค้ดอีกต่อไป ดังนั้นเราจึงปิดไฟล์และประกอบคบเพลิงเสมือนของเราอีกครั้งโดยใช้ apktool คัดลอกไปยังสมาร์ทโฟนของคุณ ติดตั้ง และเปิดใช้งาน Voila โฆษณาทั้งหมดหายไปแล้ว เราขอแสดงความยินดีกับพวกเราทุกคน

ผลลัพธ์

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

จากบทความนี้คุณจะได้เรียนรู้ว่าแอปพลิเคชัน Android ประกอบด้วยอะไรบ้าง วิธีเปิดไฟล์ APK และโปรแกรมใดบ้าง

ไฟล์ APK คืออะไร

APK คือรูปแบบของระบบปฏิบัติการ Android ที่ใช้สำหรับไฟล์แอปพลิเคชันปฏิบัติการที่เก็บถาวร และชื่อของไฟล์อาจเป็นอะไรก็ได้ แต่นามสกุลควรมีลักษณะดังนี้ this.apk เท่านั้น APK ที่คล้ายคลึงกันในระบบปฏิบัติการอื่น ได้แก่ .msi ใน Windows, .sis ใน Symbian, .rpm หรือ .deb ใน Linux

มาดูกันว่ามีอะไรอยู่ข้างใน
ที่จริงแล้ว .apk เป็นไฟล์ ZIP ดังนั้นคุณจึงสามารถดูอุปกรณ์ภายในได้โดยใช้ตัวจัดการไฟล์หรือโปรแกรมจัดเก็บไฟล์ เช่น WinRAR หรือแอปพลิเคชันมือถือ X-plore




โปรดจำไว้ว่าคุณสามารถเข้าถึงทรัพยากรภายในด้วยภาพเท่านั้น ความสามารถในการแก้ไขมีจำกัดอย่างยิ่ง

มาดูโครงสร้างกัน
ภายใน .apk เราเห็นไฟล์และโฟลเดอร์จำนวนหนึ่ง มาดูกันว่ามีไว้เพื่ออะไร:

  • AndroidManifest.xml เป็น "หนังสือเดินทาง" ของแอปพลิเคชันซึ่งคุณสามารถค้นหาประเด็นหลัก ข้อกำหนด เวอร์ชัน การอนุญาต ฯลฯ ทั้งหมดได้
  • META-INF ไฟล์นี้มีข้อมูลเมตา นั่นคือ ข้อมูลเกี่ยวกับข้อมูล เช็คซัม เส้นทางไปยังข้อมูล เส้นทางและเช็คซัมของทรัพยากร ใบรับรอง คุณสามารถเปิดไฟล์นี้ด้วยโปรแกรมแก้ไขข้อความใดก็ได้ แต่แนะนำให้ใช้ Notepad++
  • โฟลเดอร์ res ประกอบด้วยทรัพยากรของโปรแกรม กราฟิก เช่น ไอคอน รูปภาพ ข้อความ และองค์ประกอบอินเทอร์เฟซแบบกราฟิก คุณยังสามารถเข้าถึงโฟลเดอร์ได้อย่างง่ายดาย
  • class.dex เป็นโค้ดโปรแกรมแอปพลิเคชันโดยตรงที่ดำเนินการโดยเครื่องเสมือน Dalvik VM คุณสามารถดูสิ่งที่อยู่ภายในไฟล์นี้ได้โดยการคอมไพล์ .apk เท่านั้น เราจะพูดถึงเรื่องนี้ในบทความอื่น ๆ resources.arsc - ไฟล์ XML ที่คอมไพล์แล้ว ไฟล์นี้มีข้อมูลเกี่ยวกับทรัพยากรทั้งหมดที่เกี่ยวข้องกับโปรแกรม
  • lib - โฟลเดอร์ที่มีไลบรารี่ดั้งเดิมซึ่งสามารถเข้าถึงทรัพยากรได้เมื่อใช้โปรแกรมพิเศษเท่านั้น นอกจากนี้ใน APK อาจมีไฟล์และโฟลเดอร์เช่น com, org, udk แต่ไม่เสมอไป

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


ดังนั้นเราจึงติดตั้ง APKing เช่นเดียวกับแอปพลิเคชันใด ๆ สำหรับ Windows และเมื่อเลือก .apk แล้ว ให้คลิกที่มันด้วยปุ่มเมาส์ขวาและ Shift พร้อมกันหลังจากนั้นเราจะเห็นสิ่งต่อไปนี้:



และเลือกการดำเนินการที่ต้องการ เช่น แยกคอมไพล์ทั้งหมด จากนั้นโปรแกรมจะดำเนินการให้เสร็จสิ้นและสร้างโฟลเดอร์ที่มีชื่อเดียวกัน



เมื่อเปิดโฟลเดอร์เราจะสามารถเข้าถึงทรัพยากรทั้งหมดของไฟล์ APK



ขณะนี้ไฟล์ข้อความทั้งหมดสามารถแก้ไขได้ โดยปฏิบัติตามกฎพื้นฐาน คุณสามารถใช้โปรแกรม Notepad++ ยอดนิยมได้ เช่น ลองพิจารณา AndroidManifest.xml

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

หมายเหตุ 1.
โปรแกรม SmartAPKTool ยังคงสะดวกในการใช้สำหรับการลงนามไฟล์ APK ที่รวบรวมไว้
โน้ต 2.
ลิงค์ไปยังโปรแกรมที่กล่าวถึงในบทความคือ↓

โปรแกรม apktool.apkไม่มีส่วนต่อประสานกราฟิก นี่เป็นข้อเสียสำหรับผู้ที่ไม่คุ้นเคยกับการทำงานกับบรรทัดคำสั่ง แต่ก็มีข้อดีเช่นกัน: เราจะเห็นข้อผิดพลาดทั้งหมดซึ่งแตกต่างจาก SmartAPKTool ซึ่งหมายความว่าเราจะรู้ว่าต้องแก้ไขอะไร

มาดาวน์โหลดไฟล์เก็บถาวรสองไฟล์กัน: อันหนึ่งใช้ร่วมกันสำหรับทุกระบบ, อีกอันสำหรับระบบของเรา (ในตัวอย่าง Windows):

มาแตกไฟล์เก็บถาวรทั้งสองไฟล์ลงในโฟลเดอร์ว่างเดียวกัน (ในตัวอย่างของเรา C:\apktool\) เนื้อหาควรมีลักษณะดังนี้:

จากนี้ไปเราก็สามารถใช้โปรแกรมได้ apktool.apk.

หมายเหตุ 3
ผู้ใช้ Linux เวอร์ชัน 64 บิตจะต้องติดตั้งแพ็คเกจ ia32-libs:

sudo apt-get ติดตั้ง ia32-libs

ในโฟลเดอร์เดียวกันเราใส่ไฟล์ที่เราต้องแตกออก เช่น ตั้งชื่อว่า orig.apk
กดปุ่ม Shift ค้างไว้แล้วคลิกขวาบนพื้นที่ว่างในโฟลเดอร์ (อย่าคลิกที่ไฟล์!) หลังจากนั้นเลือก “เปิดหน้าต่างคำสั่ง” ในคอนโซลที่ปรากฏขึ้น ให้พิมพ์:

apktool ถอดรหัส orig.apk

ไฟล์จะถูกแตกไฟล์:

ตอนนี้เรามีโฟลเดอร์ที่มีแอปพลิเคชันที่คลายแพ็กแล้วในไดเร็กทอรี C:\apktool\ มันถูกเรียกว่าเหมือนกับไฟล์ต้นฉบับ ลบนามสกุล: C:\apktool\orig\ เราสามารถเปลี่ยนไฟล์ต้นฉบับตามที่อธิบายไว้ในบทความ Android: วิธีติดตั้งแอปพลิเคชันที่เหมือนกันสองตัวในโทรศัพท์เครื่องเดียว หลังจากที่เราทำการเปลี่ยนแปลงแล้ว เราจะรวบรวมสำเนาของแอปพลิเคชันโดยรวมไฟล์ต้นฉบับลงใน APK:

apktool สร้าง orig result.apk

ที่นี่ result.apk คือชื่อไฟล์ที่เราคิดขึ้นมาสำหรับการสร้างสำเนา หากไม่มีข้อผิดพลาด ไฟล์จะถูกประกอบ:

ส่วนที่เหลืออยู่นอกเหนือขอบเขตของบทความ:

  1. หากมีข้อผิดพลาดระหว่างการประกอบ คุณจะต้องค้นหาสาเหตุและแก้ไขให้ถูกต้อง
  2. สิ่งที่เหลืออยู่คือการลงนามไฟล์ result.apk ที่เป็นผลลัพธ์ สามารถทำได้โดยใช้ SmartAPKTool ตามที่กล่าวไว้ข้างต้น ทุกอย่างเกี่ยวกับเรื่องนี้เป็นไปตามสัญชาตญาณ ยังมีวิธีอื่นในการลงนามไฟล์ APK
  3. ข้อผิดพลาดอาจเกิดขึ้นเมื่อติดตั้งสำเนาระหว่างการเริ่มต้นหรือการทำงาน พวกเขาจำเป็นต้องถูกจับได้โดยใช้ยูทิลิตี้ adb ที่รวมอยู่ใน Android SDK

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

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

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

ขั้นแรก คุณต้องดำเนินการกระบวนการถอดรหัสไฟล์ APK ของระบบ เราจะบอกวิธีการทำเช่นนี้ค่ะ

ดังนั้นไฟล์ .apk จึงถูกถอดรหัสและคอมไพล์แล้ว เรามาวิเคราะห์ Application ที่เราสนใจกัน ให้มีชื่อ เพื่อความชัดเจน เช่น กรอบ- ความละเอียด. เอพีเค- เราจำมันไว้ในหัวของเราเป็นแอปพลิเคชั่นดั้งเดิม

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

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

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

เปลือก

แอป java -jar apktool.jar b

java - แอพ jar apktool .jar b

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

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

เปลือก

java -jar signapk.jar testkey.x509.pem testkey.pk8 *.apk apk_signed.apk

java - jar signapk .jar testkey .x509 .pem testkey .pk8 * .apk apk_signed .apk

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

บทสรุป

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

ขอบคุณทุกท่าน แล้วพบกันใหม่ครับ

  • ส่วนของเว็บไซต์