Как загубих паролата си за хранилище за ключове на Android, но след това я възстанових с Jetbrains Idea
Имало едно време приложение за Android в Google Play с няколко хиляди потребители. Трябваше да се актуализира след една година. Добре, стартирайте Idea, изберете „Build“ – „Generate Signed APK“. Спомням си, че през това време успях да се прехвърля на Linux, всичко е наред, избирам файла с ключовете, въвеждам предварително внимателно написаната парола ... Не става. Хм… Пак влизам, пак… Търся варианти, пак питам колеги… Всичко е зле.
В резултат на това потенциално три приложения са замразени в Google play, нито една от опциите не е подходяща. Спомням си, че Windows остана на dual-boot, там рестартирах, за щастие в този случай на Idea имаше запазена парола.

Е, трябва да помислите. Тъй като Idea е обикновено java приложение, възникна идеята да свържете вашия код с мястото, където се четат пароли от хранилището. След като прочетох темата за javaagent, бързо скицирах моя java агент, който просто записва имената на всички заредени класове във файл. Всичко, от което се нуждаете, за да стартирате Idea с java агент, е да добавите ред като този към idea.exe.vmoptions (или idea64.exe.vmoptions)
След стартиране с агента, текстовият файл бързо се изпълни с редове като
След това щраквам върху „Генериране на подписан APK“ и гледам изхода във файла:
Изглежда, че всичко, от което се нуждаем, е вexportSignedPackage
Малко гугъл и намираме изходния код от 2012 г.
Тук сме привлечени от част от кода:
Тук можете да видите, че паролите се изтеглят от защитено хранилище и се съхраняват в JPasswordField (стандартната Swing контрола за въвеждане на пароли).
Остава само да извлечем данните от текстовите полета. Javassist, библиотека за манипулиране на байт код в движение, ще ни помогне с това. Пишем следната част от кода в нашия java-агент:
Какво прави той? Прихващаме момента на зареждане на класаJPasswordField, намерете методаgetPassword()в него и добавете нашия кодов фрагмент в края на метода, който отпечатва търсената парола на конзолата ($_е променлива на услугата на javassist, където се намира стойността, върната от метода).
По такъв лесен начин паролите бяха възстановени и запазени.
P.S. И паролата се оказа същата, която беше записана, но въведена на български език. Всичко беше наистина...