吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7225|回复: 4
收起左侧

[Android 原创] 有关几个crackme破解和算法的分析

[复制链接]
taintitly 发表于 2014-8-6 17:39
本帖最后由 淡然出尘 于 2015-2-3 18:43 编辑

我读书少,大家不要骗我,看看就好。求大牛轻虐。
http://www.52pojie.cn/thread-232658-1-1.html
crackme 包在这个帖子里有

Crackme02破解教程
首先解压apk得到dex,再用dex2jar转成jar.jd-gui.exe打开jar.查看算法:

private boolean checkSN(StringparamString1, String paramString2)//用户名,输入的注册码
  {
   if (paramString1 != null)
     try
     {
       if (paramString1.length() == 0)
         return false;  //如果用户名长度为0,返回false
       if ((paramString2 != null) && (paramString2.length() == 16))//如果注册码不为空,且长度为16则进行下一步
       {
         MessageDigest localMessageDigest =MessageDigest.getInstance("MD5");//MD5加密
         localMessageDigest.reset();
         localMessageDigest.update(paramString1.getBytes());
         String str = toHexString(localMessageDigest.digest(), "");//字符串处理
         StringBuilder localStringBuilder = new StringBuilder();
         for (int i = 0; ; i += 2)//此函数作用是取32MD5中的16单数字符组成注册码
         {
           if (i >= str.length())
           {
              if(!localStringBuilder.toString().equalsIgnoreCase(paramString2))
               break;
              return true;
           }
           localStringBuilder.append(str.charAt(i));
         }
       }
     }
     catch (NoSuchAlgorithmException localNoSuchAlgorithmException)
     {
       localNoSuchAlgorithmException.printStackTrace();
     }
   return false;
  }

private static String toHexString(byte[] paramArrayOfByte, StringparamString)
  {
   StringBuilder localStringBuilder = new StringBuilder();
   int i = paramArrayOfByte.length;
   for (int j = 0; ; j++)
    {
     if (j >= i)
       return localStringBuilder.toString();
     String str = Integer.toHexString(0xFF & paramArrayOfByte[j]);
     if (str.length() == 1)
       localStringBuilder.append('0');
     localStringBuilder.append(str).append(paramString);
    }
  }


利用vb6.0还原算法:
Private Sub Command1_Click()
Dim pin As String
Dim key As String
Dim i As Integer
pin = Text1.Text
pin = DigestStrToHexStr(pin)
For i = 1 To 32 Step 2
key = key + Mid(pin, i, 1)
Next i
Text2.Text = key
End Sub

注册机效果:
1.png

=====================================================================================




Crackme03 还原出来的代码如下
public void onClick(ViewparamAnonymousView)
    {
     String str1 =((EditText)HelloAndroid.this.findViewById(2131034116)).getText().toString();
     int i = str1.length();//输入的用户名长度
     String str2 = "";
     String str3 =((EditText)HelloAndroid.this.findViewById(2131034118)).getText().toString();
     if (i < 4);//判别输入的注册码是否小于4
     while (true)
     {
       try
       {
         Toast.makeText(HelloAndroid.this.getApplicationContext(), "Min 4chars", 1).show();
         return;
         int k = str1.length();
         if (j >= k)
         {
           String str4 = String.valueOf(0x6B016 ^Integer.parseInt(str2.substring(0, 5)));//用户名ascii码前五位数和16进制数6b016xor运算
           TelephonyManager localTelephonyManager = (TelephonyManager)HelloAndroid.this.getSystemService("phone");
           String str5 = localTelephonyManager.getDeviceId();
           String str6 = localTelephonyManager.getSimSerialNumber();
           String str7 = str5.substring(0, 6);//hardid011到第6
           String str8 = str6.substring(0, 6); //hardid021到第6
           long l = Integer.parseInt(str7) ^ Integer.parseInt(str8);//hardid01hardid02 xor运算
           if (!(str4 + "-" + String.valueOf(l) + "-" +str7).equals(str3))
//判别注册码格式:str4-l-str7
              break label285;
           Toast.makeText(HelloAndroid.this.getApplicationContext(), "Godboy", 1).show();
           return;
         }
       }
       catch (Exception localException)
       {
         Toast.makeText(HelloAndroid.this.getApplicationContext(), "AnotherError Ocurred :(", 1).show();
         return;
       }
       int m = str1.charAt(j);
       str2 = str2 + m;
       j++;
       continue;
       label285: Toast.makeText(HelloAndroid.this.getApplicationContext(),"Bad boy ", 1).show();
       return;
       int j = 0;
     }
}

VB源代码:
Private SubCommand1_Click()
Dim hid1 AsString
Dim hid2 AsString
Dim name AsString
Dim namestr AsString
Dim nnum AsDouble
Dim num2 AsDouble
Dim i As Integer
hid1 =Mid(Text1.Text, 1, 6)
hid2 =Mid(Text2.Text, 1, 6)
name =Text3.Text
num2 = Val(hid1)Xor Val(hid2)
If Len(Text3.Text)< 4 Then
Text4.Text ="Name长度最小为4"
Else
For i = 1 ToLen(name)
namestr =namestr & Asc(Mid(name, i, 1))
Next i
nnum =Val(Mid(namestr, 1, 5)) Xor 438294
Text4.Text =nnum & "-" & num2 & "-" & hid1
End If
End Sub

2.png


===============================================================================

CrackMe-F1F2
public class LisenceCheck extends Activity
{
  inta;
private View.OnClickListener appButtonOnClickListener = newView.OnClickListener()
  {
   public void onClick(View paramAnonymousView)
    {
     if ((Button)paramAnonymousView == LisenceCheck.this.mbutton)
     {
       new String("");
       String str1 = LisenceCheck.this.meditun.getText().toString();
       new String("");
       String str2 = LisenceCheck.this.meditsn.getText().toString();
       int i = 0;
       int j = 0;
       label82: int m;
       int n;
       if (j >= str1.length())//如果用户名为空,则m=I xor0x5678
       {
         m = i ^ 0x5678;
         n = 0;
       }
       for (int i1 = 0; ; i1++)
       {
         if (i1 >= str2.length())
         {
           if (m != (n ^ 0x1234))//如果m=n xor 0x1234则注册成功
              break label202;
           Toast.makeText(LisenceCheck.this.getApplicationContext(), "LisenceCorrect", 0).show();
           return;
           int k = str1.charAt(j);
           if (k < 65)
              break label82;
           if (k > 90)
              k = (char)(k - 32);
           i += k;
           j++;
           break;
         }
         n = (char)(str2.charAt(i1) - '0') + n * 10;
       }
       label202: Toast.makeText(LisenceCheck.this.getApplicationContext(),"Lisence Uncorrect", 0).show();
       return;
     }
     LisenceCheck.this.meditun.setText("");
     LisenceCheck.this.meditsn.setText("");
    }
  };


注册算法过于坑爹:经过分析,用户名留空,注册码为“17484”即可通过验证。
PS:17484=0x1234 xor 0x5678

F1、F2函数

//F1函数部分,s1为输入的用户名


1  int i = 0,k1 = 0;;
2  char ch;
3  for (i = 0; i<s1.length();i++)
4  {
5  ch = s1.charAt(i);
6  if (ch < 'A') break;
7  if (ch > 'Z') ch -= 32;
8  k1 = k1 + ch;
9  }
10 k1 = k1 ^ 0x5678;


//F2函数部分,s2为输入的序列号


1 int k2 = 0;
2 for (i = 0;i < s2.length(); i++)
3 {
4     ch = s2.charAt(i);
5     ch –= 48;
6     k2 = k2 * 10 + ch;
7 }
8 k2 = k2 ^ 0x1234;


原apk就是这样,若k1==k2,那么验证成功,否则验证失败。

可以看出 F2函数的循环部分,仅仅是把序列号s2从字符串转换为整型,存于k2中,此处的k2我们成为k2[序列号]。最后做异或运算,从而得出密文,覆盖于k2中,此处的k2成为k2[密文]。在异或运算中,若存在

c = a xor b (对应到F2函数中的最后一步,即 k2[密文] = k2[序列号] xor 0x1234)

则a=c xor b (对应着k2[序列号] = k2[密文] xor 0x1234)

也就是说通过 密文 xor 0x1234 就能得到序列号

在F1函数的结果也就是密文。所以,注册机的写法也就出来了:把F1的结果 xor 0x1234就是对应用户名的正确的序列号。

注册机的核心代码
1  int i = 0;
2  int k3 = 0;
3  char ch;
4  for (i = 0; i < s1.length(); i++)
5  {
6      ch = s1.charAt(i);
7      if (ch < 'A') break;
8      if (ch > 'Z')
9      ch -= 32;
10     k3 = k3 + ch;
11 }
12 k3 = k3 ^ 0x5678 ^ 0x1234;

//s1为用户名,k3为根据s1算出来的正确的序列号,单独写一个注册机,然后通过注册机计算


=================================================================================
最后一个EX05_01_:


public void onCreate(Bundle paramBundle)
  {
   super.onCreate(paramBundle);
   setContentView(2130903040);
   this.mTextView01 = ((TextView)findViewById(2131034112));
   this.mEditText01 = ((EditText)findViewById(2131034114));
   this.mEditText01.setOnKeyListener(new View.OnKeyListener()
    {
     public boolean onKey(View paramAnonymousView, int paramAnonymousInt,KeyEvent paramAnonymousKeyEvent)
     {
       if ("gogo".equals("11"))////这个等式不可能成立….
       {
         EX05_01.this.mTextView01.setText("gogo");
         Toast.makeText(EX05_01.this, "right++", 1).show();
       }
       while (true)
       {
         Linkify.addLinks(EX05_01.this.mTextView01, 7);
         return false;
         EX05_01.this.mTextView01.setText("gogo");
         Toast.makeText(EX05_01.this, "error--", 1).show();
       }
     }
   });
  }

@#%……%@#¥!#%……¥#@@#%……%……#@#%……%&
smali文件,把”11”改成”gogo”.
修改后的smali代码如下:
.method publiconKey(Landroid/view/View;ILandroid/view/KeyEvent;)Z
   .locals 4
   .param p1, "arg0"    #Landroid/view/View;
   .param p2, "arg1"    # I
   .param p3, "arg2"    #Landroid/view/KeyEvent;

   .prologue
   const/4 v3, 0x1

   .line 28
   const-string v0, "gogo"

   .line 30
   .local v0, "str":Ljava/lang/String;
   const-string v1, "gogo"                             //修改这里

   invoke-virtual {v0, v1},Ljava/lang/String;->equals(Ljava/lang/Object;)Z

   move-result v1

   if-eqz v1, :cond_0

   .line 31
   iget-object v1, p0,Lirdc/ex05_01/EX05_01$1;->this$0:Lirdc/ex05_01/EX05_01;

    #getter for: Lirdc/ex05_01/EX05_01;->mTextView01:Landroid/widget/TextView;
   invoke-static {v1},Lirdc/ex05_01/EX05_01;->access$0(Lirdc/ex05_01/EX05_01;)Landroid/widget/TextView;

   move-result-object v1

   invoke-virtual {v1, v0}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

   .line 32
   iget-object v1, p0,Lirdc/ex05_01/EX05_01$1;->this$0:Lirdc/ex05_01/EX05_01;

   const-string v2, "right++"

   invoke-static {v1, v2, v3},Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

   move-result-object v1

   invoke-virtual {v1}, Landroid/widget/Toast;->show()V

   .line 40
   :goto_0
   iget-object v1, p0,Lirdc/ex05_01/EX05_01$1;->this$0:Lirdc/ex05_01/EX05_01;

    #getter for: Lirdc/ex05_01/EX05_01;->mTextView01:Landroid/widget/TextView;
   invoke-static {v1},Lirdc/ex05_01/EX05_01;->access$0(Lirdc/ex05_01/EX05_01;)Landroid/widget/TextView;

   move-result-object v1

   const/4 v2, 0x7

   invoke-static {v1, v2},Landroid/text/util/Linkify;->addLinks(Landroid/widget/TextView;I)Z

   .line 41
   const/4 v1, 0x0

   return v1

   .line 35
   :cond_0
   iget-object v1, p0,Lirdc/ex05_01/EX05_01$1;->this$0:Lirdc/ex05_01/EX05_01;

    #getter for: Lirdc/ex05_01/EX05_01;->mTextView01:Landroid/widget/TextView;
   invoke-static {v1},Lirdc/ex05_01/EX05_01;->access$0(Lirdc/ex05_01/EX05_01;)Landroid/widget/TextView;

   move-result-object v1

   invoke-virtual {v1, v0}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

   .line 36
   iget-object v1, p0,Lirdc/ex05_01/EX05_01$1;->this$0:Lirdc/ex05_01/EX05_01;

   const-string v2, "error--"

   invoke-static {v1, v2, v3},Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

   move-result-object v1

   invoke-virtual {v1}, Landroid/widget/Toast;->show()V

   goto :goto_0
.end method


注册机和修改过的最后一个软件
注册机和修改过的软件.zip (21.49 KB, 下载次数: 27)

点评

看得有点糊涂。  发表于 2017-5-2 21:34

免费评分

参与人数 1热心值 +1 收起 理由
小试锋芒 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Kzgtkc 发表于 2014-12-29 23:09
谢谢,慢慢看
头像被屏蔽
bambooqj 发表于 2014-8-6 17:51
453100956 发表于 2014-8-16 12:49 来自手机
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-11 03:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表