首页
社区
课程
招聘
[分享]千方百技第八期|安卓逆向之不得不知的smali语言
发表于: 2023-6-12 11:36 7125

[分享]千方百技第八期|安卓逆向之不得不知的smali语言

2023-6-12 11:36
7125

引言

在渗透app过程中,很多测试都无法进行,无法抓包,无法改数据(数据签名),数据加密等问题迭出。在平时使用各种app时,广告也总是层出不穷。
为了解决以上问题,TESEC安全研究院学习了安卓逆向的知识,以此篇与大家分享学习成果。

安卓逆向基础

依据作者目前对安卓逆向的理解,现可供用户编写使用的是c/c++(Native层)和java(java层),其分别对应smali和so文件。反编译操作就是对这两个层级代码进行分析和修改。

 

而其他的技术,如签名认证、加壳,都是app进行防护操作,加大逆向人员对app逆向后代码可读性、修改的难度,从而衍生出的去签名、脱壳等技术。

 

故暂拟定的学习方向如下
1.学习smali反编译及调试
2.学习so反编译及其调试
3.学习破解常见的签名认证
4.学习简单的脱壳技术

smali 介绍

Smali是一种Android应用程序汇编语言,可用于反汇编和重新打包Android应用程序。它是一种基于文本的格式,类似于Java字节码,易于阅读和编辑。使用Smali,开发人员可以更深入地了解Android应用程序的内部工作方式,从而更好地调试和优化应用程序。

 

Smali是在Dalvik虚拟机上运行的指令集的低级表示形式。与Java字节码不同,Smali是面向寄存器的,这使得它更加紧凑和高效。它还支持动态绑定、多态性和其他高级特性,使得开发人员可以编写复杂的Android应用程序。

 

以下是android 架构图
图片描述

 

Android4.4 版本前身是 Dalvik 虚拟机,4.4 版本开始引入 ART 虚拟机(Android Runtime)。在 4.4 版本上,两种运行时环境共存,可以相互切换,但是在 5.0 版本以后,Dalvik 虚拟机则被彻底的丢弃,全部采用 ART。

smali 基础语法

基本类型

基本类型和java与之对应
boolean Z 布尔型
byte B 字节型
short S 短整数型(16 位)
char C 字符型
int I 整数型
long L 长整数型(64 位)
float F 浮点型
double D 双精度型(64 位)
void V 空类型,仅用作返回类型
L 对象类型
[ 数组类型

const 常量操作

声明和赋值操作
const-<类型> 寄存器, 操作数

 

const-string v1, "test" // 定义字符串“test”并存到 v1 寄存器中

 

const/16 v1, 0x1e // 定义了16位的数据常量"0x1e",并存到v1寄存器中

IF 判断

if-gt vA, vB, :cond**" 如果vA大于vB则跳转到:cond
if-ge vA, vB, :cond_
" 如果vA大于等于vB则跳转到:cond**
if-lt vA, vB, :cond
" 如果vA小于vB则跳转到:cond_
if-le vA, vB, :cond**" 如果vA小于等于vB则跳转到:cond
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**

smali 静态分析

pc可用 jadx、jeb、gda 等进行分析,手机可用 mt管理器、 np管理器均可反编译smali文件,查看java代码

 

以上工具可到吾爱在线网盘下载使用
https://down.52pojie.cn/Tools/Android_Tools/

 

jadx 效果 如下:
图片描述
静态分析按正常审计的逻辑java即可。

smali 动态调试

方法一

android:debuggable="true"

方法二

XappDebug模块hook对应的app
https://github.com/Palatis/XAppDebug

 

启用模块后,使用lsp作用系统框架,重启生效。
图片描述
进入模块选择生效软件。
图片描述

开启调试

需要开启adb连接( 雷神模拟器不需要)
adb connect 127.0.0.1:62001

 

com.zj.wuaipojie 为包名, ui.MainActivity 为启动acvtivity

1
adb shell am start -D -n com.zj.wuaipojie/.ui.MainActivity

成功开启的截图
图片描述

使用jeb调试

ctrl + b 打断点

 

点击debug
图片描述
点击附上
图片描述
成功调试
图片描述

去广告实例

分析一个去广告的实例

启动广告

启动广告较为常见,一般都是一个activity进行倒计时,一般只需要修改倒计时为0即可
开启activity 记录
图片描述
检测启动广告的activity
com.mendon.riza.app.launch.LaunchActivity
图片描述

 

使用 javax搜索类名进行审计,查看postDelayed方法。虽然与广告时间不符,但经尝试就是该位置。
图片描述
直接搜索该类名进行修改。
图片描述
搜索 0x4e20(16进制的20000), 并修改为 0。
图片描述

去图片广告

图片描述
使用【开发助手】,【布局查看】。
图片描述
定位广告id
图片描述
使用 mt管理器,搜索id
图片描述
图片描述
反编译,并搜索id位置。
图片描述
修改上一个标签为 0dp
图片描述
图片描述
重新编译后,即可去广告。
图片描述

去付费广告

每次进入的时候都会加载该广告,其实就是一个acvtity
图片描述

 

根据之前的acvtity监控,发现每次都是跳转Main -> Pro,所以作者的思路是去Main找到创建的代码进行注释。
com.mendon.riza.app.settings.ProActivity
图片描述
经分析,没有找到直接创建ProActivity的代码。转变思路,能不能在ProActivity创建的时候直接关掉呢?

 

通过在onCreate中直接调用finish,直接关闭ProActivity。
invoke-virtual {p0}, Landroid/app/Activity;->finish()V

 

在最后添加finish方法。
图片描述

声明

本文出现的软件仅限用于学习和研究目的,不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

参考链接

https://www.bilibili.com/video/BV1wT411N7sV
https://www.52pojie.cn/thread-408645-1-1.html
https://github.com/tangsilian/My-Github-Stars


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 34
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
学到了
2023-11-17 17:53
0
游客
登录 | 注册 方可回帖
返回
//