安全玻璃盒_杭州孝道科技
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
引言
在渗透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
adb shell am start -D -n com.zj.wuaipojie/.ui.MainActivity
成功开启的截图
使用jeb调试
ctrl + b 打断点
点击debug
点击附上
成功调试
去广告实例
分析一个去广告的实例
启动广告
启动广告较为常见,一般都是一个activity进行倒计时,一般只需要修改倒计时为0即可
开启activity 记录
检测启动广告的activitycom.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
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)