package crypt.helpers;
/**
* Author: VISTALL
* Company: J Develop Station
* Date: 19:23 07/12/2009
*/
public class Obfuscator
{
private boolean _isEnable;
private int _seed;
private int _firstSize;
private int _secondSize;
//private int _thirdSize;
private int[] _decodeTable1;
private int[] _decodeTable2;
//private int[] _decodeTable3;
public Obfuscator()
{
disable();
}
public void disable()
{
_isEnable = false;
_seed = 0;
_firstSize = (_secondSize = 0);
_decodeTable1 = (_decodeTable2 = null);
}
public void init_tables(int seed)
{
int i = 0;
int j = 0;
int k = 0;
int l = 0;
_firstSize = 0xd0; //длина первых опкодов
_secondSize = 0xBF; //длина вторых опкодов
// _thirdSize = 0x06; //длина треьих опкодов
_decodeTable1 = new int[_firstSize + 1];
_decodeTable2 = new int[_secondSize + 1];
// _decodeTable3 = new int[_thirdSize + 1];
for (i = 0; i <= _firstSize; ++i)
{
_decodeTable1[i] = i;
}
for (i = 0; i <= _secondSize; ++i)
{
_decodeTable2[i] = i;
}
/* for (i = 0; i <= _thirdSize; ++i)
{
_decodeTable3[i] = i;
} */
pseudo_rand_seed(seed);
for (i = 1; i <= _firstSize; ++i)
{
k = pseudo_rand() % (i + 1);
j = _decodeTable1[k];
_decodeTable1[k] = _decodeTable1[i];
_decodeTable1[i] = j;
}
for (i = 1; i <= _secondSize; ++i)
{
k = pseudo_rand() % (i + 1);
j = _decodeTable2[k];
_decodeTable2[k] = _decodeTable2[i];
_decodeTable2[i] = j;
}
/* for (i = 1; i <= _thirdSize; ++i)
{
k = pseudo_rand() % (i + 1);
j = _decodeTable3[k];
_decodeTable3[k] = _decodeTable3[i];
_decodeTable3[i] = j;
} */
//replace(0x12);
//replace(0xb1);
replace((byte)0x11);
_isEnable = true;
}
private void replace(byte val)
{
int i;
int j;
boolean flag = false;
for (i = 0; i < _decodeTable1.length; i++)
{
if(_decodeTable1[i] == val)
{
flag = true;
break;
}
}
if(!flag)
{
System.out.println("not found " + Integer.toHexString(val));
return;
}
j = _decodeTable1[val];
_decodeTable1[val] = val;
_decodeTable1[i] = j;
}
public int decodeSingleOpcode(int id)
{
if (!_isEnable)
{
return id;
}
if (id > _firstSize)
{
return id;
}
return _decodeTable1[id];
}
public int decodeDoubleOpcode(int id)
{
if (!_isEnable)
{
return id;
}
if (id > _secondSize)
{
return id;
}
return _decodeTable2[id];
}
/* public int decodeTripleOpcode(int id)
{
if (!_isEnable)
{
return id;
}
if (id > _thirdSize)
{
return id;
}
id = _decodeTable3[id];
return id;
} */
private void pseudo_rand_seed(int id)
{
_seed = id;
}
private int pseudo_rand()
{
_seed = _seed * 214013 + 2531011;
return _seed >> 16 & 0x7FFF;
}
}