学习《安卓逆向这档事》-4-课后作业
-
打开AndroidManifest.xml文件查看是否开启了debugger模式 
-
打开软件,提示输入十六位注册码,尝试进行注册,提示无效用户名和注册码 
-
打开jeb,尝试以此为关键字进行搜索 

-
右键解析查看Java代码 
-
可以看到这里调用了checkSN方法,猜测此处为注册码的校验函数,双击进行跳转查看 /*** 序列号(SN)校验核心方法* 逻辑:对 arg11 做 MD5 加密 → 取 MD5 字符串的偶数下标字符 → 拼接成 16 位字符串 → 和 arg12 比对* @param arg11 待加密的原始字符串(如设备号、密钥)* @param arg12 待校验的 16 位 SN 码* @return 校验通过返回 true,失败/异常返回 false*/private boolean checkSN(String arg11, String arg12) {// 如果第一个参数 arg11 为 null,直接校验失败,返回 falseif(arg11 == null) {return false;}try {// 进入核心校验的条件:// 1. arg11 不是空字符串// 2. arg12 不为 null// 3. arg12 长度必须严格等于 16 位if(arg11.length() != 0 && (arg12 != null && arg12.length() == 16)) {// 获取 MD5 消息摘要对象(用于计算 MD5 哈希值)MessageDigest digest = MessageDigest.getInstance("MD5");// 重置摘要对象状态(冗余代码,new 出来默认就是清空状态)digest.reset();// 将 arg11 字符串转为字节数组,更新到 MD5 计算器中digest.update(arg11.getBytes());// 计算最终 MD5 哈希值,并调用工具类转为十六进制字符串(标准 32 位)String hexstr = MainActivity.toHexString(digest.digest(), "");// 创建字符串构建器,用于拼接提取出来的字符StringBuilder sb = new StringBuilder();// 定义循环变量 iint i;// 死循环:i 从 0 开始,每次 +2(只取偶数下标:0、2、4、6...)for(i = 0; true; i += 2) {// 当 i 超过 MD5 字符串长度时,结束循环并返回比对结果if(i >= hexstr.length()) {// 将拼接好的字符串与 arg12 忽略大小写比对,返回比对结果(true/false)return sb.toString().equalsIgnoreCase(arg12);}// 取出 MD5 字符串中 偶数下标 i 位置的字符,追加到 StringBuilder 中sb.append(((char)hexstr.charAt(i)));}}}// 捕获异常:系统不支持 MD5 算法时触发(理论上几乎不会发生)catch(NoSuchAlgorithmException e) {// 打印异常堆栈信息(用于调试)e.printStackTrace();}// 不满足核心校验条件 或 发生异常,最终返回 falsereturn false;}
-
先判空 : arg11 == null 直接失败
-
进核心条件 : arg11 非空 + arg12 是 16 位字符串
-
算 MD5 :把 arg11 转成 32 位 MD5 串
-
取偶数位 :0、2、4……30,共 16 个字符
-
比 SN :拼好的 16 位串 和 arg12 忽略大小写比对
-
异常 / 不满足条件 :一律返回 false




adb shell am start -D -n com.droider.crackme0201/.MainActivity


-
jeb中以无效用户名为关键字进行搜索,定位其资源ID 



invoke-static {对应寄存器}, Lcom/mtools/LogUtils;->v(Ljava/lang/Object;)V





夜雨聆风