როგორ გავხსნათ APK და როგორ მოვახდინოთ რედაქტირება? apktool-ის გამოყენება პროგრამა apk ფაილის დაშლისა და აწყობისთვის

ზოგჯერ ანდროიდზე არსებული ზოგიერთი აპლიკაცია მომხმარებლისთვის გარკვეულწილად არ ჯდება. ამის მაგალითია ინტრუზიული რეკლამა. ასევე ხდება, რომ პროგრამა ყველასთვის კარგია, მაგრამ მასში თარგმანი ან მრუდეა, ან საერთოდ არ არსებობს. ან, მაგალითად, პროგრამა არის საცდელი, მაგრამ სრული ვერსიის მიღების საშუალება არ არსებობს. როგორ შევცვალოთ სიტუაცია?

შესავალი

ამ სტატიაში ვისაუბრებთ იმაზე, თუ როგორ უნდა დაშალოთ 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 mail.apk

შედეგად, Java პაკეტი mail.jar გამოჩნდება მიმდინარე დირექტორიაში, რომელიც უკვე შეიძლება გაიხსნას jd-gui-ში Java კოდის სანახავად.

APK პაკეტების მოწყობა და მათი მიღება

Android აპლიკაციის პაკეტი არსებითად ჩვეულებრივი ZIP ფაილია, რომელიც არ საჭიროებს რაიმე სპეციალურ ინსტრუმენტებს მისი შინაარსის სანახავად ან ამოსაღებად. საკმარისია გქონდეთ არქივი - 7zip Windows-ისთვის ან კონსოლის unzip Linux-ზე. მაგრამ ეს ეხება შეფუთვას. Რა არის შიგნით? ზოგადად, შიგნით გვაქვს შემდეგი სტრუქტურა:

  • META-INF/- შეიცავს აპლიკაციის ციფრულ სერტიფიკატს, მისი შემქმნელის იდენტიფიცირებით და პაკეტის ფაილების შემოწმების ჯამებს;
  • res/ - სხვადასხვა რესურსი, რომელსაც აპლიკაცია იყენებს თავის მუშაობაში, როგორიცაა სურათები, ინტერფეისის დეკლარაციული აღწერა, ასევე სხვა მონაცემები;
  • AndroidManifest.xml- განაცხადის აღწერა. ეს მოიცავს, მაგალითად, საჭირო ნებართვების ჩამონათვალს, Android-ის საჭირო ვერსიას და ეკრანის საჭირო გარჩევადობას;
  • კლასები.dex- შედგენილი აპლიკაციის ბაიტიკოდი Dalvik ვირტუალური მანქანისთვის;
  • რესურსები.arsc- ასევე რესურსები, მაგრამ სხვა სახის - კერძოდ, სტრიქონები (დიახ, ეს ფაილი შეიძლება გამოყენებულ იქნას რუსიფიკაციისთვის!).

ჩამოთვლილი ფაილები და დირექტორიები, თუ არა ყველა, მაშინ, შესაძლოა, APK-ების აბსოლუტურ უმრავლესობაშია. თუმცა, არის კიდევ რამდენიმე არც თუ ისე გავრცელებული ფაილი/ცნობარი, რომელიც უნდა აღინიშნოს:

  • აქტივები- რესურსების ანალოგი. მთავარი განსხვავება ისაა, რომ რესურსზე წვდომისთვის საჭიროა იცოდეთ მისი იდენტიფიკატორი, მაგრამ აქტივების სიის დინამიურად მიღება შესაძლებელია აპლიკაციის კოდში AssetManager.list() მეთოდის გამოყენებით;
  • lib- მშობლიური Linux ბიბლიოთეკები დაწერილი NDK (Native Development Kit) გამოყენებით.

ამ დირექტორიას იყენებენ თამაშების მწარმოებლები, რომლებიც ათავსებენ C/C++-ზე დაწერილ თავიანთ სათამაშო ძრავებს, ასევე მაღალი ხარისხის აპლიკაციების შემქმნელებს (მაგალითად, Google Chrome). ჩვენ გავარკვიეთ მოწყობილობა. მაგრამ როგორ იღებთ თქვენთვის საინტერესო აპლიკაციის პაკეტის ფაილს? ვინაიდან შეუძლებელია მოწყობილობიდან APK ფაილების ამოღება root-ის გარეშე (ისინი განლაგებულია /data/app დირექტორიაში) და rooting ყოველთვის არ არის მიზანშეწონილი, აპლიკაციის ფაილის თქვენს კომპიუტერში გადატანის მინიმუმ სამი გზა არსებობს:

  • APK Downloader გაფართოება Chrome-ისთვის;
  • რეალური APK Leecher აპლიკაცია;
  • სხვადასხვა ფაილების ჰოსტინგი და ვარეზნიკები.

რომელი გამოვიყენოთ, გემოვნების საკითხია; ჩვენ გვირჩევნია გამოვიყენოთ ცალკეული აპლიკაციები, ამიტომ აღვწერთ Real APK Leecher-ის გამოყენებას, მით უმეტეს, რომ ის Java-ზეა დაწერილი და, შესაბამისად, იმუშავებს Windows-ში ან Nix-ში.

პროგრამის დაწყების შემდეგ თქვენ უნდა შეავსოთ სამი ველი: ელფოსტა, პაროლი და მოწყობილობის ID - და აირჩიეთ ენა. პირველი ორი არის თქვენი Google ანგარიშის ელექტრონული ფოსტა და პაროლი, რომელსაც იყენებთ მოწყობილობაზე. მესამე არის მოწყობილობის იდენტიფიკატორი და მისი მიღება შესაძლებელია აკრიფეთ კოდის აკრეფით # #8255## და შემდეგ მოძებნეთ მოწყობილობის ID ხაზი. შევსებისას საჭიროა მხოლოდ ID-ის შეყვანა ანდროიდის პრეფიქსის გარეშე.

შევსების და შენახვის შემდეგ ხშირად ჩნდება შეტყობინება „შეცდომა სერვერთან დაკავშირებისას“. მას არაფერი აქვს საერთო Google Play-სთან, ასე რომ, თავისუფლად უგულებელყოფთ მას და მოძებნეთ თქვენთვის საინტერესო პაკეტები.

ნახვა და შეცვლა

ვთქვათ, იპოვნეთ თქვენთვის საინტერესო პაკეტი, გადმოწერეთ, ამოშალეთ... და როცა ცდილობდით ზოგიერთი XML ფაილის ნახვას, გაგიკვირდათ, როცა აღმოაჩინეთ, რომ ფაილი არ იყო ტექსტი. როგორ ხდება მისი დეკომპილი და ზოგადად პაკეტებთან მუშაობა? ნამდვილად საჭიროა SDK-ის დაყენება? არა, საერთოდ არ არის საჭირო SDK-ის დაყენება. სინამდვილეში, APK პაკეტების ამოღების, შეცვლისა და შეფუთვის ყველა ნაბიჯი მოითხოვს შემდეგ ინსტრუმენტებს:

  • ZIP არქივატორიგასახსნელად და შესაფუთად;
  • პატარა- Dalvik ვირტუალური მანქანა bytecode assembler/disassembler (code.google.com/p/smali);
  • აპტ- რესურსების შეფუთვის ხელსაწყო (ნაგულისხმევად, რესურსები ინახება ორობითი ფორმით აპლიკაციის მუშაობის ოპტიმიზაციისთვის). შედის Android SDK-ში, მაგრამ მისი მიღება შესაძლებელია ცალკე;
  • ხელმომწერი- ინსტრუმენტი შეცვლილი პაკეტის ციფრული ხელმოწერისთვის (bit.ly/Rmrv4M).

თქვენ შეგიძლიათ გამოიყენოთ ყველა ეს ინსტრუმენტი ცალკე, მაგრამ ეს მოუხერხებელია, ამიტომ უმჯობესია გამოიყენოთ უფრო მაღალი დონის პროგრამული უზრუნველყოფა, რომელიც აგებულია მათ საფუძველზე. თუ თქვენ იყენებთ Linux ან Mac OS X-ს, არის ინსტრუმენტი სახელწოდებით apktool. ის საშუალებას გაძლევთ გახსნათ რესურსები თავდაპირველ ფორმაში (მათ შორის ორობითი XML და arsc ფაილები), აღადგინოთ პაკეტი შეცვლილი რესურსებით, მაგრამ მან არ იცის როგორ მოაწეროს ხელი პაკეტებს, ასე რომ თქვენ მოგიწევთ ხელმომწერის პროგრამის ხელით გაშვება. იმისდა მიუხედავად, რომ პროგრამა დაწერილია ჯავაში, მისი ინსტალაცია საკმაოდ არასტანდარტულია. ჯერ თავად უნდა მიიღოთ jar ფაილი:

$ cd /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 $ export PATH=~/bin:$PATH

თუ თქვენ მუშაობთ Windows-ზე, მაშინ არის მისთვის შესანიშნავი ინსტრუმენტი სახელწოდებით Virtuous Ten Studio, რომელიც ასევე აგროვებს ყველა ამ ინსტრუმენტს (თავად apktool-ის ჩათვლით), მაგრამ CLI ინტერფეისის ნაცვლად მომხმარებელს აძლევს ინტუიციურ გრაფიკულ ინტერფეისს, რომლითაც შეგიძლიათ შეასრულეთ შეფუთვის, დაშლისა და დეკომპილაციის ოპერაციები რამდენიმე დაწკაპუნებით. ეს ინსტრუმენტი არის Donation-ware, ანუ ხანდახან ჩნდება ფანჯრები, რომლებიც გთხოვენ ლიცენზიის მიღებას, მაგრამ საბოლოოდ ეს შეიძლება მოითმინოს. აზრი არ აქვს მის აღწერას, რადგან ინტერფეისის გაგება რამდენიმე წუთში შეგიძლიათ. მაგრამ apktool, მისი კონსოლის ბუნებიდან გამომდინარე, უფრო დეტალურად უნდა იყოს განხილული.


მოდით შევხედოთ apktool-ის ვარიანტებს. მოკლედ, არსებობს სამი ძირითადი ბრძანება: d (decode), b (build) და if (install frame). თუ ყველაფერი ნათელია პირველი ორი ბრძანებით, მაშინ რას აკეთებს მესამე, პირობითი განცხადება? ის ხსნის მითითებულ ინტერფეისის ჩარჩოს, რაც აუცილებელია იმ შემთხვევებში, როდესაც თქვენ ანაწილებთ რომელიმე სისტემის პაკეტს.

მოდით შევხედოთ პირველი ბრძანების ყველაზე საინტერესო ვარიანტებს:

  • -ს- არ დაშალოთ dex ფაილები;
  • -რ- არ გახსნათ რესურსები;
  • -ბ- არ ჩადოთ გამართვის ინფორმაცია dex ფაილის დაშლის შედეგებში;
  • --ჩარჩო-გზა- გამოიყენეთ მითითებული UI ჩარჩო apktool-ში ჩაშენებულის ნაცვლად. ახლა მოდით გადავხედოთ b ბრძანების რამდენიმე ვარიანტს:
  • -ვ- იძულებითი შეკრება ცვლილებების შემოწმების გარეშე;
  • -ა- მიუთითეთ გზა aapt-ისკენ (APK არქივის შესაქმნელად ინსტრუმენტი), თუ რაიმე მიზეზით გსურთ მისი გამოყენება სხვა წყაროდან.

apktool-ის გამოყენება ძალიან მარტივია, უბრალოდ მიუთითეთ ერთ-ერთი ბრძანება და გზა APK-ში, მაგალითად:

$ apktool d mail.apk

ამის შემდეგ, პაკეტის ყველა ამოღებული და დაშლილი ფაილი გამოჩნდება ფოსტის დირექტორიაში.

მომზადება. რეკლამის გამორთვა

თეორია, რა თქმა უნდა, კარგია, მაგრამ რატომ არის საჭირო, თუ არ ვიცით რა ვუყოთ შეუფუთავ პაკეტს? შევეცადოთ გამოვიყენოთ თეორია ჩვენს სასარგებლოდ, კერძოდ, შევცვალოთ რაიმე პროგრამა ისე, რომ არ გვიჩვენოს რეკლამა. მაგალითად, იყოს ვირტუალური ჩირაღდანი - ვირტუალური ჩირაღდანი. ეს პროგრამა იდეალურია ჩვენთვის, რადგან ის სავსეა შემაშფოთებელი რეკლამით და, უფრო მეტიც, საკმარისად მარტივია, რომ არ დაიკარგოს კოდების ჯუნგლებში.


ასე რომ, ერთ-ერთი ზემოაღნიშნული მეთოდის გამოყენებით, ჩამოტვირთეთ აპლიკაცია მარკეტიდან. თუ გადაწყვეტთ Virtuous Ten Studio-ს გამოყენებას, უბრალოდ გახსენით APK ფაილი აპლიკაციაში და გახსენით იგი, შექმენით პროექტი (ფაილი -> ახალი პროექტი), შემდეგ პროექტის კონტექსტურ მენიუში აირჩიეთ Import File. თუ თქვენი არჩევანი დაეცა apktool-ზე, მაშინ უბრალოდ გაუშვით ერთი ბრძანება:

$ apktool d com.kauf.particle.virtualtorch.apk

ამის შემდეგ, წინა განყოფილებაში აღწერილის მსგავსი ფაილის ხე გამოჩნდება com.kauf.particle.virtualtorch დირექტორიაში, მაგრამ dex ფაილების და apktool.yml ფაილის ნაცვლად დამატებითი smali დირექტორია. პირველი შეიცავს აპლიკაციის შესრულებადი dex ფაილის დაშლილ კოდს, მეორე შეიცავს სერვისის ინფორმაციას, რომელიც აუცილებელია apktool-ისთვის პაკეტის უკან აწყობისთვის.

რა თქმა უნდა, პირველი ადგილი, რომელიც უნდა ვეძებოთ, არის AndroidManifest.xml. და აქ ჩვენ მაშინვე ვხვდებით შემდეგ ხაზს:

ძნელი მისახვედრი არ არის, რომ ის პასუხისმგებელია აპლიკაციისთვის ინტერნეტის გამოყენების ნებართვის მინიჭებაზე. სინამდვილეში, თუ ჩვენ უბრალოდ გვინდა თავი დავაღწიოთ რეკლამას, დიდი ალბათობით, უბრალოდ დაგვჭირდება აპლიკაციის დაბლოკვა ინტერნეტიდან. შევეცადოთ ამის გაკეთება. ჩვენ ვშლით მითითებულ ხაზს და ვცდილობთ პროგრამული უზრუნველყოფის აშენებას apktool-ის გამოყენებით:

$ apktool b com.kauf.particle.virtualtorch

შედეგად მიღებული APK ფაილი გამოჩნდება com.kauf.particle.virtualtorch/build/ დირექტორიაში. ამასთან, მისი ინსტალაცია შეუძლებელი იქნება, რადგან მას არ აქვს ციფრული ხელმოწერა და ფაილების შემოწმება (მას უბრალოდ არ აქვს META-INF/ დირექტორია). ჩვენ უნდა მოვაწეროთ ხელი პაკეტს apk-signer უტილიტის გამოყენებით. Დაიწყო. ინტერფეისი შედგება ორი ჩანართისგან - პირველზე (Key Generator) ჩვენ ვქმნით გასაღებებს, მეორეზე (APK Signer) ვაწერთ ხელს. ჩვენი პირადი გასაღების შესაქმნელად, შეავსეთ შემდეგი ველები:

  • სამიზნე ფაილი- keystore გამომავალი ფაილი; ის ჩვეულებრივ ინახავს ერთ წყვილ გასაღებს;
  • პაროლიდა დაადასტურეთ- პაროლი შენახვისთვის;
  • მეტსახელი- გასაღების დასახელება საცავში;
  • მეტსახელის პაროლიდა დაადასტურეთ- საიდუმლო გასაღების პაროლი;
  • მოქმედების ვადა- მოქმედების ვადა (წლები). ნაგულისხმევი მნიშვნელობა ოპტიმალურია.

დანარჩენი ველები, ზოგადად, არჩევითია - მაგრამ მინიმუმ ერთი უნდა იყოს შევსებული.


გაფრთხილება

იმისათვის, რომ ხელი მოაწეროთ აპლიკაციას apk-signer-ის გამოყენებით, თქვენ უნდა დააინსტალიროთ Android SDK და მიუთითოთ მისი სრული გზა აპლიკაციის პარამეტრებში.

ყველა ინფორმაცია მოცემულია მხოლოდ საინფორმაციო მიზნებისთვის. არც რედაქტორები და არც ავტორი არ არიან პასუხისმგებელი ამ სტატიის მასალებით მიყენებულ შესაძლო ზიანს.

ახლა თქვენ შეგიძლიათ ხელი მოაწეროთ APK-ს ამ გასაღებით. APK Signer ჩანართზე აირჩიეთ ახლად გენერირებული ფაილი, შეიყვანეთ პაროლი, გასაღების მეტსახელი და პაროლი, შემდეგ იპოვეთ APK ფაილი და თამამად დააწკაპუნეთ ღილაკზე „ხელმოწერა“. თუ ყველაფერი კარგად წავა, პაკეტს მოეწერება ხელი.

ინფორმაცია

ვინაიდან ჩვენ ხელი მოვაწერეთ პაკეტს ჩვენივე გასაღებით, ის ეწინააღმდეგება თავდაპირველ აპლიკაციას, რაც ნიშნავს, რომ როდესაც ვცდილობთ პროგრამული უზრუნველყოფის განახლებას ბაზრის მეშვეობით, მივიღებთ შეცდომას.

ციფრული ხელმოწერა საჭიროა მხოლოდ მესამე მხარის პროგრამული უზრუნველყოფისთვის, ასე რომ, თუ თქვენ ცვლით სისტემურ აპლიკაციებს, რომლებიც დაინსტალირებულია მათი კოპირებით /system/app/ დირექტორიაში, მაშინ არ გჭირდებათ მათი ხელმოწერა.

ამის შემდეგ, ჩამოტვირთეთ პაკეტი თქვენს სმარტფონში, დააინსტალირეთ და გაუშვით. Voila, რეკლამა გაქრა! თუმცა, ამის ნაცვლად, გამოჩნდა შეტყობინება, რომ ჩვენ არ გვაქვს ინტერნეტი ან არ გვაქვს შესაბამისი ნებართვები. თეორიულად, ეს შეიძლება საკმარისი იყოს, მაგრამ მესიჯი გამაღიზიანებლად გამოიყურება და, მართალი გითხრათ, ჩვენ უბრალოდ გაგვიმართლა სულელური აპლიკაცია. ჩვეულებრივ დაწერილი პროგრამული უზრუნველყოფა, დიდი ალბათობით, დააზუსტებს მის რწმუნებათა სიგელებს ან შეამოწმებს ინტერნეტ კავშირს და სხვაგვარად უბრალოდ უარს იტყვის გაშვებაზე. როგორ უნდა იყოს ამ შემთხვევაში? რა თქმა უნდა, შეცვალეთ კოდი.

როგორც წესი, აპლიკაციის ავტორები ქმნიან სპეციალურ კლასებს რეკლამებისა და ამ კლასების გამოძახების მეთოდების საჩვენებლად, როდესაც აპლიკაციის ან მისი ერთ-ერთი „აქტივობა“ (მარტივი სიტყვებით, აპლიკაციის ეკრანები) გაშვებულია. შევეცადოთ ვიპოვოთ ეს კლასები. ჩვენ მივდივართ smali დირექტორიაში, შემდეგ com (org შეიცავს მხოლოდ ღია გრაფიკულ ბიბლიოთეკას cocos2d), შემდეგ kauf (აი, სადაც არის, რადგან ეს არის დეველოპერის სახელი და მთელი მისი კოდი იქ არის) - და აი, მარკეტინგის დირექტორია. შიგნით ვპოულობთ ფაილების თაიგულს smali გაფართოებით. ეს არის კლასები და მათგან ყველაზე საყურადღებოა Ad.smali კლასი, რომლის სახელწოდებიდანაც ადვილი მისახვედრია, რომ სწორედ ის აჩვენებს რეკლამას.

ჩვენ შეგვიძლია შევცვალოთ მისი მოქმედების ლოგიკა, მაგრამ ბევრად უფრო ადვილი იქნება ზარების უბრალოდ ამოღება მის რომელიმე მეთოდზე თავად აპლიკაციიდან. ამიტომ, ჩვენ ვტოვებთ მარკეტინგის დირექტორიას და გადავდივართ მიმდებარე ნაწილაკების დირექტორიაში, შემდეგ კი ვირტუალურ ტორშზე. MainActivity.smali ფაილი აქ განსაკუთრებულ ყურადღებას იმსახურებს. ეს არის სტანდარტული ანდროიდის კლასი, რომელიც შექმნილია Android SDK-ის მიერ და დაინსტალირებულია როგორც აპლიკაციაში შესვლის წერტილი (C-ში მთავარი ფუნქციის ანალოგი). გახსენით ფაილი რედაქტირებისთვის.

შიგნით არის smali კოდი (ლოკალური ასამბლერი). ის საკმაოდ დამაბნეველი და ძნელად წასაკითხია მისი დაბალი დონის გამო, ამიტომ ჩვენ არ შევისწავლით მას, უბრალოდ ვიპოვით ყველა მითითებას რეკლამის კლასზე კოდში და კომენტარს გავაკეთებთ. ჩვენ შევდივართ სტრიქონში "რეკლამაში" ძიებაში და მივდივართ 25-ე სტრიქონში:

საველე პირადი რეკლამა:Lcom/kauf/მარკეტინგი/რეკლამა;

აქ იქმნება სარეკლამო ველი რეკლამის კლასის ობიექტის შესანახად. კომენტარს ვაკეთებთ ხაზის წინ ### ნიშნის განთავსებით. ჩვენ ვაგრძელებთ ძებნას. ხაზი 423:

ახალი ინსტანციის v3, Lcom/kauf/მარკეტინგი/რეკლამა;

აქ ხდება ობიექტის შექმნა. მოდით კომენტარი გავაკეთოთ. ჩვენ ვაგრძელებთ ძიებას და ვპოულობთ 433, 435, 466, 468, 738, 740, 800 და 802 ხაზებში რეკლამის კლასის მეთოდებს. მოდით კომენტარი გავაკეთოთ. გამოიყურებოდეს, რომ ეს არის. Გადარჩენა. ახლა საჭიროა პაკეტის ხელახლა შეკრება და შემოწმება ფუნქციონალურობისა და რეკლამის არსებობისთვის. ექსპერიმენტის სიწმინდისთვის, ჩვენ ვაბრუნებთ AndroidManifest.xml-დან ამოღებულ ხაზს, ვაწყობთ პაკეტს, ხელს ვაწერთ მას და დავაინსტალირებთ.

ჩვენი ზღვის გოჭი. რეკლამა ჩანს

უი! რეკლამა გაქრა მხოლოდ აპლიკაციის მუშაობის დროს, მაგრამ დარჩა მთავარ მენიუში, რომელსაც ვხედავთ პროგრამის გაშვებისას. ასე რომ, დაელოდეთ, მაგრამ შესვლის წერტილი არის MainActivity კლასი და რეკლამა გაქრა აპლიკაციის გაშვებისას, მაგრამ დარჩა მთავარ მენიუში, ასე რომ, შესვლის წერტილი განსხვავებულია? ნამდვილი შესვლის წერტილის იდენტიფიცირებისთვის ხელახლა გახსენით AndroidManifest.xml ფაილი. დიახ, ის შეიცავს შემდეგ ხაზებს:

ისინი გვეუბნებიან (და, რაც მთავარია, ანდროიდს), რომ აქტივობა სახელად Start უნდა დაიწყოს საპასუხოდ intent (მოვლენის) android.intent.action.MAIN გენერირებისთვის android.intent.category.LAUNCHER კატეგორიიდან. ეს მოვლენა წარმოიქმნება, როდესაც თქვენ შეეხებით აპლიკაციის ხატულას გამშვებში, ასე რომ, ის განსაზღვრავს შესვლის წერტილს, კერძოდ Start კლასს. სავარაუდოდ, პროგრამისტმა ჯერ დაწერა აპლიკაცია მთავარი მენიუს გარეშე, რომლის შესვლის წერტილი იყო სტანდარტული MainActivity კლასი, შემდეგ დაამატა ახალი ფანჯარა (აქტივობა), რომელიც შეიცავს მენიუს და აღწერილ იქნა Start კლასში, და ხელით გააკეთა ის ჩანაწერად. წერტილი.

გახსენით Start.smali ფაილი და კვლავ მოძებნეთ სტრიქონი "Ad", 153 და 155 სტრიქონებში ვხვდებით FirstAd კლასის ხსენებას. ის ასევე არის საწყის კოდში და, სახელწოდებით თუ ვიმსჯელებთ, ის პასუხისმგებელია მთავარ ეკრანზე რეკლამის ჩვენებაზე. მოდით გადავხედოთ შემდეგს, არის FirstAd კლასის ინსტანციის შექმნა და ინტენტი, რომელიც, კონტექსტის მიხედვით, დაკავშირებულია ამ მაგალითთან, შემდეგ კი cond_10 ლეიბლი, რომელზეც პირობითი გადასვლა ხორციელდება ზუსტად ინსტანციის შექმნამდე. კლასის:

If-ne p1, v0, :cond_10 .ხაზი 74 new-instance v0, Landroid/content/Intent; ... :cond_10

სავარაუდოდ, პროგრამა რატომღაც შემთხვევით ითვლის, უნდა იყოს თუ არა რეკლამა მთავარ ეკრანზე ნაჩვენები, და თუ არა, პირდაპირ გადადის cond_10-ზე. კარგი, მოდით გავამარტივოთ მისი ამოცანა და შევცვალოთ პირობითი გადასვლა უპირობოთი:

#if-ne p1, v0, :cond_10 goto:cond_10

კოდში FirstAd-ის ნახსენები აღარ არის, ამიტომ ჩვენ ვხურავთ ფაილს და ხელახლა ვაწყობთ ჩვენს ვირტუალურ ჩირაღდნებს apktool-ის გამოყენებით. დააკოპირეთ იგი თქვენს სმარტფონში, დააინსტალირეთ, გაუშვით. ვოილა, ყველა რეკლამა გაქრა, რისთვისაც ყველას გილოცავთ.

შედეგები

ეს სტატია მხოლოდ მოკლე შესავალია 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 საქაღალდე შეიცავს ყველა პროგრამის რესურსს, გრაფიკას, როგორიცაა ხატები, სურათები, ტექსტი და გრაფიკული ინტერფეისის ელემენტები. თქვენ ასევე შეგიძლიათ მარტივად შეხვიდეთ საქაღალდეში.
  • classes.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 აპლიკაცია. მას შეუძლია ამოიღოს, zip და მოაწეროს შეცვლილი apk ფაილები. მისი უპირატესობა არის გრაფიკული ინტერფეისის არსებობა. თუმცა, არსებობს სერიოზული ნაკლი. SmartAPKTool დიდი ხანია არ განახლებულა და პროგრამა სწორად არ ხსნის და არ აფუთავს აპლიკაციებს Android-ის უახლესი ვერსიებისთვის. ამიტომ, აქ შევეცდები აგიხსნათ როგორ გამოვიყენოთ აპლიკაცია ამ მიზნებისთვის apktool.

შენიშვნა 1.
SmartAPKTool პროგრამა კვლავ მოსახერხებელია შეგროვებული apk ფაილების ხელმოწერისთვის.
შენიშვნა 2.
სტატიაში ნახსენები პროგრამების ბმულებია ↓

პროგრამა apktoolარ აქვს გრაფიკული ინტერფეისი. ეს არის მინუსი მათთვის, ვინც არ არის მიჩვეული ბრძანების ხაზთან მუშაობას. მაგრამ ასევე არის პლიუსი: SmartAPKTool-ისგან განსხვავებით, ჩვენ დავინახავთ ყველა შეცდომას, რაც ნიშნავს, რომ ჩვენ ვიცით რა უნდა გამოვასწოროთ.

მოდით გადმოვწეროთ ორი არქივი: ერთი საერთო ყველა სისტემისთვის, მეორე ჩვენი სისტემისთვის (მაგალითში Windows):

მოდით გავხსნათ ორივე არქივი იმავე ცარიელ საქაღალდეში (ჩვენს მაგალითში, C:\apktool\). მისი შინაარსი ასე უნდა გამოიყურებოდეს:

ამიერიდან ჩვენ შეგვიძლია გამოვიყენოთ პროგრამა apktool.

შენიშვნა 3.
Linux-ის 64-ბიტიანი ვერსიების მომხმარებლებს დასჭირდებათ ia32-libs პაკეტის დაყენება:

sudo apt-get დააინსტალირეთ ia32-libs

იმავე საქაღალდეში ვათავსებთ ფაილს, რომელიც უნდა განვათავსოთ. მაგალითად, დაერქვას orig.apk
ხანგრძლივად დააჭირეთ Shift ღილაკს და დააწკაპუნეთ მაუსის მარჯვენა ღილაკით საქაღალდის ნებისმიერ ცარიელ სივრცეზე (არ დააწკაპუნოთ ფაილებზე!). ამის შემდეგ აირჩიეთ "ბრძანების ფანჯრის გახსნა". კონსოლში, რომელიც გამოჩნდება, ჩაწერეთ:

apktool decode orig.apk

ფაილი გაიხსნება:

ახლა ჩვენ გვაქვს საქაღალდე შეფუთული აპლიკაციით C:\apktool\ დირექტორიაში. მას იგივე ეწოდება, რაც წყაროს ფაილს, გაფართოების გამოკლებით: C:\apktool\orig\ . ჩვენ შეგვიძლია შევცვალოთ საწყისი ფაილები, როგორც ეს აღწერილია სტატიაში Android: როგორ დავაყენოთ ორი იდენტური აპლიკაცია ერთ ტელეფონზე. ცვლილებების განხორციელების შემდეგ, ჩვენ შევაგროვებთ აპლიკაციის ასლს წყაროს ფაილების apk-ში შეფუთვით:

apktool build orig result.apk

აქ result.apk არის ფაილის სახელი, რომელიც ჩვენ გამოვიმუშავეთ ასლის შესაქმნელად. თუ შეცდომები არ არის, ფაილი შეიკრიბება:

დანარჩენი სტატიის ფარგლებს სცილდება:

  1. თუ შეკრების დროს არის შეცდომები, თქვენ უნდა იპოვოთ მათი მიზეზი და გამოასწოროთ ისინი.
  2. რჩება მხოლოდ შედეგის შედეგი.apk ფაილზე ხელმოწერა. ეს შეიძლება გაკეთდეს SmartAPKTool-ის გამოყენებით, როგორც ზემოთ აღინიშნა; ყველაფერი მასზე ინტუიციურია. ასევე არსებობს apk ფაილზე ხელმოწერის სხვა გზები.
  3. შეცდომები ასევე შეიძლება მოხდეს ასლის დაყენებისას, მისი გაშვების ან მუშაობის დროს. ისინი უნდა დაიჭიროთ Android SDK-ში შემავალი adb პროგრამის გამოყენებით.

თქვენ უნდა მოაწეროთ ხელი აპლიკაციას, წინააღმდეგ შემთხვევაში ის არ დაინსტალირდება. შეცდომები არც ისე ხშირად ხდება და მათი გამომწვევი ყველაზე გავრცელებული პრობლემები აღწერილია სტატიაში

Android მოწყობილობებისთვის სხვადასხვა პროგრამული უზრუნველყოფის გამოყენების პროცესში, ზოგჯერ საჭირო ხდება ამა თუ იმ გზით ოპერაციულ სისტემაში ჩაშენებული სისტემის აპლიკაციების შეცვლა. ამ მასალაში ჩვენ დეტალურად განვიხილავთ ამ საკითხს.

ბუნებრივია, საჭიროა სისტემის APK ფაილის დაშლა და აწყობა, რათა ის გამართულად და სტაბილურად იმუშაოს. მოდით გავარკვიოთ ეტაპობრივად რა უნდა გაკეთდეს ამისათვის.

პირველ რიგში, თქვენ უნდა განახორციელოთ სისტემის APK ფაილების დეოდექსირების პროცესი. ჩვენ გეტყვით, თუ როგორ უნდა გავაკეთოთ ეს.

ასე რომ, .apk ფაილი დეოდექსირებული და დეკომპილირებული იყო. მოდით გავაანალიზოთ აპლიკაცია, რომელიც გვაინტერესებს, მას სახელი ჰქონდეს, მაგალითის სიცხადისთვის, ჩარჩო- რეზ. apk. ჩვენ გვახსოვს ის ჩვენს თავში, როგორც ორიგინალური აპლიკაცია.

ვთქვათ, ჩვენ შევიტანეთ ყველა საჭირო ცვლილება აპლიკაციაში. ჩვენ უფრო მეტს ვისაუბრებთ APK ფაილების ყველა ასპექტზე. ახლა თქვენ უნდა შეფუთოთ იგი. მოდით გავიხსენოთ დასრულებული შეფუთული აპლიკაცია ჩვენს გონებაში, როგორც შეცვლილი აპლიკაცია 2.

ახლა ჩვენ აგიხსნით, რატომ იყო საჭირო აპლიკაციების გონებრივად დამახსოვრება, როგორც ორიგინალური და შეცვლილი 2. ApkTool პროგრამით შედგენილი აპლიკაცია (ან მომხმარებლის გრაფიკული ინტერფეისის გაფართოების გამოყენებით, როგორიცაა SmartApkTool) არ იმუშავებს, მაგრამ ეს არ არის პრობლემა. ჩვენ ვასრულებთ შემდეგ მოქმედებებს:

ასეთი ფაილების APK-ში შეგროვება საკმაოდ მარტივია. ამისათვის თქვენ უნდა გაუშვათ apktool შესაბამისი build flag-ით და გადასცეთ გზა საქაღალდეში, რომელშიც დეკომპილირებული აპლიკაციაა შიგნით. მაგალითად, თუ ჩვენ გვაქვს აპლიკაციის საქაღალდე, რომელიც მდებარეობს იმავე დირექტორიაში, როგორც apktool, მაშინ ბრძანება ასე გამოიყურება:

ჭურვი

java -jar apktool.jar b app

java - jar apktool .jar b app

შეკრების შემდეგ, დასრულებული 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 პლატფორმაზე მეკობრეობის ასეთი დიდი პროცენტის მთავარი მიზეზი. ნაწილობრივ ამიტომაა, რომ თამაშის დეველოპერები, მაგალითად, საერთოდ არ არიან დაინტერესებულნი სიუჟეტით საინტერესო თამაშების გამოშვებით. მომხმარებელთა ამჟამინდელი დამოკიდებულების გათვალისწინებით, ბევრად უფრო მომგებიანია ფერმების მოქლონება შემოწირულობებით, რომლებიც საოცრად ჰგავს ერთმანეთს. ამიტომ, ჩვენ ვყიდულობთ აპლიკაციებს, მხარს ვუჭერთ დეველოპერებს და შედეგად ვიღებთ საინტერესო კონტენტს. მაგრამ აბსოლუტურად არ არის საჭირო შემოწირულობა!

გმადლობთ ყველას, ისევ გნახავთ.

  • საიტის სექციები