smail语法
1. 通过E4A简单制作一个简单的登录验证APK
a. 首先做出这个设计界面,两个标签,两个编辑框,一个按钮
b. 对他们进行属性设置
c. 双击进入按钮被单击事件,编写代码
如果 编辑框1.内容="123" 且 编辑框2.内容="456" 则
信息框("提示","登陆成功","确定")
否则
信息框("提示","登陆失败","确定")
结束 如果
语法相信知道易语言的对于这并不陌生,就用了如果这个判断
d. 接下来点击编译,点击后生成apk
这里我使用雷神模拟器进行安装
e. 尝试登录一下看看提示框有没有弹出来
随便输入用户名或者密码,会提示登陆失败,
我们正确的用户名是123,456,
我们用正确的用户名试试,登陆成功了,
尝试输入错误的账号密码
目前为止,登录程序是符合我的预期的,接下来我会通过mt管理器来对apk进行反编译
2. 通过mt管理器进行反编译
a. 通过安装好的应用来提取安装包
b. 查看安装包内容
c. 使用mt内置的dex编辑器++打开classes.dex
classes.dex文件里面会有大量的文件夹,我们要从这些文件里面找到自己需要的内容,少不了用到这里的搜索功能
d. 搜索关键词
之前我们进行登录测试的时候,输入错误的密码会弹出登录失败的文字提示,所以这里我们就搜索“登录失败”这个关键词来进行定位
这里因为我们只设置了一个登录失败的提示词,所以只找到了一个内容,正常的APP安装包里面会出现很多的内容,那时候就需要我们进行进一步的筛选了
点击以后直接定位到了我们需要的地方,我们来分析下这段smail语句
e. 分析语句
.line 63 #第63行,这个为了便于记代码行数
iget-object v0, p0, Lcom/mobile/myapp/主窗口;->编辑框1:Lcom/e4a/runtime/components/impl/android/n2/编辑框;
invoke-interface {v0}, Lcom/e4a/runtime/components/impl/android/n2/编辑框;->内容()Ljava/lang/String;
move-result-object v0 #这三行是编辑框的具体操作,我们不用理会
const-string v1, "123"
#定义一个字符串,定义v1=“123”.字符串型,类似的v0、v1、p0、p1之类的,不用去理会,可以把他当成一个名字
move-result v0 #这里是一个判断等于不等于,这条语句需要记住,因为他经常参与到我们的解锁操作当中
if-eqz v0, :cond_26 #if是如果的意思,表示判断,这一行的意思是如果v0等于0,则跳转到cond_26。eqz是等于0的缩写。意思是判断出账号密码输入错误,跳转到登录失败的弹窗
if-eqz v0, :cond_26 #这个和上面的语句一样,如果相等就跳转。否则继续往下执行
const-string v0, "登陆成功"
.line 64
invoke-static {v2, v0, v1}, Lcom/e4a/runtime/对话框类;->信息框(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I #调用对话框类
goto :goto_2b
:cond_26 #与上面的if相对应, if-eqz v0, :cond_26条件满足则跳转到这里,coud后面常跟字母或数字的组合,用来作为标记
const-string v0, "登陆失败"
.line 66
invoke-static {v2, v0, v1}, Lcom/e4a/runtime/对话框类;->信息框(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
:goto_2b #goto与cond类似,代表无条件跳转,即直接跳转到goto_2b所在的那一行
return-void #返回
大致的内容就是这样,讲的可能不对,但大体意思都差不多接下来我们尝试破解
f. 开始破解
首先说一下思路,既然上面的判断条件说是等于0跳转,我们改成不等于0跳转试试,eqz是等于,nez是不等于,我们改一下试试
if-nez v0, :cond_26
iget-object v0, p0, Lcom/mobile/myapp/主窗口;->编辑框2:Lcom/e4a/runtime/components/impl/android/n2/编辑框;
invoke-interface {v0}, Lcom/e4a/runtime/components/impl/android/n2/编辑框;->内容()Ljava/lang/String;
move-result-object v0
const-string v3, "456"
invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-nez v0, :cond_26
const-string v0, "登陆成功"
改完以后进行保存,一路返回,选择保存并退出
接下来再对安装包进行重新安装
可以看到我们输入了错误的密码一样弹出了登陆成功的提示,这说明我们的破解是成功的,但是这样又出现了一个新的问题,那就是我们的账号和密码不能有任何一个是正确的,不然就是登录失败,不知道大佬们有没有其他的方法呢?
PS:顺便贴上if条件跳转分支:
if-eq vA, vB, :cond_** #如果vA等于vB则跳转到:cond_**
if-ne vA, vB, :cond_** #如果vA不等于vB则跳转到:cond_**
if-lt vA, vB, :cond_** #如果vA小于vB则跳转到:cond_**
if-ge vA, vB, :cond_** #如果vA大于等于vB则跳转到:cond_**
if-gt vA, vB, :cond_** #如果vA大于vB则跳转到:cond_**
if-le vA, vB, :cond_** #如果vA小于等于vB则跳转到:cond_**
if-eqz vA, :cond_** #如果vA等于0则跳转到:cond_**
if-nez vA, :cond_** #如果vA不等于0则跳转到:cond_**
if-ltz vA, :cond_** #如果vA小于0则跳转到:cond_**
if-gez vA, :cond_** #如果vA大于等于0则跳转到:cond_**
if-gtz vA, :cond_** #如果vA大于0则跳转到:cond_**
if-lez vA, :cond_** #如果vA小于等于0则跳转到:cond_**