Android安全指南 之 Smali逆向实战

Android安全指南 之 Smali逆向实战

作者简介:叶绍琛,网络安全攻防技术专家,极牛网技术委员会主席,CTFWAR网络安全攻防对抗联赛发起人,《网安观察》社群期刊总顾问,大中华区前50位RHCA系统架构师,曾任网易互娱云计算平台技术负责人,曾获国家科技部和教育部联合颁发的教育信息化发明创新奖。

一、分析Smali

由于android应用的大部分逻辑都实现在Java层,在应用打包的时候Java代码都会被处理成smali文件,当我们在逆向分析一款app的时候绝大多数是在逆向分析smali代码。现在通过逆向一个简单的android应用熟悉一下android逆向的过程中的常见操作与思路。这里使用的案例是2015年阿里与看雪论坛主办的移动安全挑战赛中的第一题:

Android安全指南 之 Smali逆向实战

题目要求我们能想办法拿到登录的密码,很明显对于这个应用,检测密码的语句中一定隐藏着和正确密码有关的信息。因此第一件事就是使用jadx-gui或者JEB反编译 apk,去检查它的代码逻辑:

Android安全指南 之 Smali逆向实战

Android安全指南 之 Smali逆向实战

先从MainActivity入手进行分析,一般的流程是点击登录按钮后进行密码的校验,所以我们找到onClick方法:

Android安全指南 之 Smali逆向实战

onClick方法中有三个String类型的变量v3,v5,v4。v3是从输入框中获取的密码。V5保存了调用getTableFromPic返回的字符串,v4保存了调用getPwdFromPic方法返回的字符串,从方法名中我们可以猜测v4中的字符串是与密码有关的。

我们来看一下后面的语句,v4并不是直接与我们输入的密码v3相比较,而是与v2作对比,而v2是调用了byteToAliSmsCode方法,以v5和v3作为参数进行处理后返回的字符串:

Android安全指南 之 Smali逆向实战

byteToAliSmsCode将输入密码的每一个字节通过字符串v5进行了转化,至于具体转化的值以及字符串v5的内容我们后面会想办法把它打印出来。

在密码校验完成后会弹出弹框,其中的setTitle,setMessage等方法参数是字符串常量在R.java中的索引:

Android安全指南 之 Smali逆向实战

有了变量名,我们可以在strings.xml文件中查看变量名对应的string值:

Android安全指南 之 Smali逆向实战

看到弹窗中的字符串,进一步验证了我们的猜想,接下来我们会通过修改smali代码,把变量v2,v4和v5的值打印出来。

二、修改Smali代码

使用apktool反编译apk文件:

$ java -jar apktool.jar d Crack.apk -o output_crack

Android安全指南 之 Smali逆向实战

编辑MainActivity$1.smali,找到onClick函数的位置:

Android安全指南 之 Smali逆向实战

根据我们在JEB中看到的函数逻辑,在三个地方分别插入log语句,分别打印 v5,v4,v2 三个变量的值:

const-string v0, “test v5”
invoke-static {v0, v5}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

const-string v0, “test v4”
invoke-static {v0, v4}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

const-string v0, “test v2”
invoke-static {v0, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

Android安全指南 之 Smali逆向实战

Android安全指南 之 Smali逆向实战

修改smali文件是的.line语句是标记行号的,其值与实际源码是否一致不影响重打包运行。但是如果修改时增加或减少使用的本地寄存器,就必须修改函数头处的.locals后面的参数,使其与寄存器数目保持一致。

三、重新编译运行

将修改完的文件重新打包签名:

$ java -jar apktool.jar b output_crack -o rePacked.apk

$ java -jar apksigner.jar sign -verbose –ks key.jks –v1-signing-enabled true –v2-signing-enabled true –ks-pass pass: password –ks-key-alias key –out rePacked_signed.apk rePacked.apk

再使用JEB反编译,确保我们添加的语句:

Android安全指南 之 Smali逆向实战

安装重签名的应用到设备中,运行起来,通过adb logcat获取设备运行日志,再随机输入一串密码1234567890。

Android安全指南 之 Smali逆向实战

不出意外弹出的是密码错误的提示框,这时我们去看一下保存的运行日志,此时应该已经将三个变量的值打印在日志中了:

Android安全指南 之 Smali逆向实战

可以看到v5中保存的是一大串汉字,而正确密码v4和我们输入的密码处理后的字符串中的字符都是v5中的汉字。因此v5保存的是一张汉字表,而根据我们输入的密码1234567890可以从汉字表中分别对应“么广亡门义之尸弓己丸”,v4中的汉字都可以在v3中找到,由此我们可以得到v4对应的密码明文是581026。

Android安全指南 之 Smali逆向实战

这就是常用的逆向分析app的操作与思路,使用反编译工具拿到代码逻辑,通过静态分析找到代码中的关键点,再去动态调试这些关键点拿到我们想要的结果。

Android安全指南 之 Smali逆向实战

极牛网精选文章《Android安全指南 之 Smali逆向实战》文中所述为作者独立观点,不代表极牛网立场。如若转载请注明出处:https://geeknb.com/12703.html

(42)
打赏 微信公众号 微信公众号 微信小程序 微信小程序
叶绍琛的头像叶绍琛认证作者
上一篇 2020年5月22日 下午8:40
下一篇 2020年6月3日 上午11:27

相关推荐

发表回复

登录后才能评论
扫码关注
扫码关注
分享本页
返回顶部