난독 화 된 코드에서 문자열 숨기기
proguard를 사용하여 Android 코드를 난독 화 한 다음 디 컴파일했습니다. 내가 엿보는 눈에서 정말로 숨기고 싶은 문자열이 많이 있습니다. 코드를 디 컴파일했을 때 모든 사람이 볼 수 있고 변경할 수있는 문자열이있었습니다. 문자열 중 하나는 내 라이선스 서버에 대한 URL이며 실제로 가짜 서버를 가리 키도록 URL을 변경할 수 있습니다 (서버 코드를 공개 할 예정이므로). 이런 종류의 정보를 숨기는 가장 좋은 방법은 무엇입니까?
또한 R 클래스 문자열은 모두 난수이지만 디 컴파일 된 코드에서 R 클래스를 찾을 수 없습니다. 어디 있어요?
내가 본 적의 예 :new SimpleCursorAdapter(localActivity, 2130903058, localCursor, arrayOfString, arrayOfInt);
2130903058은 레이아웃 파일이지만 참조하는 것은 무엇입니까? 숫자는 일종의 주소를 가리 키지 않는 한 아무것도 의미하지 않습니다.
안전하지 않고 모호한 것에 만족한다고 가정하면 사용할 수있는 여러 메커니즘이 있지만 proguard와 같은 난독 화 도구는 도움을 줄 수 없습니다.
이를 위해서는 문자열의 인코딩 또는 암호화를 직접 수행해야합니다. 사용하는 접근 방식은 방어하려는 대상에 따라 다릅니다. 명백한 검사에서 숨기려는 경우 인코딩만으로 충분할 수 있습니다 (android 참조). .util.Base64, http://developer.android.com/reference/android/util/Base64.html ). 인코딩은 안전하지 않으며 사이트에 대한 명백한 참조를 제거하기 만하면됩니다.
더 많은 것을 방어하려는 경우 실제로 문자열을 암호화하는 것으로 이동할 수 있습니다. 이렇게하려면 javax.crypto.Cipher, http://www.androidsnippets.org/snippets/ 를 통해 AES와 같은 대칭 암호를 사용합니다 . 39 / index.html 은 적절한 사용 예를 제공합니다. 다시 말하지만 이것은 해커가 될 수있는 것보다 더 성가신 것입니다. 키를 항아리 어딘가에 저장해야하므로 암호화 보안이 무효화됩니다.
이를 더 명확하게하기 위해 기본 단계는 다음과 같습니다.
- 알려진 키를 사용하여 문자열을 수동으로 암호화합니다.
- 이 문자열의 해독 된 버전을 사용하도록 코드를 변환합니다. 예 :
전에:
public class Foo {
private String mySecret = "http://example.com";
...
}
된다 :
public class Foo {
private String encrypted = "<manually created encrypted string>";
private String key = "<key used for encryption";
private String mySecret = MyDecryptUtil.decrypt(encrypted, key);
...
}
이 모든 것에 대한 (좋은) 대안은 Google에서 제공하는 라이선스 서버 http://android-developers.blogspot.com/2010/07/licensing-service-for-android.html 과 같은 타사 drm 솔루션을 사용하는 것 입니다. 이것은 당신이 스스로 굴리는 것보다 더 안전 할 수 있지만 위에서 설명한 것과 매우 유사한 제한이 있습니다.
안녕하세요.
하자
secret숨기려는 텍스트 수debug / release.keystore의 키해시를 찾으십시오. 하자
k1이 키를합니다.
(사용 도구는 +하려면 openssl을 keytool은 : keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64 )
암호화에 (안드로이드 코드 외부) 도구를 사용
secret하여k1encrypted = encode (secret, k1)
(예 : https://jwt.io , Java의 경우 : https://github.com/jwtk/jjwt ).
- 안드로이드 자바 코드에
encrypted. 디코딩 된 버전이 필요할 때encrypted(이것은 원본secret) 쓰기
original = decode(encrypted, get_my_keyhash_programmatically() )
그게 다야. 이것은 원본 secret이 자바 소스 코드에 표시되지 않고 k1디코딩 할 수도 없기 때문에 작동 합니다. 또한 해커가 디코딩 된 비밀을 인쇄하려는 경우 코드를 변경하고 다시 컴파일하여 자신의 키 저장소가 아닌 자신의 .apk에 서명하여 올바른 원본 secret. ( "유일한"요점은 k1원본 .apk에서 알아낼 수 있는지 여부입니다 ).
참고 : get_my_keyhash_programmatically () :
try {
PackageInfo info = getPackageManager().getPackageInfo(
"el nombre de su paquete por ejemplo com.tarea.u8",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (PackageManager.NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
내가 한 일은 전역 유틸리티 클래스에 정적 문자열의 긴 목록을 만드는 것입니다. 긴 문자열 목록 내의 어딘가에 패스 키를 여러 청크로 넣었습니다.
with my code it's easy to see what the real passkeys are - but once the obfuscator gets to work all the statics will have name like A, B, C, etc. and it won't be easy to spot any more.
I used ROT47. It's not very secure, but easy to use and implement, because it's a symetric encoder/decoder
You should google for "Just another Perl hacker". These are programms that print out a string with obfuscated code. There are also lots of examples in other languages then Perl on the net.
You can use DexGuard to encrypt strings, probably more effectively than you could achieve manually, and without burdening the source code.
ReferenceURL : https://stackoverflow.com/questions/4427238/hiding-strings-in-obfuscated-code
'Program Club' 카테고리의 다른 글
| Chrome 확장 코드 대 콘텐츠 스크립트 대 삽입 된 스크립트 (0) | 2021.01.05 |
|---|---|
| Unix에서 경로의 일부 제거 (0) | 2021.01.05 |
| Java 바이트 기본 유형에 대한 실제 용도가 있습니까? (0) | 2020.12.31 |
| * args, ** jinja2 매크로의 kwargs (0) | 2020.12.31 |
| C #으로 플로팅 (0) | 2020.12.31 |