Babusha
Модератор
Зарегистрирован: 07.10.2012
Сообщений: 483
Дано: приложение TuneLab 1.1 для настройки пианино. http://www.tunelab-world.com/atl.html - качать тут.
В маркете его нет.
Цели: декомпилировать до читаемой жавы (сделано), убрать окошко лицензии при настройке 14 нот, убрать проверку лицензии, написать кейген.
Делается это не с целью экономии и воровства, а для изучения разбирания и копошения в уже написанных программ. Это первый мой опыт, по этому, прошу помощи в богов реверс-инжиниринга и взлома. По этому, в качестве обучения поставил перед собой задачи выше.

Оплата происходит следующим образом:
Initially TuneLab Piano Tuner runs in free-trial mode. In this mode it has all the functions and abilities as the paid mode. But it will display a message about free-trial mode for two minutes every 14 notes. This is the only restriction in free-trial mode. In order to eliminate these messages and pauses you can license your Android device for $300 USD.

Within TuneLab go to Settings / Licensing and follow the instructions to send us the device ID of your Android device. Your license number will be keyed to this ID.

After sending us your device ID, go to www.tunelab-world.com/orders and make arrangements for payment. You can use VISA or Mastercard.

When we receive payment we will send you by e-mail a license number that was keyed to your device. Although the license number only works on one device, if you need to change devices and need the license to be transferred to the new device just contact us and we will help you do that.

Разобрал до smali http://ge.tt/5x9uOCY/v/0 с помощью APK Tools
Вот декомпилированный класс EnterLicense.java - http://pastebin.com/ZT6TGKiD
cпойлер


private DialogInterface.OnDismissListener d;

void a(String paramString1, String paramString2)
{
AlertDialog localAlertDialog = new AlertDialog.Builder(this).create();
localAlertDialog.setTitle(paramString1);
localAlertDialog.setMessage(paramString2);
localAlertDialog.setButton(-1, "OK", null);
if (paramString1.equals("Success"))
localAlertDialog.setOnDismissListener(this.d);
localAlertDialog.show();
}

public void onCreate(Bundle paramBundle)
{
super.onCreate(paramBundle);
setContentView(2130903060);
this.a = ((EditText)findViewById(2131099721));
this.d = new t(this);
}

public void onSaveButton(View paramView)
{
Editable localEditable = this.a.getText();
int i = localEditable.length();
int j = 0;
long l1 = 0L;
long l2 = 0L;
int k = 0;
if (k >= i)
{
if (j != 20)
a("Invalid Entry", "License number must consist of exactly 20 digits.");
}
else
{
int m = localEditable.charAt(k);
int n;
if ((48 <= m) && (m <= 57))
{
n = m - 48;
if (j >= 10)
break label108;
l1 = l1 * 10L + n;
}
while (true)
{
j++;
k++;
break;
label108: l2 = l2 * 10L + n;
}
}
this.c.a = l1;
this.c.b = l2;
int i1 = 0;
if (i1 >= 11)
{
this.c.a = 0L;
this.c.b = 0L;
}
for (int i3 = 0; ; i3++)
{
if (i3 >= 11)
{
if (AndroidID.a().a == this.c.a)
break label254;
a("Invalid Entry", "License number entered is not correct for this device. Be sure all 20 digits are entered correctly.");
return;
int i2 = this.c.a();
Main.c.CPcomm(i1 + 11, i2);
i1++;
break;
}
this.c.a(Main.c.CPcomm(i3, 0));
}
label254: SharedPreferences.Editor localEditor = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit();
localEditor.putLong("Oct2", l1);
localEditor.putLong("Oct3", l2);
localEditor.commit();
setResult(-1);
a("Success", "License number is good. Licensing complete.");
}
}


Как видно из исходника, программа за ключем не бьется в интернет, а проверяет его на правильность прям в программе. Первое что мог сделать - обход всего этого счастья с помощью goto, что уже сделано и работает.

cпойлер
/forumlinexp/Files/0b6ed3e3-f564-4e06-abac-ed9003c9abbd.jpg



Вот теперь самое интересное, что надо сделать, чтобы разобрать, как работает алгоритм проверки ключа

Комментарии3

0 0

SemyonKozakov
Пользователь
Зарегистрирован: 07.10.2012
Сообщений: 77
Вот теперь самое интересное, что надо сделать, чтобы разобрать, как работает алгоритм проверки ключа
Брать и разбирать, он целиком в функции onSave. Правда, код выходит какой-то бредовый, ты точно его целиком и без изменений скопировал

0 0

MOP3E
Золотой пользователь
Зарегистрирован: 11.01.2013
Сообщений: 1335
Вот теперь самое интересное, что надо сделать, чтобы разобрать, как работает алгоритм проверки ключа
Как-как - жопой об косяк!
Открываешь в одном окне блокнот/ворд/любой другой текстовый редактор, в другом окне - этот код и начинаешь шаг за шагом писать по этому коду текстовый алгоритм. Потом пытаешься разобраться в этом алгоритме, переписываешь его заново. И так по кругу. Пока не заебёт или пока не победишь.

-1 0

Babusha
Модератор
Зарегистрирован: 07.10.2012
Сообщений: 483
А есть более рациональный математический способ
-- Вера - шедевр воплощения Дьявола.