首页
论坛
课程
招聘
[原创]UnCrackable App 三部曲学习记录分享
2019-11-1 18:30 6288

[原创]UnCrackable App 三部曲学习记录分享

2019-11-1 18:30
6288

PS:小弟就是学习记录,请大佬勿喷

UnCrackable App for Android Level 1


1、root监测
    public void onCreate(Bundle bundle) {
        if (c.a() || c.b() || c.c()) {
            a("Root detected!");
        }
        if (b.a(getApplicationContext())) {
            a("App is debuggable!");
        }
        super.onCreate(bundle);
        setContentView(R.layout.activity_main);
    }
2、输入字符进行验证
public class a {
    public static boolean a(String str) {
        byte[] a;
        String str2 = "8d127684cbc37c17616d806cf50473cc";
        byte[] bArr = new byte[0];
        try {
            a = sg.vantagepoint.a.a.a(b(str2), Base64.decode("5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc=", 0));
        } catch (Exception e) {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("AES error:");
            stringBuilder.append(e.getMessage());
            Log.d("CodeCheck", stringBuilder.toString());
            a = bArr;
        }
        return str.equals(new String(a));
    }

    public static byte[] b(String str) {
        int length = str.length();
        byte[] bArr = new byte[(length / 2)];
        for (int i = 0; i < length; i += 2) {
            bArr[i / 2] = (byte) ((Character.digit(str.charAt(i), 16) << 4) + Character.digit(str.charAt(i + 1), 16));
        }
        return bArr;
    }
}

public class a {
    public static byte[] a(byte[] bArr, byte[] bArr2) {
        SecretKeySpec secretKeySpec = new SecretKeySpec(bArr, "AES/ECB/PKCS7Padding");
        Cipher instance = Cipher.getInstance("AES");
        instance.init(2, secretKeySpec);
        return instance.doFinal(bArr2);
    }
}
3、hook 代码
Java.perform(function () {
	send("hook start");
	
    var c = Java.use("sg.vantagepoint.a.c");
    c.a.overload().implementation = function(){
        send("c.a() " + this.a());
        return false;
    }
    
    c.b.overload().implementation = function(){
        send("c.b() " + this.b());
        return false;
    }
    
    c.c.overload().implementation = function(){
        send("c.c() " + this.c());
        return false;
    }

    var a = Java.use("sg.vantagepoint.a.a");
    a.a.overload('[B', '[B').implementation = function(arg1,arg2){
        var ret = this.a(arg1,arg2);
        console.log(byte2string(ret));
        return ret;
    }

	send("hook end");
});
Level 1比较简单,使用jadx查看代码,大概逻辑是 hook root判断和获取字符sg.vantagepoint.a.a.a(byte[] bArr, byte[] bArr2)

UnCrackable App for Android Level 2

字符串验证放到了native层
   static {
        System.loadLibrary("foo");
    }

用ida看一下

"Thanks for all the fish"是答案 很简单

UnCrackable App for Android Level 3

使用frida时,app崩溃 “Process crashed: Trace/BPT trap

根据控制台的log 
V/UnCrackable3: Tampering detected! Terminating...
发现so中进行了frida的反调试

hook住,继续找字符验证的地方。
java层
public void verify(View view) {
        String obj = ((EditText) findViewById(R.id.edit_text)).getText().toString();
        AlertDialog create = new Builder(this).create();
        if (this.check.check_code(obj)) {
            create.setTitle("Success!");
            create.setMessage("This is the correct secret.");
        } else {
            create.setTitle("Nope...");
            create.setMessage("That's not it. Try again.");
        }
        create.setButton(-3, "OK", new OnClickListener() {
            public void onClick(DialogInterface dialogInterface, int i) {
                dialogInterface.dismiss();
            }
        });
        create.show();
    }

    static {
        System.loadLibrary("foo");
    }


native层

v9指向的是加密字符串的内存地址
v6指向的是 dword_601C 存放的是  
private static final String xorkey = "pizzapizzapizzapizzapizz";
根据


使用ida进行调式看看v6和v9的内容

so有反调试,先过反调试(ptrace出来2个pid,防止attach)
init的时候sub_3250();是反调试方法

然后使用对so进行修改

这样ps的时候就是一个pid,可以进行attach
gdb进行调试


这样
v9对应的是 0xbfc8f8a0
v6对应的是 0xb21ed01c 

secret = '1d0811130f1749150d0003195a1d1315080e5a0017081314'.decode('hex')
key = 'pizzapizzapizzapizzapizz1'

password = ""

for i in range(24):
	password += chr((ord(secret[i]) ^ ord(key[i])))

print password







Github:https://github.com/wyhuan/owasp-mstg/tree/master/Crackmes 

[2022夏季班]《安卓高级研修班(网课)》月薪三万班招生中~

最后于 2020-1-31 20:50 被kanxue编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (4)
雪    币: 1
活跃值: 活跃值 (184)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bluegatar 活跃值 2019-11-2 16:53
2
0
好东东,mark下
雪    币: 10010
活跃值: 活跃值 (4629)
能力值: ( LV11,RANK:198 )
在线值:
发帖
回帖
粉丝
neilwu 活跃值 1 2019-11-3 08:29
3
0
bluegatar 好东东,mark下
里面的反调试还是值得学习的 比较典型
雪    币: 8911
活跃值: 活跃值 (37855)
能力值: (RANK:105 )
在线值:
发帖
回帖
粉丝
Editor 活跃值 2019-11-18 09:36
4
0
感谢分享!
雪    币: 11
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ubbuzjbsa 活跃值 2019-11-20 11:58
5
0
UnCrackable App for Android Level 1
这里为什么使用overload hook
我尝试了没有加overload和加了overload的2中方法,但是还是没有send 回来消息, 没有检测到c.a函数的执行

游客
登录 | 注册 方可回帖
返回