前言
Enmmm,还记得之前看反编译之后的结果,对于 Smali 文件,简直懵的要死。
今天,一起好好回顾下。
首先来个小 Demo
效果如下:
链接:
https://pan.baidu.com/s/1EbZsk106YLV22TgoVkbhbw
密码:f5v1
打开如下格式:
而接下来,我们重点关注 Smali 目录下的文件:
Smali 解析代码文件
Enmmm,这里还需要借助工具:Dalvik虚拟机操作码,进行辅助。
链接:
https://pan.baidu.com/s/14I63tafdQRcBkSm6UO1qaQ
密码:2w7h
首先,我们先来看前三句:
首先,我们来依次解析下所代表含义:
L 代表 Java 类型文件,也就是 MainActivity;
super 则代表父类,也就是继承自 AppCompatActivity;
source 则代表文件名称,也就是当前文件名为:MainActivity。
那么依旧这些内容,转化为 Java 代码如下:
接着,往下继续看:
Enmmm,显而易见,这里定义了三个全局变量,并且我们解析下这几行行所代表的含义:
instance fields:LZ 理解为类似作用域,表明界限;
.field private mCheckID:Landroid/widget/Button:定义一个私有变量名为 MCheckID 且类型为 Button。
那么针对这些,逆推 Java 代码如下:
而接下来,我们来看下 onCreate() 方法又被转化成了什么鬼?
显而易见,有一个名为 onCreate 并且有一个参数为 Bundle 类型,参数名为 savedInstanceState。
而其下则调用了 super,而 所代表的含义如下:
p0 代表当前,也就是 this,对应类型为 Landroid/support/v7/app/AppCompatActivity;
p1 则对应参数 onCreate(Landroid/os/Bundle;)V,这里参数依旧使用上面的 Bundle –> savedInstanceState
而 const v0, 0x7f09001b 则对应的具体类型,经过 LZ 搜索如下:
下面的
invoke-virtual ,
Lcom/hlq/apktooldemo/MainActivity;
->setContentView(I)V
解析如下:
p0 代表类型为 com/hlq/apktooldemo/MainActivity;
v0 则代表引用下面 setContentView(i) 参数对应的则是我们 MainActivity 对应的 layout 文件 id。
而这俩行,则是定义了俩个方法,分别为:
initView()V;
initEvent()V。
So,结合起来,onCreate Smali 文件转换 Java 文件如下:
而下面,继续查看 initView 方法:
而在 initEvent() 方法中,则又是如下:
而其下点击事件中关键内容解析如下:
而最后,我们简单看下 onClick 中如何处理:
由此推断出,转化为 Java 代码应该如下:
有些生涩,但是好歹翻译出来了。尴尬癌都犯了。。。生涩 ing。。。
修改 Smali 文件,使其达到我们预期效果
从文中提供 Demo 演示图,我们可以看出,当前的小程序主要功能便是,属于用户名以及校验码,验证通过进入欢迎页,否则提示错误异常。
那么,如何在我们不知道验证码的情况下,还能正常进入欢迎页面呢?
结合我们刚刚解析的 Smail 文件,以及转化后的 Java 文件,我们可以得知如下关键内容:
首先,Apk 会对用户输入进行一个非空校验,这个好办,我们随便输入点什么即可绕过;
而关键将通过 Base64 对用户输入进行校验合法性。
那么,我们可以不可以,将这块的逻辑给它逆转一下,比如,我们随便输入,使其程序校验成功,而我们真正录入正确的时候,则认为是失败的。嘿嘿嘿,有点坏哦~
说干就干,一起来修改 Smail 文件。
直接通过搜索定位到 startActivity 方法处:
那么,我们接下来只需要直接将 cond_1 前面的 if - eqz 修改为 if - nez 即可,如下所示:
这时候,再次回包:
签个名:
运行查看效果:
6 不 6?
本文到此结束~
大吉大利,晚上吃鸡~~~
欢迎各位老铁关注~不定期发布~见证你我的成长路~!!!
觉得不错,动动小手,转发让更多人看到,3Q,比心~
领取专属 10元无门槛券
私享最新 技术干货