.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 对象