반응형
1. Singing Key 확인
- 앱을 플레이스토어에 올리기 위해서는 릴리즈 빌드를 해야하는데 이 때 Signing 을 하게 된다. 이것의 목적은 Signing에 사용된 공용키에 해당하는 개인키를 가진 사람만이 업데이트를 할 수 있도록 하기 위해서이다.
- 따라서 무결성 체크를 위해서는 사이닝된 키가 개발자가 설정한 키와 동일한 키인지 런타임 시 Signing 인증서를 체크하여 위변조된 앱인지 아닌지 확인할 수 있다.
- 아래는 간단히 앱에서 현재 Signing 된 인증서 정보를 가져오는 코드이다.
( 출처 : http://dktfrmaster.blogspot.com/2017/02/apk.html )
public static void checkAppSignatureInServer(Context context, Callback callback) {
try {
@SuppressLint("PackageManagerGetSignatures")
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
//안드로이드는 이론상 여러 키스토어로 Signing 가능하다고 하지만,
//일반적으로는 하나의 키스토어로만 Signing을 하므로, signatures의 첫번째 값을 이용한다.
Signature signature = packageInfo.signatures[0];
final String currentSignature = obtainSignatureString(signature);
fetchServer(currentSignature, callback);
} catch (PackageManager.NameNotFoundException | NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
private static void fetchServer(String signature, Callback callback) {
//TODO::Fill in server logic
callback.onFinishCheck(ValidationEnum.VALID);
2. 인스톨러 확인
- 모든 앱은 어떤 인스톨러를 이용하여 설치되었는지 알 수 있다. 이 때 인스톨러의 identifier를 체크하여 위변조된 앱인지 아닌지 알 수 있다.
- 각 인스톨러마다 identifier를 가지고 있는데 구글의 경우 com.android.vending이라는 identifier를 가지고 있다. 만약 adb로 인스톨했을 때에는 null로 출력된다. 따라서 identifier가 com.android.vending이 아니라면 플레이스토어에서 설치한 앱이 아니므로 앱을 종료시키면 된다.
- 아래는 간단히 앱의 인스톨러를 확인하는 코드이다.
public static boolean verifyGoogleInstaller(Context context) {
final String installer = context.getPackageManager().getInstallerPackageName(context.getPackageName());
return installer != null && installer.startsWith("com.android.vending");
}
반응형
'Hacking > Mobile' 카테고리의 다른 글
메모리 내 중요정보 평문노출 (0) | 2020.02.10 |
---|---|
apktool decompile error solution (0) | 2019.04.24 |
Windows 환경에서 IOS device 로그 보기 (0) | 2019.03.28 |
[IOS] Frida-trace (0) | 2019.01.17 |
[IOS] gdb와 cycript를 이용한 탈옥 탐지 우회 (0) | 2019.01.04 |