【移动安全实战篇】————4、Android程序破解练习初级

方法一:暴力破解

文件名:KeygenMe#1.apk
工具:ApktoolGui v2.0 Final

主界面:

点击Activate按钮后出来注册提示框:

开工了,先用ApktoolGui v2.0 Final反编译成java
通过查看AndroidManifest.xml文件,找到主Activity:Com.zAWS.KeygenMe.main,查看主Activity处的代码,找到_check_code()函数

光看函数名称就能猜到是判断注册码正确性了。
其对应的smali代码为

将if-eqz改为if-nez重新编译,安装运行。OK

方法二:分析算法,写注册机

文件名:crackme0a.apk
工具:ApktoolGui v2.0 Final
破解前:

先用ApktoolGui v2.0 Final反编译成java源代码

就一个main文件,很简单。查看代码中的点击按钮事件

发现判断语句,找到validateSerial()方法

顺藤摸瓜,发现核心算法在这里

其中getMobileID()方法是获取手机的DeviceId即IMEI号

注册码的生成就是通过获取手机的IMEI号经MD5加密等一系列处理得来的。好了,根据上面的核心算法编写注册代码(由于我用的模拟器实验的,所以IMEI为15个0):

package com.zm.hxb.lover;
import java.security.MessageDigest;
import java.math.BigInteger;
 
public class KeyTest {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
      KeyTest kTest= new KeyTest();
      kTest.testResult();      
    }
    public String testResult(){
         String str = "000000000000000";
           MessageDigest localMessageDigest=null;
           try {
               localMessageDigest = MessageDigest.getInstance("MD5");
              } catch (Exception e) {
               System.out.println(e.toString());
               e.printStackTrace();
              } 
             
            byte[] arrayOfByte1 = str.getBytes();
            int i = str.length();
            localMessageDigest.update(arrayOfByte1, 0, i);
            byte[] arrayOfByte2 = localMessageDigest.digest();
            byte[] arrayOfByte3 = new byte[arrayOfByte2.length];
            int digestPos = 0;
            int transformPos = 0;
            int m = arrayOfByte2.length;
            //int n = arrayOfByte2.length -1;
            while (true) {
                if (digestPos >= m)
                {
                    BigInteger bInteger = new BigInteger(1, arrayOfByte3);
                    System.out.println(bInteger.toString(16).substring(0, 15));
                    return bInteger.toString(16).substring(0, 15);
                }
                m = arrayOfByte2.length-1;
                int v5;
                if(digestPos >= m){
                    v5 = 0;
                }else{
                    v5 = digestPos + 1;
                }
                int v9 = arrayOfByte2[digestPos];
                int v10 = arrayOfByte2[v5];
                int i4 = (byte)(v9 ^ v10);
                arrayOfByte3[transformPos] = (byte)i4;
                digestPos += 2;
                transformPos += 1;
            }  
    }
}

得到注册码d67bb44ac8fe21a,输入文本框,OK,破解成功。

首先,查壳,使用PEID或者是FI,为UPX v1.08 接下来用OD载入,提示为“压缩代码是否继续分析”,我们选择否 我在这里介绍几种方法,请看我的操作。 方法1:单步跟踪(最常见的方法) 0040E8C0 N> 60 pushad //停在这里了,我们F8单步 0040E8C1 BE 15B04000 mov esi,NOTEPAD.0040B015 0040E8C6 8DBE EB5FFFFF lea edi,dword ptr ds:[esi+FFFF> 0040E8CC 57 push edi 0040E8CD 83CD FF or ebp,FFFFFFFF 0040E8D0 EB 10 jmp short NOTEPAD.0040E8E2 //跳 。。。。。。。。。。 0040E8E2 8B1E mov ebx,dword ptr ds:[esi] //跳到这里,继续单步 0040E8E4 83EE FC sub esi,-4 0040E8E7 11DB adc ebx,ebx 0040E8E9 ^ 72 ED jb short NOTEPAD.0040E8D8 //这里要往回跳了 0040E8EB B8 01000000 mov eax,1 //F4,然后继续F8 0040E8F0 01DB add ebx,ebx 0040E8F2 75 07 jnz short NOTEPAD.0040E8FB //跳 。。。。。。。。。。。 0040E8FB 11C0 adc eax,eax //来到这里,F8继续 0040E8FD 01DB add ebx,ebx 0040E8FD 01DB add ebx,ebx 0040E8FF ^ 73 EF jnb short NOTEPAD.0040E8F0 0040E901 75 09 jnz short NOTEPAD.0040E90C //跳 。。。。。。。。。。。 0040E90C 31C9 xor ecx,ecx //跳到这里,继续F8 0040E90E 83E8 03 sub eax,3 0040E90E 83E8 03 sub eax,3 0040E911 72 0D jb short NOTEPAD.0040E920 //跳 。。。。。。。。。。。 0040E920 01DB add ebx,ebx //跳到这里,继续F8 0040E922 75 07 jnz short NOTEPAD.0040E92B //跳 。。。。。。。。。。。 0040E92B 11C9 adc ecx,ecx //跳到了这里,继续F8 0040E92D 01DB add ebx,ebx 0040E92F 75 07 jnz short NOTEPAD.0040E938 //跳 。。。。。。。。。。。 0040E938 11C9 adc ecx,ecx //跳到这里,继续F8 0040E93A 75 20 jnz short NOTEPAD.0040E95C //跳 。。。。。。。。。。。 0040E95C 81FD 00F3FFFF cmp ebp,-0D00 //来到这,继续F8 0040E962 83D1 01 adc ecx,1 0040E965 8D142F lea edx,dword ptr ds:[edi+ebp] 0040E968 83FD FC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值