Android学习心得(11) --- MAC下Android反编译(3)

我在博客上发表一些我的Android学习心得,希望对大家能有帮助。
在前一章我们学习了反编译。
这一章再次学习一下两个demo。


两个demo下载地址
KeygenMe#1.apk crackme0a.apk
链接: http://pan.baidu.com/s/1kTs11Tt 密码: davk


KeygenMe#1.apk

1、首先在模拟器安装测试
1

由于模拟器检测不到wifi mac地址,所以会报错。
我们首先需要将检测代码跳过
先通过dex2jar和jd-gui查看源代码进行分析

2

查看了main.class文件中,
在public static String _activity_create(boolean paramBoolean)方法中找到了判断wifi的语句,
由于模拟器不能接入wifi网络,所以必须跳过才能继续下去

3

使用apktool工具反编译

4
5

通过goto :cond_1来直接跳过上面if语句,跳转到label229标签处

6

使用apktool和signapk.jar

7
8

重新安装后又显示检测IMEI错误

9

重新打开,发现通过跳转代码,再查看源代码直接就跳过了wifi验证

10

下面继续通过上面提示的错误信息,来进行查找

11

错误显示由_emulator_dete1()函数产生,在main.smali中找到此函数

12
14

跳过判断语句,添加goto语句,直接跳过判断语句,修改完成后我们进行验证破解。

16

由于这里需要读取key.txt文件,在解压出来的apk中没找到此文件,所以最终还是进行跳转破解了  
判断函数是_check_code(),我们需要其每次进行判断都是正确

17

修改if-eqz为if-nez,则不管输入什么都能验证成功(除了正确的验证码)

18


crackme0a.apk

我们第一件事情就是安装后进行初步查看

a1
a5
主要功能是通过输入的code来验证
下面我们通过dex2jar和jd-gui来进行查看源代码

a2

验证的函数是validateSerial()函数

a3

在validateSerial()函数中,最重要的是generateIDHash()函数

a4

下面,我自己通过generateIDHash()函数编写一个注册机代码
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Test t = new Test();
        System.out.println(t.generateIDHash());
    }


    private String generateIDHash() {
        int k;
        String str = "IMEI code";
        MessageDigest localMessageDigest = null;
        try {
            localMessageDigest = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        localMessageDigest.update(str.getBytes(), 0, str.length());
        byte[] arrayOfByte1 = localMessageDigest.digest();
        byte[] arrayOfByte2 = new byte[arrayOfByte1.length];
        int i = 0;
        int j = 0;
        while (true) {
            if (i >= arrayOfByte1.length)
                return new BigInteger(1, arrayOfByte2).toString(16).substring(0, 15);
            if (i >= -1 + arrayOfByte1.length)
                k = 0;
            else
                k=i+1;
            arrayOfByte2[j] = (byte)(arrayOfByte1[i] ^ arrayOfByte1[k]);
            i += 2;
            ++j;
        }
    }
}

最开始的str是输入你自己手机的IMEI码,通过计算后会得出验证code

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值