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

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

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

KeygenMe#1.apk

1、首先在模拟器安装测试
Android学习心得(11) --- MAC下Android反编译(3)_第1张图片

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

2

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

Android学习心得(11) --- MAC下Android反编译(3)_第2张图片

使用apktool工具反编译

Android学习心得(11) --- MAC下Android反编译(3)_第3张图片
Android学习心得(11) --- MAC下Android反编译(3)_第4张图片

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

6

使用apktool和signapk.jar

Android学习心得(11) --- MAC下Android反编译(3)_第5张图片
Android学习心得(11) --- MAC下Android反编译(3)_第6张图片

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

Android学习心得(11) --- MAC下Android反编译(3)_第7张图片

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

Android学习心得(11) --- MAC下Android反编译(3)_第8张图片

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

11

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

Android学习心得(11) --- MAC下Android反编译(3)_第9张图片
Android学习心得(11) --- MAC下Android反编译(3)_第10张图片

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

16

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

17

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

Android学习心得(11) --- MAC下Android反编译(3)_第11张图片

crackme0a.apk

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

Android学习心得(11) --- MAC下Android反编译(3)_第12张图片
Android学习心得(11) --- MAC下Android反编译(3)_第13张图片
主要功能是通过输入的code来验证
下面我们通过dex2jar和jd-gui来进行查看源代码

Android学习心得(11) --- MAC下Android反编译(3)_第14张图片

验证的函数是validateSerial()函数

Android学习心得(11) --- MAC下Android反编译(3)_第15张图片

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

Android学习心得(11) --- MAC下Android反编译(3)_第16张图片

下面,我自己通过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

Android学习心得(11) --- MAC下Android反编译(3)_第17张图片

你可能感兴趣的:(android,mac,反编译,dex2jar,apktool)