Як уникнути зворотної інженерії файлу APK?


764

Я розробляю додаток для обробки платежів для Android, і хочу запобігти доступу хакера до будь-яких ресурсів, активів або вихідного коду з файлу APK .

Якщо хтось змінить розширення .apk на .zip, він може розпакувати його та легко отримати доступ до всіх ресурсів і активів програми, а за допомогою dex2jar та декомпілятора Java також може отримати доступ до вихідного коду. Зробити інженеру файл Android APK дуже просто - детальніше див. Питання щодо переповнення стека Зворотне проектування з файлу APK в проект .

Я використав інструмент Proguard, який постачається з Android SDK. Коли я повертаю інженеру файл APK, згенерований за допомогою підписаного магазину ключів та Proguard, я отримую неясний код.

Однак назви компонентів Android залишаються незмінними, а деякий код, як-от значення ключів, використовувані в додатку, залишається незмінним. Згідно з документацією Proguard, інструмент не може приховати компоненти, згадані у файлі Manifest.

Тепер мої запитання:

  1. Як я можу повністю запобігти зворотному проектуванню Android APK? Чи можливо це?
  2. Як я можу захистити всі ресурси, активи та вихідний код програми, щоб хакери не могли зламати файл APK жодним чином?
  3. Чи є спосіб зробити злому більш жорстким або навіть неможливим? Що ще я можу зробити, щоб захистити вихідний код у моєму файлі APK?

120
Здається, ви можете використовувати "безпеку від неясності", якщо ваша схема обробки платежів покладається на те, що робота клієнта залишається таємною.
PeterJ

43
Ви розглядали можливість написання важливих частин коду в C / C ++ і додавали їх у складену бібліотеку? Їх можна розібрати на код складання, але зворотна інженерія великої бібліотеки від складання вкрай затратна за часом.
Лев


60
Ласкаво просимо до основної проблеми створення будь-якого цифрового активу. Хакери можуть знизитися до рівня інструкцій на машині, тож якщо комп'ютер може прочитати файл, то його можна зламати відкрити / скопіювати, жодна кількість омертвіння чи DRM ніколи не може повністю зупинити визначеного хакера. Якщо вам потрібна безпека, то переконайтесь, що приватні ключі ніколи не є джерелом, і на етапі проектування знайте, що лише ізоляція (віддалене та / або виділене обладнання) може захистити їх.
Кіт

16
Зауважте, що залежно від того, що робить ваш додаток для обробки платежів, може існувати нормативно-правова політика, яка впливає на ваш додаток і може потенційно піддавати вас суворим штрафам: див. Відповідність PCI, починаючи з pcicomplianceguide.org/pcifaqs.php#11 .
bloopletech

Відповіді:


371

 1. Як я можу повністю уникнути зворотної інженерії Android APK? Чи можливо це?

AFAIK, не існує жодної хитрості для повного уникнення зворотної інженерії.

А також дуже добре сказав @inazaruk: Що б ви не зробили зі своїм кодом, потенційний зловмисник може змінити його будь-яким способом, який він чи він вважає можливим . Ви в основному не можете захистити свою програму від зміни. І будь-який захист, який ви вкладете туди, можна відключити / зняти.

 2. Як я можу захистити всі ресурси, активи та вихідний код програми, щоб хакери не могли зламати файл APK жодним чином?

Ви можете робити різні трюки, щоб зробити хакерство складніше. Наприклад, використовуйте обфускування (якщо це код Java). Зазвичай це значно уповільнює реверсивну техніку.

 3. Чи є спосіб зробити злому більш жорстким або навіть неможливим? Що ще я можу зробити, щоб захистити вихідний код у моєму файлі APK?

Як всі кажуть, і як ви, напевно, знаєте, 100% -ної безпеки немає. Але ProGuard - це місце для запуску Android, в яке вбудовано Google. Якщо у вас є можливість включити спільні бібліотеки , ви можете включити необхідний код у C ++, щоб перевірити розміри файлів, інтеграцію тощо. Якщо вам потрібно додати зовнішню рідну бібліотеку до папки бібліотеки вашої APK під час кожної збірки, ви можете використовувати її за наведеною нижче пропозицією.

Помістіть бібліотеку в рідну бібліотечну стежку, яка за замовчуванням "libs" у вашій папці проекту. Якщо ви створили нативний код для цілі 'Armeabi', тоді покладіть його під libs / Armeabi . Якщо він був побудований з Armeabi-v7a, то покладіть його під libs / armeabi-v7a.

<project>/libs/armeabi/libstuff.so

1
Для платіжної транзакції я використовував стандарт ISO 8585, зараз схема для цього стандарту знаходиться в парі «ключ-значення», використовуючи колекцію Java HashMap Java, і коли я роблю зворотну інженерію на apk, я отримаю всі схеми. Чи можна уникнути отримання схеми піддаються зворотній техніці. Чи може Ваша остання пропозиція бібліотек Поділитися корисною в цьому випадку? У вас є будь-які посилання, щоб я міг отримати доступ до бібліотек обміну в android.
sachin003

4
як щодо шифрування ваших рядків у коді та розшифровки їх під час виконання? Якщо ви робите розшифровку на віддаленому сервері, як це запропонували інші люди, у вас не виникне проблеми, що ключ розшифровки знаходиться в джерелах.
kutschkem

так, шифрування є способом, але це не обов'язково, щоб не зламатись. Якщо я шифрую String для того, щоб розшифрувати їх, мені потрібен один унікальний ідентифікатор у коді. і якщо хтось зможе його декомпілювати, то отримати унікальний ідентифікатор буде дуже просто.
Бхавеш Патадія

чому ви додали відредаговані речі? все це регулярно.
Мухаммед Ажаруддін Шейх

@hotveryspicy: так, я зараз видалив позначку "відредагований" з answer.i відредагував мою відповідь, тому що хотів дізнатися більше про те, як поділитися бібліотеками корисно в цьому випадку.
Бхавеш Патадія

126

AFAIK, ви не можете захистити файли в каталозі / res більше, ніж вони захищені зараз.

Однак є кроки, які ви можете вжити, щоб захистити свій вихідний код або хоча б все, що він робить, якщо не все.

  1. Використовуйте такі інструменти, як ProGuard. Вони заблудять ваш код і зроблять його складніше при читанні, якщо не неможливо.
  2. Перенесіть найважливіші частини служби з програми та перейдіть у веб-сервіс, схований за мовою на стороні сервера, як PHP. Наприклад, якщо у вас є алгоритм, вам потрібно було написати мільйон доларів. Ви, очевидно, не хочете, щоб люди крали його з вашого додатка. Перемістіть алгоритм і дозвольте йому обробляти дані на віддаленому сервері та використовуйте додаток, щоб просто надати їм дані. Або скористайтеся NDK, щоб записати їх у власні файли .so, які набагато рідше декомпілюються, ніж apks. Я не думаю, що декомпілятор для файлів .so навіть існує зараз (і навіть якби це було, це було б не так добре, як декомпілятори Java). Крім того, як @nikolay згадується в коментарях, вам слід використовувати SSL під час взаємодії між сервером та пристроєм.
  3. Зберігаючи значення на пристрої, не зберігайте їх у необробленому форматі. Наприклад, якщо у вас є гра, і ви зберігаєте кількість ігрової валюти, яку має користувач у SharedPreferences. Припустимо, це 10000монети. Замість того, щоб 10000безпосередньо економити, збережіть його, використовуючи подібний алгоритм ((currency*2)+1)/13. Отже, замість цього 10000, ви зберігаєте 1538.53846154в SharedPreferences. Однак, наведений вище приклад не є ідеальним, і вам доведеться попрацювати, щоб створити рівняння, яке не втратить валюту на помилки округлення тощо.
  4. Можна зробити аналогічну справу і для завдань на стороні сервера. Тепер для прикладу, давайте реально візьмемо додаток для обробки платежів. Скажімо, користувач повинен здійснити платіж $200. Замість того, щоб надсилати необроблене $200значення на сервер, надішліть ряд менших, попередньо визначених значень, до яких додається $200. Наприклад, на вашому сервері є файл або таблиця, які прирівнюють слова зі значеннями. Так давайте скажемо , що Charlieвідповідає до $47і Johnдо $3. Тож замість надсилання $200ви можете відправити Charlieчотири рази іJohnчотири рази. На сервері інтерпретуйте, що вони означають, і додайте їх. Це не дозволяє хакеру надсилати на ваш сервер довільні значення, оскільки вони не знають, яке слово відповідає якому значенню. В якості додаткової міри безпеки ви можете також створити рівняння, подібне до пункту 3, і змінювати ключові слова через кожну nкількість днів.
  5. Нарешті, ви можете вставити випадковий марний вихідний код у свою програму, щоб хакер шукав голку в копиці сіна. Вставте випадкові класи, що містять фрагменти з Інтернету, або просто функції для обчислення випадкових речей, таких як послідовність Фібоначчі. Переконайтеся, що ці класи складаються, але вони не використовуються фактичною функціональністю програми. Додайте достатньо цих помилкових класів, і хакеру доведеться важко знайти ваш реальний код.

Загалом, немає ніякого способу захистити додаток на 100%. Можна зробити це важче, але не неможливо. Ваш веб-сервер може бути скомпрометований, хакер може розібратися у ваших ключових словах, відстежуючи декілька сум транзакцій та ключові слова, які ви надсилаєте для цього, хакер може кропітко пройти через джерело та зрозуміти, який код є фіктивним.

Ти можеш боротися лише, але ніколи не перемогти.


136
Замість того, щоб робити хитрощі зі значеннями, які ви надсилаєте на свій сервер, використовуйте SSL та належним чином перевіряйте сертифікат сервера. Безпека через невідомість, як правило, погана ідея.
Микола Єленков

48
ви можете вставити випадковий марний вихідний код у свою програму . Це теж не може допомогти. Це лише роздує вашу програму, а також ускладнить її підтримку.
Аніруд Рамананат

4
Ви також можете підробити непотрібний код і надіслати дані на сервер, який відкине їх. Можливо, помилкова безпека, але біль у дупі для потенційного хакера, правда?
Бенуа Дюффес

19
Якщо ваш алгоритм коштує мільйон доларів, то те, що не існує декомпілятора .soфайлів, не означає, що я не можу прочитати збірку :) Більшість із них потрапляють у ту саму пастку, просто заплутавшись замість належного захисту себе. Заплутаність працює лише в тому випадку, якщо не варто витрачати час зловмисника, тому, якщо ви будуєте щось на цих методах, ви краще сподіваєтесь, що вони не стануть популярними, інакше ви накрутитеся, оскільки раптом ваша база коду неможлива і це потребує величезних змін.
Фоши

23
Я не розумію, чому ця відповідь має таку високу оцінку. 3. і 4. для одного вони просто нерозумні і взагалі не становлять ніякої безпеки.
Матті Вірккунен

117

Ні в якому разі в історії обчислень не вдалося запобігти зворотному проектуванню програмного забезпечення, коли ви надаєте робочій копії цього зловмиснику. Також, найімовірніше, це ніколи не вдасться .

З огляду на це, існує очевидне рішення: не роздавай своїх таємниць своєму нападнику. Хоча ви не можете захистити вміст APK, проте ви можете захистити те, що ви не поширюєте. Зазвичай це програмне забезпечення на стороні сервера, яке використовується для таких речей, як активація, платежі, виконання правил та інші соковиті біти коду. Ви можете захистити цінні активи, якщо не поширюючи їх у своєму APK. Натомість налаштуйте сервер, який відповідає на запити вашої програми, "використовує" активи (що б це не означало), а потім повертає результат назад у додаток. Якщо ця модель не працює для активів, які ви маєте на увазі, то, можливо, ви захочете переглянути свою стратегію.

Крім того, якщо ваша основна мета - запобігти піратству програм : навіть не турбуйтеся. Ви вже спалили більше часу та грошей на цю проблему, ніж будь-який захід проти піратства міг би сподіватися, що врятує вас. Рентабельність інвестицій для вирішення цієї проблеми настільки низька, що навіть про це не має сенсу думати.


21
Перший абзац - найкраща відповідь. Якщо ваш зловмисник контролює обладнання, вони завжди зможуть якось перемогти ваше програмне забезпечення. Все, що справді потребує захисту, повинно залишатися на апаратному забезпеченні, яким ви керуєте, це так просто. І останній абзац, про рентабельність інвестицій, також є місцем.
Даніель Приден

88

Перше правило безпеки програми: Будь-яка машина, до якої зловмисник отримує необмежений фізичний або електронний доступ, тепер належить вашому зловмиснику, незалежно від того, де він насправді є чи за що ви заплатили за нього.

Друге правило безпеки програми: Будь-яке програмне забезпечення, яке залишає фізичні межі, до яких зловмисник не може проникнути, тепер належить вашому зловмиснику, незалежно від того, скільки часу ви витратили на його кодування.

Третє правило: будь-яка інформація, яка залишає ті самі фізичні межі, до яких зловмисник не може проникнути, тепер належить вашому зловмиснику, незалежно від того, наскільки вона для вас цінна.

Основи безпеки інформаційних технологій базуються на цих трьох основоположних принципах; єдиний справді захищений комп’ютер - це той, який замкнений у сейфі, у клітці Farraday, у сталевій клітці. Є комп’ютери, які проводять більшу частину свого сервісного життя саме в такому стані; раз на рік (або рідше) вони генерують приватні ключі для довірених кореневих служб сертифікації (перед безліччю свідків з камерами, що записують кожен сантиметр приміщення, в якому вони знаходяться).

Зараз більшість комп'ютерів не використовуються в таких середовищах; вони фізично перебувають на відкритому повітрі, підключені до Інтернету по бездротовому радіоканалу. Словом, вони вразливі, як і їх програмне забезпечення. Тому їм не слід довіряти. Існують певні речі, які комп’ютери та їх програмне забезпечення повинні знати або робити для того, щоб бути корисними, але слід бути обережним, щоб вони ніколи не могли знати або зробити достатньо для заподіяння шкоди (принаймні, не постійного пошкодження поза межами цієї однієї машини ).

Ви вже все це знали; саме тому ви намагаєтеся захистити код своєї програми. Але в цьому криється перша проблема; інструменти обфускування можуть зробити код безладним для людини, щоб спробувати перекопати, але програма все одно має працювати; це означає, що фактичний логічний потік програми та даних, які він використовує, не впливають на обфускацію. Враховуючи невелику завзятість, зловмисник може просто скасувати коду, і це навіть не потрібно в певних випадках, коли те, на що він дивиться, не може бути іншим, окрім того, що шукає.

Натомість вам слід намагатися переконатися, що зловмисник нічого не може зробити з вашим кодом, як би не було легко отримати чітку його копію. Це означає, що жодних важко зашифрованих секретів, оскільки ці секрети не є секретними, як тільки код покидає будівлю, в якій ви його розробили.

Ці важко кодовані ключові значення слід повністю видалити з вихідного коду програми. Натомість вони повинні бути в одному з трьох місць; енергонезалежна пам’ять на пристрої, що зловмиснику важче (але все ж не неможливо) отримати копію офлайн; постійно на серверному кластері, до якого ви керуєте доступом залізним кулаком; або у другому сховищі даних, не пов’язаному з вашим пристроєм або серверами, наприклад, фізичною карткою або пам'яттю вашого користувача (це означає, що з часом вона буде в мінливій пам'яті, але це не повинно бути довгим).

Розглянемо наступну схему. Користувач вводить свої дані для програми із пам'яті в пристрій. Ви, на жаль, повинні довіряти, що пристрій користувача вже не порушений кейлоггером або троянським файлом; найкраще, що ви можете зробити в цьому плані - це реалізація багатофакторної безпеки, запам’ятовуючи важко підроблену ідентифікаційну інформацію про пристрої, якими користувач користувався (MAC / IP, IMEI тощо), та надаючи принаймні один додатковий канал яку спробу входу на незнайомий пристрій можна перевірити.

Після введення облікових даних замовчується клієнтським програмним забезпеченням (використовуючи захищений хеш), а облікові дані простого тексту відкидаються; вони виконували своє призначення Засмучені облікові дані надсилаються по захищеному каналу на сервер, що підтверджує сертифікат, який знову їх хеширует для отримання даних, що використовуються для перевірки дійсності входу. Таким чином, клієнт ніколи не знає, що насправді порівнюється зі значенням бази даних, сервер додатків ніколи не знає облікових даних простого тексту за тим, що він отримує для перевірки, сервер даних ніколи не знає, як виробляються дані, які він зберігає для перевірки, і людина в середина бачить лише хитрість, навіть якщо захищений канал був порушений.

Після перевірки сервер передає маркер назад по каналу. Маркер корисний лише під час безпечного сеансу, складається з випадкового шуму або зашифрованої (і, таким чином, перевіреної) копії ідентифікаторів сеансу, і клієнтська програма повинна надіслати цей маркер на тому ж каналі на сервер у рамках будь-якого запиту щось робити. Клієнтська програма зробить це багато разів, тому що вона не може робити нічого, пов’язане з грошима, конфіденційними даними чи іншим, що може завдати шкоди самому; він повинен замість цього попросити сервер виконати це завдання. Клієнтська програма ніколи не записує будь-яку конфіденційну інформацію в стійку пам'ять на самому пристрої, принаймні, не в простому тексті; клієнт може запитати у сервера через захищений канал симетричний ключ для шифрування будь-яких локальних даних, які сервер запам'ятає; в подальшому сеансі клієнт може попросити сервер того ж ключа, щоб розшифрувати дані для використання в енергонезалежної пам'яті. Ці дані також не будуть єдиною копією; все, що зберігає клієнт, також повинно бути передано в якійсь формі на сервер.

Очевидно, це робить вашу програму сильно залежною від доступу до Інтернету; клієнтський пристрій не може виконувати жодну з основних функцій без належного підключення до сервера та автентифікації. Не відрізняється від Facebook, насправді.

Тепер комп'ютер, якого хоче зловмисник, - це ваш сервер, адже саме він, а не клієнтська програма / пристрій, - це те, що може заробити йому гроші або заподіяти іншим людям біль за його задоволення. Це добре; Ви отримуєте набагато більше грошей за гроші, витрачені гроші та зусилля на безпеку сервера, ніж намагаючись захистити всіх клієнтів. Сервер може стояти за всіма брандмауерами та іншими електронними засобами безпеки, а також додатково може бути фізично захищений за сталевим, бетонним, клавіатурним / контактним доступом та цілодобовим відеоспостереженням. Ваш зловмисник дійсно повинен бути дуже складним, щоб отримати будь-який доступ до сервера безпосередньо, і ви (повинні) про це дізнатися негайно.

Найкраще, що може зробити зловмисник - це викрасти телефон та облікові дані користувача та увійти на сервер з обмеженими правами клієнта. Якщо це станеться, як і втрата кредитної картки, законному користувачеві слід доручити зателефонувати на номер 800 (бажано легко запам’ятати, а не на звороті картки, яку вони мали б у своєму гаманці, гаманці чи портфелі, які можуть бути викрадені поряд із мобільним пристроєм) з будь-якого телефону, до якого вони можуть отримати доступ, що підключає їх безпосередньо до обслуговування клієнтів. Вони заявляють, що їхній телефон був викрадений, надають основний унікальний ідентифікатор, а обліковий запис заблоковано, будь-які транзакції, які зловмисник, можливо, міг обробити, повертаються назад, а зловмисник повертається до першого.


1
ідеальна відповідь !! Мені просто сподобався ваш спосіб отримати дані з сервера з деяким зашифрованим маркером, я думаю, що це поруч з неможливим розшифрувати після цього.
дхарам

Я знаю, що це трохи пізно, але що робити з доступом до частини сервера. Такі сервіси, як Microsoft azure, надають вам щось подібне, щоб отримати доступ до свого сервера: MobileServiceClient mClient = new MobileServiceClient ("MobileServiceUrl", // Замініть вищезгаданою URL-адресою сайту "AppKey", // замініть на цей ключ програми) і багато хто, хто має доступ до того, що може отримати доступ до їх сервера в кінці редагувати його
edwinj

@edwinj - Немає проблем у інформатиці, які не можна вирішити за допомогою іншого шару непрямості. Ваш фрагмент дає основну ідею для доступу до служби мобільних клієнтів Azure; він забезпечує базовий рівень безпеки від "переїздів" вхідних дверей Microsoft. Ви можете, в свою чергу, додавати додаткові шари, наприклад, вимагати сеансового ключа (в основному, що це зашифрований маркер) на будь-який виклик служби, і щоб отримати цей ключ, вони повинні спочатку підтвердити автентифікацію за допомогою поєднання знань облікових даних та схеми шифрування.
КітС

1
Одна з найкращих відповідей.
debo.stackoverflow

64

 1. Як я можу повністю уникнути зворотної інженерії Android APK? Чи можливо це?

Це неможливо

 2. Як я можу захистити всі ресурси, активи та вихідний код програми, щоб хакери не могли зламати файл APK жодним чином?

Коли хтось змінить .apk розширення на .zip, то після розпакування можна хтось легко отримати всі ресурси (крім Manifest.xml ), але з APKtool можна отримати і реальний вміст файлу маніфесту. Знову ж таки, ні.

 3. Чи є спосіб зробити злому більш жорстким або навіть неможливим? Що ще я можу зробити, щоб захистити вихідний код у моєму файлі APK?

Знову ні, але ви можете запобігти до деякого рівня, тобто

  • Завантажте ресурс з Інтернету та виконайте певний процес шифрування
  • Використовуйте заздалегідь складену рідну бібліотеку (C, C ++, JNI, NDK)
  • Завжди виконайте кілька хешування ( клавіші MD5 / SHA або будь-яка інша логіка)

Навіть при цьому Smaliлюди можуть грати з вашим кодом. Загалом, це НЕ МОЖЛИВО.


7
@TrevorBoydSmith: Шифрування не дуже допомагає, коли операційна система працює з відкритим кодом та перетворюється на неї. Системі потрібен ключ, щоб розшифрувати APK та запустити матеріали. І якщо в системі є ключ, і я маю безперешкодний доступ до системи, то я знаю, де знайти ключ і можу дістатись до нього. Це означає, що я маю ключ і зараз .
cHao

4
@TrevorBoydSmith: Хоча частина "як це зробити" вбиває всю ідею. Просто немає можливості безпосередньо зашифрувати код; в якийсь момент розшифрований код повинен бути доступний. Що означає (1) повинен бути ключ (до того, що я, як root, мабуть, маю доступ), і (2) я навіть зможу знайти чітку копію в оперативній пам’яті і просто не турбуватися про шифрування.
cHao

3
@TrevorBoydSmith: Проблема полягає в тому, що в цьому випадку ви просто не можете підняти витрати, щоб зробити це не варто. Тут ми не говоримо про грубі клавіші; ми говоримо про те, що вони вже є - ОС має мати ключі, а у нас ОС. Єдиний спосіб виправити це - зробити операційну операційну систему неможливою. Удачі в цьому; навіть Apple не може цим керувати. :)
cHao

3
@TrevorBoydSmith: Я не думаю, що підвищення вартості взагалі неможливо. Я думаю ( зокрема , кажу), що ваша пропозиція неможлива - тому що вона є . MATLAB не Android, і він має певні свободи, яких не має Android. Зокрема, вона має затуманення на боці; набагато складніше приховати ключ шифрування. Android не може цього зробити. Кожен, хто має вихідний код, знав би, де ховаються ключі, і мав би інструмент для їх отримання протягом 10 хвилин після оголошення функції. Це не просто можливо зробити; це прямо-таки тривіально .
cHao

6
@TrevorBoydSmith: Я нічого такого не наполягав. Я наполягаю на тому, що статичність, зміна, переміщення тощо не мають значення . У ОС з відкритим кодом, шифрування само по собі не може захистити код від тих, хто міг би його реверсувати. Оскільки я можу прочитати код, який би робив розшифровку, незалежно від того, як ключ придбаний, використаний та / або збережений, я можу бачити, як ви це зробили та копіювати - навіть простіше, ніж я міг би змінити якусь суперсекретну інформацію код програми.
cHao

37

100% уникнення зворотної інженерії Android APK неможливо, але ви можете скористатися цими способами, щоб уникнути отримання більшої кількості даних, як-от вихідний код, активи з вашої APK та ресурси:

  1. Використовуйте ProGuard для придушення коду програми

  2. Використовуйте NDK за допомогою C і C ++, щоб розмістити ядро ​​програми та захистити частину коду у .soфайлах

  3. Щоб забезпечити безпеку ресурсів, не включайте всі важливі ресурси в папку активів із APK. Завантажте ці ресурси під час першого запуску програми.


7
Третя дійсно полегшує роботу нападників. Обнюхати мережевий зв’язок простіше, ніж зворотне проектування.
Totten

Щоб вирішити проблему третього, можна зашифрувати завантажений контент та / або використовувати зашифроване з'єднання (наприклад, SSL / TLS)
Страдіварі

1
Шифрування з'єднання захищає від людей, які нюхають або змінюють трафік. У випадку, коли сам користувач є зловмисним (тобто у вас є ваш apk і він намагається зламати його), він все одно отримає вміст, використовуючи ваше додаток, витягуючи ресурси як користувач root; але так, це допомагає проти простих нюхаючих атак.
Кевін Лі

Додавши до цього: 4) використовуйте програму dexguard для вищої затуманення, але це заплачено 5) використання OBB-файлу для завантаження активів під час завантаження програми, це допоможе зменшити розмір програми також
Ashok Kumar

35

Розробники можуть вжити наступних заходів, щоб якось запобігти крадіжці APK,

  • найосновніший спосіб - використовувати такі інструменти, як ProGuardпритуплення їх коду, але до цих пір було досить важко повністю запобігти комусь розкласти додаток.

  • Також я чув про інструмент HoseDex2Jar . Він припиняється Dex2Jar, вставляючи нешкідливий код в Android APK, який плутає та вимикає Dex2Jarта захищає код від декомпіляції. Це може якось запобігти хакерам декомпілювати APK у читаний java-код.

  • Використовуйте деякі програми на стороні сервера, щоб спілкуватися з програмою лише тоді, коли це потрібно. Це може допомогти запобігти важливі дані.

Взагалі, ви не можете повністю захистити свій код від потенційних хакерів. Так чи інакше, ви могли б ускладнити і трохи неприємне завдання декомпілювати ваш код. Один з найефективніших способів - це записувати в нативний код (C / C ++) і зберігати його як складені бібліотеки.


3
HoseDex2Jar поряд із марним. Це лише «плутає» dex2jar і його можна легко заблокувати. smali / apktool і т. д. відмінно працюють з "шланговими" APK-файлами.
Микола Єленков

@NikolayElenkov Чи знаєте ви, як працює HoseDex2Jar? Що вони використовували, щоб уникнути або збити з пантелику dex2jar.Больш того, я не можу завантажувати свій файл apk в Інтернет, щоб використовувати HoseDex2Jar. Якщо я можу зробити щось на зразок HoseDex2Jar, щоб збити з пантелику dex2jar, це буде важко зламати, використовуючи інструмент dex2jar.
sachin003

1
Можливо, ви неправильно зрозуміли мою думку: те, що робить HoseDex2Jar - це перепакувати ваш APK, щоб популярний інструмент dex2jar не міг (поза коробкою) повернути його назад. Однак інші інструменти можуть, і це взагалі дуже легко перемогти. Немає сенсу його використовувати. Ніхто не згадав про Dexguard I (про автора ProGuard; не безкоштовно), але це робота. Це робить дещо більше, ніж «регулярне» затухання.
Микола Єленков

C ++ ніколи не можна змінити? це важко, але можливо. і є інструменти, які допоможуть вам у цьому, як hex-rays.com/products/decompiler/index.shtml (так, у них є версія ARM. Це не так легко отримати).
dkzm

так, @VikartiAnatra: Я також якось
Сахіл Махаджан Mj

24

Ось кілька методів, які ви можете спробувати:

  1. Використовуйте обфускування та такі інструменти, як ProGuard .
  2. Зашифруйте частину джерела та даних.
  3. Використовуйте власну вбудовану контрольну суму в додатку, щоб виявити фальсифікацію.
  4. Введіть код, щоб уникнути завантаження в налагоджувальнику, тобто нехай у додатку буде можливість виявляти налагоджувач і виходити / вбивати налагоджувач.
  5. Відокремте автентифікацію як онлайн-сервіс.
  6. Використовуйте різноманітність програм
  7. Перед автентифікацією пристрою використовуйте техніку друку пальців, наприклад, апаратні підписи пристроїв з різних підсистем.

23

 1. Як я можу повністю уникнути зворотної інженерії Android APK? Чи можливо це?

Неможливо

 2. Як я можу захистити всі ресурси, активи та вихідний код програми, щоб хакери не могли зламати файл APK жодним чином?

Неможливо

 3. Чи є спосіб зробити злому більш жорстким або навіть неможливим? Що ще я можу зробити, щоб захистити вихідний код у моєму файлі APK?

Більш жорстке - можливо, але насправді воно буде більш жорстким в основному для пересічного користувача, який просто гуглить за злом посібників. Якщо хтось дійсно хоче зламати вашу програму - вона рано чи пізно буде зламана.


22

 1. Як я можу повністю уникнути зворотної інженерії Android APK? Чи можливо це?

Це неможливо

 2. Як я можу захистити всі ресурси, активи та вихідний код програми, щоб хакери не могли зламати файл APK жодним чином?

Розробники можуть вживати таких заходів, як використання таких інструментів, як ProGuard, щоб придушити свій код, але до цього часу повністю запобігти кому-небудь декомпілювати додаток було досить важко.

Це дійсно чудовий інструмент і може збільшити труднощі "повернення" коду, зменшивши при цьому код вашого коду.

Вбудована підтримка ProGuard: ProGuard тепер постачається з інструментами SDK. Тепер розробники можуть приховати свій код як інтегровану частину версії версії.

 3. Чи є спосіб зробити злому більш жорстким або навіть неможливим? Що ще я можу зробити, щоб захистити вихідний код у моєму файлі APK?

Під час дослідження я дізнався про HoseDex2Jar . Цей інструмент захистить ваш код від розкладання, але, схоже, неможливо повністю захистити свій код.

Деякі корисні посилання ви можете посилатися на них.


21

Головне питання тут полягає в тому, чи можна декомпілювати файли dex, і відповідь, чи вони можуть бути "своєрідними". Є розбиральники на кшталт дедексера та смалі .

Правильно налаштований ProGuard примхлить ваш код. DexGuard, комерційна розширена версія ProGuard, може допомогти трохи більше. Однак ваш код все-таки можна перетворити на smali, і розробники з досвідом зворотної інженерії зможуть з’ясувати, що ви робите зі смалі.

Можливо, виберіть хорошу ліцензію та найкращим чином виконайте її.


4
Як бічна примітка (відмова від відповідальності: IANAL) - ліцензія не захищатиме заявку в усіх юрисдикціях за будь-яких обставин (наприклад, у деяких країнах Європи дозволено розбирати з метою підвищення сумісності).
Мацей П'єхотка

12

Ваш клієнт повинен найняти когось, хто знає, що вони роблять, хто може приймати правильні рішення та може наставляти вас.

Говорити вище про те, що у вас є можливість змінити систему обробки транзакцій на бекенді - це абсурдно - вам не слід дозволяти вносити такі архітектурні зміни, тому не сподівайтеся, що зможете.

Моє обґрунтування цього:

Оскільки ваш домен обробляє платежі, можна впевнено вважати, що PCI DSS та / або ПД DSS (і потенційний штат / федеральний закон) будуть важливими для вашого бізнесу - щоб відповідати сумісність, ви повинні показати, що ви захищені. Щоб бути невпевненим, тоді з’ясуйте (за допомогою тестування), що ви не захищені, потім виправляйте, повторне тестування та інше, доки безпеку не зможуть перевірити на відповідному рівні = дорогий, повільний, високий ризик для успіху. Щоб зробити все правильно, подумайте наперед, зробіть досвідчений талант до роботи, розвивайтесь у безпечній формі, потім тестуйте, виправляйте (менше) та інше (менше), поки безпеку не зможете перевірити на відповідному рівні = недорогий, швидкий, шлях низького ризику до успіху.


8

Як хтось, хто широко працював над платними платформами, включаючи один додаток для мобільних платежів (MyCheck), я б сказав, що вам потрібно делегувати цю поведінку серверу, жодне ім’я користувача та пароль для платіжного процесора (що б це не було) не слід зберігати або жорстке кодування в мобільному додатку, це останнє, що ви хочете, тому що джерело можна зрозуміти, навіть якщо ви заблукаєте код.

Крім того, ви не повинні зберігати кредитні картки або платіжні жетони у програмі, все, знову ж таки, делегуватимуться на створену вами послугу, це також дозволить вам згодом легше бути сумісним з PCI, і компанії з кредитних карт виграють Не дихайте вниз по шиї (як це зробили для нас).


7

Інші акцентовані відповіді тут правильні. Я просто хочу надати інший варіант.

Для певних функціональних можливостей, які ви вважаєте важливими, ви можете розмістити елемент керування WebView у вашому додатку. Потім функціональність буде реалізована на вашому веб-сервері. Схоже, це працює у вашій програмі.


@Sarel Botha так для екранів IMP Я вже використовував перегляд веб-переглядачів. Так, це також один із способів збереження безпеки, я приймаю вашу відповідь.
sachin003

7

Якщо ми хочемо зробити зворотну інженерію (майже) неможливою, ми можемо поставити додаток на чітко стійкий до фальсифікації чіп, який виконує всі чутливі речі всередині, і спілкується з деяким протоколом, щоб зробити управління GUI можливим на хості. Навіть чіпкі, стійкі до фальсифікації, не є 100% стійкістю до розтріскування; вони просто встановлюють планку набагато вище, ніж програмні методи. Звичайно, це незручно: у програмі потрібна невелика USB-бородавка, яка містить чіп, щоб вставити її в пристрій.

Питання не розкриває мотивацію, щоб так ревно захистити цю програму.

Якщо метою є підвищення безпеки способу оплати шляхом приховування будь-яких вад безпеки у додатку (відомому чи іншому), це абсолютно невірно. Насправді, чутливі до безпеки біти насправді мають бути відкритими джерелами, якщо це можливо. Ви повинні зробити це якомога простішим для будь-якого дослідника безпеки, який переглядає вашу програму, щоб знайти ці біти та ретельно вивчити їх роботу та зв’язатися з вами. Платіжні заяви не повинні містити вбудованих сертифікатів. Тобто не повинно бути серверних додатків, які довіряють пристрою, просто тому, що він має фіксований сертифікат від заводу. Платіжна трансакція повинна здійснюватися лише за допомогою облікових даних користувача, використовуючи правильно розроблений протокол автентифікації, який перешкоджає довірі програмі, платформі або мережі тощо.

Якщо метою є запобігання клонування, окрім цього чіпа, захищеного від несанкціонованого втручання, нічого не можна зробити, щоб захистити програму від реінжинірингу та копіювання, щоб хтось включив сумісний спосіб оплати у власну програму, надавши зростають до "несанкціонованих клієнтів". Існують способи ускладнити розвиток несанкціонованих клієнтів. Можна було б створити контрольні суми на основі знімків повного стану програми: для всіх змінних стану для всього. GUI, логіка, що завгодно. Програма клонування не матиме точно такого ж внутрішнього стану. Звичайно, це державна машина, яка має подібні зовні видимі переходи стану (як це можна спостерігати за входами та виходами), але навряд чи однаковий внутрішній стан. Серверна програма може опитувати програму: який ваш детальний стан? (тобто дайте мені контрольну суму на всі ваші внутрішні змінні стану). Це можна порівняти з фіктивним кодом клієнта, який виконується на сервері паралельно, проходячи переходи справжнього стану. Сторонній клон повинен буде повторити всі відповідні зміни стану справжньої програми, щоб дати правильні відповіді, які будуть гальмувати її розвиток.


7

Погоджено з @Muhammad Saqib тут: https://stackoverflow.com/a/46183706/2496464

І @Mumair дають хороші стартові кроки: https://stackoverflow.com/a/35411378/474330

Завжди безпечно вважати, що все, що ви поширюєте на пристрої свого користувача, належить користувачеві. Простий і простий. Можливо, ви зможете скористатись найновішими інструментами та процедурами для шифрування своїх інтелектуальних властивостей, але жодного способу не завадити рішучій людині «вивчати» вашу систему. І навіть якщо нинішня технологія може ускладнити їх отримання небажаного доступу, завтра може бути якийсь простий шлях, а то й просто наступна година!

Таким чином, тут виходить рівняння:

When it comes to money, we always assume that client is untrusted.

Навіть настільки ж просто, як ігрове господарство. (Особливо в іграх! Там є більш "складні" користувачі, і лазівки поширюються за секунди!)

Як ми залишаємося в безпеці?

Більшість, якщо не всі, наші ключові системи обробки (і база даних, звичайно), розташовані на стороні сервера. А між клієнтом і сервером лежать зашифровані комунікації, валідації тощо. Це ідея тонкого клієнта.



4

Схема підпису APK v2 в Android N

Клас PackageManager тепер підтримує перевірку програм за допомогою схеми підпису APK v2. Схема підпису APK v2 - це схема підпису з усіма файлами, яка значно покращує швидкість перевірки та посилює гарантії цілісності шляхом виявлення будь-яких несанкціонованих змін у файлах APK.

Щоб підтримувати сумісність із зворотним ходом, APK повинен бути підписаний із схемою підпису v1 (схема підпису JAR) перед тим, як підписатись із схемою підпису v2. За схемою підпису v2 перевірка не вдається, якщо ви підписуєте APK додатковим сертифікатом після підписання зі схемою v2.

Підтримка схеми підпису APK v2 буде доступна пізніше в Попередньому перегляді N Developer.

http://developer.android.com/preview/api-overview.html#apk_signature_v2


2
Apk підпис v2 лише запобігає підробці ресурсів, але не ускладнює зворотну інженерію…
Louis CAD

1
Крім того, ви можете просто видалити підпис і повторно підписати його. Підпис v2 - це лише блок даних у файлі APK.
Роберт

4

Немає можливості повністю уникнути зворотної інженерії APK. Для захисту активів, ресурсів програми можна використовувати шифрування.

  • Шифрування ускладнить його використання без розшифровки. Вибір сильного алгоритму шифрування зробить розтріскування складніше.
  • Додавання коду підробки в основну логіку, щоб зробити більш важкими для розтріскування.
  • Якщо ви можете написати свою критичну логіку будь-якою рідною мовою, що, безумовно, ускладнить декомпіляцію.
  • Використання будь-яких систем безпеки сторонніх організацій, таких як Quixxi

3

В основному це неможливо. Це ніколи не вдасться. Однак є надія. Ви можете скористатися обфускатором, щоб зробити деякі поширені атаки набагато важче здійснити, зокрема такі речі, як:

  1. Перейменування методів / класів (так що в декомпіляторі ви отримуєте такі типи a.a)
  2. Обмежуючий потік управління (тому в декомпіляторі код дуже важко читати)
  3. Шифрування рядків та, можливо, ресурсів

Я впевнений, що є й інші, але це головні. Я працюю в компанії під назвою PreEmptive Solutions на обметаторі .NET . У них також є обфускатор Java, який працює для Android, а також DashO .

Хоч затуманення завжди має ціну. Зокрема, продуктивність зазвичай гірша, і зазвичай потрібен додатковий час навколо випусків. Однак, якщо ваша інтелектуальна власність для вас надзвичайно важлива, то зазвичай цього варто.

В іншому випадку ваш єдиний вибір - зробити так, щоб ваша програма Android просто перейшла на сервер, на якому розміщена вся реальна логіка вашої програми. Це має свою частку проблем, оскільки це означає, що користувачі повинні бути підключені до Інтернету, щоб користуватися вашим додатком.

Крім того, це проблема не лише в Android. Це проблема у кожному магазині додатків. Це лише питання про те, наскільки складно дістатися до файлу пакету (наприклад, я не вважаю, що це дуже просто на iPhone, але це все-таки можливо).


На жаль, якщо хтось зламає клієнта (додаток), він зможе побачити формат спілкування та створити власний сервер :(
Jocky Doe

3

Неможливо повністю уникнути RE, але, ускладнивши їх всередині країни, ви ускладнюєте зловмисникам зрозуміти чітке функціонування програми, що може зменшити кількість векторів атаки.

Якщо програма обробляє високочутливі дані, існують різні методи, які можуть збільшити складність зворотної інженерії коду. Один з методів - використовувати C / C ++ для обмеження легких маніпуляцій під час виконання зловмисником. Існує достатньо бібліотек C і C ++, які дуже зрілі і легко інтегруються з Android пропозиціями JNI. Зловмисник повинен спочатку обійти обмеження налагодження, щоб атакувати програму на низькому рівні. Це додає додаткової складності атаці. Програми для Android повинні мати Android: debuggable = "false" у маніфесті програми, щоб запобігти легкому маніпулюванню часу зловмисником або зловмисним програмним забезпеченням.

Перевірка слідів - додаток може визначити, чи відстежується він на даний момент за допомогою налагоджувача чи іншого інструменту налагодження. Якщо відслідковується, програма може виконувати будь-яку кількість можливих дій реагування на атаку, наприклад, відкидання ключів шифрування для захисту даних користувачів, повідомлення адміністратора сервера або інші відповіді подібного типу в спробі захистити себе. Це можна визначити, перевіривши прапори статусу процесу або використовуючи інші методи, такі як порівняння повернутого значення вкладення ptrace, перевірка батьківського процесу, відладчики чорного списку у списку процесів або порівняння часових міток у різних місцях програми.

Оптимізація - щоб приховати розширені математичні обчислення та інші типи складної логіки, використання оптимізацій компілятора може допомогти збити об'єктний код таким чином, щоб його не було легко розібрати зловмисником, що ускладнить зловмиснику зрозуміти конкретний код. В Android цього можна легше досягти, використовуючи нативно складені бібліотеки з NDK. Крім того, використання Obfuscator LLVM або будь-якого SDK протектора забезпечить кращу обфузацію машинного коду.

Зачистка бінарних файлів - Зачистка нативної бінарних файлів - це ефективний спосіб збільшити кількість часу та рівня навичок, необхідних для зловмисника, щоб переглянути склад функції низького рівня вашої програми. Знімаючи бінарне, таблицю символів бінарного файлу знімають, щоб зловмисник не міг легко налагоджувати або реверсувати інженер-додаток. Ви можете посилатися на такі методи, які використовуються в системах GNU / Linux, як стриптиз або використання UPX.

І нарешті, ви повинні знати про затьмарення та такі засоби, як ProGuard.


3

Якщо ваш додаток такий чутливий, вам слід розглянути частину обробки платежів на стороні сервера. Спробуйте змінити алгоритми обробки платежів. Використовуйте додаток Android лише для збору та відображення інформації про користувачів (тобто баланс рахунку), а не для обробки платежів у кодах Java, надішліть це завдання на ваш сервер, використовуючи захищений протокол SSL із зашифрованими параметрами. Створіть повністю зашифрований та захищений API для спілкування з вашим сервером.

Звичайно, він також може бути зламаний, і він не має нічого спільного із захистом вихідних кодів, але вважайте, що це ще один рівень захисту, щоб хакерам було складніше обманювати вашу програму.


2

Чи не повинні чіпи TPM (модуль довіреної платформи) керувати захищеним кодом для вас? Вони стають поширеними на персональних комп'ютерах (особливо в Apple), і вони вже можуть існувати в сьогоднішніх мікросхемах смартфонів. На жаль, ще немає API OS, який би ним скористався. Сподіваємось, Android додасть підтримку цього дня. Це також ключ до очищення вмісту DRM (над яким Google працює для WebM).


2

Нічого не є безпечним, коли ви покладете його на руку кінцевим користувачам, але деякі звичні практики можуть зробити це зловмиснику складніше для крадіжки даних.

  • Покладіть свою основну логіку (алгоритми) на сторону сервера.
  • Спілкуватися з сервером та клієнтом; переконайтесь, що сервер і клієнт зв'язку захищені через SSL або HTTPS; або використовувати інші методи алгоритмів генерації пар ключів (ECC, RSA). Переконайтесь, що конфіденційна інформація залишається зашифрованою від кінця до кінця.
  • Використовуйте сеанси та закінчуйте їх через певний часовий інтервал.
  • Зашифруйте ресурси та вийміть їх із сервера на вимогу.
  • Або ви можете зробити програму Hybrid, яка отримує доступ до системи через webviewзахист ресурсу + код на сервері

Кілька підходів; це очевидно, що вам потрібно пожертвувати серед продуктивності та безпеки


2

Я бачу цю хорошу відповідь у цій темі. Крім того, ви можете використовувати facebook redexдля оптимізації коду. Redex працює на .dexрівні, де прогуар працює як .classрівень.


2

100% безпека вихідного коду та ресурсів в Android не можлива. Але, інженеру з реверсу ви можете трохи ускладнити. Більш детальну інформацію про це ви можете знайти за посиланнями нижче:

Відвідайте безпечне збереження постійних значень та https://www.agicent.com/blog/mobile-app-security-best-practices/


1

Як я можу захистити всі ресурси, активи та вихідний код програми, щоб хакери не могли зламати файл APK жодним чином?

Файл APK захищений алгоритмом SHA-1 . Ви можете побачити деякі файли в папці META-INF в APK. Якщо ви витягнете будь-який файл APK і зміните будь-який його вміст і знову зафіксуєте його, і коли ви запустите цей новий файл APK на машині Android, він не працюватиме, оскільки хеші SHA-1 ніколи не збігаються.


Це правда; але банально подати у відставку APK (з іншим сертифікатом), і все знову запрацює. Можна перевірити, який підпис використовувався для підпису APK зсередини самої програми та помилку, якщо сертифікат змінюється, але лише трохи менше тривіальним чином редагувати цей код із програми.
Девід Даний

Це може завадити пристрою Android працювати з модифікованим кодом, але ви все одно можете легко витягти відповідний код і написати новий код на ПК, який виконує те, що ви хочете.
Сарел Бота


1

Інструмент: Використовуючи Proguard у вашій програмі, це може бути обмежено зворотною розробкою вашої програми


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.