APK 파일의 리버스 엔지니어링을 피하는 방법은 무엇입니까? 파일에서 프로젝트로 리버스 엔지니어링을 참조하십시오 . Android

Android 용 결제 처리 앱 을 개발 중이며 해커가 APK 파일 에서 모든 리소스, 자산 또는 소스 코드에 액세스하지 못하게하고 싶습니다 .

누군가 .apk 확장자를 .zip으로 변경하면 압축을 풀고 모든 앱의 리소스 및 자산에 쉽게 액세스 할 수 있으며 dex2jar 및 Java 디 컴파일러를 사용하여 소스 코드에도 액세스 할 수 있습니다. Android APK 파일을 리버스 엔지니어링하는 것은 매우 쉽습니다. 자세한 내용은 스택 오버플로 질문 APK 파일에서 프로젝트로 리버스 엔지니어링을 참조하십시오 .

Android SDK와 함께 제공된 Proguard 도구를 사용했습니다. 서명 된 키 저장소와 Proguard를 사용하여 생성 된 APK 파일을 리버스 엔지니어링하면 난독 화 된 코드가 생성됩니다.

그러나 Android 구성 요소의 이름은 변경되지 않고 앱에서 사용되는 키-값과 같은 일부 코드는 변경되지 않습니다. Proguard 설명서에 따르면이 도구는 매니페스트 파일에 언급 된 구성 요소를 난독 처리 할 수 ​​없습니다.

이제 내 질문은 :

  1. Android APK의 리버스 엔지니어링을 완전히 방지하려면 어떻게 해야합니까? 이것이 가능한가?
  2. 해커가 어떤 식 으로든 APK 파일을 해킹 할 수 없도록 모든 앱의 리소스, 자산 및 소스 코드를 어떻게 보호 할 수 있습니까?
  3. 해킹을 더 힘들거나 불가능하게 만드는 방법이 있습니까? APK 파일에서 소스 코드를 보호하기 위해 어떻게해야합니까?


답변

 1. Android APK의 리버스 엔지니어링을 완전히 피하려면 어떻게해야합니까? 이것이 가능한가?

AFAIK, 리버스 엔지니어링을 완전히 피하기위한 트릭은 없습니다.

또한 @inazaruk는 다음과 같이 잘 말합니다. 코드에 상관없이 잠재적 인 공격자는 자신이 실행 가능한 방식으로 코드를 변경할 수 있습니다. 기본적으로 응용 프로그램이 수정되는 것을 보호 할 수 없습니다. 그리고 거기에 넣은 모든 보호 기능을 비활성화 / 제거 할 수 있습니다.

 2. 해커가 어떤 식 으로든 APK 파일을 해킹 할 수 없도록 모든 앱의 리소스, 자산 및 소스 코드를 어떻게 보호 할 수 있습니까?

해킹을 어렵게 만들기 위해 다른 트릭을 수행 할 수 있습니다. 예를 들어, 난독 화를 사용하십시오 (Java 코드 인 경우). 일반적으로 리버스 엔지니어링 속도가 크게 느려집니다.

 3. 해킹을 더욱 어렵거나 불가능하게 만드는 방법이 있습니까? APK 파일에서 소스 코드를 보호하기 위해 어떻게해야합니까?

모두가 말했듯이 아시다시피 100 % 보안은 없습니다. 그러나 구글이 내장 한 안드로이드의 시작은 프로 가드 (ProGuard)이다. 공유 라이브러리 를 포함 할 수있는 옵션이 있으면 C ++에 필요한 코드를 포함시켜 파일 크기, 통합 등을 확인할 수 있습니다. 모든 빌드에서 APK의 라이브러리 폴더에 외부 기본 라이브러리를 추가해야하는 경우이를 사용할 수 있습니다. 아래 제안에 의해.

라이브러리를 기본 라이브러리 경로에 놓으십시오. 기본은 프로젝트 폴더에서 “libs”입니다. ‘armeabi’ 대상 의 원시 코드를 빌드 한 경우 libs / armeabi 아래에 넣으십시오 . 가 내장되어있는 경우 armeabi-V7A 다음 아래에 넣어
libs와 / armeabi-V7A.

<project>/libs/armeabi/libstuff.so

답변

AFAIK, 현재 / res 디렉토리의 파일을 더 이상 보호 할 수 없습니다.

그러나 소스 코드를 보호하기 위해 취할 수있는 단계 또는 최소한 모든 것이 아닌 경우 수행하는 단계가 있습니다.

  1. ProGuard와 같은 도구를 사용하십시오. 이것들은 코드를 난독 화시키고, 디 컴파일 할 때 읽을 수 없도록 어렵게 만듭니다.
  2. 서비스의 가장 중요한 부분을 앱과 PHP와 같은 서버 측 언어 뒤에 숨겨진 웹 서비스로 옮기십시오. 예를 들어, 알고리즘을 작성하는 데 백만 달러가 걸린다면. 분명히 사람들이 앱에서 앱을 도용하는 것을 원하지 않습니다. 알고리즘을 이동하여 원격 서버에서 데이터를 처리하도록하고 앱을 사용하여 간단히 데이터를 제공하십시오. 또는 NDK를 사용하여 파일을 .so 파일에 기본적으로 쓰면 apk보다 디 컴파일 가능성이 훨씬 낮습니다. .so 파일의 디 컴파일러가 지금도 존재한다고 생각하지 않습니다 (그렇더라도 Java 디 컴파일러만큼 좋지는 않습니다). 또한 주석에서 언급 한 @nikolay와 같이 서버와 장치간에 상호 작용할 때는 SSL을 사용해야합니다.
  3. 장치에 값을 저장하는 경우 원시 형식으로 저장하지 마십시오. 예를 들어 게임이 있고 사용자가 SharedPreferences에 보유한 금액을 게임 통화로 저장하는 경우. 10000동전 이라고 가정 해 봅시다 . 대신 절약 10000과 같은 알고리즘을 사용하여 저장, 직접 ((currency*2)+1)/13. 따라서 대신에 SharedPreferences에 10000저장 1538.53846154합니다. 그러나 위의 예제는 완벽하지 않으며 반올림 오류 등으로 인해 통화를 잃지 않는 방정식을 만들어야합니다.
  4. 서버 측 작업에 대해 유사한 작업을 수행 할 수 있습니다. 이제 예를 들어 실제로 결제 처리 앱을 살펴 보겠습니다. 사용자가의 결제를해야한다고 가정 해 보겠습니다 $200. 원시 $200값을 서버 로 전송하는 대신 더 작은 사전 정의 된 일련의 값을 보냅니다 $200. 예를 들어, 단어와 값을 동일시하는 파일 또는 테이블을 서버에 두십시오. , 및 에 Charlie해당 한다고 가정 해 봅시다 . 를 보내는 대신 네 번 보낼 수 있습니다.$47John$3$200CharlieJohn네번. 서버에서 의미를 해석하고 추가하십시오. 이는 해커가 어떤 단어가 어떤 값에 해당하는지 모르기 때문에 서버에 임의의 값을 보내지 못하게합니다. 보안을 강화하기 위해 포인트 3과 비슷한 방정식 n을 사용하고 며칠 마다 키워드를 변경할 수 있습니다.
  5. 마지막으로 해커가 건초 더미에서 바늘을 찾도록 임의의 쓸모없는 소스 코드를 앱에 삽입 할 수 있습니다. 인터넷에서 스 니펫이 포함 된 임의의 클래스를 삽입하거나 피보나치 시퀀스와 같은 임의의 항목을 계산하는 함수 만 삽입하십시오. 이 클래스는 컴파일되지만 앱의 실제 기능에 사용되지 않아야합니다. 이러한 잘못된 클래스를 충분히 추가하면 해커가 실제 코드를 찾는 데 어려움을 겪을 수 있습니다.

대체로 앱을 100 % 보호 할 수있는 방법이 없습니다. 더 어렵게 만들 수는 있지만 불가능하지는 않습니다. 웹 서버가 손상 될 수 있고, 해커는 여러 트랜잭션 금액과 귀하가 전송하는 키워드를 모니터링하여 키워드를 파악할 수 있으며, 해커는 소스를 통해 고의로 이동하여 어떤 코드가 더미인지 파악할 수 있습니다.

당신은 싸울 수 있지만 결코 이길 수 없습니다.


답변

컴퓨팅 역사상 어느 시점에서도 공격자에게 소프트웨어 사본을 제공 할 때 소프트웨어의 리버스 엔지니어링을 방지 할 수 없었습니다. 또한, 가능성은 거의 없습니다 .

이해 했으므로 확실한 해결책 이 있습니다. 공격자에게 비밀을주지 마십시오. APK의 내용을 보호 할 는 없지만 배포 할 수없는 것은 보호 할 있는 것 입니다. 일반적으로 이것은 활성화, 지불, 규칙 적용 및 기타 수분이 많은 코드에 사용되는 서버 측 소프트웨어입니다. APK에 소중한 자산을 배포 하지 않으면 소중한 자산을 보호 할 수 있습니다 . 대신 앱의 요청에 응답하고 에셋을 “사용”한 다음 결과를 앱으로 다시 보내는 서버를 설정하십시오. 이 모델이 마음에 든 자산에 적합하지 않은 경우 전략을 다시 생각할 수 있습니다.

또한 앱의 불법 복제를 방지하는 것이 주된 목표라면 귀찮게하지 마십시오. 불법 복제 방지 조치가 당신을 구할 수있는 것보다이 문제에 대해 이미 더 많은 시간과 돈을 소모했습니다. 이 문제를 해결하기위한 투자 수익은 너무 낮아서 생각조차하지 않습니다.


답변

앱 보안의 첫 번째 규칙 : 공격자가 물리적 또는 전자적으로 제한없이 액세스 할 수있는 모든 머신은 이제 실제 위치 또는 비용에 관계없이 공격자에게 속합니다.

앱 보안의 두 번째 규칙 : 침입자가 침투 할 수없는 물리적 경계를 벗어나는 소프트웨어는 이제 코딩에 소요 된 시간에 관계없이 공격자의 소유입니다.

세 번째 규칙 : 공격자가 침투 할 수없는 동일한 물리적 경계를 벗어나는 정보는 사용자에게 아무리 가치가 있어도 공격자에게 속합니다.

정보 기술 보안의 기초는이 세 가지 기본 원칙을 기반으로합니다. 진정으로 안전한 유일한 컴퓨터는 금고, 패러데이 케이지 내부, 스틸 케이지 내부에 잠겨있는 컴퓨터입니다. 대부분의 서비스 수명을이 상태로 보내는 컴퓨터가 있습니다. 일 년에 한 번 (또는 그 이하), 그들은 신뢰할 수있는 루트 인증 기관을위한 개인 키를 생성합니다.

이제 대부분의 컴퓨터는 이러한 유형의 환경에서 사용되지 않습니다. 그들은 물리적으로 개방되어 있으며 무선 라디오 채널을 통해 인터넷에 연결되어 있습니다. 요컨대, 소프트웨어와 마찬가지로 취약합니다. 그러므로 그들은 신뢰할 수 없습니다. 컴퓨터와 소프트웨어가 유용하기 위해서는 반드시 알아야하거나해야 할 일이 있지만, 그 컴퓨터가 손상을 일으킬 수있는 정도를 알 수 없거나 충분히 할 수 없도록주의를 기울여야합니다 (적어도 해당 단일 시스템의 경계를 벗어나는 영구적 인 손상은 아님) ).

당신은 이미이 모든 것을 알고있었습니다. 그렇기 때문에 애플리케이션 코드를 보호하려고합니다. 그러나 그 안에 첫 번째 문제가있다. 난독 화 도구를 사용하면 코드를 엉망으로 만들 수 있지만 프로그램을 계속 실행해야합니다. 즉, 앱의 실제 논리 흐름과 앱이 사용하는 데이터는 난독 화의 영향을받지 않습니다. 약간의 끈기가 주어지면 공격자는 단순히 코드를 난독 화 할 수 있으며, 그가보고있는 것이 다른 것이 될 수없는 특정 경우에는 필요하지 않습니다.

대신, 공격자가 코드를 분명하게 확보하는 것이 얼마나 쉬운 지에 상관없이 공격자가 코드로 아무 것도 할 수 없도록해야합니다. 즉, 코드가 개발 한 건물을 떠나는 즉시 그 비밀은 비밀이 아니기 때문에 하드 코딩 된 비밀은 없습니다.

하드 코드 한 이러한 키-값은 응용 프로그램의 소스 코드에서 완전히 제거해야합니다. 대신, 그들은 세 곳 중 하나에 있어야합니다. 공격자가 오프라인 복사본을 얻는 것이 어렵지만 여전히 불가능하지는 않지만 장치의 휘발성 메모리. 아이언 주먹으로 액세스를 제어하는 ​​서버 클러스터에서 영구적으로; 또는 실제 카드 또는 사용자의 메모리와 같은 장치 또는 서버와 관련이없는 두 번째 데이터 저장소에 있습니다 (즉, 휘발성 메모리에 있지만 오래 걸리지 않아도 됨).

다음 구성표를 고려하십시오. 사용자는 메모리에서 장치로 앱의 자격 증명을 입력합니다. 안타깝게도 키로거나 트로이 목마에 의해 사용자의 장치가 손상되지 않았 음을 신뢰해야합니다. 이와 관련하여 할 수있는 최선의 방법은 사용자가 사용한 장치 (MAC / IP, IMEI 등)에 대한 위조하기 어려운 식별 정보를 기억하고 최소한 하나 이상의 추가 채널을 제공함으로써 다단계 보안을 구현하는 것입니다. 익숙하지 않은 장치의 로그인 시도를 확인할 수 있습니다.

자격 증명은 일단 입력되면 클라이언트 소프트웨어 (보안 해시 사용)에 의해 난독 처리되고 일반 텍스트 자격 증명은 삭제됩니다. 그들은 그들의 목적을 달성했습니다. 난독 화 된 자격 증명은 보안 채널을 통해 인증서 인증 서버로 전송되며,이 자격 증명은 다시 해시 하여 로그인의 유효성을 확인하는 데 사용되는 데이터를 생성합니다. 이런 식으로 클라이언트는 데이터베이스 값과 실제로 비교되는 것을 절대 알 수 없으며, 앱 서버는 유효성 검사를 위해 수신 한 내용의 평문 자격 증명을 알 수 없으며, 데이터 서버는 유효성 검사를 위해 저장 한 데이터가 생성되는 방식을 알지 못합니다. 보안 채널이 손상 되더라도 중간에는 횡설수설 만 보입니다.

확인되면 서버는 채널을 통해 토큰을 다시 전송합니다. 토큰은 보안 세션 내에서만 유용하며 임의 노이즈 또는 세션 식별자의 암호화 된 (따라서 확인할 수있는) 사본으로 구성되며 클라이언트 애플리케이션은 요청의 일부로 동일한 채널에서 서버로이 토큰을 보내야합니다. 무언가를하기 위해. 클라이언트 응용 프로그램은 돈, 민감한 데이터 또는 자체적으로 손상 될 수있는 다른 작업을 수행 할 수 없기 때문에이 작업을 여러 번 수행합니다. 대신 서버에이 작업을 수행하도록 요청해야합니다. 클라이언트 응용 프로그램은 최소한 일반 텍스트가 아닌 장치 자체의 영구 메모리에 중요한 정보를 쓰지 않습니다. 클라이언트는 서버가 기억할 로컬 데이터를 암호화하기 위해 보안 채널을 통해 서버에 대칭 키를 요청할 수 있습니다. 이후 세션에서 클라이언트는 휘발성 메모리에서 사용하기 위해 데이터를 해독하기 위해 서버에 동일한 키를 요청할 수 있습니다. 이 데이터 만이 유일한 사본은 아닙니다. 클라이언트가 저장하는 것은 서버에 어떤 형태로도 전송되어야합니다.

분명히 이것은 응용 프로그램이 인터넷 액세스에 크게 의존하게 만듭니다. 클라이언트 장치는 서버에 대한 적절한 연결 및 인증 없이는 기본 기능을 수행 할 수 없습니다. 페이스 북과 다르지 않습니다.

이제 공격자가 원하는 컴퓨터는 서버입니다. 클라이언트 응용 프로그램 / 장치가 아니라 서버가 돈을 벌거나 다른 사람들이 자신의 즐거움을 위해 고통을 줄 수 있기 때문입니다. 괜찮아; 모든 클라이언트를 보호하는 것보다 서버를 보호하는 데 드는 비용과 노력에 훨씬 더 많은 돈을 지불합니다. 서버는 모든 종류의 방화벽 및 기타 전자 보안을 지원할 수 있으며 강철, 콘크리트, 키 카드 / 핀 액세스 및 24 시간 비디오 감시를 통해 물리적으로 보호 할 수 있습니다. 공격자는 실제로 서버에 직접 액세스하려면 매우 정교해야하며 서버에 대해 즉시 알아야합니다.

공격자가 할 수있는 최선의 방법은 사용자의 전화 및 자격 증명을 훔치고 클라이언트의 제한된 권한으로 서버에 로그인하는 것입니다. 신용 카드 분실과 마찬가지로 이러한 경우에는 합법적 인 사용자에게 800 번호로 전화를 걸도록 지시해야합니다. 액세스 할 수있는 모든 휴대 전화에서 고객 서비스에 직접 연결하는 휴대 전화에서 도난당했습니다. 그들은 전화기를 도난 당했다고 말하고, 기본 고유 식별자를 제공하고, 계정이 잠겨 있으며, 공격자가 처리 할 수 ​​있었던 모든 트랜잭션이 롤백되고 공격자는 다시 정사각형으로 돌아갑니다.


답변

 1. Android APK의 리버스 엔지니어링을 완전히 피하려면 어떻게해야합니까? 이것이 가능한가?

불가능하다

 2. 해커가 어떤 식 으로든 APK 파일을 해킹 할 수 없도록 모든 앱의 리소스, 자산 및 소스 코드를 어떻게 보호 할 수 있습니까?

누군가가 .apk 확장자를 .zip으로 변경하면 압축을 풀면 누군가가 쉽게 모든 리소스를 얻을 수 있지만 ( Manifest.xml 제외 ) APKtool 을 사용하면 매니페스트 파일의 실제 내용도 얻을 수 있습니다. 다시 한 번

 3. 해킹을 더욱 어렵거나 불가능하게 만드는 방법이 있습니까? APK 파일에서 소스 코드를 보호하기 위해 어떻게해야합니까?

다시 말하지만, 어느 정도까지는 막을 수 있습니다.

  • 웹에서 리소스를 다운로드하고 암호화 프로세스를 수행하십시오.
  • 사전 컴파일 된 원시 라이브러리 사용 (C, C ++, JNI, NDK)
  • 항상 일부 해싱 ( MD5 / SHA 키 또는 기타 논리)을 수행하십시오.

로도 Smali사람들은 코드를 가지고 놀 수 있습니다. 대체로 가능하지 않습니다.


답변

Android APK의 리버스 엔지니어링을 100 % 피할 수는 없지만 다음 방법을 사용하여 소스 코드, APK의 자산 및 리소스와 같은 더 많은 데이터 추출을 피할 수 있습니다.

  1. ProGuard를 사용하여 응용 프로그램 코드를 난독 처리

  2. 사용 NDK 사용하여 C 및 C ++를 응용 프로그램 코어와 코드의 보안 부분을 넣어 .so파일을

  3. 리소스를 보호하려면 APK를 사용하여 자산 폴더에 중요한 리소스를 모두 포함시키지 마십시오. 응용 프로그램을 처음 시작할 때 이러한 리소스를 다운로드하십시오.


답변

개발자는 APK가 도난 당하지 않도록 다음 단계를 수행 할 수 있습니다.

  • 가장 기본적인 방법은 ProGuard코드를 난독 화하는 것과 같은 도구를 사용하는 것이지만 지금까지 누군가가 앱을 디 컴파일하는 것을 완전히 막는 것은 매우 어려웠습니다.

  • 또한 HoseDex2Jar 도구에 대해 들었습니다 . Dex2Jar안드로이드 APK에 무해한 코드를 삽입하여 코드를 혼동하고 비활성화 Dex2Jar하고 코드 디 컴파일로부터 보호 함으로써 중단 됩니다 . 해커가 APK를 읽을 수있는 Java 코드로 디 컴파일하는 것을 막을 수 있습니다.

  • 필요한 경우에만 일부 서버 측 응용 프로그램을 사용하여 응용 프로그램과 통신하십시오. 중요한 데이터를 방지하는 데 도움이 될 수 있습니다.

잠재적 인 해커로부터 코드를 완전히 보호 할 수는 없습니다. 어떻게 든 코드를 디 컴파일하는 것이 어려워지고 약간의 좌절감을 줄 수 있습니다. 가장 효율적인 방법 중 하나는 네이티브 코드 (C / C ++)로 작성하여 컴파일 된 라이브러리로 저장하는 것입니다.