方法三:Log插桩
1、安装完作业apk,然后进入classes.dex文件内,搜索0x7F05000B定位到代码
2、找到checkSN方法,长按跳转进方法,简单分析一下smali代码
[Asm] 纯文本查看 复制代码 .method private checkSN(Ljava/lang/String;Ljava/lang/String;)Z
.registers 13
.param p1, "userName" # Ljava/lang/String; 参数寄存器 p1 保存的是用户名 userName
.param p2, "sn" # Ljava/lang/String; 参数寄存器 p2 保存的是注册码 sn
.prologue
const/4 v7, 0x0 # 将 0x0 存入寄存器 v7
.line 45
if-eqz p1, :cond_9 # 如果 p1,即 userName 等于 0,跳转到 cond_9
:try_start_3
invoke-virtual {p1}, Ljava/lang/String;->length()I # 调用 userName.length()
move-result v8 # 将 userName.length() 的执行结果存入寄存器 v8
if-nez v8, :cond_a # 如果 v8 不等于 0,跳转到 cond_a
.line 69
:cond_9
:goto_9
return v7
.line 47
:cond_a
if-eqz p2, :cond_9 # 如果 p2,即注册码 sn 等于 0,跳转到 cond_9
invoke-virtual {p2}, Ljava/lang/String;->length()I # 执行 sn.length()
move-result v8 # 将 sn.length() 执行结果存入寄存器 v8
const/16 v9, 0x10 # 将 0x10 存入寄存器 v9
if-ne v8, v9, :cond_9 # 如果 sn.length != 0x10 ,跳转至 cond_9
.line 49
const-string v8, "MD5" # 将字符串 "MD5" 存入寄存器 v8
# 调用静态方法 MessageDigest.getInstance("MD5")
invoke-static {v8}, Ljava/security/MessageDigest;->getInstance(Ljava/lang/String;)Ljava/security/MessageDigest;
move-result-object v1 # 将上一步方法的返回结果赋给寄存器 v1,这里是 MessageDigest 对象
.line 50
.local v1, "digest":Ljava/security/MessageDigest;
invoke-virtual {v1}, Ljava/security/MessageDigest;->reset()V # 调用 digest.reset() 方法
.line 51
invoke-virtual {p1}, Ljava/lang/String;->getBytes()[B # 调用 userName.getByte() 方法
move-result-object v8 # 上一步得到的字节数组存入 v8
invoke-virtual {v1, v8}, Ljava/security/MessageDigest;->update([B)V # 调用 digest.update(byte[]) 方法
.line 52
invoke-virtual {v1}, Ljava/security/MessageDigest;->digest()[B # 调用 digest.digest() 方法
move-result-object v0 # 上一步的执行结果存入 v0,是一个 byte[] 对象
.line 53
.local v0, "bytes":[B
const-string v8, "" # 将字符串 "" 存入 v8
# 调用 MainActivity 中的 toHexString(byte[] b,String s) 方法
invoke-static {v0, v8}, Lcom/droider/crackme0201/MainActivity;->toHexString([BLjava/lang/String;)Ljava/lang/String;
move-result-object v3 # 上一步方法返回的字符串存入 v3
.line 54
.local v3, "hexstr":Ljava/lang/String;
new-instance v5, Ljava/lang/StringBuilder; # 新建 StringBuilder 对象
3、分析在第117行可知v6为最终真实的的sn注册码,只需在后面添加如下代码并保存
[Asm] 纯文本查看 复制代码 invoke-static {v6}, Lcom/mtools/LogUtils;->v(Ljava/lang/Object;)V
4、然后将log插桩dex文件放入包内并改名为classes2.dex,并打包重新安装
5、LSPosed 选中程序,算法助手开启应用总开关、Log捕获不在赘述
6、运行后随便输入用户名和注册码,翻看日志,可以看到用户名对应正确的注册码
7、进行验证,注册成功
|