Здравствуйте, взял триал такого продукта как "Stringer Java Obfuscator", но теперь битый час пытаюсь использовать его плагин stringer-gradle-plugin.jar чтобы создавать защищенные приложения в Android Stuio, русскоязычной документации именно по stringer-gradle-plugin.jar НЕТ, а в английской на этот счет все как-то абстрактно. Может кто то сталкивался, подскажите как правильно подключить Stringer Java Obfuscator чтобы приложения компилировались уже обсуфицированные.
Ссылка на это чудо Stringer Java Obfuscator
Насколько я помню, то вы должны уже скомпилированное приложение загрузить в интерфейс обфускатора и запустить обфускацию. Также описаны способы обфускации в этом разделе - https://jfxstore.com/stringer/ru/docs#console_and_gui_install .И да, он бесполезен, ключь и хеш лежат в сгенерированных файлах, достать и запустить обратный процесс не составляет труда
->
Пример ключей
public long keyP0; //= -7419641886780833564L;
public byte[] keyP1;// = new byte[]{-80, 100, 14, 109, 115, -3, 66, -119};
public int[] keyP2; //= new int[]{950288844, 1005004556, 847874850, -546161312};
private static final int \u6492(int n, int n2)
private static final int \u796d(byte[] arrby, int n)
private static final byte[] \u7e19(long l) // longToByteArray
private static final long \u5ca2(long l) // long l2 = -1250128675298129261L; остальное мусор
private static final long \uc224() // мусор
private static final void \u8161() // создание ключа
static final String \u3e33(String object) // декрипт
/*
* Decompiled with CFR 0_102.
*/
package services.lineage;
public class BootManager$0 {
private static Object[] \u4bcd;
/*
* Enabled aggressive block sorting
* Enabled unnecessary exception pruning
*/
private static final int \u6492(int n, int n2) {
int n3 = 0;
int n4 = n;
int n5 = n2;
int n6 = n5 + n4 >> 24;
n3 = 0;
if (n3 == 0) {
n3 = 3;
return n >>> n2 | n << - n2;
}
Object var1_2 = null;
n3 = 0;
if (n3 != 0) return n5;
++n3;
return n4 + n6;
}
/*
* Enabled aggressive block sorting
* Enabled unnecessary exception pruning
*/
private static final int \u796d(byte[] arrby, int n) {
int n2 = 0;
int n3 = arrby[14] << 16;
n2 = 0;
if (n2 == 0) {
n2 = 3;
return arrby[n & 255] & 255 | (arrby[n >> 8 & 255] & 255) << 8 | (arrby[n >> 16 & 255] & 255) << 16 | arrby[n >> 24 & 255] << 24;
}
Object var3_4 = null;
n2 = 0;
if (n2 != 0) return n3;
n2 = 2;
return arrby[n & 127] >> 8;
}
private static final byte[] \u7e19(long l) {
return new byte[]{(byte)(l >> 56 & 255), (byte)(l >> 48 & 255), (byte)(l >> 40 & 255), (byte)(l >> 32 & 255), (byte)(l >> 24 & 255), (byte)(l >> 16 & 255), (byte)(l >> 8 & 255), (byte)(l & 255)};
}
/*
* Enabled aggressive block sorting
* Enabled unnecessary exception pruning
*/
private static final long \u5ca2(long l) {
int n = 0;
long l2 = -1250128675298129261L;
long l3 = l2 + l >> 24;
n = 0;
if (n == 0) {
n = 1;
l3 = l2 + l + l3 >> 24;
return l2;
}
Object var6_4 = null;
n = 0;
if (n != 0) return l2;
++n;
return l + l3;
}
private static final long \uc224() {
return 4927734936748677948L;
}
/*
* WARNING - Removed back jump from a try to a catch block - possible behaviour change.
* Unable to fully structure code
* Enabled aggressive block sorting
* Enabled unnecessary exception pruning
* Lifted jumps to return sites
*/
private static final void \u8161() {
var15 = 0;
var16_1 = 0;
var0_2 = new int[256];
var1_4 = new byte[256];
var2_5 = new int[256];
var3_6 = new int[256];
var4_7 = new int[256];
var5_8 = new int[256];
var6_9 = new int[30];
var7_10 = Long.MAX_VALUE;
var10_12 = 1;
for (var9_11 = 0; var9_11 < 256; var10_12^=var10_12 << 1 ^ (var10_12 >>> 7) * 283, ++var9_11) {
var0_2[var9_11] = var10_12;
}
var1_4[0] = 99;
var15 = 0;
if (var15 == 0) {
var15 = 1;
for (var10_12 = 0; var10_12 < 255; ++var10_12) {
v0 = var0_2[255 - var10_12];
var9_11 = v0 | v0 << 8;
var1_4[var0_2[var10_12]] = (byte)(var9_11 ^ (var9_11 >> 4 ^ var9_11 >> 5 ^ var9_11 >> 6 ^ var9_11 >> 7) ^ 99);
}
for (var9_11 = 0; var9_11 < 256; ++var9_11) {
var11_19 = var1_4[var9_11] & 255;
var10_12 = var11_19 << 1 ^ (var11_19 >>> 7) * 283;
var2_5[var9_11] = var11_19 = ((var11_19 ^ var10_12) << 24 ^ var11_19 << 16 ^ var11_19 << 8 ^ var10_12) & -1;
var3_6[var9_11] = var11_19 << 8 | var11_19 >>> -8;
var4_7[var9_11] = var11_19 << 16 | var11_19 >>> -16;
var5_8[var9_11] = var11_19 << 24 | var11_19 >>> -24;
}
var10_12 = 1;
for (var11_19 = 0; var11_19 < 30; ++var11_19) {
var6_9[var11_19] = var10_12;
var10_12 = var10_12 << 1 ^ (var10_12 >>> 7) * 283;
}
} else {
var11_20 = null;
}
var11_22 = new byte[16];
var15 = 0;
if (var15 == 0) {
var15 = 1;
System.arraycopy(BootManager$0.\u7e19(BootManager$0.\u5ca2(BootManager$0.\uc224()) ^ var7_10 - System.currentTimeMillis() >> 63 & 1), 0, var11_22, 0, 8);
var11_22[8] = 68;
var11_22[9] = 98;
var11_22[10] = -44;
var11_22[11] = -47;
var11_22[12] = 20;
var11_22[13] = 47;
var11_22[14] = -37;
var11_22[15] = 60;
} else {
var10_13 = null;
var11_22[8] = 68;
var11_22[9] = 98;
var11_22[10] = -44;
var11_22[11] = -47;
var11_22[12] = 20;
var11_22[13] = 47;
var11_22[14] = -37;
var11_22[15] = 60;
}
var9_11 = 4;
{
catch (Throwable var10_14) {}
{
var10_15 = var10_14;
var11_22[8] = 68;
var11_22[9] = 98;
var11_22[10] = -44;
var11_22[11] = -47;
var11_22[12] = 20;
var11_22[13] = 47;
var11_22[14] = -37;
var11_22[15] = 60;
}
throw var10_15;
}
var0_3 = var9_11 + 6;
var12_23 = new int[(var0_3 + 1) * 4];
var16_1 = 0;
if (var16_1 != 0) ** GOTO lbl84
++var16_1;
var13_24 = 0;
var10_16 = 0;
** GOTO lbl91
lbl84: // 1 sources:
var14_27 = null;
** GOTO lbl103
lbl-1000: // 1 sources:
{
var15 = 2;
if (var10_16 < 16) {
var12_23[(var13_24 >> 2) * 4 + var13_24 & 3] = var11_22[var10_16] & 255 | (var11_22[var10_16 + 1] & 255) << 8 | (var11_22[var10_16 + 2] & 255) << 16 | var11_22[var10_16 + 3] << 24;
var10_16+=4;
++var13_24;
} else {
** GOTO lbl93
}
lbl91: // 2 sources:
** while ((var15 = 0) == 0)
}
lbl92: // 1 sources:
var10_17 = null;
lbl93: // 3 sources:
var13_24 = var0_3 + 1 << 2;
for (var14_26 = var9_11; var14_26 < var13_24; ++var14_26) {
var10_18 = var12_23[(var14_26 - 1 >> 2) * 4 + (var14_26 - 1 & 3)];
if (var14_26 % var9_11 == 0) {
var10_18 = BootManager$0.\u796d(var1_4, BootManager$0.\u6492(var10_18, 8)) ^ var6_9[var14_26 / var9_11 - 1];
} else if (var9_11 > 6 && var14_26 % var9_11 == 4) {
var10_18 = BootManager$0.\u796d(var1_4, var10_18);
}
var12_23[(var14_26 >> 2) * 4 + (var14_26 & 3)] = var12_23[(var14_26 - var9_11 >> 2) * 4 + (var14_26 - var9_11 & 3)] ^ var10_18;
}
lbl103: // 2 sources:
var14_28 = new int[]{-2074560752, 431123582, -569586100, -2072898572};
var13_25 = new Object[]{var1_4, var2_5, var3_6, var4_7, var5_8, var12_23, var14_28};
BootManager$0.\u4bcd = var13_25;
}
/*
* Enabled aggressive block sorting
* Enabled unnecessary exception pruning
*/
static final String \u3e33(String object) {
int n = 0;
int n2 = 0;
if (\u4bcd == null) {
BootManager$0.\u8161();
}
int[] arrn = (int[])\u4bcd[6];
int n3 = arrn[0];
int n4 = arrn[1];
int n5 = arrn[2];
int n6 = arrn[3];
int[] arrn2 = (int[])\u4bcd[5];
int[] arrn3 = (int[])\u4bcd[1];
int[] arrn4 = (int[])\u4bcd[2];
int[] arrn5 = (int[])\u4bcd[3];
int[] arrn6 = (int[])\u4bcd[4];
byte[] arrby = (byte[])\u4bcd[0];
object = object.toCharArray();
n2 = 0;
if (n2 != 0) {
return new String((char[])object);
}
n2+=2;
int n7 = object.length;
for (int i = 0; i < n7; ++i) {
if (i % 8 == 0) {
int n8;
int n9;
int n10;
int n11 = 0;
n11 = 0;
n11 = 0;
n11 = 0;
int n12 = n3 ^ arrn2[0];
int n13 = n4 ^ arrn2[1];
int n14 = n5 ^ arrn2[2];
int n15 = n6 ^ arrn2[3];
for (n11 = 4; n11 < 36; n11+=4) {
n10 = arrn3[n12 & 255] ^ arrn4[n13 >> 8 & 255] ^ arrn5[n14 >> 16 & 255] ^ arrn6[n15 >>> 24] ^ arrn2[n11];
n9 = arrn3[n13 & 255] ^ arrn4[n14 >> 8 & 255] ^ arrn5[n15 >> 16 & 255] ^ arrn6[n12 >>> 24] ^ arrn2[n11 + 1];
n8 = arrn3[n14 & 255] ^ arrn4[n15 >> 8 & 255] ^ arrn5[n12 >> 16 & 255] ^ arrn6[n13 >>> 24] ^ arrn2[n11 + 2];
n15 = arrn3[n15 & 255] ^ arrn4[n12 >> 8 & 255] ^ arrn5[n13 >> 16 & 255] ^ arrn6[n14 >>> 24] ^ arrn2[n11 + 3];
n12 = arrn3[n10 & 255] ^ arrn4[n9 >> 8 & 255] ^ arrn5[n8 >> 16 & 255] ^ arrn6[n15 >>> 24] ^ arrn2[n11+=4];
n13 = arrn3[n9 & 255] ^ arrn4[n8 >> 8 & 255] ^ arrn5[n15 >> 16 & 255] ^ arrn6[n10 >>> 24] ^ arrn2[n11 + 1];
n14 = arrn3[n8 & 255] ^ arrn4[n15 >> 8 & 255] ^ arrn5[n10 >> 16 & 255] ^ arrn6[n9 >>> 24] ^ arrn2[n11 + 2];
n15 = arrn3[n15 & 255] ^ arrn4[n10 >> 8 & 255] ^ arrn5[n9 >> 16 & 255] ^ arrn6[n8 >>> 24] ^ arrn2[n11 + 3];
}
n8 = arrn3[n12 & 255] ^ arrn4[n13 >> 8 & 255] ^ arrn5[n14 >> 16 & 255] ^ arrn6[n15 >>> 24] ^ arrn2[n11];
n9 = arrn3[n13 & 255] ^ arrn4[n14 >> 8 & 255] ^ arrn5[n15 >> 16 & 255] ^ arrn6[n12 >>> 24] ^ arrn2[n11 + 1];
n10 = arrn3[n14 & 255] ^ arrn4[n15 >> 8 & 255] ^ arrn5[n12 >> 16 & 255] ^ arrn6[n13 >>> 24] ^ arrn2[n11 + 2];
n15 = arrn3[n15 & 255] ^ arrn4[n12 >> 8 & 255] ^ arrn5[n13 >> 16 & 255] ^ arrn6[n14 >>> 24] ^ arrn2[n11 + 3];
n14 = n11 + 4;
n3 = arrby[n8 & 255] & 255 ^ (arrby[n9 >> 8 & 255] & 255) << 8 ^ (arrby[n10 >> 16 & 255] & 255) << 16 ^ arrby[n15 >>> 24] << 24 ^ arrn2[n14 + 0];
n4 = arrby[n9 & 255] & 255 ^ (arrby[n10 >> 8 & 255] & 255) << 8 ^ (arrby[n15 >> 16 & 255] & 255) << 16 ^ arrby[n8 >>> 24] << 24 ^ arrn2[n14 + 1];
n5 = arrby[n10 & 255] & 255 ^ (arrby[n15 >> 8 & 255] & 255) << 8 ^ (arrby[n8 >> 16 & 255] & 255) << 16 ^ arrby[n9 >>> 24] << 24 ^ arrn2[n14 + 2];
n6 = arrby[n15 & 255] & 255 ^ (arrby[n8 >> 8 & 255] & 255) << 8 ^ (arrby[n9 >> 16 & 255] & 255) << 16 ^ arrby[n10 >>> 24] << 24 ^ arrn2[n14 + 3];
}
if ((n = 0) == 0) {
n = 2;
switch (i % 8) {
case 0: {
object[i] = (char)(n3 >> 16 ^ object[i]);
break;
}
case 1: {
object[i] = (char)(n3 ^ object[i]);
break;
}
case 2: {
object[i] = (char)(n4 >> 16 ^ object[i]);
break;
}
case 3: {
object[i] = (char)(n4 ^ object[i]);
break;
}
case 4: {
object[i] = (char)(n5 >> 16 ^ object[i]);
break;
}
case 5: {
object[i] = (char)(n5 ^ object[i]);
break;
}
case 6: {
object[i] = (char)(n6 >> 16 ^ object[i]);
break;
}
case 7: {
object[i] = (char)(n6 ^ object[i]);
}
}
continue;
}
Object var13_17 = null;
}
return new String((char[])object);
}
}
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Мне в приложении нужно динамически переводить текст с английского на русский, почитала, что есть Google Translate API, но он платный, есть какие-то...
В качестве нового опыта есть идея создать приложение на JAVA ( в планах простой чат с сервером и БД) чтобы там использовалось следующее: