突破用户名和口令的验证#
2021/4/27
实验内容
1、编写一个验证app给下一位同学。app功能如下:如果用户名和口令输入正确则显示“恭喜你通过验证!”,否则显示“验证失败!”
以下是我的代码
首先我对帐号输入是什么,没有做出要求,但是在密码口令上做出了很多限制,要求如下:
1.长度在8位数以上
2.第1、3、4、6位为数字
3.第2、5位需要时小写字母
4.最后一位必须是!(叹号)
5.除了以上提到的位数,其他位数不做要求
如果后一位同学成功破解,那么将显示一个Toast“密码输入正确!即将进入新的页面”,随后跳转到Main2Activity,在此activity中,显示一个textview “恭喜你输入密码正确!!!”
2、在获得上一位同学编写的app后,争取能够突破用户和口令的验证,让app显示“恭喜你通过验证!”
收到上一位同学葛雪颖发来的文件,打开后是这样的页面,随意输入,显示验证失败
所以我们对它进行代码分析
1.使用apktool
命令:apktool d app-debug.apk -o ./decode -f
2.查看smail文件,获取有用信息
const-string v1, “gexueying”
const-string v1, “\u9a8c\u8bc1\u5931\u8d25\uff01” unicode转中文:验证失败
\u606d\u559c\u4f60\u901a\u8fc7\u9a8c\u8bc1\uff01 恭喜你通过验证
const/4 v2, 0x0
const-string v3, “1812190325”
以上是字符串信息
接下来是跳转语句
if-eqz v0, :cond_1
我们的关注点应该放在这里:if-eqz v0, :cond_0
\u606d\u559c\u4f60\u901a\u8fc7\u9a8c\u8bc1\uff01 恭喜你通过验证
这一段就是显示破解成功Toast的代码
3.缩小判断的范围
const-string v1, "gexueying"
invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
const-string v1, "\u9a8c\u8bc1\u5931\u8d25\uff01"
const/4 v2, 0x0
if-eqz v0, :cond_1
.line 28
iget-object v0, p0, Lcom/example/test4/MainActivity$1;->val$password:Landroid/widget/EditText;
invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;
move-result-object v0
const-string v3, "1812190325"
invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_0
跳转语句分析
"if-eq vA, vB, :cond_" 如果vA等于vB则跳转到:cond_
“if-ne vA, vB, :cond_" vA不等于
"if-lt vA, vB, :cond_” vA小于vB
“if-ge vA, vB, :cond_" vA大于等于vB
"if-gt vA, vB, :cond_” vA大于vB
这边有两个if判断条件
1. if-eqz v0, :cond_1 将输入的字符串和V0比较,相等的话则跳转运行cond_1,这里的V0就是V1
因为在这边已经转化了
const-string v1, “gexueying”
invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
2. if-eqz v0, :cond_0 将输入的字符串和V0比较,相等的话则跳转运行cond_0,这里的V0就是V3
因为在这边已经转化了
const-string v3, “1812190325”
invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z