首页
社区
课程
招聘
[讨论]一二题解题思路
发表于: 2015-10-21 00:42 11283

[讨论]一二题解题思路

2015-10-21 00:42
11283
1 jadx反编译apk,没有加壳,直接看到所有逻辑在k2015.a1.Check.check中
该函数对访问的方法以及用到了数据都做了保护,两个自定义的函数解密字符串,再通过反射动态调用方法。
最先的想法是动态调试,可以直接看到调用过程以及数据,这方面的准备工作没做好,发现USB转到虚拟机居然adb连接不上。
然后准备尝试编译jadx出来的java文件,错误太多,改起来很繁琐,放弃
最后想既然用的反射调用,何不直接在反射里加打印
修改android 源码 libcore/luni/src/main/java/java/lang/reflect/Method.java
     public Object invoke(Object receiver, Object... args)
             throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
         if (args == null) {
             args = EmptyArray.OBJECT;
         }
-        return invokeNative(receiver, args, declaringClass, parameterTypes, returnType, slot, flag);
+        Object result = invokeNative(receiver, args, declaringClass, parameterTypes, returnType, slot, flag);
+        if(debug) {
+            StringBuffer buffer = new StringBuffer("CrackU invoke ");
+            buffer.append(declaringClass);
+            if(receiver != null) {
+                buffer.append(" ");
+                buffer.append(receiver);
+            }
+            if(args != null) {
+                buffer.append("(");
+                for(Object arg : args) {
+                    buffer.append(arg);
+                    buffer.append(";");
+                }
+                buffer.append(")");
+            }
+            if(result != null) {
+                buffer.append(" ");
+                buffer.append(result);
+            }
+            System.out.println(buffer.toString());
+        }
+        return result;
     }

再回到前面的check,代码虽然超级多,输入输出还是很简洁的,结合前面的打印
输入string转int,在循环加上 1,5,9,...,997,假设是input + 124750
输出就是比较 (value % 1000000) + 124750 == input + 124750
修改固件后,可以看到直接打印出了value的值

I/System.out( 8172): CrackU invoke class java.math.BigDecimal 3.139592655589776(7;) 31395926.55589776

所以密码就是395926

题外话,里面value的计算也绕了很多弯弯,用到了一个表达式就是(7 + ((((1 + j) * j) * (2 + j)) % 6))

2 java层没有加密(会验证签名),so能看到的保护是读取了traceid,关键代码动态修改,需要一层一层下断点。
Java_k2015_a2_Ch_ch GetStringUTFChars后直接调用sub_1DE0
sub_1DE0 将输入字符串拷贝到16字节数组[缺省用0,1,...,15填充],直接调用sub_24C8
sub_24C8 将输入数组加0,1,...,15,直接调用 sub_14A4
sub_14A4 将输入数组加
0x1F, 0xBC, 0xDA, 0xFF, 0xE6, 0x4C, 0xBC, 0x44, 0xF5, 0xB8, 0x13, 0xC8, 0xEC, 0xA8, 0xCD, 0xBD
再通过,偏移2A000处函数转换,最后同
0x5C, 0xDA, 0x77, 0x2F, 0xA3, 0xC6, 0x3E, 0x39, 0xB6, 0xF0, 0xF3, 0xED, 0x51, 0x5A, 0x99, 0x86 比较
2A000处函数大致就是一个AES加密函数,但MixColumn那一部分怎么看都不像,而且那一部分我没能找到直接的逆向,最后对这部分做了枚举,好在速度可以接受,几分钟可以出来结果,附件是代码

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//