- Android용 SSH 클라이언트 JuiceSSH가 2025년 12월 이후 기존 구매자들의 결제를 인식하지 못하게 됨
- 2019년에 구매한 사용자의 라이선스가 무효화되고, 가격이 20달러 인상되었으며, 일부 사용자는 재구매 후에도 활성화되지 않는 문제를 겪음
-
지원팀이 응답하지 않아 사용자들은 이를 사실상 ‘exit scam’ 으로 인식
- 글에서는 ApkTool, jadx, jarsigner 등을 이용해 앱을 디컴파일하고 smali 코드를 수정하여 프로 기능을 복원하는 방법을 단계별로 제시
- 클라우드 동기화와 플러그인은 더 이상 작동하지 않지만, 프로 기능을 다시 사용할 수 있는 방법으로 소개됨
JuiceSSH의 문제 상황
- JuiceSSH는 Android에서 사용 가능한 SSH 클라이언트로, 작성자는 2025년 12월까지 이를 최고의 앱으로 평가함
- 2019년에 구매한 Pro 버전 라이선스가 더 이상 인식되지 않음, 가격은 20달러 상승
- 일부 사용자는 재구매 후에도 앱이 활성화되지 않는다고 리뷰에 남김
- Google Play에서 앱이 리스트에서 제거되었으며, 지원팀은 응답하지 않음
- 이러한 상황을 작성자는 exit scam으로 표현
앱 복원 준비
- 앱을 다시 작동시키기 위해 jadx, ApkTool, jarsigner(OpenJDK 포함) 등의 도구가 필요함
- Windows에서는 choco install openjdk로 설치 가능
- JuiceSSH APK는 PureAPK에서 다운로드하거나, adb를 이용해 직접 추출 가능
- 다운로드 시 SHA256 해시 검증 필요
- 마지막 버전(3.2.2)의 해시는 d1ee811bcd82f25aea0bdc568896d82017ee174d9c4631c123a9d9173c748232
디컴파일 단계
- ApkTool을 이용해 APK의 DEX 코드를 디컴파일
& "C:\Program Files\OpenJDK\jdk-25\bin\java.exe" -jar ./apktool_2.12.1.jar d juicessh.apk
smali 코드 수정
1. smali/com/sonelli/juicessh/models/User.smali
-
public boolean H() 함수는 구매 및 서명 검증을 수행
- 원래의 검증 로직을 제거하고 항상 true를 반환하도록 변경
public boolean H() {
return true;
}
2. smali/com/sonelli/oi0.smali
-
public static boolean d(Object obj) 함수는 위의 H()를 호출해 구매 유효성을 확인
- 이를 항상 true를 반환하도록 수정
public static boolean d(Object obj) {
return obj.getClass().getName().equals(User.class.getName());
}
3. smali/com/sonelli/pi0.smali
-
public static void j(Context context, p pVar) 함수는 프로 기능 인증의 핵심 부분
- 원래는 사용자 세션을 검증하고 만료 시 재인증을 수행
- 수정된 버전에서는 가짜 사용자 객체를 생성하고, 세션 만료를 1년 뒤로 설정한 뒤 항상 성공 콜백을 호출
public static void j(Context context, p pVar) {
User user = new User();
user.email = "myemail@google.com";
user.name = "hello";
user.given_name = "hello";
user.sessionExpires = System.currentTimeMillis() + (86400000 * 365);
user.sessionIdentifier = "";
b = user;
pVar.b(user);
}
재컴파일 및 서명
- 수정 후 APK를 다시 빌드
& "C:\Program Files\OpenJDK\jdk-25\bin\java.exe" -jar .\apktool_2.12.1.jar b juicessh
- 생성된 파일은 juicessh\dist\juicessh.apk에 위치
-
자체 서명용 keystore 생성 및 APK 서명
keytool -genkey -v -keystore k.keystore -alias a -keyalg RSA -keysize 2048 -validity 50000
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore k.keystore ./juicessh/dist/juicessh.apk a
결과 및 한계
- 서명된 APK를 설치하면 보안 경고를 무시하고 프로 기능을 다시 사용할 수 있음
-
클라우드 동기화 기능은 작동하지 않으며, 플러그인도 더 이상 지원되지 않음
- 작성자는 이러한 상황을 개발자에 대한 신뢰 상실로 표현하며, 이를 “농담 같은 일”로 평가함