乐于分享
好东西不私藏

学习《安卓逆向这档事》-4-课后作业

学习《安卓逆向这档事》-4-课后作业

01
四阶段课后作业
https://www.52pojie.cn/thread-1714883-1-1.html
目标:破解用户注册注册码功能
02
动态调试
  1. 打开AndroidManifest.xml文件查看是否开启了debugger模式

  2. 打开软件,提示输入十六位注册码,尝试进行注册,提示无效用户名和注册码

  3. 打开jeb,尝试以此为关键字进行搜索

  4. 右键解析查看Java代码

  5. 可以看到这里调用了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,直接校验失败,返回 false    if(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();            // 定义循环变量 i            int i;            // 死循环:i 从 0 开始,每次 +2(只取偶数下标:0、2、4、6...)            for(i = 0true; 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();    }    // 不满足核心校验条件 或 发生异常,最终返回 false    return false;}
  • 先判空 : arg11 == null 直接失败
  • 进核心条件 : arg11 非空 + arg12 是 16 位字符串
  • 算 MD5 :把 arg11 转成 32 位 MD5 串
  • 取偶数位 :0、2、4……30,共 16 个字符
  • 比 SN :拼好的 16 位串 和 arg12 忽略大小写比对
  • 异常 / 不满足条件 :一律返回 false

6.此处V5值即为运算出的字符串,在此处下断点进行调试
7.查看包名及启动activity
8.使用如下命令启动软件动态调试
adb shell am start -D -n com.droider.crackme0201/.MainActivity
9.查看参数值即为软件注册码
03
log插桩
  1. jeb中以无效用户名为关键字进行搜索,定位其资源ID

2.mt管理器中打开classes.dex搜索0x7F05000B
3.追踪checkSN方法
4.定位返回参数位置,此处的V6即为函数返回的字符串位置,在下添加代码将该值以日志的方式打印输出
invoke-static {对应寄存器}, Lcom/mtools/LogUtils;->v(Ljava/lang/Object;)V
5.放入日志插桩文件并重命名为classes2.dex
6.打开算法助手log捕获功能,点击右上角启动软件
7.参数2即为注册码
04
免责声明
本文旨在进行安全技术 交流与学习 。所有内容仅代表个人观点与研究心得,仅供法律许可范围内的技术研究与防御参考。读者须承诺并保证:不将分享的任何知识、工具或方法用于任何未授权的测试、攻击或非法用途,并严格遵守您所在地及目标系统所在地的所有适用法律。所有基于本公众号内容进行的操作与决策,其产生的一切后果均由操作者 自行独立承担全部责任 。技术风险自控,法律红线勿越。