2012-01-03 13 views
1

ImはJavaコードのリバースエンジニアリングを固執しました。私は誰かが私を助けることができるかどうか疑問に思っていた!アルゴリズムをリバースエンジニアリングするのに役立つ必要があります

String var1 = "hello"; 
String var2 = "123456"; 

long var_l = 0L; 
byte[] a1 = new byte[50]; 
byte[] a2 = new byte[50]; 

// i believe this checks if its between a-Z? 
for (int j = 0; j < var1.length(); j++) 
{ 
    a2[j] = (byte) var1.charAt(j); 

    if ((a2[j] < 65) || (a2[j] > 122) 
    { 
     continue; 
    } 

    var_l += 145 + a2[j]; 
} 

私は本当に

var_l *= a1[0]; // a1 is a byte array of var2 
var_l = 0xFFFF & var_l * (0xFF & var_l); 

if (var_l < 100L) 
{ 
    var_l = 2728L; 
} 

を理解しない次の部分は、誰かがここに私を助けていただけますか?私はここでサイファーアルゴリズムを学ぼうとしていますが、ロジックに続く問題があります。 & licensename & lictypeがグローバルVARSある

param_licensekey:

はここで完全なコードです。なぜ私はこれをリバースエンジニアリングする理由について私のコメントをお読みください。すべてのお姉さんに感謝します。参考のため

public boolean check_license() 
    { 
    long l = 0L; 
    byte[] arrayOfByte2 = new byte['ÿ']; 
    byte[] arrayOfByte1 = new byte['ÿ']; 
    int i; 
    if (this.param_licensename.length() >= 2) 
    { 
     if (this.param_licensekey.length() >= 2) 
     { 
     for (int j = 0; j < this.param_licensekey.length(); j++) 
      arrayOfByte1[j] = (byte)this.param_licensekey.charAt(j); 
     for (j = 0; j < this.param_licensename.length(); j++) 
     { 
      arrayOfByte2[j] = (byte)this.param_licensename.charAt(j); 
      if ((this.param_licensename.charAt(j) < 'A') || (this.param_licensename.charAt(j) > 'Z')) 
      continue; 
      arrayOfByte2[j] = (byte)(32 + arrayOfByte2[j]); 
     } 
     for (j = 0; j < this.param_licensename.length(); j++) 
     { 
      if ((arrayOfByte2[j] < 65) || (arrayOfByte2[j] > 122)) 
      continue; 
      l += 145 + arrayOfByte2[j]; 
     } 
     l *= arrayOfByte1[0]; 
     l = 0xFFFF & l * (0xFF & l); 
     if (l < 100L) 
      l = 2728L; 
     String str = this.param_licensekey.charAt(0) + l; 
     if (!this.param_licensekey.startsWith(str)) 
     { 
      this.lictype = -1; 
      i = 0; 
     } 
     else 
     { 
      this.lictype = (i[0] - 48); 
      i = 1; 
     } 
     } 
     else 
     { 
     i = 0; 
     } 
    } 
    else 
     i = 0; 
    return i; 
    } 
+0

、これはJavaでC'ishコードを書くしようとしている誰かの作品のように見えます。 – cHao

+0

デコンパイラーの結果でもあります。 – rfeak

+0

このコードのように、逆コンパイラは配列を任意に使用できないようです。たとえその物がインラインになっていても、それはまだかなり伸びているだろう。 – cHao

答えて

1
// var_l = var_l * a1[0] 
var_l *= a1[0]; // a1 is a byte array of var2 

// The low 16 bits of var_l are multipled by the low 8 bits of var_l (the parenthesis 
// are not necessary in this case). 
var_l = 0xFFFF & var_l * (0xFF & var_l); 

// Self explanatory 
if (var_l < 100L) { 
var_l = 2728L; 
} 
+0

"自明の"部分はまだ少し面白いです。 2728Lのハードコードは、ある種のビットマスクかもしれません。バイナリでは101010101000です。これはビットのパターンのパターンになります。 var_1がこれの下流でどのように使用されているかを知ることは興味深いでしょう。 – rfeak