Имеем следующий код.
Это скрипт квеста Ла2 на ява.
Исходный код был обработан обсфукатором который заменяет имена классов и методов на абстрактные А,B,C но не все.
Строковые перменные шифруются.
package quests._001_LettersOfLove;
import java.io.PrintStream;
import ru.l2f.extensions.scripts.ScriptFile;
import ru.l2f.gameserver.model.L2Player;
import ru.l2f.gameserver.model.instances.L2NpcInstance;
import ru.l2f.gameserver.model.quest.Quest;
import ru.l2f.gameserver.model.quest.QuestState;
public class _001_LettersOfLove extends Quest
implements ScriptFile
{
public void onLoad()
{
System.out.println(z[4]);
}
public void onReload()
{
}
public void onShutdown()
{
}
public _001_LettersOfLove()
{
super(1, z[1], z[0], false);
addStartNpc(30048);
addTalkId(30006);
addTalkId(30033);
addQuestItem(687);
addQuestItem(688);
addQuestItem(1079);
addQuestItem(1080);
}
public String onEvent(String s, QuestState queststate)
{
if(s.equalsIgnoreCase(z[3]))
{
queststate.set(z[2], "1");
queststate.setState(_fld0402);
queststate.giveItems(687, 1L, false);
queststate.playSound(SOUND_ACCEPT);
}
return s;
}
public String onTalk(L2NpcInstance l2npcinstance, QuestState queststate)
{
String s = z[16];
int i = l2npcinstance.getNpcId();
int j = queststate.getInt(z[2]);
switch(i)
{
default:
break;
case 30048:
if(j == 0)
{
if(queststate.getPlayer().getLevel() >= 2)
{
s = z[5];
} else
{
s = z[15];
queststate.exitCurrentQuest(true);
}
break;
}
if(j == 1)
{
s = z[8];
break;
}
if(j == 2 && queststate.getQuestItemsCount(688) == 1L)
{
s = z[14];
queststate.takeItems(688, -1L);
queststate.giveItems(1079, 1L, false);
queststate.set(z[2], "3");
queststate.playSound(SOUND_MIDDLE);
break;
}
if(j == 3)
{
s = z[10];
break;
}
if(j == 4 && queststate.getQuestItemsCount(1080) == 1L)
{
s = z[12];
queststate.takeItems(1080, -1L);
queststate.giveItems(906, 1L, false);
queststate.unset(z[2]);
queststate.playSound(SOUND_FINISH);
queststate.exitCurrentQuest(false);
}
break;
case 30006:
if(j == 1 && queststate.getQuestItemsCount(688) == 0L && queststate.getQuestItemsCount(687) > 0L)
{
s = z[6];
queststate.takeItems(687, -1L);
queststate.giveItems(688, 1L, false);
queststate.set(z[2], "2");
queststate.playSound(SOUND_MIDDLE);
break;
}
if(j == 2 && queststate.getQuestItemsCount(688) > 0L)
{
s = z[9];
break;
}
if(j > 2 && (queststate.getQuestItemsCount(1080) > 0L || queststate.getQuestItemsCount(1079) > 0L))
s = z[13];
break;
case 30033:
if(j == 3 && queststate.getQuestItemsCount(1079) == 1L)
{
s = z[7];
queststate.takeItems(1079, -1L);
queststate.giveItems(1080, 1L, false);
queststate.set(z[2], "4");
queststate.playSound(SOUND_MIDDLE);
break;
}
if(j == 4)
s = z[11];
break;
}
return s;
}
public final int DARIN = 30048;
public final int ROXXY = 30006;
public final int BAULRO = 30033;
public final short DARINGS_LETTER = 687;
public final short RAPUNZELS_KERCHIEF = 688;
public final short DARINGS_RECEIPT = 1079;
public final short BAULS_POTION = 1080;
public final short NECKLACE = 906;
private static final String z[];
static
{
String as[];
as = new String[17];
as[0] = "WW(\034\036iA|\007\035;~3\036\036";
as[1] = "D\002lY$WW(\034\036iA\023\0167tD9";
as[2] = "x]2\f";
as[3] = "(\002l\\C6\002jF\023o_";
as[4] = "W]=\f\036\177\022\r\035\036hFfHK+\003fH7~F(\r\th\0223\016[W]*\r";
as[5] = "(\002l\\C6\002nF\023o_";
as[6] = "(\002lXM6\002mF\023o_";
as[7] = "(\002l[H6\002mF\023o_";
as[8] = "(\002l\\C6\002kF\023o_";
as[9] = "(\002lXM6\002nF\023o_";
as[10] = "(\002l\\C6\002eF\023o_";
as[11] = "(\002l[H6\002nF\023o_";
as[12] = "(\002l\\C6\003lF\023o_";
as[13] = "(\002lXM6\002oF\023o_";
as[14] = "(\002l\\C6\002dF\023o_";
as[15] = "(\002l\\C6\002lF\023o_";
as[16] = "u]-\035\036hF";
z = as;
break MISSING_BLOCK_LABEL_257;
local;
toCharArray();
JVM INSTR dup ;
JVM INSTR arraylength .length;
JVM INSTR swap ;
int i = 0;
goto _L1
_L3:
JVM INSTR dup ;
i;
JVM INSTR dup2 ;
JVM INSTR caload ;
byte byte0;
switch(i % 5)
{
case 0: // '\0'
byte0 = 0x1b;
break;
case 1: // '\001'
byte0 = 50;
break;
case 2: // '\002'
byte0 = 92;
break;
case 3: // '\003'
byte0 = 104;
break;
default:
byte0 = 123;
break;
}
byte0;
JVM INSTR ixor ;
(char);
JVM INSTR castore ;
i++;
_L1:
JVM INSTR swap ;
JVM INSTR dup_x1 ;
i;
JVM INSTR icmpgt 170;
goto _L2 _L3
_L2:
JVM INSTR new #123 <Class String>;
JVM INSTR dup_x1 ;
JVM INSTR swap ;
String();
intern();
JVM INSTR swap ;
JVM INSTR pop ;
JVM INSTR ret 0;
}
}
как я понял при шифровании строковых переменных они заменяются на элементы массива строк (z) а сами строковые переменные шифруются и заносятся в мвссив (as) При загрузке класса элемты массива (as) расшифровываются и присваиваются создаваемому массиву строк (Z)
В общем надо как то их расшифровать. В принципе анализируя код можно и самому догадаться что именно зашифровано потому что в основном это имена файлов в каталоге одноименном с классом который зашифрован.
данный код получен декомпиляцией jad'ом к сожалению шифрование переменных приводит к большой задержке по переосу квеста на сборку сервера скомпилированную без шифрования.
последнии строки кода я так понимю команды JVM для расшифровки строк при загрузке класса.
так вот суть вопроса можно ли каким либо образом расшифровать зачения элемтов массива (as)?